mmh-0.4/0000755000000000000000000000000013414435727010646 5ustar rootrootmmh-0.4/config/0000755000000000000000000000000013414435726012112 5ustar rootrootmmh-0.4/config/config.c0000644000000000000000000001036613414435726013531 0ustar rootroot/* ** config.c -- master nmh configuration file ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include /* ** nmh globals */ char *mhetcdir = NMHETCDIR; char *invo_name; /* command invocation name */ char *mypath; /* user's $HOME */ char *mmhpath; /* pathname of user's mmh dir */ char *defpath; /* pathname of user's profile */ char *ctxpath; /* pathname of user's context */ char ctxflags; /* status of user's context */ struct node *m_defs; /* profile/context structure */ /* ** nmh constants: standard file names ** ** Important: Adjust uip/mmh.sh if you make changes here! */ /* default name of the mail storage */ char *mailstore = "Mail"; /* default name of user profile */ char *mmhdir = ".mmh"; /* default name of user profile */ char *profile = "profile"; /* default name for the nmh context file */ char *context = "context"; /* ** Default name of file for public sequences. Gets overridden ** by a `Mh-Sequences' entry in the user's profile. Set to NULL ** or the empty string to use private sequences by default. */ char *mh_seq = ".mh_sequences"; /* standard component files */ char *components = "components"; /* comp */ char *replcomps = "replcomps"; /* repl */ char *replgroupcomps = "replgroupcomps"; /* repl -group */ char *forwcomps = "forwcomps"; /* forw */ char *distcomps = "distcomps"; /* dist */ char *rcvdistcomps = "rcvdistcomps"; /* rcvdist */ char *digestcomps = "digestcomps"; /* forw -digest */ /* standard format (filter) files */ char *mhlformat = "mhl.format"; /* show */ char *mhlreply = "mhl.reply"; /* repl */ char *scanformat = "scan.default"; /* scan/inc */ /* ** standard names for: mail folders, sequences, and profile entries */ /* some default folder names */ char *defaultfolder = "+inbox"; char *draftfolder = "+drafts"; char *trashfolder = "+trash"; char *inbox = "Inbox"; /* profile entry name to specify the default folder */ char *curfolder = "Current-Folder"; /* predefined sequences */ char *seq_all = "a"; char *seq_beyond = "b"; /* the previous `new' sequence */ char *seq_cur = "c"; char *seq_first = "f"; char *seq_last = "l"; char *seq_next = "n"; char *seq_prev = "p"; char *seq_unseen = "u"; char *seq_neg = "!"; char *usequence = "Unseen-Sequence"; char *psequence = "Previous-Sequence"; char *nsequence = "Sequence-Negation"; /* profile entries for storage locations */ char *nmhstorage = "nmh-storage"; /* Default header field names */ char *attach_hdr = "Attach"; char *sign_hdr = "Sign"; char *enc_hdr = "Enc"; /* the tool to query the mime type of a file */ char *mimetypequery = "Mime-Type-Query"; char *mimetypequeryproc = "file -b --mime"; /* ** nmh default programs */ /* ** This is the default program invoked by a "list" or "display" response ** at the "What now?" prompt. It will be given the absolute pathname of ** the message to show. */ char *listproc = "show"; /* ** This is used by mhl as a front-end. It is also used ** by show(1) as the default method of displaying message bodies ** or message parts of type text/plain. */ char *defaultpager = "more"; /* ** This is the editor invoked by the various message ** composition programs. It SHOULD be a full screen ** editor, such as vi or emacs, but any editor will work. */ char *defaulteditor = "vi"; /* ** This program is called after comp, et. al., have built a draft */ char *whatnowproc = "whatnow"; /* ** This is the sendmail interface to use for sending mail. */ char *sendmail = SENDMAILPATH; /* ** This is the path to the system mail spool directory (e.g. `/var/mail'). */ char *mailspool = MAILSPOOL; /* ** file stuff */ /* ** Folders (directories) are created with this protection (mode) */ char *foldprot = "0700"; /* ** Every NEW message will be created with this protection. When a ** message is filed it retains its protection. */ char *msgprot = "0600"; /* ** Standard yes/no switches structure */ struct swit anoyes[] = { { "no", 0 }, { "yes", 0 }, { NULL, 0 } }; mmh-0.4/config/Makefile.in0000644000000000000000000000243113414435726014157 0ustar rootroot# # Makefile for config subdirectory # SHELL = /bin/sh top_srcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ etcdir = @sysconfdir@ sendmailpath = @sendmailpath@ mailspool = @mailspool@ CC = @CC@ CFLAGS = @CFLAGS@ DEFS = @DEFS@ # add include dir .. for config.h when building in different directory INCLUDES = -I$(top_srcdir) -I.. @CPPFLAGS@ CONFIGDEFS = -DNMHETCDIR='"$(etcdir)"' \ -DSENDMAILPATH='"$(sendmailpath)"' \ -DMAILSPOOL='"$(mailspool)"' COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CFLAGS) COMPILE2 = $(CC) -c $(DEFS) $(CONFIGDEFS) $(INCLUDES) $(CFLAGS) .SUFFIXES: .SUFFIXES: .c .o .c.o: $(COMPILE) $< # source files SRCS = config.c # object files OBJS = config.o # ========= DEPENDENCIES FOR BUILDING ========== all: $(OBJS) config.o: config.c $(COMPILE2) $(srcdir)/config.c install: uninstall: lint: # ========== DEPENDENCIES FOR CLEANUP ========== mostlyclean: rm -f *.o *~ clean: mostlyclean distclean: clean rm -f Makefile realclean: distclean superclean: realclean # ========== DEPENDENCIES FOR MAINTENANCE ========== subdir = config Makefile: Makefile.in ../config.status cd .. && ./config.status $(subdir)/$@ mmh-0.4/ChangeLog0000644000000000000000000404353313414435727012434 0ustar rootrootcommit b1087b8a83359c41f5886bfeca72c08ae43d9ca8 Author: Philipp Takacs AuthorDate: Sun Jan 6 12:21:08 2019 +0100 Commit: Philipp Takacs CommitDate: Sun Jan 6 12:28:55 2019 +0100 This is mmh-0.4 :100644 100644 683256d3... d8acce59... M DATE :100644 100644 aad13dd8... a45071f1... M NEWS :100644 100644 be586341... bd73f470... M VERSION commit df98103428cb4cdfa9d911190791745c9bbe05b0 Author: Philipp Takacs AuthorDate: Sun Jan 6 12:27:37 2019 +0100 Commit: Philipp Takacs CommitDate: Sun Jan 6 12:27:37 2019 +0100 remove dtimep.c only in distclean this avoids flex dependency for the tarball :100644 100644 07877590... f2310fb8... M sbr/Makefile.in commit c42126750a40dae4c42a84c152c3be1ede3cf89e Author: Philipp Takacs AuthorDate: Sun Jan 6 03:13:04 2019 +0100 Commit: Philipp Takacs CommitDate: Sun Jan 6 03:13:04 2019 +0100 automitc set the owner/group in release tar :100644 100644 465beda0... 4012a2d3... M Makefile.in commit a859462824cb481880506c394704a0b5a4b9fc2d Author: Philipp Takacs AuthorDate: Sat Jan 5 20:35:50 2019 +0100 Commit: Philipp Takacs CommitDate: Sat Jan 5 20:35:50 2019 +0100 depricate whatnow Now a depricated warning is printed at the usage of whatnow. Also add a BUG section to the manpage. :100644 100644 d0fea84e... 4fa2b34c... M man/whatnow.man1 :100644 100644 82b25c69... 2b6847fc... M test/tests/whatnow/test-attach-detach :100644 100644 44fecb6c... 05bbd760... M test/tests/whatnow/test-cd :100644 100644 15d0824a... 474b505b... M test/tests/whatnow/test-ls :100644 100644 be046ac7... 41c8733c... M uip/whatnow.c commit ec2171174c019bdc83002cc29d06357e30b4b90d Author: Philipp Takacs AuthorDate: Sat Jan 5 14:30:57 2019 +0100 Commit: Philipp Takacs CommitDate: Sat Jan 5 14:45:38 2019 +0100 fail in pick if a massage of -thread has no thread-id If pick -thread is used with a message without a message-id or a references header field pick now fails. This prevents falling back to all messages as default. :100644 100644 d693439e... 60588151... M test/tests/pick/test-thread-without-msgid :100644 100644 049be8a7... f700a0c7... M uip/pick.c commit 1a1646dc54cace9984b36a1c12e1831d51fa89f1 Author: Philipp Takacs AuthorDate: Wed Jan 2 16:14:21 2019 +0100 Commit: Philipp Takacs CommitDate: Wed Jan 2 16:14:21 2019 +0100 pick fix segfault pick now copy the static memory which is later freed. Also fix the access to uninitialized variable in getthreadid(). Thanks c_14 for reporting. :100644 100644 99a7d67b... 41e3e22b... M sbr/getthreadid.c :000000 100644 00000000... 0397e11c... A test/tests/pick/test-thread :000000 100644 00000000... d693439e... A test/tests/pick/test-thread-without-msgid :100644 100644 aba0c028... 049be8a7... M uip/pick.c commit 76e95977668d89054ced87fc7d379464713e2ee9 Author: Philipp Takacs AuthorDate: Mon Dec 31 12:42:01 2018 +0100 Commit: Philipp Takacs CommitDate: Mon Dec 31 12:42:01 2018 +0100 rename whatnow2 tests the testsystem require the format test-* for tests :100644 100644 e91cc791... e91cc791... R100 test/tests/whatnow2/metafile test/tests/whatnow2/test-metafile :100644 100644 bd4cf88e... bd4cf88e... R100 test/tests/whatnow2/default-workflow test/tests/whatnow2/test-workflow commit 8da62db99b6d668511eb99881ad8889e4421ae7a Author: Philipp Takacs AuthorDate: Mon Dec 31 02:54:23 2018 +0100 Commit: Philipp Takacs CommitDate: Mon Dec 31 02:54:23 2018 +0100 whatnow2 save metainformation in the draft itself by default meta information like last editor or altmsg is stored in the draft ifself. This can be overritten by the profile entry Metafile-Extension. :100644 100644 7b2934e2... b4aea9e8... M etc/Makefile.in :000000 100644 00000000... 188634d1... A etc/mhl.whatnow2 :100644 100644 dd8196f3... 3b692eef... M man/mh-profile.man5 :100644 100644 f66bfe78... 4ba56742... M man/whatnow2.man1 :000000 100644 00000000... bd4cf88e... A test/tests/whatnow2/default-workflow :000000 100644 00000000... e91cc791... A test/tests/whatnow2/metafile :100644 100644 f037ec13... fcab14d7... M uip/Makefile.in :100755 100755 91ff5a5e... f9cf2559... M uip/whatnow2.sh commit 216b5073ff0503c04868769fe7930c49f6fbcf1c Author: Philipp Takacs AuthorDate: Sun Dec 30 03:11:53 2018 +0100 Commit: Philipp Takacs CommitDate: Sun Dec 30 03:11:53 2018 +0100 h/mh.h remove comma at the end of enum state This is a C99 feature and mmh stick to C98. Just to stop the noise from the compiler ;-) :100644 100644 20346b6b... 6337a0ca... M h/mh.h commit f421770234df8633ec9e703c9045cc21753fc644 Author: Philipp Takacs AuthorDate: Sun Dec 30 01:51:06 2018 +0100 Commit: Philipp Takacs CommitDate: Sun Dec 30 01:51:06 2018 +0100 merge pick and scan manpage Now only one manpage for scan and pick is dokumentating the usage of pick/scan. :100644 100644 8188ff41... ea63a753... M man/pick.man1 :100644 100644 2a25d18c... 02e5a2ec... M man/scan.man1 commit ca984be73bdba8c9e807aa56be6403a7b790ed21 Author: Philipp Takacs AuthorDate: Mon Nov 26 01:02:53 2018 +0100 Commit: Philipp Takacs CommitDate: Mon Nov 26 01:02:53 2018 +0100 add raw option to mhl raw allows to output a header as in the input, no changes are done by mhl. This is written for whatnow2. whatnow2 shall safe some data in the draft and use mhl with ignore to remove this data. Also other tools can use mhl to filter some header fields out of a message without changing the message itself. :100644 100644 76d23358... fa83602d... M uip/mhl.c commit dbf7c84b34c2d3f87c0c3cb11a04dff2c20b39e5 Author: Philipp Takacs AuthorDate: Wed Nov 21 02:34:56 2018 +0100 Commit: Philipp Takacs CommitDate: Sun Nov 25 22:43:53 2018 +0100 whatnow2 handle mhuse If mhuse is set don't write new envirement to the metafile. mhuse is set, when comp -use is used. :100755 100755 4e767663... 91ff5a5e... M uip/whatnow2.sh commit d44d7ab7f82b27b1644c7ec93bdbe0fedc0fb4c5 Author: Philipp Takacs AuthorDate: Wed Nov 21 02:26:49 2018 +0100 Commit: Philipp Takacs CommitDate: Sun Nov 25 22:43:53 2018 +0100 strict use "" in whatnow2 :100755 100755 59e91b7a... 4e767663... M uip/whatnow2.sh commit c89293b617b20e1bdceeed290941c45acc457b15 Author: Philipp Takacs AuthorDate: Mon Jul 10 16:34:45 2017 +0200 Commit: Philipp Takacs CommitDate: Sun Nov 25 22:40:45 2018 +0100 mhl implement simple globbing ignores now supports simple globbing :100644 100644 9785fe27... b6af9531... M man/mhl.man1 :100644 100644 b8213b04... 76d23358... M uip/mhl.c commit 24d23e290e7b1320eca49cfd2ea0ca0af3e761e0 Author: Philipp Takacs AuthorDate: Fri Nov 23 01:41:06 2018 +0100 Commit: Philipp Takacs CommitDate: Sun Nov 25 15:08:54 2018 +0100 fix indention in uip/mhl.c :100644 100644 2987c0d2... b8213b04... M uip/mhl.c commit de6974ed610ffbfaff335021ea7e359e85c27cfa Author: Philipp Takacs AuthorDate: Mon Nov 19 03:04:12 2018 +0100 Commit: Philipp Takacs CommitDate: Sun Nov 25 15:08:54 2018 +0100 Trailing withspace handling in mhl If a component has trailing whitespace, e.g., body:component="> ", mhl now trims that whitespace off when filtering blank text lines. Also add a rtrim flag to mhl. This flag removes trailing whitespace in filtert text. The implementation was done by David Levine for nmh commit ea0a6d8112a918809bd03d8126411040d22f2bb8 commit 1aa8f3e11e6d83ee4806abaa132ab9466f02ca5f :100644 100644 69556f94... 65265822... M h/prototypes.h :100644 100644 a80d6bf0... 9785fe27... M man/mhl.man1 :100644 100644 249faf9c... cbf90984... M sbr/trim.c :100755 100755 7220e6cb... 578fd37c... M test/tests/mhl/test-mhl-flags :100644 100644 a84703b8... 2987c0d2... M uip/mhl.c commit fa1c9e13c8bae76993ec43f56685fa0057758579 Author: Philipp Takacs AuthorDate: Fri Oct 26 21:53:36 2018 +0200 Commit: Philipp Takacs CommitDate: Sun Nov 25 14:29:17 2018 +0100 read the defaultfolder from the profile context_read now creates the inbox specified in the profile, instand of create the compiletime default. :100644 100644 cfdcff27... 51592a91... M sbr/context_read.c :000000 100644 00000000... 997e52e6... A test/tests/config/test-inbox commit 20597014bd0a3a6afa0244e5ee6531c59bc8fceb Author: Philipp Takacs AuthorDate: Wed Nov 21 23:25:54 2018 +0100 Commit: Philipp Takacs CommitDate: Fri Nov 23 00:14:54 2018 +0100 pick implement rfc2047 :100644 100644 7f0d3a9a... aba0c028... M uip/pick.c commit f826c136f3bee802c63cef0510bcd8de71ccbe84 Author: Philipp Takacs AuthorDate: Wed Nov 21 23:23:10 2018 +0100 Commit: Philipp Takacs CommitDate: Fri Nov 23 00:14:43 2018 +0100 fix logic bug in pick GREPaction GREPaction now check the header field correct :100644 100644 12b2bd70... 7f0d3a9a... M uip/pick.c commit b7df0ea22b417220d96485c84d5d0a0b2e8e86ea Author: Philipp Takacs AuthorDate: Wed Nov 21 22:06:22 2018 +0100 Commit: Philipp Takacs CommitDate: Fri Nov 23 00:14:34 2018 +0100 remove free of static memory :100644 100644 25bd6b6a... 12b2bd70... M uip/pick.c commit 1c4473f16f0081a480b9c1065675fdee277618f5 Author: David Levine AuthorDate: Sun Oct 14 19:27:17 2012 -0500 Commit: Philipp Takacs CommitDate: Sun Nov 18 22:15:18 2018 +0100 Fix blind list alias expansion The first alias contained in a blind list is now expanded. The mh-alias(5) man page was updated to show that blind lists must not be terminated with, or contain, a trailing semicolon [Bug #15604]. :100644 100644 1d0508f8... 3769141d... M man/mh-alias.man5 :100644 100644 b00f51bc... 3faa3733... M uip/aliasbr.c commit defe82a74d1742f7f723e2c8311905577320342a Author: markus schnalke AuthorDate: Sun Nov 4 14:11:01 2018 +0100 Commit: markus schnalke CommitDate: Sun Nov 4 14:11:01 2018 +0100 Fix test/tests/show/test-longlines Although it worked correct on the server, it did not in terminals which have a number of columns set, like those connected to a screen. The test now sets `-width 2000' for mhl(1) via the test config. :100644 100644 c15c1cbb... f6ae1266... M test/tests/show/test-longlines commit 9deab9cb456aa52ea9857663304f322b5c6be72d Author: markus schnalke AuthorDate: Sun Nov 4 14:07:43 2018 +0100 Commit: markus schnalke CommitDate: Sun Nov 4 14:07:43 2018 +0100 Fix test/tests/send/test-mimeify The size differences came from generated values of the Content-ID headers. They depend on the hostname and thus vary in length. leading to different MIME part sizes. The solution is replacing all Content-IDs with static values. The helper function replace_contentid() is added to commons.sh. :100644 100644 1a677335... b869d56d... M test/common.sh :100644 100644 3de45d74... f5a18aaf... M test/tests/send/test-mimeify commit 410e6cccd38f176e9df34e5565d04f6f96c7e815 Author: markus schnalke AuthorDate: Wed Oct 31 11:32:39 2018 +0100 Commit: markus schnalke CommitDate: Wed Oct 31 11:32:39 2018 +0100 Add test for empty sequence patch by c_14 i.e. for commit 850190587ff71010fc63e44ca01a93a44c96f58e :000000 100644 00000000... f134f274... A test/tests/new/test-empty-seq commit 850190587ff71010fc63e44ca01a93a44c96f58e Author: c_14 AuthorDate: Mon Oct 1 16:01:52 2018 +0200 Commit: markus schnalke CommitDate: Wed Oct 31 11:29:20 2018 +0100 Ignore folders with an empty sequence in new This solves the issue where `new' lists folders that have an empty sequence (e.g. the unseen sequence), this also prevents `fnext' and `fprev' from navigating to such folders. :100644 100644 97633766... 21435b34... M uip/new.c commit 1642d62841486ade88ec2c48dd581e3249c98c94 Author: Vasilii Kolobkov AuthorDate: Thu Jul 19 18:55:57 2018 +0200 Commit: markus schnalke CommitDate: Wed Oct 31 10:54:12 2018 +0100 Use the same mh_hostname() function from test/common.h in mhsign(1) :100755 100755 39a3f690... 894ca5e3... M uip/mhsign.sh commit 17de69d5b6a8082a86d08f7617718e38c27205e0 Author: Vasilii Kolobkov AuthorDate: Thu Jul 19 18:54:07 2018 +0200 Commit: markus schnalke CommitDate: Wed Oct 31 10:53:52 2018 +0100 Fix tests to run on OpenBSD Use a hardcoded sequence for there's no seq(1) in OpenBSD. awk(1) doesn't support interval regular expression syntax ({n,m}) on some BSDs. hostname(1) has no -f flag on OpenBSD and. Try it first and fallback to `uname -n`. Omit explicit template in mktemp(1) call. :100644 100644 805afeaf... 1a677335... M test/common.sh :100755 100755 9f35adea... 32c82f55... M test/runtest :100755 100755 3c2bb97c... 44e0997f... M test/tests/mhsign/test-mhsign :100755 100755 a1d3c3d0... 31946ee0... M test/tests/mhstore/test-filenames :100644 100644 138c7248... c15c1cbb... M test/tests/show/test-longlines commit 5cb46b33551f28e4168989e752e09bd927e993f9 Author: Vasilii Kolobkov AuthorDate: Thu Jul 19 11:56:11 2018 +0200 Commit: markus schnalke CommitDate: Wed Oct 31 10:32:14 2018 +0100 Remove tests/inc/test-eom-align Reimplemented m_getfld2() makes it obsolete. :100644 000000 a8667a7d... 00000000... D test/tests/inc/cksums :100644 000000 7be957f3... 00000000... D test/tests/inc/filler.txt :100644 000000 8bc47909... 00000000... D test/tests/inc/fromline.txt :100644 000000 f6faad4f... 00000000... D test/tests/inc/msgheader.txt :100644 000000 2b6afb48... 00000000... D test/tests/inc/test-eom-align commit 2649858ef32645a56e78497d8268f0589b94b63f Author: markus schnalke AuthorDate: Sun Jul 15 13:41:17 2018 +0200 Commit: markus schnalke CommitDate: Sun Jul 15 13:41:17 2018 +0200 Extend test for long lines with CRLF :100644 100644 8079e4db... 138c7248... M test/tests/show/test-longlines commit d39fe43959fda0efb9ae681672ea8e476f1848e1 Author: Philipp Takacs AuthorDate: Sat Jul 14 13:41:09 2018 +0200 Commit: markus schnalke CommitDate: Sun Jul 15 13:31:07 2018 +0200 spost accept body lines with 998 characters :100644 100644 39d8ada5... fd0cbcc9... M uip/spost.c commit 1fadbab6f4c38dbd151898ecc158b3dc28e87f16 Author: Philipp Takacs AuthorDate: Sat Jul 14 11:24:36 2018 +0200 Commit: markus schnalke CommitDate: Sun Jul 15 13:31:07 2018 +0200 check for crlf in m_getfld2 now header fields witch lines 998 chars and crlf are accepted. :100644 100644 53b301e5... 20346b6b... M h/mh.h :100644 100644 954ed331... b9a618d1... M sbr/m_getfld2.c commit 220857595d567997752e7e10279882ceac9516ae Author: markus schnalke AuthorDate: Sun Jul 15 13:28:13 2018 +0200 Commit: markus schnalke CommitDate: Sun Jul 15 13:28:13 2018 +0200 Add test to check for correct handling of long lines :000000 100644 00000000... 8079e4db... A test/tests/show/test-longlines commit 4f230b2e91103abc77dcc41c46a59ba2041a2248 Author: Vasilii Kolobkov AuthorDate: Wed Jul 11 13:21:16 2018 +0200 Commit: markus schnalke CommitDate: Sun Jul 15 12:21:13 2018 +0200 Accept header lines of exactly 998 characters :100644 100644 956a5565... 954ed331... M sbr/m_getfld2.c commit 3de462f2108cb2be990bba95fee04f45899a4d44 Author: c_14 AuthorDate: Mon May 7 18:48:33 2018 +0200 Commit: Philipp Takacs CommitDate: Mon May 7 19:02:16 2018 +0200 Fix parallel `make install' Prior to this commit, running make install with -j > 1 caused an (easily reproducible) race condition where make tried linking commands that hadn't been installed yet. :100644 100644 e7e7b46d... e0c280fa... M uip/Makefile.in commit b3fde4704d42fd432536e23678d21d1fc78db7b8 Author: markus schnalke AuthorDate: Sun Feb 18 10:33:02 2018 +0100 Commit: markus schnalke CommitDate: Sun Feb 18 10:33:02 2018 +0100 Better wording in README concerning compatibility :100644 100644 63037c28... 8400d5e2... M README commit f49900dcc4b009ab4e1a90985029b6ac98569e95 Author: Philipp Takacs AuthorDate: Sat Jul 22 21:35:44 2017 +0200 Commit: Philipp Takacs CommitDate: Sat Jul 22 21:35:44 2017 +0200 fix install of scan now scan is removed bevore it is linked found by Jan :100644 100644 8719cc70... a758fe0a... M uip/Makefile.in commit 53a7340002907ae85b4d288dcbd4a48211e0b25a Author: markus schnalke AuthorDate: Sat Jul 8 14:34:04 2017 +0200 Commit: markus schnalke CommitDate: Sat Jul 8 14:34:04 2017 +0200 Add example to pick.1 for handling empty result set in the shell This commit bases on a patch provided by Vasily Kolobkov . Actually, he also brought the topic up on the mailing list. Thanks! Also adjust the man page from nmh's special sequence name `all' to mmh's name `a' for it. :100644 100644 076f99d9... 2390984a... M man/pick.man1 commit 5edd028a43a622bbdd5e9bbd658a7284aaf340ba Author: Philipp Takacs AuthorDate: Fri Jun 16 14:12:24 2017 +0200 Commit: Philipp Takacs CommitDate: Fri Jun 30 11:41:09 2017 +0200 fix undefined behavior in fmt_trim() It now writes the output in the input char *. This is only a temporaly fix. :100644 100644 ca7f5e8c... 4d4d6330... M sbr/fmt_scan.c commit b600ac49b9dd3fe3938e6a7618d4b75f30e5b636 Author: c_14 AuthorDate: Tue May 16 18:13:52 2017 +0200 Commit: Philipp Takacs CommitDate: Thu Jun 15 21:57:46 2017 +0200 cpstripped: Add braces to make code more legible. :100644 100644 d0b112bf... ca7f5e8c... M sbr/fmt_scan.c commit dcda74a843a1198dc23a3f6a17572c2f6ba5de61 Author: c_14 AuthorDate: Mon May 22 23:56:12 2017 +0200 Commit: Philipp Takacs CommitDate: Thu Jun 15 21:53:57 2017 +0200 add a test to test-scan-multibyte Tests for splitting within a multibyte character. :100644 100644 0d843c35... a7a6356c... M test/tests/scan/test-scan-multibyte commit 95f7880a49b3eb5d1d4f5a966c291d91aeca3c41 Author: c_14 AuthorDate: Tue May 16 18:13:27 2017 +0200 Commit: Philipp Takacs CommitDate: Thu Jun 15 21:53:47 2017 +0200 fmt_scan: support multibyte characters in putstr decoding Fixes an issue where the string output by scan with a putstr format is truncated within a multibyte character causing terminal corruption :100644 100644 2485e6cb... d0b112bf... M sbr/fmt_scan.c commit 1d392de336185c47e70ebc89cb36ea5fc77fc3f0 Author: Philipp Takacs AuthorDate: Sun May 28 14:58:38 2017 +0200 Commit: Philipp Takacs CommitDate: Sun May 28 14:58:38 2017 +0200 replace scan with pick :100644 100644 cd43aaae... 8719cc70... M uip/Makefile.in :100644 000000 018cd9cd... 00000000... D uip/scan.c commit e5579d23f1d5dcfaf9b7ecb2819e3a0f0b2ab3fa Author: Philipp Takacs AuthorDate: Sun May 28 14:49:52 2017 +0200 Commit: Philipp Takacs CommitDate: Sun May 28 14:49:52 2017 +0200 port -file switch to pick now scan can full replaced by pick :100644 100644 464a7345... 25bd6b6a... M uip/pick.c commit 3ec7019fb0a1c08f1c866f0a84fa75fe5b498596 Author: Philipp Takacs AuthorDate: Sun Feb 26 20:28:06 2017 +0100 Commit: Philipp Takacs CommitDate: Sun May 28 14:06:53 2017 +0200 pick option -thread The -thread option allows to pick mails of a specific thread. The thread is choosen by a mail in the option argument. :100644 100644 69556f94... 50d8a8b7... M h/prototypes.h :100644 100644 4f223df1... 8188ff41... M man/pick.man1 :100644 100644 58cf5c7d... 07877590... M sbr/Makefile.in :000000 100644 00000000... 99a7d67b... A sbr/getthreadid.c :100644 100644 1c195be4... 464a7345... M uip/pick.c commit e0bd1185d5a6a854a04f3c567195cfe96df112d0 Author: Philipp Takacs AuthorDate: Sun Apr 2 23:15:19 2017 +0200 Commit: Philipp Takacs CommitDate: Sun May 28 14:06:53 2017 +0200 complete rewrite of pick this make the code cleaner and removes the regex implementation. The mail itself is now read by pick and the match functions only check if the field match. :100644 100644 3e250a77... 1c195be4... M uip/pick.c commit 641a9d953e86685f9ca2f3da72e9a94e5bcfd69e Author: Philipp Takacs AuthorDate: Sun Apr 2 23:13:42 2017 +0200 Commit: Philipp Takacs CommitDate: Sun May 28 14:06:39 2017 +0200 mh_xstrdup arguments now const this is better to avoid errors and required by my pick rewrite :100644 100644 13964b23... 1d55b59f... M h/utils.h :100644 100644 ef0ee973... 50060ae7... M sbr/utils.c commit da25188de43095cc8fd78094e538ec868e910a44 Author: Philipp Takacs AuthorDate: Fri Sep 9 23:06:37 2016 +0200 Commit: Philipp Takacs CommitDate: Thu May 25 15:43:41 2017 +0200 add -format to pick this leads to remove scan :100644 100644 aa0aa258... 7b2934e2... M etc/Makefile.in :000000 100644 00000000... 0ab1bed0... A etc/pick.default :100644 100644 076f99d9... 4f223df1... M man/pick.man1 :100644 100644 e7e7b46d... cd43aaae... M uip/Makefile.in :100644 100644 4cb33fb1... 3e250a77... M uip/pick.c commit 4fbfa159384d4f0230d96999164b630f17c5e4a5 Author: Philipp Takacs AuthorDate: Mon Sep 19 18:23:39 2016 +0200 Commit: Philipp Takacs CommitDate: Sun Apr 23 14:56:17 2017 +0200 decode rfc2047 header in mhparse attachment filenames are mostly rfc2047 encoded. Now all mime header are decoded to avoid problems. :000000 100755 00000000... a1d3c3d0... A test/tests/mhstore/test-filenames :100644 100644 a478b427... 2b72e7bc... M uip/mhparse.c commit 403e71903f2bb190f83a2cababef05697babec5b Author: markus schnalke AuthorDate: Mon Apr 17 23:52:26 2017 +0200 Commit: markus schnalke CommitDate: Mon Apr 17 23:52:26 2017 +0200 mhpgp: use trusted header field copies to replace original header fields Enigmail provides so called ``protected-headers'', which are copies of some main mail header fields to protect them from forgery. Mhpgp(1) works in a rough way and simply adds this MIME part to the main header, and this resulted in a doubling of those header fields. Now those original headers are removed if trusted copies are provided within the encrpyted MIME part. :100755 100755 ce4d2c87... 1cfa2745... M uip/mhpgp.sh commit 41ad151c26f230e99d1ec6df0dcc477e72a7e6f7 Author: markus schnalke AuthorDate: Mon Apr 17 23:41:55 2017 +0200 Commit: markus schnalke CommitDate: Mon Apr 17 23:41:55 2017 +0200 Fix `anno -delete': preserve newline in folded header fields :100644 100644 33d2b49d... 17085579... M uip/anno.c commit ee8d01d64e8832304256de53db07228e2be67f6a Author: markus schnalke AuthorDate: Mon Apr 17 19:35:21 2017 +0200 Commit: markus schnalke CommitDate: Mon Apr 17 19:35:21 2017 +0200 Fix mhsign for gpg2: Expiry date format Gnupg2 uses --fixed-list-mode by default for --with-colons. Gnupg1 needs this option explicitly to generate the same output format (timestamps) for expiry dates. Thanks to Jan Unterbrink for reporting the bug. :100755 100755 9d6c747e... 39a3f690... M uip/mhsign.sh commit bd7e2d5cc610c87f2f8c2df507bb7eda86cce90e Author: Philipp Takacs AuthorDate: Wed Mar 8 15:31:37 2017 +0100 Commit: Philipp Takacs CommitDate: Wed Mar 8 15:31:37 2017 +0100 fix oldstyle whom Check if msg struct have selected messages before accessing a message. :100644 100644 f42bd80b... 9d70cdd7... M sbr/parse_msgs.c commit 6e9577f324bef90765a5edc02044eb111ec48072 Author: markus schnalke AuthorDate: Wed Mar 8 13:44:12 2017 +0100 Commit: markus schnalke CommitDate: Wed Mar 8 13:44:12 2017 +0100 Fix uip/whom.c for C89 compatibility :100644 100644 e664f4b2... ef0b684d... M uip/whom.c commit d9b9dba7abf1c10248abfb5f64c13eb1c3ddcb40 Author: markus schnalke AuthorDate: Wed Mar 8 13:31:31 2017 +0100 Commit: markus schnalke CommitDate: Wed Mar 8 13:31:31 2017 +0100 Fix sbr/parse_msgs.c for C89 compatibility :100644 100644 00d9fb81... f42bd80b... M sbr/parse_msgs.c commit eb650f703c26232c0ccce00c9b3dd3f6b6d51dd4 Author: Philipp Takacs AuthorDate: Sun Mar 5 17:55:31 2017 +0100 Commit: Philipp Takacs CommitDate: Tue Mar 7 15:09:50 2017 +0100 add() first parameter (s2) is now const :100644 100644 bed9188c... 13964b23... M h/utils.h :100644 100644 466b9aba... ef0ee973... M sbr/utils.c commit 5b483b0b8517541a8359d7049b4497c6efcb117e Author: Philipp Takacs AuthorDate: Sun Mar 5 17:55:00 2017 +0100 Commit: Philipp Takacs CommitDate: Tue Mar 7 15:08:42 2017 +0100 allow msgs as parameters for whom now you can write ``whom c'' instand of ``whom `mhpath c`'' :100644 100644 c0d28351... bed9188c... M h/utils.h :100644 100644 02038e74... 58cf5c7d... M sbr/Makefile.in :000000 100644 00000000... 00d9fb81... A sbr/parse_msgs.c :100644 100644 64ec7c97... e664f4b2... M uip/whom.c commit eb6938d742d51b5f6637da8e706cc6dd080be058 Author: Philipp Takacs AuthorDate: Fri Feb 17 16:05:57 2017 +0100 Commit: Philipp Takacs CommitDate: Fri Feb 17 16:05:57 2017 +0100 quote path variables in whatnow2.sh without qoutes this causes error with spaces or other special charecter in the path or filename. :100755 100755 20407253... 59e91b7a... M uip/whatnow2.sh commit c057a79cf3583b3c6b7ce824a1281b32c5287f21 Author: Philipp Takacs AuthorDate: Sun Jan 1 21:57:07 2017 +0100 Commit: Philipp Takacs CommitDate: Fri Jan 6 21:43:48 2017 +0100 make dateparsing case insensitive Acourding to RFC 5322 and 5234 the date field is case insenitive :100644 100644 4f07aacf... 340abf1c... M sbr/dtimep.lex commit 143328edd5842208e53d3f2427a6059d604eb78e Author: Philipp Takacs AuthorDate: Fri Nov 25 13:38:04 2016 +0100 Commit: Philipp Takacs CommitDate: Fri Jan 6 21:40:49 2017 +0100 mhparse add support for CRLF multipart mime content wasn't able to parse, if the mail use CRLF line endings. :100644 100644 782ab51a... 1ff37bf3... M h/mhparse.h :100644 100644 8e8b3605... a478b427... M uip/mhparse.c commit 79cbafe7268202d5b9c231b2d25472c152caa709 Author: Philipp Takacs AuthorDate: Tue Nov 22 17:15:58 2016 +0100 Commit: Philipp Takacs CommitDate: Fri Jan 6 19:25:36 2017 +0100 Accept binary encoding for messages/* Acording to RFC 2046 binary encoding is allowed for messages/*. Also ignore other encodings. :100644 100644 b0876eb9... 8e8b3605... M uip/mhparse.c commit 30cd04b718c568c8c327bc32c5700a3a1f403be4 Author: mor0ious@gmail.com AuthorDate: Thu Jan 5 08:35:22 2017 -0700 Commit: Philipp Takacs CommitDate: Thu Jan 5 17:52:04 2017 +0100 mhsign manpage: mention hostname bug :100644 100644 85c80b1f... 7e5c3e59... M man/mhsign.man1 commit 9e5b3025ed2dbb984181c8616456bbfa804bd1fa Author: Dmitry Bogatov AuthorDate: Fri Sep 16 15:22:28 2016 +0300 Commit: Philipp Takacs CommitDate: Sun Jan 1 20:55:24 2017 +0100 whatnow2: remove get_attachmentheader() :100755 100755 22be3539... 20407253... M uip/whatnow2.sh commit f78e7c6e6e616cc4ff2bee8a726365fafef2d8ce Author: Dmitry Bogatov AuthorDate: Thu Sep 8 13:03:52 2016 +0300 Commit: Philipp Takacs CommitDate: Sun Jan 1 16:55:34 2017 +0100 Remove unused code The unsude code is: struct zone, macro strbase64, macro isatom, function unset_unseen(), function pref_encoding(), function cpydgst(), macro base64len :100644 100644 22c23495... d8551cb0... M h/mime.h :100644 100644 a9fa2d4b... 02038e74... M sbr/Makefile.in :100644 000000 5e5ef87f... 00000000... D sbr/cpydgst.c :100644 100644 47ae79e0... 1d3bc060... M sbr/dtime.c :100644 100644 4e4cbefb... 72d27ce5... M sbr/encode_rfc2047.c :100644 100644 50ae7c68... 7ffbde16... M sbr/seq_msgstats.c commit c29e62470a481bcd4d54760b0578ca4bc1201681 Author: Larry Hynes AuthorDate: Tue Dec 13 20:14:12 2016 +0000 Commit: Philipp Takacs CommitDate: Wed Dec 28 17:13:35 2016 +0100 Grammer and layout fixes anno.man1 :100644 100644 97720315... 21ba903e... M man/anno.man1 commit d6f94362211ed42179c5c8c4c80602d58a758e61 Author: Larry Hynes AuthorDate: Tue Dec 13 20:14:12 2016 +0000 Commit: Philipp Takacs CommitDate: Wed Dec 28 15:33:06 2016 +0100 Grammer and layout fixes in ali.man1 :100644 100644 b45fb928... e6750cc9... M man/ali.man1 commit fbb3dac3857095f59113e582bd7ff9a54643c20a Author: Philipp Takacs AuthorDate: Sun Sep 25 22:40:46 2016 +0200 Commit: Philipp Takacs CommitDate: Sun Sep 25 22:40:46 2016 +0200 fix bug in whatnow2 attach :100755 100755 543dbe58... 22be3539... M uip/whatnow2.sh commit 6e4f8128fe078a3e54f5c92d27c31acc7b8f9fd8 Author: Philipp Takacs AuthorDate: Sun Sep 4 14:12:00 2016 +0200 Commit: Philipp Takacs CommitDate: Sun Sep 18 12:26:46 2016 +0200 redesign version string Now we have two version nummbers one for the tool and one for the lib. Also the version number is changed everytime the object is rebuild. :100644 100644 f93359df... 465beda0... M Makefile.in :100644 100644 52c43259... be586341... M VERSION :100644 100644 47f9125b... 16af1516... M config/Makefile.in :100755 000000 63963061... 00000000... D config/version.sh :100644 100644 e1795caa... 53b301e5... M h/mh.h :100644 100644 abfcd414... 49b26004... M man/Makefile.in :100644 100644 f60bd9aa... a9fa2d4b... M sbr/Makefile.in :100644 100644 8361c664... 72233908... M sbr/print_version.c :000000 100644 00000000... 42917c52... A sbr/version.c :100644 100644 d7cad062... e7e7b46d... M uip/Makefile.in :100644 100644 9ab6515e... d4c6c7fb... M uip/ali.c :100644 100644 9e287be4... 33d2b49d... M uip/anno.c :100644 100644 9d356018... 41eae6a2... M uip/ap.c :100644 100644 a68420a1... 12d1f9d4... M uip/burst.c :100644 100644 c34ce43f... 75bbf86f... M uip/comp.c :100644 100644 d74e498b... 1d5c3aa4... M uip/dist.c :100644 100644 3a019951... 70162b2a... M uip/dp.c :100644 100644 63fcb0f5... 73ad5f29... M uip/flist.c :100644 100644 d75849b5... 419d8eea... M uip/fmtdump.c :100644 100644 3e3cd760... b7cdfe54... M uip/folder.c :100644 100644 d8d69f78... e00ae0e1... M uip/forw.c :100644 100644 08aa533c... e31c6a62... M uip/inc.c :100644 100644 1e57d1cc... 72b6d8e0... M uip/mark.c :100644 100644 6ed6037d... a233c685... M uip/mhbuild.c :100644 100644 c089d8e0... a84703b8... M uip/mhl.c :100644 100644 c9194cc0... 7056db5f... M uip/mhlist.c :100644 100644 06630b3b... 4215ecf2... M uip/mhmail.c :100644 100644 29d4170d... 2c61e608... M uip/mhparam.c :100644 100644 0fe638cd... 31e0722e... M uip/mhpath.c :100644 100644 e39bf65a... be9cd454... M uip/mhshow.c :100644 100644 596df728... 47b7c025... M uip/mhstore.c :100644 100644 cecf2ee5... d4bf6a6a... M uip/mhtest.c :100644 100644 efbea043... 97633766... M uip/new.c :100644 100644 a8c2c421... fe1102c6... M uip/packf.c :100644 100644 7d9c0869... 4cb33fb1... M uip/pick.c :100644 100644 ea17b91a... 7f71e028... M uip/prompter.c :100644 100644 d08058be... af3fc10d... M uip/rcvdist.c :100644 100644 bd6bacbf... b4e37bde... M uip/rcvpack.c :100644 100644 83c5150f... 33f8f3bc... M uip/rcvstore.c :100644 100644 182f315e... 682f66a5... M uip/refile.c :100644 100644 8a405439... b2adebfe... M uip/repl.c :100644 100644 e435a276... 273477e5... M uip/rmf.c :100644 100644 99820e94... 5059383d... M uip/rmm.c :100644 100644 a735b315... 018cd9cd... M uip/scan.c :100644 100644 eac15aee... d7691db9... M uip/send.c :100644 100644 9306f94b... df0dc7f6... M uip/slocal.c :100644 100644 ff69bc9e... c56a4019... M uip/sortm.c :100644 100644 505b94ce... 39d8ada5... M uip/spost.c :100644 100644 45671ed3... be046ac7... M uip/whatnow.c :100644 100644 7486dd89... 64ec7c97... M uip/whom.c :000000 100755 00000000... 9c868de3... A version.sh commit 9a990c3302e6bf6c5c313541cbc1cbcea16dcb4d Author: markus schnalke AuthorDate: Mon Sep 12 14:54:17 2016 +0200 Commit: markus schnalke CommitDate: Mon Sep 12 14:54:17 2016 +0200 Fix segfault in mhstore The bug was introduced by 6306992cd580d47c217edb1ae98d58b24d5be8c9 It didn't handle MIME parts without Content-Disposition headers. :100644 100644 da19123b... b0876eb9... M uip/mhparse.c :100644 100644 2b909eff... 596df728... M uip/mhstore.c commit cde72ae86fdf635342a573fc1ca5239702ca554e Author: markus schnalke AuthorDate: Thu Sep 8 08:54:52 2016 +0200 Commit: markus schnalke CommitDate: Thu Sep 8 08:54:52 2016 +0200 Fix repllistcomps: use the correct header :100644 100644 24db8d6b... 2f070b88... M etc/repllistcomps commit dc08e69006fdf9edb458dc23885dd669f3b4a176 Author: markus schnalke AuthorDate: Wed Sep 7 22:59:21 2016 +0200 Commit: markus schnalke CommitDate: Wed Sep 7 22:59:21 2016 +0200 No need to define the month and day names a second time ... just use the definition that already is available. :100644 100644 e06a068f... 4f07aacf... M sbr/dtimep.lex commit 9c9972821e53c2e5ac94431e3c9be3aeb63ef26c Author: markus schnalke AuthorDate: Wed Sep 7 22:41:06 2016 +0200 Commit: markus schnalke CommitDate: Wed Sep 7 22:47:28 2016 +0200 Add support for simplified ISO 8601/RFC 3339 dates It is now possible to use: pick -after 2016-02-15 -and -before 2016-08-31T16:30:00+02:00 At the same time drop support for the highly ambiguous date format XX-XX-YY. :100644 100644 e93a0cdb... 076f99d9... M man/pick.man1 :100644 100644 0581736a... e06a068f... M sbr/dtimep.lex commit dd2e898a13855acd7034a2ee73584995d7452f4f Author: markus schnalke AuthorDate: Wed Sep 7 16:31:58 2016 +0200 Commit: markus schnalke CommitDate: Wed Sep 7 22:47:28 2016 +0200 Replace lookup tables for obscure hashes with more readable code Time-performance doesn't matter here. If you think differently, demonstrate it convincingly! :100644 100644 db2b1939... 0581736a... M sbr/dtimep.lex commit 31750e8a12eafcd1b8fa81cb12b988e680254f24 Author: markus schnalke AuthorDate: Wed Sep 7 07:52:38 2016 +0200 Commit: markus schnalke CommitDate: Wed Sep 7 22:47:28 2016 +0200 Remove not used code (JLR define) I don't yet understand what the code does but we've never used it and didn't miss it, thus it appears to be a good decision to just remove it. :100644 100644 37bf16a1... 2485e6cb... M sbr/fmt_scan.c commit 31617c81857c7a0079ea21ebd1d7f01abaee9271 Author: Philipp Takacs AuthorDate: Wed Sep 7 01:14:42 2016 +0200 Commit: Philipp Takacs CommitDate: Wed Sep 7 10:53:00 2016 +0200 fix build in a diffrent folder Build in diffrent folder is a feature required by the test suite. This is a fixup for commit 94ac6bb :100644 100644 adb0e89a... abfcd414... M man/Makefile.in :100755 100755 6585edd8... deb0c0a1... M man/gettitles.sh commit 18591f8e001ecedbee48a51c1d1f08ebaa1c15c8 Author: markus schnalke AuthorDate: Tue Sep 6 20:10:28 2016 +0200 Commit: markus schnalke CommitDate: Tue Sep 6 20:10:28 2016 +0200 Factor trim format function out Also clarify that it trims both, leading and trailing whitespace. (Note that it is a special trim function. We cannot simply replace it with sbr/trim.c. Nonetheless, its readability is somehow bad.) :100644 100644 f034c6c0... 21e21e25... M h/fmt_compile.h :100644 100644 703e633b... 3935872e... M man/mh-format.man5 :100644 100644 9ad7b8a7... 37bf16a1... M sbr/fmt_scan.c commit fc9279e818dfc96c63a5d75a89080cc68cfe1170 Author: markus schnalke AuthorDate: Tue Sep 6 19:53:20 2016 +0200 Commit: markus schnalke CommitDate: Tue Sep 6 19:53:20 2016 +0200 Add %(unmailto) format function for List-Post headers With the unmailto format function it is possible to extract the address from a List-Post header, which e.g. is: List-Post: Applying %(unmailto{list-post}) extracts: ``mmh@marmaro.de'', which then can be used as recipient address for list replies. A format file (to be used with ``repl -form repllistcomps'') is included. :100644 100644 fd00e0de... aa0aa258... M etc/Makefile.in :000000 100644 00000000... 24db8d6b... A etc/repllistcomps :100644 100644 a84efaed... f034c6c0... M h/fmt_compile.h :100644 100644 f450012f... 703e633b... M man/mh-format.man5 :100644 100644 566f6209... 2b32e715... M sbr/fmt_compile.c :100644 100644 6cfc1765... 9ad7b8a7... M sbr/fmt_scan.c :100644 100644 a91333b7... d75849b5... M uip/fmtdump.c commit 94ac6bbeccca6dcf41f4e84d3a71b437929f98df Author: markus schnalke AuthorDate: Tue Sep 6 07:58:17 2016 +0200 Commit: markus schnalke CommitDate: Tue Sep 6 07:58:17 2016 +0200 Generate the command list in mmh-intro(7) This implementation does handle the aliases of folder(1) and flist(1), but not the ones of show(1) and new(1). Hence the commands next(1), prev(1), fnext(1), fprev(1) and unseen(1) don't appear on the list. Adjusted some of the short descriptions based on the version in the manual command list. :100644 100644 a0972bdb... 4b6687d3... M .gitignore :100644 100644 9a27e82a... adb0e89a... M man/Makefile.in :100644 100644 a2ba53a4... b4ebc7d3... M man/flist.man1 :000000 100755 00000000... 6585edd8... A man/gettitles.sh :100644 100644 cd8e2401... dd8196f3... M man/mh-profile.man5 :100644 100644 423ddd64... 2de3fcb2... M man/mhmail.man1 :100644 100644 afc0c107... fc93723b... M man/mhpgp.man1 :100644 100644 3ee998e3... 9ae2c67d... M man/mmh-intro.man7 :100644 100644 6f5a0ce1... e93a0cdb... M man/pick.man1 :100644 100644 e4447093... 288b90c6... M man/rcvpack.man1 :100644 100644 b19b1c0e... 29092308... M man/refile.man1 :100644 100644 a9e1a848... f66bfe78... M man/whatnow2.man1 commit 6306992cd580d47c217edb1ae98d58b24d5be8c9 Author: markus schnalke AuthorDate: Mon Sep 5 11:51:00 2016 +0200 Commit: markus schnalke CommitDate: Mon Sep 5 11:51:00 2016 +0200 Make mhstore(1) use "filename" attr of Content-Disposition Before, only the "name" attr of Content-Type was used as the filename to store attachments. The "filename" attr of Content-Disposition (which is the much more appropriate value) was ignored, thus often resulting in the attachment being stored with a default name like 20.2.pdf, for instance. :100644 100644 1954d897... 782ab51a... M h/mhparse.h :100644 100644 b860dcfa... da19123b... M uip/mhparse.c :100644 100644 adaca774... 2b909eff... M uip/mhstore.c commit be582c44948fe09cba55e538f1c9e2f57edb11ad Author: Philipp Takacs AuthorDate: Wed Aug 31 17:21:15 2016 +0200 Commit: Philipp Takacs CommitDate: Wed Aug 31 17:39:02 2016 +0200 remove msg-hook config option This is removed, because I don't see this is necesarry and it's not a good idea to pass a user provided string direct in a format string. :100644 100644 714ba008... 6ae745a4... M docs/README.hooks :100644 100644 0f3bd792... 3693d8bc... M sbr/ext_hook.c commit e917512db8efcbf3b5b5baeb64b6d345fd3686db Author: Dmitry Bogatov AuthorDate: Tue Aug 30 02:35:43 2016 +0300 Commit: Philipp Takacs CommitDate: Wed Aug 31 17:33:37 2016 +0200 Fix unreproducible build Hostname and date of compilation are no longer embeded in version string. See https://reproducible-builds.org :100755 100755 5a9628c2... 63963061... M config/version.sh commit 4112940aea5591648b03a81907408752c08b33aa Author: Dmitry Bogatov AuthorDate: Sat Aug 27 11:06:00 2016 +0300 Commit: Philipp Takacs CommitDate: Sun Aug 28 22:10:36 2016 +0200 Fix spelling errors, including binaries ones Signed-off-by: Dmitry Bogatov :100644 100644 64ada10f... aad13dd8... M NEWS :100644 100644 4d67d927... 01b845b7... M docs/COMPLETION-ZSH :100644 100644 4b7ecf8a... 3022a519... M docs/ChangeLog_MH-3_to_MH-6.6 :100644 100644 1d6542ec... 8cf86cf9... M docs/ChangeLog_MH-6.7.0_to_MH-6.8.4.html :100644 100644 324dddc1... 9c1ae3df... M docs/ChangeLog_nmh :100644 100644 8a1805c5... 3f17ebfa... M docs/FAQ :100644 100644 0d435eff... 40025d36... M docs/README.manpages :100644 100644 192c3ff5... a1c9512b... M docs/README.start-devel :100644 100644 308f755c... f01a718e... M docs/TODO :100644 100644 e722c851... 46449095... M docs/m_getfld.c.humor :100644 100644 d7f43af0... eec967ed... M h/fmt_scan.h :100644 100644 610117b9... 1d0508f8... M man/mh-alias.man5 :100644 100644 ed0a2dc6... f450012f... M man/mh-format.man5 :100644 100644 304cbf29... 7a32a41f... M man/mhbuild.man1 :100644 100644 c86d4d5d... 8130fbfb... M sbr/mf.c :100644 100644 f95a758f... 66bb8f1f... M sbr/path.c :100644 100644 6253c233... 91d2b4ed... M sbr/readconfig.c :100644 100644 d195a7cf... 805afeaf... M test/common.sh :100644 100644 9530f2bf... 3de45d74... M test/tests/send/test-mimeify :000000 100644 00000000... e69de29b... A uip/empty :100644 100644 c0f272e0... 08aa533c... M uip/inc.c :100644 100644 ba4428f7... 6ed6037d... M uip/mhbuild.c :100644 100644 aa63f4d7... 0fe638cd... M uip/mhpath.c commit d4bcca1aa235370bc20bc2734c0cd6f700b17871 Author: Dmitry Bogatov AuthorDate: Sat Aug 27 11:40:15 2016 +0300 Commit: Philipp Takacs CommitDate: Sun Aug 28 22:00:27 2016 +0200 Fix missing va_end call in uip/mhmisc.c :100644 100644 eb29e833... 8e20fa93... M uip/mhmisc.c commit 292c381b278f6761440c8f7438488e9cd4377c4a Author: Philipp Takacs AuthorDate: Sat Aug 27 23:17:35 2016 +0200 Commit: Philipp Takacs CommitDate: Sat Aug 27 23:17:35 2016 +0200 Fix misspelled variable in uip/whatnow2.sh This make the error message better :100755 100755 7ddebeaa... 543dbe58... M uip/whatnow2.sh commit 88b2142594d5ea1e8385dae5eca81eed1018c555 Author: Dmitry Bogatov AuthorDate: Sat Aug 27 02:03:28 2016 +0300 Commit: Philipp Takacs CommitDate: Sat Aug 27 23:14:30 2016 +0200 Fix out-of-bounds error when incorporating email from stdin Before this patch, if +inbox is empty, following error happened: $ inc -file - < /dev/null Incorporating new mail into inbox... inc: no messages incorporated, continuing... inc: Bug: message out of bounds This happened due improper call to `seq_setunseen', which implicitly assumed that there is at least one message (it does not handle case where both mp->hghmsg and mh->lowmsg are 0). Bug does not happens with command `inc -file empty', since file is checked for being empty before any read attempts. Signed-off-by: Dmitry Bogatov :100644 100644 d8336503... bd57a2c5... M sbr/seq_setunseen.c :100644 100644 d771d329... 96c4e4ae... M test/tests/inc/test-read-stdin commit 3ba0e8cc826b51f7d8e2d1e3e04557857d13f334 Author: Dmitry Bogatov AuthorDate: Sat Aug 27 11:37:28 2016 +0300 Commit: Philipp Takacs CommitDate: Sat Aug 27 22:39:55 2016 +0200 Fix FILE resource leaks in uip/distsbr.c :100644 100644 058875c5... 2662c02d... M uip/distsbr.c commit c4517caf3df401e6e2faa2b9ecca65f4baef0650 Author: Philipp Takacs AuthorDate: Wed Aug 24 14:46:26 2016 +0200 Commit: Philipp Takacs CommitDate: Wed Aug 24 14:46:26 2016 +0200 add Sendmail option to spost manpage Thanks Dmitry Bogatov :100644 100644 4a704f84... 1e962860... M man/spost.man8 commit c93521777fac4d553a5fe4410ab8fc3e9b9b7ed8 Author: Philipp Takacs AuthorDate: Tue Aug 23 17:04:12 2016 +0200 Commit: Philipp Takacs CommitDate: Tue Aug 23 17:04:12 2016 +0200 add uip/whatnow2 to .gitignore :100644 100644 7b8b03ef... a0972bdb... M .gitignore commit 8efe8c2562030a7d2e7ce99c544e8f0b9fd16cce Author: Philipp Takacs AuthorDate: Mon Aug 15 00:35:23 2016 +0200 Commit: Philipp Takacs CommitDate: Mon Aug 15 00:35:23 2016 +0200 Bump version number :100644 100644 be586341... 52c43259... M VERSION commit b0b3aacb4078ae60a19a31474b191d4475e202d9 Author: Philipp Takacs AuthorDate: Mon Aug 15 00:21:12 2016 +0200 Commit: Philipp Takacs CommitDate: Mon Aug 15 00:21:12 2016 +0200 This is mmh-0.3 :100644 100644 76cec130... 683256d3... M DATE :100644 100644 5a903442... 64ada10f... M NEWS :100644 100644 a4a8ba98... be586341... M VERSION commit 9481ba13dc70acb0b7ab32c0d251ec608532d89b Author: Philipp Takacs AuthorDate: Mon Aug 15 00:11:39 2016 +0200 Commit: Philipp Takacs CommitDate: Mon Aug 15 00:11:39 2016 +0200 fix whatnow2 send in the last commit whatnow2 send was changed to keep the metafile. This don't work with the ``exec send''. Now the send() is renamed to sendfunktion and the ``exec'' is removed. :100755 100755 2e3cf125... 7ddebeaa... M uip/whatnow2.sh commit d272d4a234dad206a18167a2f806ac7628922b19 Author: Philipp Takacs AuthorDate: Sun Aug 14 22:36:55 2016 +0200 Commit: Philipp Takacs CommitDate: Sun Aug 14 22:36:55 2016 +0200 del metafile in whatnow2 only if send don't fail If send fails, you want to keep the metafile. Without this dist wold only work, if send works on the first time. Also some metainfo don't get lost. :100755 100755 00a40e1b... 2e3cf125... M uip/whatnow2.sh commit c26f5c832bd8a7d1a5f4aa5b658c79aae5168704 Author: Philipp Takacs AuthorDate: Sun Aug 14 17:31:50 2016 +0200 Commit: Philipp Takacs CommitDate: Sun Aug 14 17:31:50 2016 +0200 touch the DISTINCLUDE in mmhdist target This avoids rebuilding this files. So autoconf and flex is not need for a normal user. :100644 100644 7ec76736... f93359df... M Makefile.in commit 69aecfa8763593b903e6e180f20343a9d27db078 Author: m@mmmmarascio.xyz AuthorDate: Fri Aug 12 09:00:05 2016 -0700 Commit: Philipp Takacs CommitDate: Fri Aug 12 20:21:53 2016 +0200 Add "delete" to "delete" pattern in whatnow2's case construct The attached patch modifies whatnow2 so that calling `whatnow2 delete` works as may be expected. Without this change, the "delete" function in whatnow2 was called only when whatnow2 was executed as one of the following. * whatnow2 del * whatnow2 dele * whatnow2 delet :100755 100755 4f957e23... 00a40e1b... M uip/whatnow2.sh commit 75efa1e0fba76daa240c3c8b99deaf45fbb09fde Author: Philipp Takacs AuthorDate: Fri Aug 12 18:11:11 2016 +0200 Commit: Philipp Takacs CommitDate: Fri Aug 12 18:11:11 2016 +0200 better error handling in whatnow2 if the command is unknown then usage is printed and if usage is called with an argument other then 0 exit 1 is forced. :100755 100755 dbddb553... 4f957e23... M uip/whatnow2.sh commit 1afb651874175658357df5a065ebcf49ee28705f Author: Philipp Takacs AuthorDate: Fri Aug 12 17:43:05 2016 +0200 Commit: Philipp Takacs CommitDate: Fri Aug 12 17:48:38 2016 +0200 fix bug in decode_rfc2047() If iconv() returns an error and the source encoding is utf-8, the character jump has an of by one: the source string is incresed by one possition more the the length is decreased. :100644 100644 41451398... 687ea577... M sbr/fmt_rfc2047.c commit d40c61859f24a638a770fff091630e5f1f22de2c Author: markus schnalke AuthorDate: Fri Aug 12 10:07:07 2016 +0200 Commit: markus schnalke CommitDate: Fri Aug 12 10:11:48 2016 +0200 Update comment in script concerning the VCS We're not using CVS anymore, but a VCS -- doesn't matter which one. :100755 100755 71a29127... 39cc112f... M autogen.sh commit 57251c0435c8b994c85baf68099ac0e60436444a Author: Philipp Takacs AuthorDate: Thu Aug 11 17:22:49 2016 +0200 Commit: Philipp Takacs CommitDate: Thu Aug 11 17:22:49 2016 +0200 fix dist Because of always mimeify the dist hasn't work anymore. This is fixed by skipping attach() and signandenc(), if it's handled as a redistribution message. :000000 100755 00000000... ced65953... A test/tests/dist/test-dist :100644 100644 9ad124f9... eac15aee... M uip/send.c commit fa3da68dfa43341a8b6722d2e8a787c14cef02b9 Author: markus schnalke AuthorDate: Wed Aug 10 19:25:53 2016 +0200 Commit: markus schnalke CommitDate: Wed Aug 10 19:25:53 2016 +0200 Add more tests to tests/test-send-mimeify :000000 100644 00000000... d6676400... A test/tests/send/amphioctopus-marginatus.png :100644 100644 96e24184... 9530f2bf... M test/tests/send/test-mimeify :000000 100644 00000000... ddeb0d42... A test/tests/send/ulm.txt commit 40c8c8f1fbf8271368b61e70710b25f6b7760a1a Author: m@mmmmarascio.xyz AuthorDate: Mon Aug 8 16:14:50 2016 -0700 Commit: Philipp Takacs CommitDate: Tue Aug 9 13:26:12 2016 +0200 Fix typo in whatnow2 function "display" The attached patch fixes a typo in the whatnow2's "display" function. [ -z instand of [ -n for a check if a variable is empty. :100755 100755 a4a2cc5d... dbddb553... M uip/whatnow2.sh commit 8884262ec2ed546eed9d2bf999b3321b3c6c4903 Author: Philipp Takacs AuthorDate: Sun Aug 7 21:57:30 2016 +0200 Commit: Philipp Takacs CommitDate: Sun Aug 7 21:57:30 2016 +0200 add a test for repl on a ASCII only system This should create the same output as with utf-8. But the Umlaut should be displayed as '?'. This isn't the case at the moment. :100644 100644 145957c0... 4be347cd... M test/tests/repl/test-decode-addr commit f154b393795d008e105ad63570e1f83bcccc6243 Author: m@mmmmarascio.xyz AuthorDate: Sat Aug 6 14:13:18 2016 -0700 Commit: Philipp Takacs CommitDate: Sat Aug 6 23:40:13 2016 +0200 Fix typo in whatnow2.sh command call is done with `command` not "command" :100755 100755 f8778b1b... a4a2cc5d... M uip/whatnow2.sh commit ce96b206f69380c42849be06a708796ee94a1e5e Author: Philipp Takacs AuthorDate: Sat Aug 6 18:08:58 2016 +0200 Commit: Philipp Takacs CommitDate: Sat Aug 6 18:08:58 2016 +0200 Test if MIME creation works Test if send uses mhbuild only, if it is usefull. A message already in MIME-Formate should not cause a fail. :000000 100644 00000000... 96e24184... A test/tests/send/test-mimeify commit 851e352945512424ff9959c6fa4b3e1969063ed2 Author: Philipp Takacs AuthorDate: Sat Aug 6 17:07:11 2016 +0200 Commit: Philipp Takacs CommitDate: Sat Aug 6 17:07:11 2016 +0200 unset MM_CHARSET in tests/scan/test-scan-multibyte If MM_CHARSET is set to anything other then ascii this test probaly fail, but the test is mean to run on a ascii only envirement. :100644 100644 ee3e434c... 0d843c35... M test/tests/scan/test-scan-multibyte commit 60aa1c59ed770abce080f28e8aba133713d140e3 Author: Philipp Takacs AuthorDate: Sat Aug 6 17:05:57 2016 +0200 Commit: Philipp Takacs CommitDate: Sat Aug 6 17:05:57 2016 +0200 Adjust tests/bad-input/test-header for m_gefld2() With the m_gefld2 change mmh ignores more errors. This causes a diffrent behaviour in some cases. :100644 100644 e152e0e7... f0e7a45e... M test/tests/bad-input/test-header commit 6fa7bb89ded1ee5b45d8c0d706db974e92bd546f Author: m@mmmmarascio.xyz AuthorDate: Thu Aug 4 19:15:42 2016 -0700 Commit: Philipp Takacs CommitDate: Sat Aug 6 14:21:03 2016 +0200 Fix tests/mhparam/test-mhparam The behaviour of readconfig() has changed. This causes another behaviour for mhparam. :100644 100644 45e1cb6f... 6253c233... M sbr/readconfig.c :100755 100755 7f21be3a... 4b95500b... M test/tests/mhparam/test-mhparam commit 13b978e9a4118d3de7a418bef4e5cad663e9068f Author: markus schnalke AuthorDate: Fri Aug 5 21:46:55 2016 +0200 Commit: markus schnalke CommitDate: Fri Aug 5 21:53:22 2016 +0200 send: Always MIMEify and pass already MIMIfied drafts through Even if technically not necessary, MIMEify the draft. This simplifies the code at hardly any cost. To still be able to create arbitrary complex MIME structures, make send(1) pass already MIMEified drafts through, without automatically invoking mhbuild(1) on them a second time (which would fail). This way, you can manually invoke mhbuild(1) and afterward call send(1) ... and everything will work just as expected. Also documented this in the man page, and additionally added a paragraph about the signing and encrypting feature of send(1), which wasn't documented yet. :100644 100644 02e64fed... 7367610c... M man/send.man1 :100644 100644 c1665b23... 9ad124f9... M uip/send.c commit f841083f6f8afa8583f92595aa84d381623c9f12 Author: Philipp Takacs AuthorDate: Mon Aug 1 13:14:47 2016 +0200 Commit: Philipp Takacs CommitDate: Fri Aug 5 13:31:22 2016 +0200 mhsign should work now :100755 100755 7654e5f8... 3c2bb97c... M test/tests/mhsign/test-mhsign :100755 100755 f28c0fec... 9d6c747e... M uip/mhsign.sh commit 718f854205f71294706def6688efcb1967cdc34c Author: markus schnalke AuthorDate: Fri Jul 29 11:18:36 2016 +0200 Commit: markus schnalke CommitDate: Thu Aug 4 18:19:01 2016 +0200 Allow send(1) to send from folder other than +drafts This allows having multiple draft folders or queueing drafts for automatic sending. :100644 100644 b4a9fccd... 02e64fed... M man/send.man1 :100644 100644 619ff628... c1665b23... M uip/send.c commit 8a5c71467df0cdfe96b6dcdca94eec5c787fcdf8 Author: Philipp Takacs AuthorDate: Sun Jul 31 00:05:05 2016 +0200 Commit: Philipp Takacs CommitDate: Tue Aug 2 17:45:20 2016 +0200 some small fixes for whatnow2.sh some bugs fixes most found by markus :100755 100755 a4be1a92... f8778b1b... M uip/whatnow2.sh commit a0bb92c9f397eb69914be03d7de16ae8e83e7426 Author: m@mmmmarascio.xyz AuthorDate: Mon Aug 1 11:25:57 2016 +0200 Commit: markus schnalke CommitDate: Mon Aug 1 11:25:57 2016 +0200 Enable inc(1) to read from stdin The -file switch handles the argument "-" special and reads from stdin in this case. :100644 100644 817c1bd8... ed586c1c... M man/inc.man1 :000000 100644 00000000... d771d329... A test/tests/inc/test-read-stdin :100644 100644 0cb2a5e0... c0f272e0... M uip/inc.c commit 501f523802eeaed49dc095c9577a9e5f20447a6d Author: Philipp Takacs AuthorDate: Sat Feb 27 19:58:42 2016 +0100 Commit: Philipp Takacs CommitDate: Sat Jul 30 22:23:12 2016 +0200 add my whatnow replacement whatnow2 whatnow2 is tool which acts like whatnow, but don't trap the user in it. :100644 100644 ffa12037... 9a27e82a... M man/Makefile.in :000000 100644 00000000... a9e1a848... A man/whatnow2.man1 :100644 100644 6b7a570a... d7cad062... M uip/Makefile.in :000000 100755 00000000... a4be1a92... A uip/whatnow2.sh commit 370cd86e50f3348d7ee0cc4a265764d002b15cdc Author: markus schnalke AuthorDate: Fri Jul 29 11:42:59 2016 +0200 Commit: markus schnalke CommitDate: Fri Jul 29 11:42:59 2016 +0200 mhsign/mhpgp: Clarify the manpages and usage lines These tools are shell scripts and thus have a different option processing mechanism than the other mmh tools. Unfortunately, it is limited: Options must come first. Also note that mhpgp accepts a +folder argument, and what the defaults are. :100644 100644 7d5af3b5... afc0c107... M man/mhpgp.man1 :100644 100644 585dcfd2... 85c80b1f... M man/mhsign.man1 :100755 100755 4929358e... ce4d2c87... M uip/mhpgp.sh :100755 100755 94c19f9f... f28c0fec... M uip/mhsign.sh commit e65252ee0baf5060c7300d0814d42aa1ebf16225 Author: markus schnalke AuthorDate: Fri Jul 29 00:28:58 2016 +0200 Commit: markus schnalke CommitDate: Fri Jul 29 00:28:58 2016 +0200 Update manpages send(1) and mh-draft(7) Documented the actual behavior and homogenized the style. :100644 100644 65ae9388... e1ca894e... M man/mh-draft.man7 :100644 100644 34c4a221... b4a9fccd... M man/send.man1 commit 900d7ecb383b331d5fc17bc12c3463a2157cdcd9 Author: Vasily Kolobkov <> AuthorDate: Thu Jun 9 14:30:30 2016 +0200 Commit: Philipp Takacs CommitDate: Thu Jul 21 16:37:05 2016 +0200 Remove extra space from 'From' line when writing to mbox :100644 100644 45451f8b... e1058842... M uip/dropsbr.c commit 4d5de28f500fe48f5aa28cec5e8a5dc3b6eac659 Author: Vasily Kolobkov <> AuthorDate: Mon Jun 6 00:08:14 2016 +0200 Commit: Philipp Takacs CommitDate: Thu Jul 21 16:37:05 2016 +0200 Fix header lookup table setup in slocal(1) :100644 100644 bff4320c... 9306f94b... M uip/slocal.c commit 1fb6287fc4986668e8f49d7c3bdca27d53e267af Author: Dmitry Bogatov AuthorDate: Fri Jul 15 01:39:37 2016 +0300 Commit: Philipp Takacs CommitDate: Tue Jul 19 09:40:19 2016 +0200 simplify whatnow.c/main() function GNU Complexity: 60 -> 59. :100644 100644 65d2fb02... 45671ed3... M uip/whatnow.c commit 49f93810142f22bc3bc86a9ccbe96f1f56b578ac Author: Philipp Takacs AuthorDate: Sun May 8 18:40:51 2016 +0200 Commit: Philipp Takacs CommitDate: Sun May 8 18:40:51 2016 +0200 use old error message :100644 100644 04958388... 48837d76... M uip/scansbr.c commit e78afec69f277159f4b821b02b2280cb05b270bb Author: Philipp Takacs AuthorDate: Sun May 8 18:21:34 2016 +0200 Commit: Philipp Takacs CommitDate: Sun May 8 18:21:34 2016 +0200 don't warn if lenerr is ignored :100644 100644 c2506755... b860dcfa... M uip/mhparse.c :100644 100644 b0205fdf... 7d9c0869... M uip/pick.c :100644 100644 bc7cd43f... ea17b91a... M uip/prompter.c :100644 100644 feef5c04... 04958388... M uip/scansbr.c :100644 100644 26cad52e... bff4320c... M uip/slocal.c :100644 100644 061ae5a4... ff69bc9e... M uip/sortm.c :100644 100644 e02994f1... 7486dd89... M uip/whom.c commit ac3066d2d563ce3b9de66195f6818eecb594fec2 Author: Philipp Takacs AuthorDate: Mon Apr 25 16:19:54 2016 +0200 Commit: Philipp Takacs CommitDate: Sun May 1 19:56:31 2016 +0200 better error handling only warn for LENERR2, or ignore it in some cases :100644 100644 6975d724... 45e1cb6f... M sbr/readconfig.c :100644 100644 67d769ca... c2506755... M uip/mhparse.c :100644 100644 4335892e... efbea043... M uip/new.c :100644 100644 5df2861a... b0205fdf... M uip/pick.c :100644 100644 c7eb9578... bc7cd43f... M uip/prompter.c :100644 100644 f8f9d953... 26cad52e... M uip/slocal.c :100644 100644 56fa7cb5... 061ae5a4... M uip/sortm.c :100644 100644 daca343b... e02994f1... M uip/whom.c commit b16c039dc21faa0d68a0ba45eab857895e82439b Author: Philipp Takacs AuthorDate: Wed Mar 16 03:06:03 2016 +0100 Commit: Philipp Takacs CommitDate: Thu Apr 28 21:52:53 2016 +0200 fork in repl as a tree This fix the bug in the last improvement (pipe mail through show). In the first patch repl only waits for one child, now the tree causes that both childs finished befor repl continues. :100644 100644 9006dec2... 8a405439... M uip/repl.c commit 18b08c1d08cc93b6d86c4e71013e5f8dd3ea103b Author: Philipp Takacs AuthorDate: Sun Apr 24 14:19:05 2016 +0200 Commit: Philipp Takacs CommitDate: Sun Apr 24 14:19:05 2016 +0200 fix 2fb1dd2271e5be9d0b0c9cbd4e7d6d5d51aaecb9 Do a length check in the header, but not in the body. :100644 100644 488a445c... 956a5565... M sbr/m_getfld2.c commit 4cda5cc76d32679825aee226dd407f0b87f3de00 Author: Philipp Takacs AuthorDate: Sun Apr 24 12:39:30 2016 +0200 Commit: Philipp Takacs CommitDate: Sun Apr 24 12:39:49 2016 +0200 fixup for 2a903a43ad7d26f5581d4ad1bbc077f8ecc5f5a9 a spell error hapend in uip/spost.c: state not status :100644 100644 4e9e7cec... 505b94ce... M uip/spost.c commit 2a903a43ad7d26f5581d4ad1bbc077f8ecc5f5a9 Author: Philipp Takacs AuthorDate: Sun Apr 24 12:29:32 2016 +0200 Commit: Philipp Takacs CommitDate: Sun Apr 24 12:29:32 2016 +0200 check for to long lines and ioerror in spost Now spost stop and exit if some error happend. Befor this spost stoped on an error in the body and submitted a half mail. :100644 100644 53ae86a7... 4e9e7cec... M uip/spost.c commit f721c7dba14ce0ed5042b8d212669014952aa324 Author: Philipp Takacs AuthorDate: Sat Apr 23 20:50:43 2016 +0200 Commit: Philipp Takacs CommitDate: Sun Apr 24 12:24:21 2016 +0200 check for linecap and trailing space in mhbuild for text/plain without this a mail with too long lines can be created, or trailing space is removed by mhsign. :100644 100644 fe3e9466... ba4428f7... M uip/mhbuild.c commit bdd3e72e5d8929b420af8fa28565888d39ba9f91 Author: Philipp Takacs AuthorDate: Sat Apr 23 20:48:45 2016 +0200 Commit: Philipp Takacs CommitDate: Sun Apr 24 12:24:21 2016 +0200 ignore LENERR2 in seq_read() this is unnecessary and brings problems because sequences aren't created with a linecap. :100644 100644 1fdccf96... 041f6327... M sbr/seq_read.c commit 2fb1dd2271e5be9d0b0c9cbd4e7d6d5d51aaecb9 Author: Philipp Takacs AuthorDate: Sat Apr 23 20:46:20 2016 +0200 Commit: Philipp Takacs CommitDate: Sun Apr 24 12:24:21 2016 +0200 adjust handling of too long lines in m_getfld2 Now a field is complete read, if a line is to long. Also no length check is done in the body, because the caller can check f.valuelength. :100644 100644 45172aa2... 488a445c... M sbr/m_getfld2.c commit 5cf93efd16ee663ed0f680b503b71beec1783191 Author: markus schnalke AuthorDate: Sun Apr 24 10:59:10 2016 +0200 Commit: markus schnalke CommitDate: Sun Apr 24 10:59:10 2016 +0200 Fix for commit bd02210b2be64956a952f925a2dcd35fb42f6136 :100755 100755 17b74893... 94c19f9f... M uip/mhsign.sh commit bd02210b2be64956a952f925a2dcd35fb42f6136 Author: markus schnalke AuthorDate: Fri Apr 22 12:46:33 2016 +0200 Commit: markus schnalke CommitDate: Fri Apr 22 12:46:33 2016 +0200 mhsign: Fix key lookup of aliases when encrypting Now mhsign can handle addresses that contain whitespace (e.g. ``markus schnalke '') in aliases. The helper tool ap(1) is used to extract the actual addresses. :000000 100755 00000000... 7654e5f8... A test/tests/mhsign/test-mhsign :100644 100644 be02b670... 6b7a570a... M uip/Makefile.in :100755 100755 038052b3... 17b74893... M uip/mhsign.sh commit a8984c0e490cda653615bc0e1d4743ad8fe7a2a7 Author: markus schnalke AuthorDate: Thu Apr 21 16:43:25 2016 +0200 Commit: markus schnalke CommitDate: Thu Apr 21 16:43:25 2016 +0200 refile: Never change the current folder Refile is different to all other tools, as its +folder arguments are destination folders, not source folders (it even supports multiple of them). A source folder can be specified with -src. Refile used to change the current folder to the source folder. It does not do so anymore. Most often the current folder is used as the source folder; this is the default. Hence changing the current folder is a no-op. But if one refiles from some other source folder, changing to that folder is seldom useful. Consider the scenario where one wants to collect the last messages of a set of folders in some other folder. The old behavior required to know where you are to collect the messages, because after the first refile you'd be somewhere else: for i in one two three ; do refile -src +$i l +lastmsgs done # now we are in +three, hence go back where we were folder +lastmsgs The new behavior allows to move the messages just here (@), no matter where that is: for i in one two three ; do refile -src +one l @ done # now we still are where we were Refiling actions do no more affect the current folder, hence one may securely refile with different -src +folder many times in one row, without having to care for changing locations. :100644 100644 a82d1da9... b19b1c0e... M man/refile.man1 :000000 100755 00000000... 9dd852ae... A test/tests/refile/test-refile :100644 100644 4e1d065f... 182f315e... M uip/refile.c commit 3244935a74559715749a60c03e7b608a227e0438 Author: markus schnalke AuthorDate: Thu Apr 21 16:03:23 2016 +0200 Commit: markus schnalke CommitDate: Thu Apr 21 16:03:23 2016 +0200 refile: Fix an error message; always use braces; add/remove comments :100644 100644 e75deb9f... 4e1d065f... M uip/refile.c commit f3575c51862ea3ef58aa9acae72505054d510143 Author: markus schnalke AuthorDate: Wed Apr 20 09:02:06 2016 +0200 Commit: markus schnalke CommitDate: Thu Apr 21 10:07:59 2016 +0200 Fix order of (trim) and (decode) in repl*comps Before MH had (decode), the format escapes used to be: %(void{comp})%(trim)%(putstr) i.e. set the internal str register to the component text, trim trailing whitespace from it, then print the value. Later (putstr) was simply replaced by (decode), which first RFC-2047 decodes the string and then prints it (if it is the outermost function). That almost always produced the correct result. But this way the whitespace trimming is done at the wrong point. Correct is to first decode the string and then trim it. tests/scan/test-mh-format checks for that. :100644 100644 5c981428... 52307007... M etc/replcomps :100644 100644 ffbe6ff9... 09d63606... M etc/replgroupcomps :100644 100644 20b3937b... ed0a2dc6... M man/mh-format.man5 commit 72d6c7764974246384bb5daa7cc8b4f0a516621b Author: markus schnalke AuthorDate: Wed Apr 20 08:54:20 2016 +0200 Commit: markus schnalke CommitDate: Thu Apr 21 10:07:59 2016 +0200 Trim trailing whitespace in scan and show This commit fixes the most common scan listings. Still trailing whitespace will be generated by legacy scan listings. The formatfield workaround in etc/mhl.headers is a bit clumsy. Maybe, an mhl variable should be defined for this case ... or better not, to keep the mh-format and the mhl functions orthogonal. :100644 100644 a3988379... 87a7752f... M etc/mhl.headers :100644 100644 902998ab... 40a05547... M etc/scan.default :100644 100644 c809e3b2... 90011481... M etc/scan.meillo :000000 100644 00000000... 27719347... A test/tests/scan/test-mh-format commit e2550f03c9679b6fcc5240f9cda48bd5a9951e3a Author: markus schnalke AuthorDate: Wed Apr 20 08:19:24 2016 +0200 Commit: markus schnalke CommitDate: Thu Apr 21 10:07:59 2016 +0200 Make default scan/inc listing file-based There's now a new format file etc/scan.default, which contains the default scan listing. Previously it was hard-coded as a define in h/scansbr.h. The default scan listing format can be set in config/config.h and can be queried with `mhparam scanformat'. :100644 100644 2bf7325b... 5e250414... M config/config.c :100644 100644 da3bb51a... fd00e0de... M etc/Makefile.in :000000 100644 00000000... 902998ab... A etc/scan.default :100644 100644 33b38eef... a5a12ce2... M h/mh.h :100644 100644 91b2ff67... 5e5816d9... M h/scansbr.h :100644 100644 5266235a... a91333b7... M uip/fmtdump.c :100644 100644 1523a2c3... 36e0ab1a... M uip/inc.c :100644 100644 76fe4279... 29d4170d... M uip/mhparam.c :100644 100644 dc54bf07... 671509af... M uip/scan.c commit 102d1d8f2f783d7daa43c4b933bac85fc8de7fab Author: markus schnalke AuthorDate: Tue Apr 19 16:15:10 2016 +0200 Commit: markus schnalke CommitDate: Tue Apr 19 16:15:10 2016 +0200 Cleanup manpage mh-format(5) - More suitable scan listing examples - Adjust paths - There are no ``local mh experts'' anymore in the mmh world - Add overview on the escape types - %(decode) does print str as well - Decode Subject header in the example - Further minor stuff :100644 100644 5fe3451f... 20b3937b... M man/mh-format.man5 commit 09f632a7c9e4eea0a02c7ec0f66c8a2f9b10aed7 Author: markus schnalke AuthorDate: Mon Apr 18 09:13:15 2016 +0200 Commit: markus schnalke CommitDate: Mon Apr 18 09:13:15 2016 +0200 Enable addr decoding in replcomps and replgroupcomps :100644 100644 f5cc117e... 3d1fd717... M etc/rcvdistcomps :100644 100644 87532bac... 5c981428... M etc/replcomps :100644 100644 ae55a7b8... ffbe6ff9... M etc/replgroupcomps :000000 100644 00000000... 145957c0... A test/tests/repl/test-decode-addr commit 2a2c5381369629d0f068681571bc667215e44742 Author: markus schnalke AuthorDate: Mon Apr 18 08:47:17 2016 +0200 Commit: markus schnalke CommitDate: Mon Apr 18 08:47:17 2016 +0200 Tests: mmh currently generates a part line, so expect it :100644 100644 7d6604b1... b23d498d... M test/tests/repl/test-if-str commit b6823062c9806496b39ff12bf1fbe43ae127c96c Author: Dmitry Bogatov AuthorDate: Wed Apr 13 21:36:29 2016 +0300 Commit: Philipp Takacs CommitDate: Sat Apr 16 23:28:53 2016 +0200 Fix spelling and encoding errors in manpages and an error message :100644 100644 a7794885... 65ae9388... M man/mh-draft.man7 :100644 100644 014a4174... 5fe3451f... M man/mh-format.man5 :100644 100644 98fb39da... 304cbf29... M man/mhbuild.man1 :100644 100644 281037a5... 4a821bf9... M man/mhstore.man1 :100644 100644 4d701c6e... e4738dbe... M man/prompter.man1 :100644 100644 fcbeee44... 7cc41106... M man/repl.man1 :100644 100644 5c472109... 94bd33c0... M man/show.man1 :100644 100644 72ee22d0... 29a067d6... M man/sortm.man1 :100644 100644 aacb6336... ce3e6843... M uip/spost.c commit 90534bb281c5063ab582be42e253ee444b443426 Author: Jan Düpmeier AuthorDate: Wed Apr 13 18:22:37 2016 +0200 Commit: Philipp Takacs CommitDate: Wed Apr 13 18:22:37 2016 +0200 test also libtinfo for modf Some Gentoo instalations has this instand of ncurses :100644 100644 653acf0a... ad45c152... M configure.ac commit 9cf6132a6ea29968131a000bc2fb6860affac45e Author: m@mmmmarascio.xyz AuthorDate: Sun Apr 3 21:33:34 2016 -0700 Commit: Philipp Takacs CommitDate: Sat Apr 9 17:05:14 2016 +0200 Replace getcpy() and strdup() with mh_xstrdup() this harmonise the code. Also fix some bugs, if return value of strdup is not checked. :100644 100644 a439680d... 308f755c... M docs/TODO :100644 100644 8575b226... 8455b38d... M h/prototypes.h :100644 100644 60cc34cc... c0d28351... M h/utils.h :100644 100644 51049c70... 77c0c1b6... M sbr/Makefile.in :100644 100644 b2e11769... db5b42e6... M sbr/addrsbr.c :100644 100644 4475ca08... cfdcff27... M sbr/context_read.c :100644 100644 1b39b278... bfa3daf8... M sbr/context_replace.c :100644 100644 3841b976... 71646162... M sbr/crawl_folders.c :100644 100644 c89a195d... 25c0e168... M sbr/fmt_addr.c :100644 100644 f4d92d29... 566f6209... M sbr/fmt_compile.c :100644 100644 6dcc70b3... c1386d4c... M sbr/fmt_new.c :100644 100644 1eeee00a... 722ee2fd... M sbr/folder_read.c :100644 100644 33db7f76... e8da9849... M sbr/getarguments.c :100644 000000 67375bbc... 00000000... D sbr/getcpy.c :100644 100644 b8d385f9... ee857900... M sbr/m_draft.c :100644 100644 ec97e1e2... 2fe2d7d3... M sbr/readconfig.c :100644 100644 1ceb4216... e76bcc6a... M sbr/seq_read.c :100644 100644 aecbea6b... f4304cc5... M sbr/seq_setprev.c :100644 100644 73bd83dc... d8336503... M sbr/seq_setunseen.c :100644 100644 0d7f58a8... ffa6b575... M sbr/trimcpy.c :100644 100644 f61456d6... 466b9aba... M sbr/utils.c :100644 100644 d6a480cd... 9ab6515e... M uip/ali.c :100644 100644 1ed527fb... b00f51bc... M uip/aliasbr.c :100644 100644 81ad042b... 9e287be4... M uip/anno.c :100644 100644 041abf14... 9d356018... M uip/ap.c :100644 100644 eb2fb7a7... a68420a1... M uip/burst.c :100644 100644 159d7e76... c34ce43f... M uip/comp.c :100644 100644 07107127... d74e498b... M uip/dist.c :100644 100644 f7e5ba38... 63fcb0f5... M uip/flist.c :100644 100644 c8b3c60d... 3e3cd760... M uip/folder.c :100644 100644 5b577bda... d8d69f78... M uip/forw.c :100644 100644 cbbec1be... 1523a2c3... M uip/inc.c :100644 100644 a6ac480e... 1e57d1cc... M uip/mark.c :100644 100644 4ff06efd... 0f77f337... M uip/mhbuild.c :100644 100644 ddf32ec6... e4e8dbf3... M uip/mhl.c :100644 100644 72dc9ed2... c9194cc0... M uip/mhlist.c :100644 100644 46b0d4cc... dd6264bf... M uip/mhlistsbr.c :100644 100644 1515858b... 06630b3b... M uip/mhmail.c :100644 100644 f04a3482... 71c1e8e2... M uip/mhparse.c :100644 100644 c400fa6d... aa63f4d7... M uip/mhpath.c :100644 100644 dc5c2020... e39bf65a... M uip/mhshow.c :100644 100644 62988699... c7923c87... M uip/mhshowsbr.c :100644 100644 4f845702... adaca774... M uip/mhstore.c :100644 100644 0fa97414... cecf2ee5... M uip/mhtest.c :100644 100644 25ee492b... 5bc71366... M uip/new.c :100644 100644 c81db88d... a8c2c421... M uip/packf.c :100644 100644 0465ef51... 1df59b18... M uip/pick.c :100644 100644 e3c38cda... f3caa500... M uip/rcvdist.c :100644 100644 9c842701... 5fd9ae06... M uip/rcvstore.c :100644 100644 ab5d55f8... e75deb9f... M uip/refile.c :100644 100644 505160ec... e3028fad... M uip/repl.c :100644 100644 64ee68c7... e435a276... M uip/rmf.c :100644 100644 3237debd... 99820e94... M uip/rmm.c :100644 100644 e5958574... dc54bf07... M uip/scan.c :100644 100644 d7cf204c... 619ff628... M uip/send.c :100644 100644 17a1d365... 18c4a582... M uip/slocal.c :100644 100644 8f1d2ea6... 0c5511de... M uip/sortm.c :100644 100644 e2b5a882... aacb6336... M uip/spost.c :100644 100644 4b45a0c4... 65d2fb02... M uip/whatnow.c :100644 100644 27c8d91b... b987356f... M uip/whom.c commit 4cc601f996579386ce4f4937b9b72b7b3d891107 Author: Philipp Takacs AuthorDate: Sun Jan 31 19:47:23 2016 +0100 Commit: Philipp Takacs CommitDate: Sat Mar 26 16:20:15 2016 +0100 simple mbox support for rcvstore Some MTA(opensmtpd) add a ``From '' line ad the head of mails befor handling the mail to a .forwoad MDA. m_getfld2 don't support such mails, so rcvstore should handle this mbox-like mails. :100644 100644 9c842701... 5c7f9d82... M uip/rcvstore.c commit d4c34b4439a9dbd89664de460ed37ecddc260fb1 Author: m@mmmmarascio.xyz AuthorDate: Mon Mar 21 20:28:44 2016 -0700 Commit: Philipp Takacs CommitDate: Fri Mar 25 23:26:18 2016 +0100 Replace free() with mh_free0() mh_free0() free's the memmory and set's the pointer to NULL after the free. This avoids doublefree and dereferenc of a non valid poiter. :100644 100644 35d08331... 60cc34cc... M h/utils.h :100644 100644 dc3924bf... b2e11769... M sbr/addrsbr.c :100644 100644 7d068b5c... 96610506... M sbr/context_del.c :100644 100644 5b7c7775... 4475ca08... M sbr/context_read.c :100644 100644 0a31bba8... 1b39b278... M sbr/context_replace.c :100644 100644 2e1a094a... 3841b976... M sbr/crawl_folders.c :100644 100644 844f0c46... 4e4cbefb... M sbr/encode_rfc2047.c :100644 100644 85ed7d74... f4d92d29... M sbr/fmt_compile.c :100644 100644 874129aa... 6dcc70b3... M sbr/fmt_new.c :100644 100644 0932e341... 41451398... M sbr/fmt_rfc2047.c :100644 100644 2930254e... 8da713ef... M sbr/folder_free.c :100644 100644 1c68d0d5... 1eeee00a... M sbr/folder_read.c :100644 100644 bfdc44f5... 64a66409... M sbr/folder_realloc.c :100644 100644 07302e5b... 957bc4e8... M sbr/lock_file.c :100644 100644 549e89b6... b8d385f9... M sbr/m_draft.c :100644 100644 7c6f004c... c86d4d5d... M sbr/mf.c :100644 100644 c99b7cd1... ec97e1e2... M sbr/readconfig.c :100644 100644 b932cadc... 1ceb4216... M sbr/seq_read.c :100644 100644 c66c1328... aecbea6b... M sbr/seq_setprev.c :100644 100644 e6283932... 73bd83dc... M sbr/seq_setunseen.c :100644 100644 2744581c... f61456d6... M sbr/utils.c :100644 100644 dc2a3414... d6a480cd... M uip/ali.c :100644 100644 1fbcc7a5... 1ed527fb... M uip/aliasbr.c :100644 100644 66e62c52... 81ad042b... M uip/anno.c :100644 100644 5b9677fd... 041abf14... M uip/ap.c :100644 100644 119a936a... eb2fb7a7... M uip/burst.c :100644 100644 d1b94749... a600b77b... M uip/distsbr.c :100644 100644 b4758cf4... c8b3c60d... M uip/folder.c :100644 100644 243c9181... 5b577bda... M uip/forw.c :100644 100644 368bce3f... cbbec1be... M uip/inc.c :100644 100644 ca7c5bf8... 4ff06efd... M uip/mhbuild.c :100644 100644 c8730669... 5378c35c... M uip/mhfree.c :100644 100644 6f87d623... ddf32ec6... M uip/mhl.c :100644 100644 46090128... 72dc9ed2... M uip/mhlist.c :100644 100644 2a4f5041... 46b0d4cc... M uip/mhlistsbr.c :100644 100644 0f0a8d60... eb29e833... M uip/mhmisc.c :100644 100644 d3f543fb... f04a3482... M uip/mhparse.c :100644 100644 691ef8c3... dc5c2020... M uip/mhshow.c :100644 100644 aeaf0e8e... 62988699... M uip/mhshowsbr.c :100644 100644 519991ff... 4f845702... M uip/mhstore.c :100644 100644 5b9f669f... 0fa97414... M uip/mhtest.c :100644 100644 9774729a... 25ee492b... M uip/new.c :100644 100644 b12597b2... 0465ef51... M uip/pick.c :100644 100644 59ffdf2c... e3c38cda... M uip/rcvdist.c :100644 100644 a67b1505... ab5d55f8... M uip/refile.c :100644 100644 cd0f6beb... 505160ec... M uip/repl.c :100644 100644 230360b8... 64ee68c7... M uip/rmf.c :100644 100644 0f755ca2... e5958574... M uip/scan.c :100644 100644 ca267fa5... 17a1d365... M uip/slocal.c :100644 100644 470fa8b3... 8f1d2ea6... M uip/sortm.c :100644 100644 a4c170bf... e2b5a882... M uip/spost.c :100644 100644 d313f056... 27c8d91b... M uip/whom.c commit b78007de9802005825390bee71dfce2306b42519 Author: m@mmmmarascio.xyz AuthorDate: Thu Mar 17 08:16:26 2016 -0700 Commit: Philipp Takacs CommitDate: Fri Mar 25 14:44:28 2016 +0100 remove unnecessary casts These casts after malloc just make the code harder to read :100644 100644 96fa72f0... dc3924bf... M sbr/addrsbr.c :100644 100644 acbba6a9... a9446fef... M sbr/brkstring.c :100644 100644 2c3bc189... 0a31bba8... M sbr/context_replace.c :100644 100644 096f7dd6... 85ed7d74... M sbr/fmt_compile.c :100644 100644 c3b1ea27... 874129aa... M sbr/fmt_new.c :100644 100644 e9db55eb... 0932e341... M sbr/fmt_rfc2047.c :100644 100644 67775f1b... 1c68d0d5... M sbr/folder_read.c :100644 100644 a7004436... 33db7f76... M sbr/getarguments.c :100644 100644 77564a16... 67375bbc... M sbr/getcpy.c :100644 100644 3aa00301... 07302e5b... M sbr/lock_file.c :100644 100644 6931b2eb... 1ec09a4e... M sbr/m_getfld.c :100644 100644 3134328b... 7c6f004c... M sbr/mf.c :100644 100644 54c40684... c47f26ea... M sbr/putenv.c :100644 100644 747aedea... c99b7cd1... M sbr/readconfig.c :100644 100644 241c7206... 3606f6f3... M sbr/seq_list.c :100644 100644 f964e7e3... 2744581c... M sbr/utils.c :100644 100644 1718ff19... 1ddd99b9... M sbr/vfgets.c :100644 100644 744d3bf1... 1fbcc7a5... M uip/aliasbr.c :100644 100644 96b896c4... 66e62c52... M uip/anno.c :100644 100644 e2d43dab... 5b9677fd... M uip/ap.c :100644 100644 04e5450a... 119a936a... M uip/burst.c :100644 100644 d2433a20... f7e5ba38... M uip/flist.c :100644 100644 77339b30... 243c9181... M uip/forw.c :100644 100644 76826c32... ca7c5bf8... M uip/mhbuild.c :100644 100644 15489ff6... 6f87d623... M uip/mhl.c :100644 100644 6d7b8e7a... 46090128... M uip/mhlist.c :100644 100644 3522a97b... d3f543fb... M uip/mhparse.c :100644 100644 bb03939c... 691ef8c3... M uip/mhshow.c :100644 100644 fae054fa... 519991ff... M uip/mhstore.c :100644 100644 dd456263... 5b9f669f... M uip/mhtest.c :100644 100644 320db198... b12597b2... M uip/pick.c :100644 100644 deeccb88... 59ffdf2c... M uip/rcvdist.c :100644 100644 fa1a7b46... cd0f6beb... M uip/repl.c :100644 100644 896497fd... 3237debd... M uip/rmm.c :100644 100644 ed163f3e... 877bdef2... M uip/scansbr.c :100644 100644 d47ba8ea... d7cf204c... M uip/send.c :100644 100644 06ec0cac... 470fa8b3... M uip/sortm.c commit 10eff860a28b96582526eb739fd0a55441669938 Author: m@mmmmarascio.xyz AuthorDate: Mon Mar 14 09:29:35 2016 -0700 Commit: Philipp Takacs CommitDate: Thu Mar 17 14:48:04 2016 +0100 Replace mh_xmalloc() with mh_xcalloc() calloc() is safer, because it initialize the memory to zero. :100644 100644 6f74c325... 35d08331... M h/utils.h :100644 100644 205c8c9e... acbba6a9... M sbr/brkstring.c :100644 100644 4a57656f... 9efe7318... M sbr/concat.c :100644 100644 dd6e6314... 2c3bc189... M sbr/context_replace.c :100644 100644 47327edd... 2e1a094a... M sbr/crawl_folders.c :100644 100644 852c2613... 844f0c46... M sbr/encode_rfc2047.c :100644 100644 c7379b10... c89a195d... M sbr/fmt_addr.c :100644 100644 9a7988eb... c3b1ea27... M sbr/fmt_new.c :100644 100644 faa3cc2c... e9db55eb... M sbr/fmt_rfc2047.c :100644 100644 ec51d64e... 67775f1b... M sbr/folder_read.c :100644 100644 47b9281e... bfdc44f5... M sbr/folder_realloc.c :100644 100644 14c9a23d... a7004436... M sbr/getarguments.c :100644 100644 478986a9... 77564a16... M sbr/getcpy.c :100644 100644 7309c868... 3aa00301... M sbr/lock_file.c :100644 100644 826cfb3f... 6931b2eb... M sbr/m_getfld.c :100644 100644 633522b8... 3134328b... M sbr/mf.c :100644 100644 a2ec7d3a... 54c40684... M sbr/putenv.c :100644 100644 bc9329f4... 747aedea... M sbr/readconfig.c :100644 100644 148ecb90... 241c7206... M sbr/seq_list.c :100644 100644 fa4cfdb2... f964e7e3... M sbr/utils.c :100644 100644 3e71ad0b... 1718ff19... M sbr/vfgets.c :100644 100644 bda73261... 744d3bf1... M uip/aliasbr.c :100644 100644 1c971791... 96b896c4... M uip/anno.c :100644 100644 68acabb1... d2433a20... M uip/flist.c :100644 100644 4ffb9f5b... b4758cf4... M uip/folder.c :100644 100644 4bb03d34... 77339b30... M uip/forw.c :100644 100644 6989c705... 15489ff6... M uip/mhl.c :100644 100644 b7b86940... 3522a97b... M uip/mhparse.c :100644 100644 cb16dea2... 9774729a... M uip/new.c :100644 100644 53cc0f0c... deeccb88... M uip/rcvdist.c :100644 100644 f1e4bcc4... fa1a7b46... M uip/repl.c :100644 100644 f99dcbc7... 896497fd... M uip/rmm.c :100644 100644 d985a5ca... ed163f3e... M uip/scansbr.c :100644 100644 df813401... d47ba8ea... M uip/send.c :100644 100644 5d15ed68... 06ec0cac... M uip/sortm.c :100644 100644 4a24fc4b... a4c170bf... M uip/spost.c commit d6742b1bb19c7eca8488402484a6e4f55543d789 Author: m@mmmmarascio.xyz AuthorDate: Sun Mar 13 08:49:35 2016 -0700 Commit: Philipp Takacs CommitDate: Sun Mar 13 20:04:02 2016 +0100 Call context_read() before getting filter in repl The manual page of repl says "[i]f a file named `mhl.reply' exists in the user's mmh directory, it will be used instead of [the default form file]". Now this behavior is implement. :100644 100644 71ae98e7... f1e4bcc4... M uip/repl.c commit 1646b692af15ca4aac6d2c77fa72f63a18515215 Author: Philipp Takacs AuthorDate: Sat Feb 27 15:45:26 2016 +0100 Commit: Philipp Takacs CommitDate: Sat Feb 27 15:45:26 2016 +0100 check return value of m_getfld2 befor using the field this bug causes a segfault, because the field.value is a nullptr if FILEEOF2 is returned. :100644 100644 9c20fdad... 058875c5... M uip/distsbr.c commit e9df3f1a429daaca00025e76ce8850d104311ee1 Author: Philipp Takacs AuthorDate: Sun Jan 17 14:19:11 2016 +0100 Commit: Philipp Takacs CommitDate: Fri Jan 22 22:57:29 2016 +0100 pipe mail throu show on repl now repl works as expected for MIME-messages :100644 100644 f5df9ecb... 71ae98e7... M uip/repl.c commit 27f39f1e62375fdd22f4cecab4883b0ad764b361 Author: m@mmmmarascio.xyz AuthorDate: Thu Jan 14 14:41:26 2016 -0700 Commit: Philipp Takacs CommitDate: Sat Jan 16 22:58:14 2016 +0100 Add existing "From:" to Bcc-ed messages. If you use multible mailboxes, the correct one is now used for Bcc-messages. :100644 100644 7729e9bb... 4a24fc4b... M uip/spost.c commit 8523e64e0de904a09689c67b8681d1fcdb6405a0 Author: Philipp Takacs AuthorDate: Thu Jan 7 14:23:34 2016 +0100 Commit: Philipp Takacs CommitDate: Thu Jan 7 14:23:34 2016 +0100 fix profile path in mhl(1) :100644 100644 3a740dfd... a80d6bf0... M man/mhl.man1 commit 176905cd5ed51f8280fbf4bc81ad2cf3d01149ea Author: m@mmmmarascio.xyz AuthorDate: Mon Jan 4 19:47:00 2016 -0700 Commit: Philipp Takacs CommitDate: Thu Jan 7 14:21:51 2016 +0100 Change some "nmh" into "mmh" in man pages This is to avoid confusion between nmh and mmh :100644 100644 c96770ce... ad41a922... M man/ap.man8 :100644 100644 b19c50b9... caf695ea... M man/dp.man8 :100644 100644 6156c395... 046c2de8... M man/fmtdump.man8 :100644 100644 704809d8... be903be0... M man/folder.man1 :100644 100644 8091c423... 220a7f02... M man/forw.man1 :100644 100644 73c0346c... 817c1bd8... M man/inc.man1 :100644 100644 dacf4ce2... ba19506a... M man/mark.man1 :100644 100644 e05358a1... 610117b9... M man/mh-alias.man5 :100644 100644 b721aa6a... a7794885... M man/mh-draft.man7 :100644 100644 e86e9ce6... 014a4174... M man/mh-format.man5 :100644 100644 9b3334da... 9d06dfcd... M man/mh-mail.man5 :100644 100644 dd051b78... cd8e2401... M man/mh-profile.man5 :100644 100644 4e4b4438... 0ad2c4a4... M man/mh-sequence.man7 :100644 100644 37577f8c... 3a740dfd... M man/mhl.man1 :100644 100644 80bdccad... 90f46cc8... M man/mhlist.man1 :100644 100644 acecbbc8... 423ddd64... M man/mhmail.man1 :100644 100644 11a1346f... 9cd39fbb... M man/mhparam.man1 :100644 100644 d5d3327d... 17295650... M man/mhpath.man1 :100644 100644 e4fdfdce... 281037a5... M man/mhstore.man1 :100644 100644 c07204a5... 337c9a90... M man/packf.man1 :100644 100644 42971fec... 6f5a0ce1... M man/pick.man1 :100644 100644 c9c64b99... 5cae3e39... M man/rcvstore.man1 :100644 100644 47f825be... a82d1da9... M man/refile.man1 :100644 100644 698d9c82... fcbeee44... M man/repl.man1 :100644 100644 7dccb69f... d2f50f76... M man/rmf.man1 :100644 100644 997ade20... 2a25d18c... M man/scan.man1 :100644 100644 d4f90d16... 5c472109... M man/show.man1 :100644 100644 f6c78d45... 8779c0c0... M man/slocal.man1 :100644 100644 e13fbfd3... d0fea84e... M man/whatnow.man1 commit 8c6b463904e23df6025727207d5ffd012c8dd0cb Author: Philipp Takacs AuthorDate: Sun Dec 13 17:20:33 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Dec 13 17:20:33 2015 +0100 Use boolean instand of bool :100644 100644 18ad8128... 45172aa2... M sbr/m_getfld2.c commit cdb32d069bdcb6fa04ca7e3d87240442665611b0 Author: Philipp Takacs AuthorDate: Sun Dec 13 17:14:38 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Dec 13 17:14:38 2015 +0100 Revert "add free_field as standard for struct field" This is not necesary, because the compieler have to take care about NULL != (void*)0 This reverts commit a87df3543d3bc128ba4079d1f95638476ba5ca50. :100644 100644 481f2f1c... 8f6fad1d... M h/mh.h :100644 100644 74d25e4e... 18ad8128... M sbr/m_getfld2.c :100644 100644 645a9efe... ccdf867c... M sbr/readconfig.c :100644 100644 68351acb... 1929b263... M sbr/seq_read.c :100644 100644 21b42a5c... 9c20fdad... M uip/distsbr.c :100644 100644 c4b1c607... ec5623a6... M uip/mhbuild.c :100644 100644 20f5d31f... 8becba9b... M uip/mhl.c :100644 100644 04333f49... 257bc66e... M uip/mhparse.c :100644 100644 60bb8063... a2be29bf... M uip/new.c :100644 100644 03af15aa... 993527b4... M uip/pick.c :100644 100644 c715cb71... c7eb9578... M uip/prompter.c :100644 100644 b54bc399... 8292a20b... M uip/rcvdist.c :100644 100644 bbc3cfe8... d71f27b3... M uip/repl.c :100644 100644 8281c7bc... 50b250e5... M uip/scansbr.c :100644 100644 3b5007db... c3b45e87... M uip/slocal.c :100644 100644 6d45d35d... 61953e17... M uip/sortm.c :100644 100644 b8ae5629... 04479a1f... M uip/spost.c :100644 100644 c4e7e8f8... a72c84f0... M uip/whom.c commit 02ad941fcb6ccc24fab97dff24a8f5253ab7e538 Author: Philipp Takacs AuthorDate: Fri Nov 27 11:59:03 2015 +0100 Commit: Philipp Takacs CommitDate: Fri Nov 27 11:59:03 2015 +0100 fix lengthcheck in m_getfld2() The lenght check akcepted to big field names :100644 100644 6545d0f7... 74d25e4e... M sbr/m_getfld2.c commit fc1b00d424f47972a8311b3706304258e111d8d4 Author: Philipp Takacs AuthorDate: Fri Nov 27 11:54:24 2015 +0100 Commit: Philipp Takacs CommitDate: Fri Nov 27 11:54:24 2015 +0100 fix segfault in prompter This was necesary because m_getfld2() clears now f.value if FILEEOF2 is reached :100644 100644 21ec5ced... c715cb71... M uip/prompter.c commit a87df3543d3bc128ba4079d1f95638476ba5ca50 Author: Philipp Takacs AuthorDate: Thu Nov 26 23:24:18 2015 +0100 Commit: Philipp Takacs CommitDate: Fri Nov 27 02:01:17 2015 +0100 add free_field as standard for struct field this is a easy way to initializ a struct field. ``{{0}}'' can lead to bugs, because NULL is not necesary ``((void *)0)'' :100644 100644 8f6fad1d... 481f2f1c... M h/mh.h :100644 100644 cd1c6bea... 6545d0f7... M sbr/m_getfld2.c :100644 100644 ccdf867c... 645a9efe... M sbr/readconfig.c :100644 100644 1929b263... 68351acb... M sbr/seq_read.c :100644 100644 9c20fdad... 21b42a5c... M uip/distsbr.c :100644 100644 ec5623a6... c4b1c607... M uip/mhbuild.c :100644 100644 8becba9b... 20f5d31f... M uip/mhl.c :100644 100644 257bc66e... 04333f49... M uip/mhparse.c :100644 100644 a2be29bf... 60bb8063... M uip/new.c :100644 100644 993527b4... 03af15aa... M uip/pick.c :100644 100644 24f2d9f0... 21ec5ced... M uip/prompter.c :100644 100644 8292a20b... b54bc399... M uip/rcvdist.c :100644 100644 d71f27b3... bbc3cfe8... M uip/repl.c :100644 100644 50b250e5... 8281c7bc... M uip/scansbr.c :100644 100644 c3b45e87... 3b5007db... M uip/slocal.c :100644 100644 61953e17... 6d45d35d... M uip/sortm.c :100644 100644 04479a1f... b8ae5629... M uip/spost.c :100644 100644 a72c84f0... c4e7e8f8... M uip/whom.c commit bf1c715de0935bc1a472925fcf80be70b30d2724 Author: Philipp Takacs AuthorDate: Thu Nov 26 23:07:12 2015 +0100 Commit: Philipp Takacs CommitDate: Fri Nov 27 02:01:17 2015 +0100 m_getfld2 is more tranceparent on error now all read content of the file is given to the caller, so he can possible fix this error. :100644 100644 a2b8ae9a... cd1c6bea... M sbr/m_getfld2.c commit d0d56900365f8088ac1fcfea53183ba2f34c705f Author: Philipp Takacs AuthorDate: Sat Nov 21 12:20:36 2015 +0100 Commit: Philipp Takacs CommitDate: Fri Nov 27 02:01:14 2015 +0100 make m_getfld2() aware of CRLF lineendings :100644 100644 970a3f03... a2b8ae9a... M sbr/m_getfld2.c commit 2c31657cf61e7fe818571f3c60f168d3210988ab Author: Philipp Takacs AuthorDate: Sat Nov 21 12:16:01 2015 +0100 Commit: Philipp Takacs CommitDate: Sat Nov 21 12:53:47 2015 +0100 make m_getfld2() called with an error state a noop This probduce some code dublication, but the will be reduced, if we make m_getfld2() more transparent on errors. :100644 100644 de38435c... 970a3f03... M sbr/m_getfld2.c commit e3589a920c43d8f4c7967a4884238658076114a1 Author: markus schnalke AuthorDate: Thu Nov 12 21:48:32 2015 +0100 Commit: markus schnalke CommitDate: Thu Nov 12 22:43:04 2015 +0100 Finally we get rid of the unmaintainable m_getfld()! m_getfld() was about 700 lines, 300 of them being comments -- that's 42%! m_getfld2() is 240 lines, 30 of them being comments. That's only half as much code. Most important, however, is that this code is understandable and thus maintainable. We escaped the dead end of the heavily optimized m_getfld() be re-writing it from scratch. (Thanks to Philipp Tacaks!) m_getfld2() is line-based and not character-based like m_getfld(). This change spared us to keep digging into stdio internals or implementing our own I/O buffering. We are now portable to any standard-conforming stdio implementation. :100644 100644 8107a3e3... 8f6fad1d... M h/mh.h :100644 100644 b48946b6... 32ec0b5b... M h/prototypes.h :100644 100644 981945e9... 4064d4e3... M sbr/Makefile.in :100644 000000 826cfb3f... 00000000... D sbr/m_getfld.c commit e200d3000e399ba55437e3b85c73df5ba2df27f4 Author: markus schnalke AuthorDate: Thu Nov 12 20:58:03 2015 +0100 Commit: markus schnalke CommitDate: Thu Nov 12 22:42:51 2015 +0100 Adjust tests to m_getfld2() and write some more m_getfld2() is more strict than m_getfld() and does less guessing. :100644 100644 cb9202f3... e152e0e7... M test/tests/bad-input/test-header commit bebbba12196b01deca4e33631937fdfdf605b75c Author: markus schnalke AuthorDate: Thu Nov 12 20:12:02 2015 +0100 Commit: markus schnalke CommitDate: Thu Nov 12 22:42:39 2015 +0100 Only lines consisting of nothing but dashes are body separators This is how the documentation specifies it, see mh-mail(5). The old m_getfld(), however, was more relaxed and treated any header line that starts with a dash as the body separator. We are more strict here, because ``-foo: bar'' is a valid header line (according to RFC 2822), that should thus not be treated as the body separator, whereas a line ``------'' in the header could only be a format error if we don't take it as the body separator. :100644 100644 6d96bdd4... de38435c... M sbr/m_getfld2.c commit 28ce2e7139731b7c8c0bdb67b181f34011e74ed7 Author: markus schnalke AuthorDate: Thu Nov 12 17:52:22 2015 +0100 Commit: markus schnalke CommitDate: Thu Nov 12 22:42:29 2015 +0100 Convert inc and scan from m_getfld() to m_getfld2() The main conversion was done in uip/scansbr.c. Mbox handling is now completely outside of m_getfld2(), which does not even know about From_ lines. No more need to call thisisanmbox() (formerly m_unknown(), ``the magic invocation'') before calling scan(). The newly introduced gotos should be eliminated ... :100644 100644 f08fb4f3... 5f08df45... M uip/inc.c :100644 100644 d6a43729... 3a834208... M uip/scan.c :100644 100644 d985a5ca... 50b250e5... M uip/scansbr.c commit bf016a819708d2f84387843e73af51df7e19c621 Author: markus schnalke AuthorDate: Thu Nov 12 17:05:53 2015 +0100 Commit: markus schnalke CommitDate: Thu Nov 12 22:42:18 2015 +0100 Convert rcvdist and repl from m_getfld() to m_getfld2() :100644 100644 53cc0f0c... 8292a20b... M uip/rcvdist.c :100644 100644 f5df9ecb... d71f27b3... M uip/repl.c commit c4de1023b3141b9a89038012b246fa74205752cd Author: markus schnalke AuthorDate: Thu Nov 12 17:03:36 2015 +0100 Commit: markus schnalke CommitDate: Thu Nov 12 22:42:03 2015 +0100 m_getfld2: Return line for LENERR2, plus some documentation :100644 100644 59204252... 6d96bdd4... M sbr/m_getfld2.c commit a3d849510ecad775e265ab7b6090e85576f48ef7 Author: markus schnalke AuthorDate: Thu Nov 12 08:23:04 2015 +0100 Commit: markus schnalke CommitDate: Thu Nov 12 22:41:55 2015 +0100 m_getfld2: ERR2 means a read error, thus name it IOERR2 :100644 100644 a93d9a94... 8107a3e3... M h/mh.h :100644 100644 a17eb03a... 59204252... M sbr/m_getfld2.c :100644 100644 494c2986... 9c20fdad... M uip/distsbr.c :100644 100644 b8e9f93a... ec5623a6... M uip/mhbuild.c :100644 100644 fcdb77f7... 8becba9b... M uip/mhl.c :100644 100644 1cbefed0... 257bc66e... M uip/mhparse.c :100644 100644 a5e658d1... 993527b4... M uip/pick.c :100644 100644 5760a83d... c3b45e87... M uip/slocal.c :100644 100644 43dc7dc0... 61953e17... M uip/sortm.c :100644 100644 6282e751... 04479a1f... M uip/spost.c :100644 100644 e1aab77f... a72c84f0... M uip/whom.c commit d6321964322004b6fc7efbccbc97f92cee905ae7 Author: markus schnalke AuthorDate: Thu Nov 12 08:14:59 2015 +0100 Commit: markus schnalke CommitDate: Thu Nov 12 22:41:46 2015 +0100 m_getfld2: Whitespace in component name is forbidden Also on style: No function calls should be used to initialize variables in definition statements. Use separate assignments in this case. :100644 100644 91164f3c... a17eb03a... M sbr/m_getfld2.c commit 43ae44731bc0732c894ba6dc7de2d2881c5888e0 Author: markus schnalke AuthorDate: Wed Nov 11 07:31:00 2015 +0100 Commit: markus schnalke CommitDate: Thu Nov 12 22:32:22 2015 +0100 Use continue instead of one long if for the whole loop body Plus remove unnecessary comments. This improves the signal-noise ratio. The identifiers are already telling us enough. :100644 100644 368bce3f... f08fb4f3... M uip/inc.c :100644 100644 0f755ca2... d6a43729... M uip/scan.c commit f5df6f250dc5862488efb0198823c68f5b573ccc Author: markus schnalke AuthorDate: Tue Nov 10 20:58:31 2015 +0100 Commit: markus schnalke CommitDate: Tue Nov 10 21:06:12 2015 +0100 Return invalid line for FMTERR in m_getfld2() This is necessary for mbox handling outside of m_getfld2(). :100644 100644 6eb0ef8c... 91164f3c... M sbr/m_getfld2.c commit 6e7d34c614291079de750ceda1d4f5ec537beb81 Author: markus schnalke AuthorDate: Tue Nov 10 06:53:44 2015 +0100 Commit: markus schnalke CommitDate: Tue Nov 10 21:06:12 2015 +0100 No error-checking for error-checking alloc functions The mh_x(m|c|re)alloc function always return successful ... or terminate the program on their own, otherwise. :100644 100644 8156517b... e2d43dab... M uip/ap.c :100644 100644 591d7f4b... 04e5450a... M uip/burst.c :100644 100644 4f764f46... b8e9f93a... M uip/mhbuild.c :100644 100644 5caa717c... fcdb77f7... M uip/mhl.c :100644 100644 9022ecfa... 6d7b8e7a... M uip/mhlist.c :100644 100644 b144c375... 1cbefed0... M uip/mhparse.c :100644 100644 f48fa993... bb03939c... M uip/mhshow.c :100644 100644 1202fcba... fae054fa... M uip/mhstore.c :100644 100644 43fde0e2... dd456263... M uip/mhtest.c :100644 100644 a1b5effd... a5e658d1... M uip/pick.c :100644 100644 1337c893... 53cc0f0c... M uip/rcvdist.c :100644 100644 c0b290de... f5df9ecb... M uip/repl.c :100644 100644 ade3a28f... d985a5ca... M uip/scansbr.c :100644 100644 75aa2e35... 43dc7dc0... M uip/sortm.c commit 056af7546464661f792d85308f119bf6c1554316 Author: Philipp Takacs AuthorDate: Fri Nov 6 11:30:51 2015 +0100 Commit: markus schnalke CommitDate: Tue Nov 10 21:05:15 2015 +0100 check for (un)selection befor (un)set If you select or unselect the same msgnum numsel won't be increased/decreased twice. :100644 100644 0a475681... d187a341... M sbr/m_convert.c :100644 100644 6b89d705... 50ae7c68... M sbr/seq_msgstats.c commit d3425f7ef7287db6f843f27df8b9fa27da695562 Author: Philipp Takacs AuthorDate: Thu Nov 5 22:48:34 2015 +0100 Commit: markus schnalke CommitDate: Tue Nov 10 21:05:15 2015 +0100 handle hghsel lowsel and numsel in (un)set_selected Now you can use this funkitions without taking care of this values. Thanks c_14 for reporting this bug. :100644 100644 4cc8d6c6... e14c7099... M sbr/folder_addmsg.c :100644 100644 8e5fd0a2... 31658838... M sbr/folder_delmsgs.c :100644 100644 f113366c... 0a475681... M sbr/m_convert.c :100644 100644 eb483b7b... 6b89d705... M sbr/seq_msgstats.c :100644 100644 3ac9e110... a1b5effd... M uip/pick.c commit 7a13a5266a14f1c6a13752db9292cd40c1211fba Author: markus schnalke AuthorDate: Tue Nov 10 06:53:44 2015 +0100 Commit: markus schnalke CommitDate: Tue Nov 10 07:04:48 2015 +0100 No error-checking for error-checking alloc functions The mh_x(m|c|re)alloc function always return successful ... or terminate the program on their own, otherwise. :100644 100644 8156517b... e2d43dab... M uip/ap.c :100644 100644 591d7f4b... 04e5450a... M uip/burst.c :100644 100644 01acdb77... 76826c32... M uip/mhbuild.c :100644 100644 f3f74775... 6989c705... M uip/mhl.c :100644 100644 9022ecfa... 6d7b8e7a... M uip/mhlist.c :100644 100644 48855728... b7b86940... M uip/mhparse.c :100644 100644 f48fa993... bb03939c... M uip/mhshow.c :100644 100644 1202fcba... fae054fa... M uip/mhstore.c :100644 100644 43fde0e2... dd456263... M uip/mhtest.c :100644 100644 2d2bd650... 320db198... M uip/pick.c :100644 100644 1337c893... 53cc0f0c... M uip/rcvdist.c :100644 100644 c0b290de... f5df9ecb... M uip/repl.c :100644 100644 ade3a28f... d985a5ca... M uip/scansbr.c :100644 100644 4ca0c724... 5d15ed68... M uip/sortm.c commit 6e27d395a60fe59a274edc47989b9b8127359f36 Author: markus schnalke AuthorDate: Mon Nov 9 19:17:09 2015 +0100 Commit: markus schnalke CommitDate: Mon Nov 9 22:12:05 2015 +0100 Fix minor typo in man page :100644 100644 415ebcbb... 73c0346c... M man/inc.man1 commit 5ed626079bc1aaba6d0daea2b32c43cb463244bb Author: markus schnalke AuthorDate: Mon Nov 9 22:08:51 2015 +0100 Commit: markus schnalke CommitDate: Mon Nov 9 22:08:51 2015 +0100 Adjust the tests to less tolerant m_getfld2() We require the header and body to be separated by an empty line. We require header lines to end with a newline. m_getfld2() does not try to guess as much as the old m_getfld() did. :100644 100644 6b826a00... cb9202f3... M test/tests/bad-input/test-header :100755 100755 c2fc5dec... 7f21be3a... M test/tests/mhparam/test-mhparam commit 1e99819ed105950cd584c71fa4b2e36b038be102 Author: markus schnalke AuthorDate: Mon Nov 9 22:07:54 2015 +0100 Commit: markus schnalke CommitDate: Mon Nov 9 22:07:54 2015 +0100 Convert most of the tools from m_getfld() to m_getfld2() :100644 100644 bc9329f4... ccdf867c... M sbr/readconfig.c :100644 100644 b932cadc... 1929b263... M sbr/seq_read.c :100644 100644 d1b94749... 494c2986... M uip/distsbr.c :100644 100644 01acdb77... 4f764f46... M uip/mhbuild.c :100644 100644 f3f74775... 5caa717c... M uip/mhl.c :100644 100644 48855728... b144c375... M uip/mhparse.c :100644 100644 cb16dea2... a2be29bf... M uip/new.c :100644 100644 984d80bd... 3ac9e110... M uip/pick.c :100644 100644 2adbd480... 24f2d9f0... M uip/prompter.c :100644 100644 ca267fa5... 5760a83d... M uip/slocal.c :100644 100644 4ca0c724... 75aa2e35... M uip/sortm.c :100644 100644 7729e9bb... 6282e751... M uip/spost.c :100644 100644 d313f056... e1aab77f... M uip/whom.c commit 4e6362c1749f16f1b09fb04d5951a03c1d9aa9cd Author: markus schnalke AuthorDate: Mon Nov 9 22:03:40 2015 +0100 Commit: markus schnalke CommitDate: Mon Nov 9 22:03:40 2015 +0100 Add new implementation m_getfld2() This is mainly Philipp Takacs work. :100644 100644 33b38eef... a93d9a94... M h/mh.h :100644 100644 8575b226... b48946b6... M h/prototypes.h :100644 100644 51049c70... 981945e9... M sbr/Makefile.in :000000 100644 00000000... 6eb0ef8c... A sbr/m_getfld2.c commit 3d42b0a33233e6973fe841066c90d839cf732178 Author: markus schnalke AuthorDate: Mon Nov 9 19:17:09 2015 +0100 Commit: markus schnalke CommitDate: Mon Nov 9 19:17:09 2015 +0100 Fix minor typo in man page :100644 100644 415ebcbb... 73c0346c... M man/inc.man1 commit 860ebc0e4bd25ef45ca0257e90daa6a61b7f477a Author: Philipp Takacs AuthorDate: Fri Nov 6 11:30:51 2015 +0100 Commit: Philipp Takacs CommitDate: Fri Nov 6 11:35:03 2015 +0100 check for (un)selection befor (un)set If you select or unselect the same msgnum numsel won't be increased/decreased twice. :100644 100644 0a475681... d187a341... M sbr/m_convert.c :100644 100644 6b89d705... 50ae7c68... M sbr/seq_msgstats.c commit 1492dd50aa1043da58809ca0fec18cb6ab9937bc Author: Philipp Takacs AuthorDate: Thu Nov 5 22:48:34 2015 +0100 Commit: Philipp Takacs CommitDate: Thu Nov 5 23:26:41 2015 +0100 handle hghsel lowsel and numsel in (un)set_selected Now you can use this funkitions without taking care of this values. Thanks c_14 for reporting this bug. :100644 100644 4cc8d6c6... e14c7099... M sbr/folder_addmsg.c :100644 100644 8e5fd0a2... 31658838... M sbr/folder_delmsgs.c :100644 100644 f113366c... 0a475681... M sbr/m_convert.c :100644 100644 eb483b7b... 6b89d705... M sbr/seq_msgstats.c :100644 100644 984d80bd... 2d2bd650... M uip/pick.c commit 0b601e31ba8c6fddef8e825cdc4409d75b7afd90 Author: markus schnalke AuthorDate: Wed Nov 4 17:31:50 2015 +0100 Commit: markus schnalke CommitDate: Wed Nov 4 18:37:58 2015 +0100 Better description of the Sender header in man page Plus wording improvements and other minor stuff. :100644 100644 fd4adbff... dd051b78... M man/mh-profile.man5 :100644 100644 c4558bec... 4a704f84... M man/spost.man8 commit e48142e43bfeef1a44fb2f7131918b7172cd427e Author: markus schnalke AuthorDate: Tue Nov 3 08:47:26 2015 +0100 Commit: markus schnalke CommitDate: Wed Nov 4 18:37:58 2015 +0100 Re-add --with-lockdir=DIR configure option At the same time eliminate acconfig.h (and thus the autoreconf warning). Include the lock dir string only if we use dot locking. :100644 100644 8e6c177c... 39443435... M INSTALL :100644 100644 abe21a77... 7ec76736... M Makefile.in :100644 000000 73522406... 00000000... D acconfig.h :100644 100644 d32c30b6... 653acf0a... M configure.ac :100644 100644 b62604a6... 7309c868... M sbr/lock_file.c commit a1a744d898ec8842871dca302e6ae54d9233413f Author: markus schnalke AuthorDate: Tue Nov 3 08:37:57 2015 +0100 Commit: markus schnalke CommitDate: Wed Nov 4 18:37:58 2015 +0100 More sensible check for 7bit ASCII Always true condition reported by -Wextra -pendatic. :100644 100644 bab16997... df813401... M uip/send.c commit 2f2a1446c8ed6b3e466425561c0a09f9bf417b05 Author: markus schnalke AuthorDate: Tue Nov 3 08:36:45 2015 +0100 Commit: markus schnalke CommitDate: Wed Nov 4 18:37:58 2015 +0100 Remove unused parameter Reported by -Wextra -pedantic. :100644 100644 7e54929f... 4b45a0c4... M uip/whatnow.c commit 4dc39c08f07428ff5f39acd7b0ddee30e0a004f6 Author: markus schnalke AuthorDate: Tue Nov 3 10:57:07 2015 +0100 Commit: markus schnalke CommitDate: Tue Nov 3 10:57:07 2015 +0100 Remove dead code: FLDEOF and BODYEOF are never set :100644 100644 f9ed6455... 33b38eef... M h/mh.h :100644 100644 3539ed4f... 826cfb3f... M sbr/m_getfld.c :100644 100644 cbeb4811... bc9329f4... M sbr/readconfig.c :100644 100644 ff01c427... b932cadc... M sbr/seq_read.c :100644 100644 a856dc73... d1b94749... M uip/distsbr.c :100644 100644 1fdedb66... 01acdb77... M uip/mhbuild.c :100644 100644 2afb03a2... 48855728... M uip/mhparse.c :100644 100644 90e2da71... cb16dea2... M uip/new.c :100644 100644 8ae58a46... 984d80bd... M uip/pick.c :100644 100644 ae0c0c63... 2adbd480... M uip/prompter.c :100644 100644 eac77e49... ca267fa5... M uip/slocal.c :100644 100644 ae4038db... 4ca0c724... M uip/sortm.c commit 5deca188ac8e6f5b0a060712b8a71bb4e58573df Author: markus schnalke AuthorDate: Mon Nov 2 17:51:32 2015 +0100 Commit: markus schnalke CommitDate: Mon Nov 2 17:51:32 2015 +0100 Bump version number :100644 100644 3b04cfb6... a4a8ba98... M VERSION commit 5bf0e3c0e41afcea29bd240aaa74c9418021b30b Author: markus schnalke AuthorDate: Mon Nov 2 17:38:44 2015 +0100 Commit: markus schnalke CommitDate: Mon Nov 2 17:38:44 2015 +0100 This is mmh-0.2 :100644 100644 44242e74... 76cec130... M DATE :100644 100644 20958024... 3b04cfb6... M VERSION commit cc274fe6a74f58cfa17dc263d12d9d940e91b934 Author: markus schnalke AuthorDate: Mon Nov 2 17:37:13 2015 +0100 Commit: markus schnalke CommitDate: Mon Nov 2 17:37:13 2015 +0100 Decode address headers in replcomps :100644 100644 8a766798... 87532bac... M etc/replcomps :100644 100644 f6af3a98... ae55a7b8... M etc/replgroupcomps commit c84cfab8f077f7e1929de69ba82587d999f769d9 Author: markus schnalke AuthorDate: Mon Nov 2 17:17:40 2015 +0100 Commit: markus schnalke CommitDate: Mon Nov 2 17:17:40 2015 +0100 Update README and release howto to new NEWS file Also reorder the release steps to first check the tarball and then tag it as final. :100644 100644 fe62a4af... 63037c28... M README :100644 100644 c526fb3f... fbc9877e... M docs/README.releasing commit b11a6cdd6f0f7f6716744be10943c4676d6c1eb6 Author: markus schnalke AuthorDate: Mon Nov 2 17:06:32 2015 +0100 Commit: markus schnalke CommitDate: Mon Nov 2 17:06:32 2015 +0100 Add NEWS file, which summarizes changes per release :000000 100644 00000000... 5a903442... A NEWS :100644 100644 8063b83f... 08993ce0... M docs/DIFFERENCES_mmh_nmh commit aac675d09723c457707ef877ce4bb45055096d7b Author: markus schnalke AuthorDate: Mon Nov 2 08:16:10 2015 +0100 Commit: markus schnalke CommitDate: Mon Nov 2 08:16:10 2015 +0100 Include a static copy of the CVS log in the dist tarball :100644 100644 d7aa3f5b... 7b8b03ef... M .gitignore :100644 100644 bd6d9a4f... abe21a77... M Makefile.in commit 66aa5fa11f02d91364b6954bda61cba1674770fe Author: Philipp Takacs AuthorDate: Sun Nov 1 22:35:29 2015 +0100 Commit: markus schnalke CommitDate: Sun Nov 1 22:35:29 2015 +0100 Teach spost to handle address groups Plus more tests for address groups. :100644 100644 13c3bf14... c65e58c1... M test/tests/spost/test-group :100644 100644 780b5f44... 7729e9bb... M uip/spost.c commit 319a70dc20f208d465037b108f5d7453d9be2691 Author: Philipp Takacs AuthorDate: Fri Oct 30 21:41:31 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Nov 1 00:08:20 2015 +0100 test Group Addresses in spost :000000 100644 00000000... 13c3bf14... A test/tests/spost/test-group commit 054c8779d6660afe45f38fa04510c2061aa6a605 Author: Philipp Takacs AuthorDate: Sat Oct 31 16:40:20 2015 +0100 Commit: Philipp Takacs CommitDate: Sat Oct 31 23:56:13 2015 +0100 catch unparsable addresses Now spost don't coredump if an address can't be parsed :100644 100644 93b1735e... 639333ea... M h/addrsbr.h :100644 100644 201e8165... 96fa72f0... M sbr/addrsbr.c :100644 100644 d682318b... 780b5f44... M uip/spost.c commit 1d8a8014d875169c468341a66a5a7773c845577e Author: Philipp Takacs AuthorDate: Sat Oct 31 16:39:40 2015 +0100 Commit: Philipp Takacs CommitDate: Sat Oct 31 23:56:01 2015 +0100 test if spost catch bad addresses :000000 100644 00000000... ff39d1b5... A test/tests/spost/test-bad-address commit 6ce9606eeec3c7050ad8fe6182d64bd1694bb422 Author: Philipp Takacs AuthorDate: Sat Oct 31 15:52:31 2015 +0100 Commit: Philipp Takacs CommitDate: Sat Oct 31 17:27:56 2015 +0100 test if aliasing work in spost :000000 100644 00000000... 7705c6fc... A test/tests/spost/test-alias commit eb0c1c4bfb574bf724379a3714359c69c83826e3 Author: markus schnalke AuthorDate: Wed Oct 28 23:43:02 2015 +0100 Commit: markus schnalke CommitDate: Wed Oct 28 23:43:02 2015 +0100 Fix configure.ac warning :100644 100644 05432d49... d32c30b6... M configure.ac commit bdd879c997e50e6b6e14dffb746d9fe9b6a1cf6c Author: markus schnalke AuthorDate: Wed Oct 28 23:39:50 2015 +0100 Commit: markus schnalke CommitDate: Wed Oct 28 23:39:50 2015 +0100 Remove check for not used networking libraries in configure.ac Mmh does no more contain networking code, hence we don't need this. This way, we can also get rid of aclocal.m4. :100644 100644 21ffdb23... bd6d9a4f... M Makefile.in :100644 000000 872f5f9e... 00000000... D aclocal.m4 :100644 100644 9e32e217... 05432d49... M configure.ac commit d5d94ce76327869346e2b02b7b02a3620ddd38eb Author: markus schnalke AuthorDate: Wed Oct 28 23:19:14 2015 +0100 Commit: markus schnalke CommitDate: Wed Oct 28 23:19:14 2015 +0100 Build the release tarball from git, not manually Previously the Makefiles contained lists of files to distribute. They built the release tarball manually. It's much easier to just use git, which knows which files are the relevant files, because it's the ones that are under version control. We just need to add some additional, pre-generated files for convenience, so that the user does not need to have auto* and lex installed. The release tarball is now fully assembled in the top-level Makefile. (The only tricky part is sbr/dtimep.c, because that needs to be generated in the subdirectory.) :100644 100644 83af4c24... 21ffdb23... M Makefile.in :100644 100644 4bdad8e5... 47f9125b... M config/Makefile.in :100644 100644 8b8a1c36... da3bb51a... M etc/Makefile.in :100644 100644 31237d0e... baef0e0a... M h/Makefile.in :100644 100644 44d0b75f... ffa12037... M man/Makefile.in :100644 100644 6b4acf15... 51049c70... M sbr/Makefile.in :100644 100644 84f8535a... be02b670... M uip/Makefile.in commit 5faf465b84082afa8bb85ce6fe87ce6675749675 Author: markus schnalke AuthorDate: Wed Oct 28 17:50:24 2015 +0100 Commit: markus schnalke CommitDate: Wed Oct 28 17:50:24 2015 +0100 Include `test' dir in release tarball The subdirectories `docs' and `test' are managed by the top-level Makefile now, because there's nothing to do in them but to copy them for the distribution tarball. (This way, we also don't have to include each new file in these directories to the file list in Makefile.in.) :100644 100644 058e7d8b... 83af4c24... M Makefile.in :100644 100644 2cda6e08... 9e32e217... M configure.ac :100644 000000 a30292b6... 00000000... D docs/Makefile.in commit 04083c773195287a6a0774d27f96897f3d57d69d Author: markus schnalke AuthorDate: Wed Oct 28 17:15:42 2015 +0100 Commit: markus schnalke CommitDate: Wed Oct 28 17:15:42 2015 +0100 Update lists of files to distribute Also partly reordered the lists. :100644 100644 4d6c6967... a30292b6... M docs/Makefile.in :100644 100644 8277cc8b... 8b8a1c36... M etc/Makefile.in :100644 100644 31987b59... 31237d0e... M h/Makefile.in commit 6ee8839fd9f57c6c97fa7e6e0d142d06c5ba09c3 Author: Philipp Takacs AuthorDate: Wed Oct 28 12:19:05 2015 +0100 Commit: Philipp Takacs CommitDate: Wed Oct 28 12:26:53 2015 +0100 initialize mp in ismymbox :100644 100644 89157982... 201e8165... M sbr/addrsbr.c commit 57abb238e16c26d285904e51b7568be3c45d8614 Author: markus schnalke AuthorDate: Wed Oct 28 07:55:10 2015 +0100 Commit: markus schnalke CommitDate: Wed Oct 28 07:55:10 2015 +0100 Drop the SYNOPSIS section from some man pages For some man pages this section makes few sense. Plus some minor formating stuff on the way ... :100644 100644 7d681c34... e05358a1... M man/mh-alias.man5 :100644 100644 04c84465... b721aa6a... M man/mh-draft.man7 :100644 100644 a6e66775... 9b3334da... M man/mh-mail.man5 :100644 100644 9b052c9a... fd4adbff... M man/mh-profile.man5 :100644 100644 516b8afd... 4e4b4438... M man/mh-sequence.man7 commit c47d5a37f1677dd296a8b7d9bca6ed53f1a95af6 Author: markus schnalke AuthorDate: Wed Oct 28 07:47:15 2015 +0100 Commit: markus schnalke CommitDate: Wed Oct 28 07:47:15 2015 +0100 Minor clarification in mh-alias(5) :100644 100644 990ea42b... 7d681c34... M man/mh-alias.man5 commit bc21b73b2fd41f156e14feee7a77fcc292effaef Author: markus schnalke AuthorDate: Wed Oct 28 06:59:03 2015 +0100 Commit: markus schnalke CommitDate: Wed Oct 28 06:59:03 2015 +0100 Silence the output of `cd -' in the tests :100644 100644 cafddaf6... 750d525a... M test/tests/spost/test-bcc-dcc :100644 100644 a0776bbf... 3bbff3c1... M test/tests/spost/test-sender-header commit f5603521ed2325c69c5b475dc2693175ba9e3b27 Author: markus schnalke AuthorDate: Tue Oct 27 23:11:51 2015 +0100 Commit: markus schnalke CommitDate: Tue Oct 27 23:11:51 2015 +0100 Use cksum(1) instead of md5sum(1) in the tests cksum(1) is part of POSIX; md5sum(1) is not. :000000 100644 00000000... a8667a7d... A test/tests/inc/cksums :100644 000000 7f68baa3... 00000000... D test/tests/inc/md5sums :100644 100644 36cd1c24... 8ca63954... M test/tests/inc/test-deb359167 :100644 100644 622774b8... 2b6afb48... M test/tests/inc/test-eom-align commit d1ddea31fec698bedc7f1c67e040f8568d843ee9 Author: markus schnalke AuthorDate: Tue Oct 27 22:30:30 2015 +0100 Commit: markus schnalke CommitDate: Tue Oct 27 22:30:30 2015 +0100 Run the tests in defined (i.e. sorted) order :100755 100755 a4a72692... c06481ef... M test/runalltests commit fa191d6436c1fc25e645b8d88964e0fe648451d4 Author: Philipp Takacs AuthorDate: Sun Oct 25 20:57:23 2015 +0100 Commit: Philipp Takacs CommitDate: Tue Oct 27 17:50:13 2015 +0100 consider Default-From as own address :100644 100644 09ea1311... 89157982... M sbr/addrsbr.c :100644 100644 ff8399fd... a0776bbf... M test/tests/spost/test-sender-header commit 1f8deea066cec81699c76bc4f8021fab658aae73 Author: markus schnalke AuthorDate: Tue Oct 27 07:50:33 2015 +0100 Commit: markus schnalke CommitDate: Tue Oct 27 07:50:33 2015 +0100 Remove outcommented code (C99 comment) Our code should be clean C89 (ANSI C). There's no reason to keep this C99 comment. :100644 100644 52d41794... 4bb03d34... M uip/forw.c commit 063706a481ecba111064eedce97856e5eac9dca6 Author: markus schnalke AuthorDate: Tue Oct 27 07:43:58 2015 +0100 Commit: markus schnalke CommitDate: Tue Oct 27 07:43:58 2015 +0100 Ensure $SHELL is set for the tests Non-interactive shells might not set it (this is true for dash and mksh, at least). Currently we use $SHELL in whatnow(1). Although we likely remove this use, it's rather worthwhile to have $SHELL available in the test scripts. :100755 100755 498db05d... 9f35adea... M test/runtest commit e8843fe6800f7cf727240b3a0b5514aab3d11c93 Author: markus schnalke AuthorDate: Tue Oct 27 07:30:14 2015 +0100 Commit: markus schnalke CommitDate: Tue Oct 27 07:30:14 2015 +0100 Update mmh-intro(7) man page :100644 100644 e9d0f136... 3ee998e3... M man/mmh-intro.man7 commit 677b7649d52d77072f3ee0fccceb36290a97e882 Author: markus schnalke AuthorDate: Tue Oct 27 07:29:34 2015 +0100 Commit: markus schnalke CommitDate: Tue Oct 27 07:29:34 2015 +0100 Remove mh-tailor(5) man page :100644 100644 2246c175... 44d0b75f... M man/Makefile.in :100644 000000 097242b2... 00000000... D man/mh-tailor.man5 commit 029dc004802d489487964524d1e2cc61b96ee0f0 Author: markus schnalke AuthorDate: Tue Oct 27 07:17:09 2015 +0100 Commit: markus schnalke CommitDate: Tue Oct 27 07:17:09 2015 +0100 Split the releasing instructions into own document This makes them better visible. :100644 100644 a4505980... dcec2a73... M docs/README.developers :000000 100644 00000000... c526fb3f... A docs/README.releasing commit 41a9c66fe834e7c3b39cc8bda5b429802d926a2b Author: markus schnalke AuthorDate: Tue Oct 27 07:16:00 2015 +0100 Commit: markus schnalke CommitDate: Tue Oct 27 07:16:00 2015 +0100 Updates README, INSTALL, and docs/MACHINES :100644 100644 fa2713c7... 8e6c177c... M INSTALL :100644 100644 81705d8e... fe62a4af... M README :100644 100644 96014314... e808cac8... M docs/MACHINES commit 768aa0b03f49e661e908c0e886ebb05683b723cb Author: markus schnalke AuthorDate: Mon Oct 26 08:04:55 2015 +0100 Commit: markus schnalke CommitDate: Mon Oct 26 08:04:55 2015 +0100 Update TODO list Some comments on the removed items: - Mmh's show does already invoke a pager - The reverse action of `rmm' is: refile -src +trash l @ - Disjunct contexts are already possible (just set MMHC accordingly) - We already generate the mh-chart man page - Prompter can already be used to input the recipients. Use: Editor: prompter prompter: -nobody prompter-next: vi - Comp: -nowhatnowproc is obsolete; use `-whatnowproc true' instead. (It puts an empty draft into the drafts folder.) - Forw: Since we use MIME to forward messages, these todos are obsolete - Mhmail is not considered to be a full-featured interface to MH - We now do have RFC 2047 encoding of headers :100644 100644 b47855e8... a439680d... M docs/TODO commit 5318ec4a25b8ba8f5ac9c0e440d50969038fa8d7 Author: Philipp Takacs AuthorDate: Sun Oct 25 15:10:11 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Oct 25 23:06:42 2015 +0100 add the mmh mailing list to the doc :100644 100644 ca6c7c35... 2840b19e... M docs/MAILING-LISTS commit f1135dbc3c847ae387f3b763f536ba05b8adb4d0 Author: Philipp Takacs AuthorDate: Sun Oct 25 14:37:51 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Oct 25 23:06:42 2015 +0100 remove docs/README.SASL we don't need it, because smtp support is gone. :100644 000000 c06568be... 00000000... D docs/README.SASL commit 4033b947e4817fbaef2667658909a6f44d03c665 Author: Philipp Takacs AuthorDate: Sun Oct 25 14:36:51 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Oct 25 23:06:42 2015 +0100 add mailsync description :100644 100644 4786c025... 8a1805c5... M docs/FAQ commit afc7db57cfebd6be9573e930a3e7db006a70e38e Author: Philipp Takacs AuthorDate: Sun Oct 25 14:21:55 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Oct 25 23:06:42 2015 +0100 remove TODOs for not supportet programms :100644 100644 8ea5ab51... b47855e8... M docs/TODO commit 5b389106e9bfb05edbbcbdc847e09437f2390da0 Author: markus schnalke AuthorDate: Sun Oct 25 21:34:20 2015 +0100 Commit: markus schnalke CommitDate: Sun Oct 25 21:34:20 2015 +0100 send: MIMEify with non-ascii header and ascii body! This code is not perfect, as it scans body lines twice. We might want to rework it someday. But, ignoring the minor performance issue, it ensures, that we MIMEify in the case when some headers contain non-ASCII text but the body does not. :100644 100644 ec9b76db... bab16997... M uip/send.c commit 7d95e0861814febe23512e306b7b1e805c17bd81 Author: Philipp Takacs AuthorDate: Sun Oct 25 21:27:58 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Oct 25 21:27:58 2015 +0100 remove variable mp2 from spost in putadr This variable is set but not used. Thanks gcc for the warning. :100644 100644 f755a162... d682318b... M uip/spost.c commit ca2931beaec23f8e1d2f98d15d7e9974009278b0 Author: markus schnalke AuthorDate: Sun Oct 25 20:42:52 2015 +0100 Commit: markus schnalke CommitDate: Sun Oct 25 20:42:52 2015 +0100 Add DCC support into whom Plus a test for it. :100644 100644 b40787b8... d52dbca9... M man/whom.man1 :000000 100644 00000000... 5936bbd2... A test/tests/whom/test-dcc-bcc :100644 100644 4b15fbdc... d313f056... M uip/whom.c commit 15378d1b682670191b2a186391398b1e1a285983 Author: markus schnalke AuthorDate: Sun Oct 25 20:00:50 2015 +0100 Commit: markus schnalke CommitDate: Sun Oct 25 20:00:50 2015 +0100 DCC contains invisible (not visible) recipients Added new test for BCC and DCC headers, which discovered the bug. :000000 100644 00000000... cafddaf6... A test/tests/spost/test-bcc-dcc :100644 100644 ff8399fd... ff8399fd... R100 test/tests/spost/test-spost test/tests/spost/test-sender-header :100644 100644 96ca14d1... f755a162... M uip/spost.c commit fd828e57682371471c6dacd11ac389bd745de14b Author: Philipp Takacs AuthorDate: Sun Oct 25 13:45:42 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Oct 25 19:53:56 2015 +0100 add config.o and version.o to libmh.a Now you can easy link against libmh.a with -lmh :100644 100644 304b50b0... 6b4acf15... M sbr/Makefile.in :100644 100644 8fe7197f... 84f8535a... M uip/Makefile.in commit 1794d729c1c4b0de8f2e72b5096539c52ee6b74f Author: markus schnalke AuthorDate: Sun Oct 25 19:38:33 2015 +0100 Commit: markus schnalke CommitDate: Sun Oct 25 19:38:33 2015 +0100 Add test for sender header in spost (Fails currently, because default-from is not part of alternate-mailboxes.) :000000 100644 00000000... ff8399fd... A test/tests/spost/test-spost commit d29d0d9cef0620e6a7ed0a18462d33c99ecd9da5 Author: markus schnalke AuthorDate: Sun Oct 25 18:54:23 2015 +0100 Commit: markus schnalke CommitDate: Sun Oct 25 18:54:23 2015 +0100 Adjust coding style from nmh to mmh :100644 100644 b0e8274f... fa4cfdb2... M sbr/utils.c commit 4ad908a6b1e4601b8881f514061e494b0dd00e57 Author: Philipp Takacs AuthorDate: Sun Oct 25 17:25:16 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Oct 25 17:44:18 2015 +0100 fix the prompter test :100755 100755 229ee561... caa74cbe... M test/tests/prompter/test-prompter commit 8268f67015f9659a2f63dc26702a5a49d3fa6c2a Author: Philipp Takacs AuthorDate: Sat Oct 24 12:16:58 2015 +0200 Commit: Philipp Takacs CommitDate: Sat Oct 24 12:16:58 2015 +0200 set psigint befor the setjmp in prompter this mutes a Compielerwarning. :100644 100644 0ca1e83a... ae0c0c63... M uip/prompter.c commit 82325c1114254a76b8285bb710b2f651674331c7 Author: markus schnalke AuthorDate: Fri Oct 23 15:30:10 2015 +0200 Commit: markus schnalke CommitDate: Fri Oct 23 15:30:10 2015 +0200 Rework in the test framework; updated and new tests Many tests were ported from nmh. Two tests fail at the moment: - tests/ali/test-ali: needs porting the bugfix from nmh - tests/prompter/test-prompter: needs further investigation :100644 100644 0fd3afb9... d195a7cf... M test/common.sh :100755 100755 279ced53... a4a72692... M test/runalltests :100755 100755 88676618... 498db05d... M test/runtest :000000 100755 00000000... f37a1acc... A test/tests/ali/test-ali :000000 100755 00000000... fed865e5... A test/tests/anno/test-anno :100644 100644 8a3251ef... 6b826a00... M test/tests/bad-input/test-header :000000 100755 00000000... af8e3f4b... A test/tests/burst/test-burst :000000 100755 00000000... 19ddaaa1... A test/tests/burst/test-burst-mime :100644 100644 5b74b237... 1321a780... M test/tests/folder/test-create :000000 100755 00000000... abd2b2f5... A test/tests/folder/test-recurse :000000 100755 00000000... 6ba36a71... A test/tests/folder/test-sortm :100644 100644 72d559e2... 7eb9c7b3... M test/tests/folder/test-total :000000 100755 00000000... ca3d3935... A test/tests/folder/x-test-packf :100644 100644 3b6c6779... 622774b8... M test/tests/inc/test-eom-align :100644 100644 759c8ed0... ae613d96... M test/tests/mhbuild/test-forw :100644 100644 422f9707... 047f7dc1... M test/tests/mhbuild/test-header-encode :000000 100644 00000000... 7b58f759... A test/tests/mhbuild/test-linebreak :000000 100755 00000000... 7220e6cb... A test/tests/mhl/test-mhl-flags :000000 100755 00000000... 7f3fec0e... A test/tests/mhlist/test-ext-params :000000 100755 00000000... 57f0cd5c... A test/tests/mhlist/test-mhlist :000000 100755 00000000... c2fc5dec... A test/tests/mhparam/test-mhparam :000000 100755 00000000... 229ee561... A test/tests/prompter/test-prompter :000000 100755 00000000... 8d05bc88... A test/tests/rcv/test-rcvdist :000000 100755 00000000... 357eb017... A test/tests/rcv/test-rcvpack :000000 100755 00000000... fba32b96... A test/tests/rcv/test-rcvstore :100644 100644 88082eed... c006308f... M test/tests/scan/test-scan :000000 100644 00000000... ee3e434c... A test/tests/scan/test-scan-multibyte :000000 100644 00000000... 9847d7f0... A test/tests/show/test-multibytes commit b4987f510fb3494bfc5b11fc92d2047cdb51642b Author: Eric Schnoebelen AuthorDate: Fri Aug 31 09:49:37 2012 -0400 Commit: markus schnalke CommitDate: Fri Oct 23 10:16:15 2015 +0200 Move chdir() call so -recurse option works again This commit is ported from nmh. :100644 100644 3ca0e7db... 4ffb9f5b... M uip/folder.c commit 1cbc163b11d6dbabfe7206fb2f9ddf650337dad6 Author: markus schnalke AuthorDate: Fri Oct 23 09:52:55 2015 +0200 Commit: markus schnalke CommitDate: Fri Oct 23 09:52:55 2015 +0200 Fix off-by-one error (CPERLIN) CPERLIN is the chars per line without the line break chars (\r\n), at least would that match the description in RFC 2822. Actually, however, the max SHOULD line length (excluding line break chars) is 78 according to the RFC. Therefore it seems as if we should set CPERLIN to 78. (This is open to decide and to do.) :100644 100644 ba883196... 87e7943c... M uip/mhoutsbr.c commit 5d690daafbcd4ed26d19610fcc017999ee5af892 Author: markus schnalke AuthorDate: Wed Oct 21 17:35:14 2015 +0200 Commit: markus schnalke CommitDate: Wed Oct 21 17:35:14 2015 +0200 Coding style adjustments for nmh-imported code - No documentation in h/prototypes.h, but rather in the sbr/*.c files - Convert coding style from nmh to mmh: + indent with tabs only not with a tab-spaces-mixture + no space between function name and opening parenthesis + no space on the inner side of parens + no trailing space + different comment style - Variable definition at the beginning of the block only (ANSI C) - Choose meaningful identifier name rather than add a comment to a meaningless name :100644 100644 e6e7dc14... 8575b226... M h/prototypes.h :100644 100644 b4027d8b... 852c2613... M sbr/encode_rfc2047.c :100644 100644 f9fa9112... aa40a0cc... M sbr/unquote.c :100644 100644 d636cf7c... 1fdedb66... M uip/mhbuild.c :100644 100644 8448d968... 8ae58a46... M uip/pick.c commit 55ca5bf643035fd37cf0568e5ea73c1a8636b9a6 Author: markus schnalke AuthorDate: Wed Oct 21 17:13:35 2015 +0200 Commit: markus schnalke CommitDate: Wed Oct 21 17:13:35 2015 +0200 Don't remove the draft on SIGQUIT to allow debugging :100755 100755 66fc7ec4... 5e4cd67f... M uip/sendfiles.sh commit 96c6767c747252fa6b050e2fdd2e67268fcc344b Author: Philipp Takacs AuthorDate: Sun Oct 18 13:25:33 2015 +0200 Commit: Philipp Takacs CommitDate: Sun Oct 18 13:25:33 2015 +0200 export MM_CHARSET in mhbuild test The test has some UTF-8 charracter to test the encoding. :100644 100644 9049f6fa... 422f9707... M test/tests/mhbuild/test-header-encode commit 9aa034524acfaaa1a9881ef7b6cadd788b551ebe Author: Philipp Takacs AuthorDate: Wed Sep 23 13:15:31 2015 +0200 Commit: Philipp Takacs CommitDate: Sun Oct 11 16:37:47 2015 +0200 use anno and mhparam in sendfiles :100755 100755 40d8f72e... 66fc7ec4... M uip/sendfiles.sh commit e2c50b4a7530bceb52dec5e65fcccbc929fc7bc2 Author: Philipp Takacs AuthorDate: Sat Oct 10 14:19:07 2015 +0200 Commit: Philipp Takacs CommitDate: Sat Oct 10 14:38:53 2015 +0200 decode recipient-fields by default :100644 100644 9636dbbf... 60904de5... M etc/mhl.format :100644 100644 1a01a7f9... a3988379... M etc/mhl.headers commit 3cbdaea22c94d1c1d13e11b1ea6e55d3d9408771 Author: Philipp Takacs AuthorDate: Fri Sep 25 12:50:56 2015 +0200 Commit: Philipp Takacs CommitDate: Sat Oct 10 14:35:58 2015 +0200 add a test for mhbuild rfc2047-support This is only the first test, more come later. :000000 100644 00000000... 9049f6fa... A test/tests/mhbuild/test-header-encode commit 0595979e1f0514b3da28762f336b3b9ac9eec5c5 Author: Philipp Takacs AuthorDate: Sat Sep 19 23:25:57 2015 +0200 Commit: Philipp Takacs CommitDate: Sat Oct 10 14:12:56 2015 +0200 porte encode_rfc2047 from nmh Now a user can add any nonascii in header-fields. mhbuild now encode this acourding to rfc2047. Thanks Ken Hornstein :100644 100644 42767f57... e6e7dc14... M h/prototypes.h :100644 100644 62d01be5... 98fb39da... M man/mhbuild.man1 :100644 100644 4d2b91b7... 304b50b0... M sbr/Makefile.in :000000 100644 00000000... b4027d8b... A sbr/encode_rfc2047.c :100644 100644 140cfdb3... d636cf7c... M uip/mhbuild.c commit 92e279e1255b12b02a2faede6e1d66b46f731807 Author: markus schnalke AuthorDate: Fri Oct 2 19:49:38 2015 +0200 Commit: markus schnalke CommitDate: Fri Oct 2 19:49:38 2015 +0200 mhbuild: Avoid a dot on a line on its own mhbuild's quoted-printable encoder breaks lines to have at most CPERLIN chars. If the it happens that the last character on the line is a dot (`.') and the line is broken just before it, then the following line contains nothing but one single dot. This currently leads to problems in mmh ... but it may cause problems to other mail software as well. Hence we avoid it by encoding any dot at the beginning of a line, just to be sure. :100644 100644 21c2e263... ba883196... M uip/mhoutsbr.c commit c6cf5c38fb74a2399cc656357be571f1669a36d1 Author: markus schnalke AuthorDate: Fri Oct 2 19:24:28 2015 +0200 Commit: markus schnalke CommitDate: Fri Oct 2 19:24:28 2015 +0200 Sleep only 1 sec before retry to lock the file The previous 5 seconds might have been appropriate on old, heavy loaded systems, but they will hardly be necessary on modern ones. :100644 100644 bdce7bbb... b62604a6... M sbr/lock_file.c :100644 100644 0ce5425b... 45451f8b... M uip/dropsbr.c commit 770d341357b1a6890c7eea72070d0a9e3e270bf9 Author: markus schnalke AuthorDate: Fri Oct 2 19:18:32 2015 +0200 Commit: markus schnalke CommitDate: Fri Oct 2 19:18:32 2015 +0200 Show the date hdr in local time in the default scan listing :100644 100644 53f7bb9f... c809e3b2... M etc/scan.meillo commit ce0de2d6a9d308834a10b058ef850473e78976aa Author: markus schnalke AuthorDate: Fri Oct 2 08:22:53 2015 +0200 Commit: markus schnalke CommitDate: Fri Oct 2 08:37:03 2015 +0200 Improve wording and more description in man page spost(8) :100644 100644 6a3d7578... c4558bec... M man/spost.man8 commit 4c30d368bca8b3f108a7e86a5b890e33470cdebf Author: Ken Hornstein AuthorDate: Thu Nov 14 11:43:33 2013 -0500 Commit: Philipp Takacs CommitDate: Sat Sep 19 22:37:19 2015 +0200 Break out the unquote functionality to a separate function. :100644 100644 848115fd... 42767f57... M h/prototypes.h :100644 100644 61fc96c0... 4d2b91b7... M sbr/Makefile.in :100644 100644 a8e773a9... 6cfc1765... M sbr/fmt_scan.c :000000 100644 00000000... f9fa9112... A sbr/unquote.c commit f16ae6eedeacce086d513e10461938c1650e265e Author: David Levine AuthorDate: Sun Nov 25 09:06:20 2012 -0600 Commit: Philipp Takacs CommitDate: Wed Sep 16 14:12:01 2015 +0200 pick(1) decode rfc2047-fields Attempt to decode each header field as if it were MIME encoded. :000000 100644 00000000... b89a71ab... A test/tests/pick/test-rfc2047 :100644 100644 819d81a2... 8448d968... M uip/pick.c commit 850059f6637354d31129f303151f9f7d30514c9e Author: Philipp Takacs AuthorDate: Sun Sep 6 23:29:21 2015 +0200 Commit: Philipp Takacs CommitDate: Sun Sep 6 23:29:21 2015 +0200 include h/utils.h I forgot uip/ap.c and uip/burst.c, too :100644 100644 46c3ff55... 8156517b... M uip/ap.c :100644 100644 28e0e851... 591d7f4b... M uip/burst.c commit 56f27eb41e0171f34585b8ae2e232ae13fe08dc0 Author: Philipp Takacs AuthorDate: Sun Sep 6 23:11:15 2015 +0200 Commit: Philipp Takacs CommitDate: Sun Sep 6 23:18:16 2015 +0200 include h/utils.h I forgot to add it in sbr/addrsbr.c sbr/fmt_compile.c :100644 100644 e5fc19d6... 09ea1311... M sbr/addrsbr.c :100644 100644 28a96e69... 096f7dd6... M sbr/fmt_compile.c commit e16d5bfc58d8b0dfe61701cd4d6b1732e837d60a Author: Philipp Takacs AuthorDate: Sun Sep 6 01:09:15 2015 +0200 Commit: Philipp Takacs CommitDate: Sun Sep 6 13:05:53 2015 +0200 replaced calloc with mh_xcalloc This finished the work of David Levine, which was portet in the last commit. :100644 100644 de2cf459... 140cfdb3... M uip/mhbuild.c :100644 100644 c201a951... f3f74775... M uip/mhl.c :100644 100644 2a0ddf9e... 1202fcba... M uip/mhstore.c :100644 100644 5b47f22c... 43fde0e2... M uip/mhtest.c :100644 100644 b3bac286... 819d81a2... M uip/pick.c :100644 100644 89bb1dc5... 1337c893... M uip/rcvdist.c :100644 100644 33d4bf55... c0b290de... M uip/repl.c commit 72795bfcbe9f7fee8927b1a4942c0230b0f857a8 Author: David Levine AuthorDate: Sat Oct 11 09:22:52 2014 -0500 Commit: Philipp Takacs CommitDate: Sun Sep 6 13:05:53 2015 +0200 Added mh_xcalloc(). :100644 100644 a8059ea2... 6f74c325... M h/utils.h :100644 100644 ea017f4d... e5fc19d6... M sbr/addrsbr.c :100644 100644 9e08ab46... 28a96e69... M sbr/fmt_compile.c :100644 100644 1cc041b5... 3539ed4f... M sbr/m_getfld.c :100644 100644 515c9a08... b0e8274f... M sbr/utils.c :100644 100644 acf3cace... 46c3ff55... M uip/ap.c :100644 100644 37dc9b17... 28e0e851... M uip/burst.c :100644 100644 c4682b4a... 9022ecfa... M uip/mhlist.c :100644 100644 f520e03d... 2afb03a2... M uip/mhparse.c :100644 100644 9ae5bf0f... f48fa993... M uip/mhshow.c :100644 100644 4234d25f... 2a0ddf9e... M uip/mhstore.c :100644 100644 9c74f04f... ade3a28f... M uip/scansbr.c :100644 100644 0d02af9f... ae4038db... M uip/sortm.c commit 5086954856e7b078981418d4aac233d37deb72bd Author: Philipp Takacs AuthorDate: Sat Aug 29 11:56:34 2015 +0200 Commit: Philipp Takacs CommitDate: Sat Sep 5 20:21:52 2015 +0200 fix open up to 4 times on mbox_open() Befor this lkopen was only called ones. :100644 100644 5fbbb617... 0ce5425b... M uip/dropsbr.c commit ec019f1e02bfc457c156a81bd6cc879e89644c21 Author: Philipp Takacs AuthorDate: Thu Aug 27 21:59:11 2015 +0200 Commit: Philipp Takacs CommitDate: Sat Sep 5 19:21:03 2015 +0200 reimplement Dcc-field Dcc is like Bcc but don't send an extra message with the orginal message attched. See FAQ for more details. :100644 100644 76d10a8f... 6a3d7578... M man/spost.man8 :100644 100644 3a70f363... 96ca14d1... M uip/spost.c commit 00b5842e0c5feef345a8e69cdb501f8a4c5c8c0f Author: Philipp Takacs AuthorDate: Mon Jun 29 00:42:31 2015 +0200 Commit: Philipp Takacs CommitDate: Sat Sep 5 19:18:58 2015 +0200 find recipients for sendmail Recipients are given as comandline arguments to sendmail. Also do aliasing on every header which contain an address. :100644 100644 a86a90df... 93b1735e... M h/addrsbr.h :100644 100644 db783ef6... 76d10a8f... M man/spost.man8 :100644 100644 53e9be43... ea017f4d... M sbr/addrsbr.c :100644 100644 4d0b48a0... 3a70f363... M uip/spost.c commit 219ca2478b42be77eee20866a8a6cf8b87f3a59c Author: Philipp Takacs AuthorDate: Sat Sep 5 13:10:33 2015 +0200 Commit: Philipp Takacs CommitDate: Sat Sep 5 13:10:33 2015 +0200 Revert "Remove stdio internals manipulation in sbr/m_getfld.c" This only temporaly, to ensure mmh is working correct. This reverts commit 976303d04d3bc2cad0afd5e3d364264783da56c2. :100644 100644 108af138... 1cc041b5... M sbr/m_getfld.c commit 976303d04d3bc2cad0afd5e3d364264783da56c2 Author: David Levine AuthorDate: Tue Dec 25 11:57:31 2012 -0600 Commit: markus schnalke CommitDate: Sat Aug 29 18:32:03 2015 +0200 Remove stdio internals manipulation in sbr/m_getfld.c Replaced all the stdio buffer access in sbr/m_getfld.c with a single call to fread() and then some almost straightforward buffer manipulations. This commit is ported to mmh. :100644 100644 1cc041b5... 108af138... M sbr/m_getfld.c commit 5901f87be7eaf0475af7c6c1e139ed844468643c Author: markus schnalke AuthorDate: Sat Aug 29 16:39:59 2015 +0200 Commit: markus schnalke CommitDate: Sat Aug 29 16:39:59 2015 +0200 Make msg_delim file static to sbr/m_getfld.c Thanks to David Levine for nmh commit e69044f7624abe5cb2cb796d528c0cc5f29515f7 :100644 100644 e7663cd5... 1cc041b5... M sbr/m_getfld.c commit aa2ba01b2dc678047d13572942628a39c7cf40dd Author: Philipp Takacs AuthorDate: Fri Aug 28 11:53:03 2015 +0200 Commit: Philipp Takacs CommitDate: Fri Aug 28 11:53:03 2015 +0200 Bring back the LINUX-IO check from the last commit We need them for m_getfld(), too. This reverts parts of the commit 33516e5b74bb4bb5c626d4ee42bd3a7a9faaabef. :100644 100644 372f0e07... 2cda6e08... M configure.ac commit 5ba9c2f13fedf1d8d6ed907ef1f505616290efaa Author: markus schnalke AuthorDate: Wed Apr 29 07:09:43 2015 +0200 Commit: markus schnalke CommitDate: Thu Aug 27 07:36:38 2015 +0200 Drop register storage class :100644 100644 d7894c54... 53e9be43... M sbr/addrsbr.c :100644 100644 6eebd7e0... 7d068b5c... M sbr/context_del.c :100644 100644 5886c5ee... 5b7c7775... M sbr/context_read.c :100644 100644 4d813563... dd6e6314... M sbr/context_replace.c :100644 100644 10d4d427... 0f7061a5... M sbr/context_save.c :100644 100644 090cd717... 5e5ef87f... M sbr/cpydgst.c :100644 100644 b59a8e7e... 47327edd... M sbr/crawl_folders.c :100644 100644 42b35723... db2b1939... M sbr/dtimep.lex :100644 100644 d6218b56... c7379b10... M sbr/fmt_addr.c :100644 100644 ce35de91... 9e08ab46... M sbr/fmt_compile.c :100644 100644 8ddd3c16... 9a7988eb... M sbr/fmt_new.c :100644 100644 c62eb772... 1f9e497f... M sbr/gans.c :100644 100644 7f2a7a8e... f113366c... M sbr/m_convert.c :100644 100644 b3659f98... 549e89b6... M sbr/m_draft.c :100644 100644 12d05b98... e7663cd5... M sbr/m_getfld.c :100644 100644 c4870dd7... e87ae574... M sbr/makedir.c :100644 100644 17809976... 633522b8... M sbr/mf.c :100644 100644 3a70c545... 02d00bc0... M sbr/print_sw.c :100644 100644 5c7279b0... a2ec7d3a... M sbr/putenv.c :100644 100644 171ecf8a... cbeb4811... M sbr/readconfig.c :100644 100644 ce7bf8ac... 376d4b05... M sbr/snprintb.c :100644 100644 f23e1d03... 515c9a08... M sbr/utils.c :100644 100644 c6b028cb... dc2a3414... M uip/ali.c :100644 100644 97f0c342... bda73261... M uip/aliasbr.c :100644 100644 af97e9ec... acf3cace... M uip/ap.c :100644 100644 cf668ad0... a856dc73... M uip/distsbr.c :100644 100644 1cbb7ed5... 3a019951... M uip/dp.c :100644 100644 091def78... 68acabb1... M uip/flist.c :100644 100644 c9b28cf7... 5266235a... M uip/fmtdump.c :100644 100644 77029dc1... 3ca0e7db... M uip/folder.c :100644 100644 c754b278... 52d41794... M uip/forw.c :100644 100644 6ac0a220... 76fe4279... M uip/mhparam.c :100644 100644 a487adcf... b3bac286... M uip/pick.c :100644 100644 4027ea2c... 89bb1dc5... M uip/rcvdist.c :100644 100644 01f205be... a67b1505... M uip/refile.c :100644 100644 0ff86b81... 33d4bf55... M uip/repl.c :100644 100644 f2460042... 230360b8... M uip/rmf.c :100644 100644 802e010a... 0d02af9f... M uip/sortm.c :100644 100644 1ccd2096... 765ed8ac... M uip/whatnowproc.c commit 33516e5b74bb4bb5c626d4ee42bd3a7a9faaabef Author: David Levine AuthorDate: Tue Dec 25 19:25:43 2012 -0600 Commit: Philipp Takacs CommitDate: Wed Aug 26 23:46:44 2015 +0200 Remove discard() total discard() isn't needed in mmh anymore. :100644 100644 2cda6e08... 372f0e07... M configure.ac :100644 100644 3512ef7f... 848115fd... M h/prototypes.h :100644 100644 e5d8ffd9... 61fc96c0... M sbr/Makefile.in :100644 000000 d3eabd0e... 00000000... D sbr/discard.c commit e2c8b0c495161c21c7bece0b4fc844542e0da212 Author: markus schnalke AuthorDate: Wed Aug 26 21:36:54 2015 +0200 Commit: markus schnalke CommitDate: Wed Aug 26 21:36:54 2015 +0200 Fix autoconf check for mailspool world write permission This is a bugfix and improvement for commit b15b7cc (``Use realpath to find the mailspool''). We can even do this check much simpler, if we focus on the problem that $lspath -dlL $mailspool does not check the target of a symlink, although -L is given. The contradicting -d seems to overrule it. We can fix this more easily by appending a slash to the path: $ ls -ld /var/mail/ drwxrwxr-t 2 root root 4096 Apr 29 06:36 /var/mail// Without the slash it was: $ ls -ld /var/mail lrwxrwxrwx 1 root root 10 Nov 22 2011 /var/mail -> spool/mail/ This small change does it for one level of indirection. This should be sufficient. :100644 100644 b8f41f22... 2cda6e08... M configure.ac commit 1e9a7f8082f2ea4b496827be6b9ebbc4ac145839 Author: Philipp Takacs AuthorDate: Fri Aug 7 15:22:23 2015 +0200 Commit: Philipp Takacs CommitDate: Mon Aug 10 10:33:59 2015 +0200 Ignore empty MIME parameter If a message contains an empty parameter, we only produce a warning. :100644 100644 7a15b75b... f520e03d... M uip/mhparse.c commit 0b4cb45a0dd18d07f6af9d77283ee369bd17b14e Author: Philipp Takacs AuthorDate: Tue Aug 4 21:26:14 2015 +0200 Commit: Philipp Takacs CommitDate: Mon Aug 10 10:18:30 2015 +0200 Ignore wrong encoding in multipart/* If a multipart message has an encoding other then 7bit or 8bit, 7bit encoding is assumed. :100644 100644 fad75d7f... 7a15b75b... M uip/mhparse.c commit caa8041a6870b8ce1a92f4384d25599e247b0961 Author: Philipp Takacs AuthorDate: Sun May 31 02:10:32 2015 +0200 Commit: Philipp Takacs CommitDate: Thu Jun 11 18:50:01 2015 +0200 remove dublicated code in uip/spost To avoid bugs like in commit dc81afc84b4d53177a1c4 :100644 100644 163c1e6d... ee70385e... M uip/spost.c commit 8aeebaf757a1588ae2836965f5443ca7dc3a0257 Author: Philipp Takacs AuthorDate: Sun May 31 00:53:11 2015 +0200 Commit: Philipp Takacs CommitDate: Thu Jun 11 16:49:18 2015 +0200 fix bug if multible mbox in From-field Now the first address of the user is used, if multible addresses are in the From-field. If non of the addresses is an address of the user, the the behaviour has not changed. :100644 100644 ac2843fd... 163c1e6d... M uip/spost.c commit dc81afc84b4d53177a1c4fb9fd6fea0ec2912825 Author: Philipp Takacs AuthorDate: Sat May 2 14:36:50 2015 +0200 Commit: Philipp Takacs CommitDate: Sat May 2 14:46:35 2015 +0200 bugfix for a memory-reuse bug spost and whom spost and whom use add to initialize a temporary char*. This pointer maybe points to internal data or already freed memory. Now getcpy is used. :100644 100644 48f97978... ac2843fd... M uip/spost.c :100644 100644 e61dc623... 4b15fbdc... M uip/whom.c commit 43c31a90ba57b93a5504c39a28b9ef55a9b6e801 Author: markus schnalke AuthorDate: Wed Apr 29 07:03:09 2015 +0200 Commit: markus schnalke CommitDate: Wed Apr 29 07:03:09 2015 +0200 spost: Refactor braces, comments, etc. :100644 100644 48f97978... b5fac127... M uip/spost.c commit 19b66d5b25c2c07b7bcceaa7c128ab60f9b34793 Author: markus schnalke AuthorDate: Wed Apr 29 06:47:13 2015 +0200 Commit: markus schnalke CommitDate: Wed Apr 29 06:47:13 2015 +0200 gitignore: More specific ignore patterns I frequently make temporary backups this way: cp uip/foo.c uip/foo.c.1 These files were ignored, although this ignore filter was meant for the created man pages in section 1 only. :100644 100644 b9250e08... d7aa3f5b... M .gitignore commit eda302e1f049eae6b429a12c5526600eea6a02e1 Author: Philipp Takacs AuthorDate: Sun Apr 19 00:53:14 2015 +0200 Commit: Philipp Takacs CommitDate: Sun Apr 19 19:29:06 2015 +0200 Add "Default-From" config option The "Default-From" config option is used, if the Draft don't contain a From header. If the draft contains a From header and it's not from the user it's used as the Sender header. Bug: If the From-header contains more then one addresse and one is from the user, no Sender-header is attached. :100644 100644 5e02d9f0... 9b052c9a... M man/mh-profile.man5 :100644 100644 c66ba10a... db783ef6... M man/spost.man8 :100644 100644 476227ba... 48f97978... M uip/spost.c commit 37388292edf9ca9e8236297ed5f777ab4b15b7cc Author: Philipp Takacs AuthorDate: Sat Dec 6 15:20:12 2014 +0100 Commit: Philipp Takacs CommitDate: Sun Apr 19 17:05:20 2015 +0200 Use realpath to find the mailspool inc is istalled with setgid-flag if the mailspool isn't world writeable and dot-locking is used. This work now if the mailspool is a sysmlink. :100644 100644 fda0e5a4... b8f41f22... M configure.ac commit cf1205b5cbea2f0cd6ea710ec16c637df85b647c Author: Philipp Takacs AuthorDate: Tue Apr 14 15:29:56 2015 +0200 Commit: Philipp Takacs CommitDate: Sun Apr 19 14:15:21 2015 +0200 Use sysexits.h for better exit-codes The sysexits header describe some standard exit-codes, which should be used. adios has now a status argument so sysexits.h can be used. :100644 100644 cfc0dc50... 8ea5ab51... M docs/TODO :100644 100644 f162ef51... 3512ef7f... M h/prototypes.h :100644 100644 e7590887... d7894c54... M sbr/addrsbr.c :100644 100644 32dd37f7... 205c8c9e... M sbr/brkstring.c :100644 100644 166fe592... 5886c5ee... M sbr/context_read.c :100644 100644 ac0dbfdf... 10d4d427... M sbr/context_save.c :100644 100644 6fa21f7e... 9cd8d38b... M sbr/cpydata.c :100644 100644 a9e5bc6e... 090cd717... M sbr/cpydgst.c :100644 100644 28f3255a... 1841ce40... M sbr/error.c :100644 100644 28ef8105... c10421d2... M sbr/execprog.c :100644 100644 d299efc4... ce35de91... M sbr/fmt_compile.c :100644 100644 e71b8d02... 8ddd3c16... M sbr/fmt_new.c :100644 100644 0616d17d... a8e773a9... M sbr/fmt_scan.c :100644 100644 0ecf382b... 8e5fd0a2... M sbr/folder_delmsgs.c :100644 100644 8b0d67d2... 47b9281e... M sbr/folder_realloc.c :100644 100644 e97dd1e8... b3659f98... M sbr/m_draft.c :100644 100644 a3852feb... 12d05b98... M sbr/m_getfld.c :100644 100644 90d3a273... f95a758f... M sbr/path.c :100644 100644 d93d04bd... 171ecf8a... M sbr/readconfig.c :100644 100644 40b84746... eb483b7b... M sbr/seq_msgstats.c :100644 100644 bfecaf01... ff01c427... M sbr/seq_read.c :100644 100644 1a9093d8... f23e1d03... M sbr/utils.c :100644 100644 bd01a2c7... 3e71ad0b... M sbr/vfgets.c :100644 100644 e7bc90f6... c6b028cb... M uip/ali.c :100644 100644 7a65a7fc... 1c971791... M uip/anno.c :100644 100644 a74eb961... af97e9ec... M uip/ap.c :100644 100644 21b218ba... 37dc9b17... M uip/burst.c :100644 100644 62e4cd22... 159d7e76... M uip/comp.c :100644 100644 21c67028... 07107127... M uip/dist.c :100644 100644 b6efbe84... 1cbb7ed5... M uip/dp.c :100644 100644 c0a056c8... 091def78... M uip/flist.c :100644 100644 884aa4fe... c9b28cf7... M uip/fmtdump.c :100644 100644 84b43650... 77029dc1... M uip/folder.c :100644 100644 91ce04a8... c754b278... M uip/forw.c :100644 100644 1cac19fd... 368bce3f... M uip/inc.c :100644 100644 57a65530... a6ac480e... M uip/mark.c :100644 100644 c862bc34... de2cf459... M uip/mhbuild.c :100644 100644 386cf95c... c201a951... M uip/mhl.c :100644 100644 ceb9336c... c4682b4a... M uip/mhlist.c :100644 100644 a59e0e88... 2a4f5041... M uip/mhlistsbr.c :100644 100644 eea92b72... 1515858b... M uip/mhmail.c :100644 100644 1d953772... 6ac0a220... M uip/mhparam.c :100644 100644 a3259264... fad75d7f... M uip/mhparse.c :100644 100644 47146f4f... c400fa6d... M uip/mhpath.c :100644 100644 3713495e... 9ae5bf0f... M uip/mhshow.c :100644 100644 f6d86cda... aeaf0e8e... M uip/mhshowsbr.c :100644 100644 74442ad5... 4234d25f... M uip/mhstore.c :100644 100644 c31a2dcc... 5b47f22c... M uip/mhtest.c :100644 100644 e95ee6ab... 90e2da71... M uip/new.c :100644 100644 78f64c04... c81db88d... M uip/packf.c :100644 100644 07dca9a9... a487adcf... M uip/pick.c :100644 100644 2bcd92a2... 0ca1e83a... M uip/prompter.c :100644 100644 4e052ccd... 4027ea2c... M uip/rcvdist.c :100644 100644 4c271dff... bd6bacbf... M uip/rcvpack.c :100644 100644 61a91b24... 9c842701... M uip/rcvstore.c :100644 100644 17e6d614... 01f205be... M uip/refile.c :100644 100644 a5864c11... 0ff86b81... M uip/repl.c :100644 100644 615369ca... f2460042... M uip/rmf.c :100644 100644 520ce036... f99dcbc7... M uip/rmm.c :100644 100644 f53cf1dd... 0f755ca2... M uip/scan.c :100644 100644 4fa5a0d9... 9c74f04f... M uip/scansbr.c :100644 100644 41ef92a5... ec9b76db... M uip/send.c :100644 100644 41f986dc... eac77e49... M uip/slocal.c :100644 100644 734b63b9... 802e010a... M uip/sortm.c :100644 100644 449d1a71... 476227ba... M uip/spost.c :100644 100644 cd72e446... 7e54929f... M uip/whatnow.c :100644 100644 3d3eb846... e61dc623... M uip/whom.c commit d254c5e2ad008f26d5fda43c3f24f0a711c7e851 Author: Philipp Takacs AuthorDate: Tue Apr 14 14:33:36 2015 +0200 Commit: Philipp Takacs CommitDate: Tue Apr 14 14:33:36 2015 +0200 reinclude some headers These includes are necessary to compile on FreeBSD. :100644 100644 8e8c11ac... f9ed6455... M h/mh.h :100644 100644 f97f65be... 47ae79e0... M sbr/dtime.c :100644 100644 60a8d82c... 42b35723... M sbr/dtimep.lex :100644 100644 cb0cb1c4... cab45f54... M sbr/pidstatus.c commit 2abb9a7cfb0930e27062088734d306e7d78e4cc2 Author: markus schnalke AuthorDate: Fri Apr 10 12:30:56 2015 +0200 Commit: markus schnalke CommitDate: Fri Apr 10 12:30:56 2015 +0200 Move #include from h/mh.h to source files Included files should not include further files. Now, only the necessary files are included and not all of them in every file. A large bunch of this work is done, but there are some more nested include files. :100644 100644 17d5c2f8... 8e8c11ac... M h/mh.h :100644 100644 5c519e9f... 4a57656f... M sbr/concat.c :100644 100644 abf666c6... 166fe592... M sbr/context_read.c :100644 100644 048579eb... 6fa21f7e... M sbr/cpydata.c :100644 100644 b788fefb... a9e5bc6e... M sbr/cpydgst.c :100644 100644 59ec9520... b59a8e7e... M sbr/crawl_folders.c :100644 100644 599b91d0... 28f3255a... M sbr/error.c :100644 100644 f1f03bcd... 28ef8105... M sbr/execprog.c :100644 100644 1fc5f36d... d299efc4... M sbr/fmt_compile.c :100644 100644 9fd34c8e... e71b8d02... M sbr/fmt_new.c :100644 100644 1f55a651... 0616d17d... M sbr/fmt_scan.c :100644 100644 69083cc8... 4cc8d6c6... M sbr/folder_addmsg.c :100644 100644 17b99bef... 0ecf382b... M sbr/folder_delmsgs.c :100644 100644 159949a0... ec51d64e... M sbr/folder_read.c :100644 100644 c90bfefd... c62eb772... M sbr/gans.c :100644 100644 9bac0e52... 4de8a892... M sbr/getanswer.c :100644 100644 b1879b38... bdce7bbb... M sbr/lock_file.c :100644 100644 b903b7e8... 0dcbffe4... M sbr/m_atoi.c :100644 100644 85d4e587... 7f2a7a8e... M sbr/m_convert.c :100644 100644 059e0e37... a3852feb... M sbr/m_getfld.c :100644 100644 4c7703cd... ff5d00c7... M sbr/m_mktemp.c :100644 100644 ea393852... c4870dd7... M sbr/makedir.c :100644 100644 a65d9de0... b52740df... M sbr/mts.c :100644 100644 21796a7a... 90d3a273... M sbr/path.c :100644 100644 a61dd9c0... 54d63eed... M sbr/seq_nameok.c :100644 100644 745fa25b... f546cb89... M sbr/seq_save.c :100644 100644 608b4a58... d59c10c8... M sbr/strcasecmp.c :100644 100644 9f08d99d... 249faf9c... M sbr/trim.c :100644 100644 64dd8487... 0d7f58a8... M sbr/trimcpy.c :100644 100644 297ad45c... 1a9093d8... M sbr/utils.c :100644 100644 4d7617bf... e7bc90f6... M uip/ali.c :100644 100644 8b32826b... 97f0c342... M uip/aliasbr.c :100644 100644 0483dffc... 7a65a7fc... M uip/anno.c :100644 100644 41554d7e... a74eb961... M uip/ap.c :100644 100644 db2ddc68... 21b218ba... M uip/burst.c :100644 100644 f8675932... 62e4cd22... M uip/comp.c :100644 100644 47d7ed50... 21c67028... M uip/dist.c :100644 100644 42c3ce87... cf668ad0... M uip/distsbr.c :100644 100644 22e725c3... b6efbe84... M uip/dp.c :100644 100644 5b5cf0ee... 5fbbb617... M uip/dropsbr.c :100644 100644 c0c8b5f6... c0a056c8... M uip/flist.c :100644 100644 dd5dbcb1... 884aa4fe... M uip/fmtdump.c :100644 100644 e46519b5... 84b43650... M uip/folder.c :100644 100644 1ba80eed... 91ce04a8... M uip/forw.c :100644 100644 33672de6... 1cac19fd... M uip/inc.c :100644 100644 e58ec64d... 57a65530... M uip/mark.c :100644 100644 2ffd09ce... c862bc34... M uip/mhbuild.c :100644 100644 c9a04188... c8730669... M uip/mhfree.c :100644 100644 09fa3665... 386cf95c... M uip/mhl.c :100644 100644 cf55c4cf... ceb9336c... M uip/mhlist.c :100644 100644 08f35c73... a59e0e88... M uip/mhlistsbr.c :100644 100644 9936261f... eea92b72... M uip/mhmail.c :100644 100644 0c8e644a... 0f0a8d60... M uip/mhmisc.c :100644 100644 e83932c5... a3259264... M uip/mhparse.c :100644 100644 67408ed9... 47146f4f... M uip/mhpath.c :100644 100644 e56b6120... 3713495e... M uip/mhshow.c :100644 100644 fe40f9d8... f6d86cda... M uip/mhshowsbr.c :100644 100644 63fa5abc... 74442ad5... M uip/mhstore.c :100644 100644 aa7e411e... c31a2dcc... M uip/mhtest.c :100644 100644 04fb949b... e95ee6ab... M uip/new.c :100644 100644 f9d02e8f... 78f64c04... M uip/packf.c :100644 100644 d31f9b80... 07dca9a9... M uip/pick.c :100644 100644 e42e8df7... 2bcd92a2... M uip/prompter.c :100644 100644 c3650595... 4e052ccd... M uip/rcvdist.c :100644 100644 352f785b... 4c271dff... M uip/rcvpack.c :100644 100644 0b5ad85c... 61a91b24... M uip/rcvstore.c :100644 100644 96f355a6... 17e6d614... M uip/refile.c :100644 100644 42bcfdc5... a5864c11... M uip/repl.c :100644 100644 164ec77b... 615369ca... M uip/rmf.c :100644 100644 03d4568b... 520ce036... M uip/rmm.c :100644 100644 29aea656... f53cf1dd... M uip/scan.c :100644 100644 865f2f72... 4fa5a0d9... M uip/scansbr.c :100644 100644 234dfb29... 41ef92a5... M uip/send.c :100644 100644 17be186b... 41f986dc... M uip/slocal.c :100644 100644 0230495e... 734b63b9... M uip/sortm.c :100644 100644 bfa8f4be... 449d1a71... M uip/spost.c :100644 100644 29693973... cd72e446... M uip/whatnow.c :100644 100644 e20df682... 1ccd2096... M uip/whatnowproc.c :100644 100644 fb77ab37... 3d3eb846... M uip/whom.c commit fe6c01d9f21c739dc729288ea350db865c5dbf95 Author: markus schnalke AuthorDate: Fri Apr 10 11:21:12 2015 +0200 Commit: markus schnalke CommitDate: Fri Apr 10 11:21:12 2015 +0200 Remove h/nmh.h Move its contents to h/mh.h. Remove the NLENGTH macro on the way, be cause it is not used. :100644 100644 2633228c... fda0e5a4... M configure.ac :100644 100644 78db70b2... 31987b59... M h/Makefile.in :100644 100644 75245e05... a39689d5... M h/mf.h :100644 100644 6b8f4a97... 17d5c2f8... M h/mh.h :100644 000000 3da6a140... 00000000... D h/nmh.h :100644 100644 2f8e5dc2... f97f65be... M sbr/dtime.c :100644 100644 83edbffe... 60a8d82c... M sbr/dtimep.lex :100644 100644 69afff8a... 17809976... M sbr/mf.c :100644 100644 95c0a3f9... a65d9de0... M sbr/mts.c :100644 100644 3c3e1052... 5b5cf0ee... M uip/dropsbr.c commit 3113d18bf20013be27c9aabc8aafcab9a6a8643e Author: markus schnalke AuthorDate: Fri Apr 10 10:59:30 2015 +0200 Commit: markus schnalke CommitDate: Fri Apr 10 10:59:30 2015 +0200 Minimize the include It's not necessary to include , is enough. :100644 100644 0fbe33f7... e83932c5... M uip/mhparse.c commit 803fbeb16fac49e0b6b1bdf1e4c2874bcf901749 Author: markus schnalke AuthorDate: Thu Apr 9 12:44:58 2015 +0200 Commit: markus schnalke CommitDate: Thu Apr 9 12:44:58 2015 +0200 Fix FTBFS bug introduced by 600379c One #include of h/signals.h is still necessary. :100644 100644 fc5d5707... 0fbe33f7... M uip/mhparse.c commit 55eda7c77fdf33b0a7175968471df55e2600379c Author: David Levine AuthorDate: Fri Feb 13 21:31:48 2015 -0600 Commit: Philipp Takacs CommitDate: Thu Mar 12 00:04:18 2015 +0100 Removed unnecessary #include of h/signals.h. :100644 100644 ba0d9781... 2ffd09ce... M uip/mhbuild.c :100644 100644 dc85bcc6... 08f35c73... M uip/mhlistsbr.c :100644 100644 4d04b652... 21c2e263... M uip/mhoutsbr.c :100644 100644 f4c26cc8... fc5d5707... M uip/mhparse.c commit 4e4c5eeaffc0ff9e341c1562a02c1749a9a06dbe Author: Marcin Cieslak AuthorDate: Tue Feb 10 14:18:05 2015 +0000 Commit: Philipp Takacs CommitDate: Wed Mar 11 23:53:36 2015 +0100 Fixed the error message in lockit() when it fails to create tmp file. :100644 100644 d15c9395... b1879b38... M sbr/lock_file.c commit 24756fd85e33a76ac495073e90a7a56cb7f6103c Author: David Levine AuthorDate: Fri Feb 13 22:22:21 2015 -0600 Commit: Philipp Takacs CommitDate: Wed Mar 11 23:53:36 2015 +0100 Removed m_chkids(), per suggestion of Marcin Cieslak. :100644 100644 d1371d01... ac0dbfdf... M sbr/context_save.c commit bb2dc190d836a871640e68feee28b290e554390d Author: David Levine AuthorDate: Fri Feb 13 21:30:41 2015 -0600 Commit: Philipp Takacs CommitDate: Wed Mar 11 23:53:36 2015 +0100 Removed #include of signal.h because it's in h/signals.h. :100644 100644 eb85a4a2... 3da6a140... M h/nmh.h :100644 100644 480bf6d0... 1e1dde16... M h/signals.h commit 0a96784b09f85f33437936b5dcfa819a33fa5bac Author: Marcin Cieslak AuthorDate: Thu Feb 12 21:09:26 2015 -0600 Commit: Philipp Takacs CommitDate: Wed Mar 11 23:53:33 2015 +0100 Replaced setgid() calls with setegid() so that it works with dot locking on FreeBSD. setegid() should be supported on modern POSIX systems. :100644 100644 8a05c6a0... 33672de6... M uip/inc.c commit 77ce143a56ef8238d974fd7e1e893516ec58772f Author: Philipp Takacs AuthorDate: Sat Mar 7 01:41:12 2015 +0100 Commit: Philipp Takacs CommitDate: Sat Mar 7 01:41:12 2015 +0100 remove declaration of child_id in slocal:usr_pipe Now the global version is used, so the signal handler works correct. :100644 100644 cf9a9b0f... 17be186b... M uip/slocal.c commit 92005d4291ac03dae4481c72d1549b2f75264cb9 Author: Philipp Takacs AuthorDate: Sun Feb 22 23:26:38 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Feb 22 23:26:38 2015 +0100 return -1 if fork(2) fails in execprog If fork in execprog fails and return 1 there is now way to different between a proces witch return 1. Thanks Marcin Cieslak for reporting. :100644 100644 ce383077... f1f03bcd... M sbr/execprog.c commit c72e2386fd126324e3b699d4b37f71a3c40f56bc Author: Philipp Takacs AuthorDate: Sat Feb 21 12:09:33 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Feb 22 23:19:11 2015 +0100 remove longjmp from signal handler in mhl To avoid undefined behavior set an interrupt flag in the signal handler. :100644 100644 54036735... 09fa3665... M uip/mhl.c commit 62b0c6727235a0bc560179dbf6b13d252716c02c Author: Philipp Takacs AuthorDate: Sat Feb 21 11:38:18 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Feb 22 23:15:51 2015 +0100 remove longjmp in signalhandler of slocal To avoid undefined behavior kill the child process in the signal handler and set an interrupt flag. :100644 100644 6a622846... 4a282fca... M h/rcvmail.h :100644 100644 ff8df8c8... cf9a9b0f... M uip/slocal.c commit 11f38fca55972832ee09a3b1ac8693050500545b Author: Philipp Takacs AuthorDate: Sat Feb 21 11:05:43 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Feb 22 23:12:15 2015 +0100 remove longjmp in signalhandler of prompter to avoid undefined behavior use close(2) in the signal handler :100644 100644 4d0ce860... e42e8df7... M uip/prompter.c commit 8edab16f7a56c8e822f94609b69c4f95ee2eec3b Author: Philipp Takacs AuthorDate: Sat Feb 21 11:03:26 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Feb 22 23:10:00 2015 +0100 remove longjmp from signalhandler in getans To avoid undefined behavior use close in the signal handler. :100644 100644 7254d6bd... f3cea273... M sbr/getans.c commit 1201af682c2a7e34d4d598e62718306b885a187e Author: Philipp Takacs AuthorDate: Sun Feb 22 14:26:27 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Feb 22 22:54:32 2015 +0100 nonstatic function for atexit, check if atexit fails atexit needs nonstatic functions to work correct. The error check is importent, because atexit can fail for some reasons and the cleanup woulden't work. :100644 100644 213cc5dd... 8a05c6a0... M uip/inc.c :100644 100644 6e0861ea... ba0d9781... M uip/mhbuild.c :100644 100644 8c7e51d2... cf55c4cf... M uip/mhlist.c :100644 100644 9bc7ed32... e56b6120... M uip/mhshow.c :100644 100644 6a268f23... 63fa5abc... M uip/mhstore.c :100644 100644 a1718db7... aa7e411e... M uip/mhtest.c :100644 100644 6c59add7... d31f9b80... M uip/pick.c :100644 100644 d3e41001... c3650595... M uip/rcvdist.c :100644 100644 fbddda7f... 0b5ad85c... M uip/rcvstore.c commit f9ed40f2742263b3a1023bedee4139b4b18f0a86 Author: markus schnalke AuthorDate: Sat Feb 14 17:29:22 2015 +0100 Commit: markus schnalke CommitDate: Sat Feb 14 17:29:22 2015 +0100 Refactor: Use if for two-way branching; Compare against 0 explicitly I think that the use of switch for the two-way branches could have been a performance optimization. I think it's clearer to use if, especially in the fall-through case. As setjmp() is known to return with either 0 or something else, we should compare against 0 and not against some define (for which I again and again wonder if it stands for 0 or for 1). :100644 100644 fedf78fa... 8c2e4af0... M uip/mhl.c :100644 100644 823760ef... ef33db96... M uip/prompter.c :100644 100644 ed6b08d8... 13ae7614... M uip/send.c commit 2f43405ca3cccdfc56faca7a8b6b0d6913cf45aa Author: markus schnalke AuthorDate: Sat Feb 14 17:28:05 2015 +0100 Commit: markus schnalke CommitDate: Sat Feb 14 17:28:05 2015 +0100 Fix minor coding style issues (whitespace) :100644 100644 c66b7cfe... afa67cee... M uip/mhlist.c :100644 100644 e94c2593... 58c5969c... M uip/pick.c commit 822e01d48920e30e281c5144ae0977ac2bf27549 Author: markus schnalke AuthorDate: Sat Feb 14 17:27:11 2015 +0100 Commit: markus schnalke CommitDate: Sat Feb 14 17:27:11 2015 +0100 Remove unnecessary headers :100644 100644 af460e6a... e187f59b... M uip/mhparse.c :100644 100644 71c16992... fe40f9d8... M uip/mhshowsbr.c :100644 100644 ae812ad3... f28d867d... M uip/mhstore.c commit a26d3f6e071fa5704406317fe50a1805659ed2f8 Author: Philipp Takacs AuthorDate: Fri Jan 30 02:25:17 2015 +0100 Commit: Philipp Takacs CommitDate: Fri Feb 13 19:19:33 2015 +0100 distout and ready_msg return NOTOK on error If distout or ready_msg fails, the cleanup of send is done. :100644 100644 a9a52b10... 42c3ce87... M uip/distsbr.c commit 965fe13d3f17c03059f172d4b6df0e53d0240433 Author: markus schnalke AuthorDate: Thu Feb 12 07:49:33 2015 +0100 Commit: markus schnalke CommitDate: Thu Feb 12 07:49:33 2015 +0100 mhmail: use execprog() :100644 100644 7e170a8b... e79d874b... M uip/mhmail.c commit 556440fbe435fee96348ca56e44c015149e5f7da Author: markus schnalke AuthorDate: Thu Feb 12 07:40:50 2015 +0100 Commit: markus schnalke CommitDate: Thu Feb 12 07:40:50 2015 +0100 sbr/execprog.c: Fix the return value Use pidXwait(), which invokes pidstatus(), here for error reporting. This eases the use of execprog() because we don't have to call it there everytime. However, it might be unwanted to put the error printing stuff into execprog() because we might have an invokation of execprog() that want's to deal with errors itself in a different way. If this would be the case, then we likely should change pidXwait() to pidwait() and call pidstatus(execprog()). :100644 100644 9cc88797... ce383077... M sbr/execprog.c commit 24493820bd28199ac23a81a5444cd2ebfb9c1f9c Author: markus schnalke AuthorDate: Wed Feb 11 08:11:53 2015 +0100 Commit: markus schnalke CommitDate: Wed Feb 11 08:11:53 2015 +0100 Minor clarifications in mhmail(1) :100644 100644 b2381c17... acecbbc8... M man/mhmail.man1 commit 1ba1ca6484d35f40b87d515302ea76e7b7b01f32 Author: markus schnalke AuthorDate: Wed Feb 11 08:04:35 2015 +0100 Commit: markus schnalke CommitDate: Wed Feb 11 08:04:35 2015 +0100 Update the man pages to the shortened reserved sequence names These reserved sequence names were shortened to one character long ago in the code. Now the docs are adjusted to that change. Thanks to Marcin for spotting it. :100644 100644 d545f2de... 97720315... M man/anno.man1 :100644 100644 b5babf60... a13e476b... M man/burst.man1 :100644 100644 8e27f663... 773663bc... M man/dist.man1 :100644 100644 ae4f6708... 8091c423... M man/forw.man1 :100644 100644 6577f64d... dacf4ce2... M man/mark.man1 :100644 100644 40ab6264... 04c84465... M man/mh-draft.man7 :100644 100644 60568edc... 516b8afd... M man/mh-sequence.man7 :100644 100644 e0724b27... 80bdccad... M man/mhlist.man1 :100644 100644 1c35fcd1... d5d3327d... M man/mhpath.man1 :100644 100644 8445a5f4... e4fdfdce... M man/mhstore.man1 :100644 100644 7b1263fd... 42971fec... M man/pick.man1 :100644 100644 3bc85f7b... 47f825be... M man/refile.man1 :100644 100644 c0feecbd... 698d9c82... M man/repl.man1 :100644 100644 07d6cc3e... 07af34f7... M man/rmm.man1 :100644 100644 f7b30fd1... d4f90d16... M man/show.man1 commit 4398a8488b5490571e6a82d4918c892828f88816 Author: Philipp Takacs AuthorDate: Thu Jan 29 23:02:58 2015 +0100 Commit: Philipp Takacs CommitDate: Thu Jan 29 23:02:58 2015 +0100 Initialize status in uip/send.c Thanks Marcin Cieslak for reporting. :100644 100644 07f25457... 492f027c... M uip/send.c commit fa591538beda05e6ce89323128705beabe4f543f Author: Philipp Takacs AuthorDate: Sat Jan 17 23:46:30 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Jan 18 00:49:51 2015 +0100 remove done finaly removed the used of done in sbr and the dafinition in the header. Also the source file is removed. :100644 100644 9d22c2b1... 6b8f4a97... M h/mh.h :100644 100644 9729346b... e5d8ffd9... M sbr/Makefile.in :100644 000000 3545d108... 00000000... D sbr/done.c :100644 100644 d8313cec... 599b91d0... M sbr/error.c :100644 100644 3659ff3d... e97dd1e8... M sbr/m_draft.c commit b284ee1b3c718e41bdcab6600532025b8743d477 Author: Philipp Takacs AuthorDate: Sat Jan 17 23:43:28 2015 +0100 Commit: Philipp Takacs CommitDate: Sun Jan 18 00:49:38 2015 +0100 remove last rests of done in uip At some points done was used as callback funktion. :100644 100644 92ee4962... e46519b5... M uip/folder.c :100644 100644 159e0108... 213cc5dd... M uip/inc.c :100644 100644 cdada9ba... 96f355a6... M uip/refile.c commit 96d10c193324201ef8acb622ed13e9a5ecb59827 Author: Philipp Takacs AuthorDate: Fri Jan 16 22:31:04 2015 +0100 Commit: Philipp Takacs CommitDate: Sat Jan 17 15:09:25 2015 +0100 Remove done from mhl pick and send Second part of removing done, to make the code better to read. This tools needed some refactoring before done could removed. Next step is removing done from sbr. :100644 100644 fedf78fa... 45113f3c... M uip/mhl.c :100644 100644 e94c2593... ae1fa03f... M uip/pick.c :100644 100644 ed6b08d8... 07f25457... M uip/send.c commit 2823e13f67239db7deb7274f3a47bfbff56c7c64 Author: Philipp Takacs AuthorDate: Sat Jan 17 02:00:22 2015 +0100 Commit: Philipp Takacs CommitDate: Sat Jan 17 02:00:22 2015 +0100 Initialize vecp in send anno() Access to an uninialized variable can cause a a buffer overflow or underrun. (Thanks to the compiler for reporting.) :100644 100644 b85963de... ed6b08d8... M uip/send.c commit b03bb1d9c9cd73aeac2b4003115b5546905433cd Author: Philipp Takacs AuthorDate: Sat Jan 17 01:01:57 2015 +0100 Commit: Philipp Takacs CommitDate: Sat Jan 17 01:36:52 2015 +0100 Add tests for pick Add two patches for pick. One to test the normale behavior, and one to test if a ``0'' is print to stdout when no message is find. :000000 100644 00000000... bd1a2e70... A test/tests/pick/test-normal-output :000000 100644 00000000... 8d962240... A test/tests/pick/test-output-on-error commit a40e399a346d4aef26ad6ea583558cdf00751c1f Author: Philipp Takacs AuthorDate: Fri Jan 16 20:48:09 2015 +0100 Commit: Philipp Takacs CommitDate: Fri Jan 16 20:48:09 2015 +0100 Bugfix in pick.c Undo last last commit in uip/pick.c. pick shoud only print "0" if it exit with a non-zero exit. :100644 100644 7c42b42a... e94c2593... M uip/pick.c commit fede6e42d81ce34fd5c1bbe7fb2757b281c2573a Author: Philipp Takacs AuthorDate: Sun Dec 14 14:45:35 2014 +0100 Commit: Philipp Takacs CommitDate: Fri Jan 16 19:18:08 2015 +0100 Replace done with exit at uip Replace done with exit in most sourcefiles of uip. This makes the code better to read. If the done was overwritten by an externel function atexit() is used instand. send.c and mhl.c are excluded, because need a bit rewrite first. :100644 100644 2c80147e... 4d7617bf... M uip/ali.c :100644 100644 e8742385... 0483dffc... M uip/anno.c :100644 100644 c293a532... 41554d7e... M uip/ap.c :100644 100644 e657c33f... db2ddc68... M uip/burst.c :100644 100644 4768fc4a... f8675932... M uip/comp.c :100644 100644 c1f4f9d3... 47d7ed50... M uip/dist.c :100644 100644 1a91678f... 22e725c3... M uip/dp.c :100644 100644 057d5f4e... c0c8b5f6... M uip/flist.c :100644 100644 a0e6e140... dd5dbcb1... M uip/fmtdump.c :100644 100644 8638151e... 92ee4962... M uip/folder.c :100644 100644 57e508f0... 1ba80eed... M uip/forw.c :100644 100644 f737d698... 159e0108... M uip/inc.c :100644 100644 d4a3729e... e58ec64d... M uip/mark.c :100644 100644 fde4a1d7... 6e0861ea... M uip/mhbuild.c :100644 100644 bf3382c5... c9a04188... M uip/mhfree.c :100644 100644 c66b7cfe... 8c7e51d2... M uip/mhlist.c :100644 100644 7e170a8b... 46b16fd2... M uip/mhmail.c :100644 100644 dce2d753... 1d953772... M uip/mhparam.c :100644 100644 af460e6a... 205c41a0... M uip/mhparse.c :100644 100644 a8de5cb2... 67408ed9... M uip/mhpath.c :100644 100644 0b49b7e8... 9bc7ed32... M uip/mhshow.c :100644 100644 ae812ad3... 5b56b090... M uip/mhstore.c :100644 100644 1c1684f4... a1718db7... M uip/mhtest.c :100644 100644 a43a710f... 1ea90103... M uip/new.c :100644 100644 763b6e70... f9d02e8f... M uip/packf.c :100644 100644 e94c2593... 7c42b42a... M uip/pick.c :100644 100644 823760ef... 03038a6b... M uip/prompter.c :100644 100644 2ba60977... d3e41001... M uip/rcvdist.c :100644 100644 79c34504... 352f785b... M uip/rcvpack.c :100644 100644 bb14ed98... fbddda7f... M uip/rcvstore.c :100644 100644 b07c32d2... cdada9ba... M uip/refile.c :100644 100644 e5fbc0ff... 42bcfdc5... M uip/repl.c :100644 100644 a0c68a36... 164ec77b... M uip/rmf.c :100644 100644 f6026411... 9401d2be... M uip/rmm.c :100644 100644 ba90e401... 29aea656... M uip/scan.c :100644 100644 837f038d... ff8df8c8... M uip/slocal.c :100644 100644 ed091815... 0230495e... M uip/sortm.c :100644 100644 b65e4c42... bfa8f4be... M uip/spost.c :100644 100644 914e2989... fbc85822... M uip/whatnow.c :100644 100644 57fddc8e... fb77ab37... M uip/whom.c commit 379b1bf4d085439639e7c535aac08345809dd6aa Author: markus schnalke AuthorDate: Thu Jan 15 21:40:53 2015 +0100 Commit: markus schnalke CommitDate: Thu Jan 15 21:43:15 2015 +0100 new: Fix a pointer problem I should learn to get such stuff right without the need to draw the memory layout with boxes and lines on paper ... Thanks to the test suite for catching this one! :100644 100644 a43a710f... 1ee95ffd... M uip/new.c commit 208338019e6adf22c0636baa07a6d0c61d8357fc Author: markus schnalke AuthorDate: Thu Jan 15 21:27:09 2015 +0100 Commit: markus schnalke CommitDate: Thu Jan 15 21:27:09 2015 +0100 send: Fix uninitialied variable :100644 100644 b85963de... ed6b08d8... M uip/send.c commit e40f90484354303f9ff03878f3b15b3c72b215c2 Author: markus schnalke AuthorDate: Thu Jan 15 21:18:03 2015 +0100 Commit: markus schnalke CommitDate: Thu Jan 15 21:18:03 2015 +0100 whatnow: Use execprog() ... one more time :100644 100644 163a02ec... 4f8d9563... M uip/whatnow.c commit edfe67020b9039e59e318cfc7831e033bd3e2615 Author: markus schnalke AuthorDate: Thu Jan 15 21:13:08 2015 +0100 Commit: markus schnalke CommitDate: Thu Jan 15 21:13:08 2015 +0100 whatnow: No need to fork Plus refactoring. :100644 100644 914e2989... 163a02ec... M uip/whatnow.c commit a546ac5c47c1053b3d03cc686d1c900f601ea237 Author: markus schnalke AuthorDate: Thu Jan 15 20:50:50 2015 +0100 Commit: markus schnalke CommitDate: Thu Jan 15 20:50:50 2015 +0100 sbr/ext_hook.c: Use execprog(); Refactoring :100644 100644 771d5589... 0f3bd792... M sbr/ext_hook.c commit 25e91f307475ef5b7e60b882299e0208398389c2 Author: markus schnalke AuthorDate: Thu Jan 15 20:30:15 2015 +0100 Commit: markus schnalke CommitDate: Thu Jan 15 20:30:15 2015 +0100 rmm: Use execprog() instead of own fork-exec :100644 100644 f6026411... 33ae9dad... M uip/rmm.c commit c62aa648e80ae81ac4aa354ab15783c8fb172514 Author: markus schnalke AuthorDate: Thu Jan 15 18:04:06 2015 +0100 Commit: markus schnalke CommitDate: Thu Jan 15 18:04:06 2015 +0100 Remove unused variable :100644 100644 7e80bc40... b85963de... M uip/send.c commit 43b38cc6c82b85aff3a5868289ecebeb20215b9c Author: markus schnalke AuthorDate: Thu Jan 15 17:53:20 2015 +0100 Commit: markus schnalke CommitDate: Thu Jan 15 17:53:20 2015 +0100 Convert pidXwait() from macro to function Plus some refactoring and syntactic sugar in pidstatus(). :100644 100644 f3fda880... 9d22c2b1... M h/mh.h :100644 100644 1333a84b... f162ef51... M h/prototypes.h :100644 100644 edd67490... cb0cb1c4... M sbr/pidstatus.c commit bcee4360d0113d2cbc71c9b0d13495327894e454 Author: markus schnalke AuthorDate: Thu Jan 15 17:08:55 2015 +0100 Commit: markus schnalke CommitDate: Thu Jan 15 17:08:55 2015 +0100 Don't save the context within execprog() This context_save() call was copied there accidently. :100644 100644 6a4a912d... 9cc88797... M sbr/execprog.c commit e8ac33e207bd0ac7efa723d32687156a9924c3f8 Author: markus schnalke AuthorDate: Wed Jan 14 22:24:34 2015 +0100 Commit: markus schnalke CommitDate: Wed Jan 14 22:24:34 2015 +0100 send: Convert system() to execprog() ... second half Now only uip/spost.c has one left. :100644 100644 3c2db0ea... 7e80bc40... M uip/send.c commit 04e93dabf152cc30d0aeb043d65f911ef765a176 Author: markus schnalke AuthorDate: Wed Jan 14 21:56:54 2015 +0100 Commit: markus schnalke CommitDate: Wed Jan 14 21:56:54 2015 +0100 send: Convert system() to execprog() ... partly :100644 100644 c2c9f178... 3c2db0ea... M uip/send.c commit 1e42112bb983f886f389b1fa3ef4d90a4dad4f91 Author: markus schnalke AuthorDate: Wed Jan 14 21:22:02 2015 +0100 Commit: markus schnalke CommitDate: Wed Jan 14 21:22:02 2015 +0100 forw: convert system() to execprog(); fix buffer check :100644 100644 54b7c074... 57e508f0... M uip/forw.c commit db62cda50055368e5f4ac51df787053f70706c30 Author: markus schnalke AuthorDate: Wed Jan 14 08:23:39 2015 +0100 Commit: markus schnalke CommitDate: Wed Jan 14 08:23:39 2015 +0100 Cleanup of code layout only :100644 100644 0185bd83... 59ec9520... M sbr/crawl_folders.c :100644 100644 738ffd59... 2f8e5dc2... M sbr/dtime.c :100644 100644 133a9ab1... 83edbffe... M sbr/dtimep.lex :100644 100644 173f12d4... 1fc5f36d... M sbr/fmt_compile.c :100644 100644 4e8231fc... faa3cc2c... M sbr/fmt_rfc2047.c :100644 100644 ec086a13... 1f55a651... M sbr/fmt_scan.c :100644 100644 4265763b... 159949a0... M sbr/folder_read.c :100644 100644 e69b833f... 8b0d67d2... M sbr/folder_realloc.c :100644 100644 ce33c2ea... 14c9a23d... M sbr/getarguments.c :100644 100644 5bd6bbba... 059e0e37... M sbr/m_getfld.c :100644 100644 6338a6ef... 69afff8a... M sbr/mf.c :100644 100644 c4e1e758... edd67490... M sbr/pidstatus.c :100644 100644 f051e38b... 148ecb90... M sbr/seq_list.c commit 6e5da31c92f5a3fa38e010052c5a7743bfe1cf11 Author: markus schnalke AuthorDate: Wed Jan 14 08:08:07 2015 +0100 Commit: markus schnalke CommitDate: Wed Jan 14 08:08:07 2015 +0100 Refactoring in the small Out-sorting failure cases instead of deep-nesting the success case. :100644 100644 ff9d84ce... 914e2989... M uip/whatnow.c commit 3c2d2abb007c8d97c6a09d9be0e70367518afe30 Author: markus schnalke AuthorDate: Wed Jan 14 07:53:31 2015 +0100 Commit: markus schnalke CommitDate: Wed Jan 14 07:53:31 2015 +0100 Remove verbosity for -noverbose; cleanup in code layout and message texts We shouldn't print information messages if we run non-verbosely. In this case, the message appeared not to be helpful because it suggests to re-run the command with `-verbose' ... but sending the message again is usually not possible, not wanted or would produce different results. This is a cleanup of Philipp's patch. :100644 100644 3ca67721... c2c9f178... M uip/send.c commit 8bf8e1e29df17658c3d77629e17f88bf9159e21b Author: markus schnalke AuthorDate: Wed Jan 14 07:31:49 2015 +0100 Commit: markus schnalke CommitDate: Wed Jan 14 07:31:49 2015 +0100 Use execprog() instead of system() ... partly transition There are several more places where system() should be replaced. As execprog() does not split strings into multiple arguments, `listproc' could no longer contain ``show -file''. We need to rework the concept of these `...proc' entries. This commit fixes tests/whatnow/test-attach-detach. :100644 100644 52ef4364... 2bf7325b... M config/config.c :100644 100644 109d3c40... 5e02d9f0... M man/mh-profile.man5 :100644 100644 a79845c0... a43a710f... M uip/new.c :100644 100644 9c9e5ce9... e5fbc0ff... M uip/repl.c :100644 100644 adb2039f... 3ca67721... M uip/send.c :100644 100644 7a59d591... b65e4c42... M uip/spost.c :100644 100644 c60a11c6... ff9d84ce... M uip/whatnow.c commit 0127c00f735b9e38608676b9f7bd3c6e38a7ffb4 Author: markus schnalke AuthorDate: Wed Jan 14 07:28:33 2015 +0100 Commit: markus schnalke CommitDate: Wed Jan 14 07:28:33 2015 +0100 Added execprog() and execprogl(), which are safer alternatives to system(3) This is motivated by the currently failing test case tests/whatnow/test-attach-detach. :100644 100644 26981f89... 1333a84b... M h/prototypes.h :100644 100644 64ecb9eb... 9729346b... M sbr/Makefile.in :000000 100644 00000000... 6a4a912d... A sbr/execprog.c commit 1ec0f1695f9f129210f7c3cdc0c85d329cc055df Author: markus schnalke AuthorDate: Tue Jan 13 23:13:59 2015 +0100 Commit: markus schnalke CommitDate: Tue Jan 13 23:13:59 2015 +0100 mhsign: use the strongest, newest not-expired secret key Is there no GnuPG option to exclude expired keys from the listing? :100755 100755 66ab142d... 038052b3... M uip/mhsign.sh commit 7f39c7e200489197364011fe4a39539beabf9ac7 Author: markus schnalke AuthorDate: Mon Dec 22 15:00:38 2014 +0100 Commit: markus schnalke CommitDate: Mon Dec 22 15:00:38 2014 +0100 Fix manpages (nroff code), as reported by tests/manpages/test-manpages :100644 100644 90cb9bae... 990ea42b... M man/mh-alias.man5 :100644 100644 39991522... 585dcfd2... M man/mhsign.man1 :100644 100644 26fd0945... c0feecbd... M man/repl.man1 commit c6462147c65c39cfe7eb9f7a2c57af426ac2b824 Author: markus schnalke AuthorDate: Mon Dec 22 13:07:02 2014 +0100 Commit: markus schnalke CommitDate: Mon Dec 22 13:07:02 2014 +0100 Partly fix tests/whatnow/test-attach-detach: changes in detach and alist Whatnow's detach and alist commands are different today: - detach does only take number arguments - alist prints full path names :100644 100644 8932bc3f... 82b25c69... M test/tests/whatnow/test-attach-detach commit 91b4059b377fa0d9601cab6be32c54edf54ac4d6 Author: markus schnalke AuthorDate: Mon Dec 22 13:03:50 2014 +0100 Commit: markus schnalke CommitDate: Mon Dec 22 13:03:50 2014 +0100 Fix tests/mhbuild/test-forw: rfc934 mode is no longer supported :100644 100644 8e783744... 759c8ed0... M test/tests/mhbuild/test-forw commit a624645d3bd49686c77559cee52900ec6f175909 Author: Philipp Takacs AuthorDate: Fri May 2 23:21:35 2014 +0200 Commit: Philipp Takacs CommitDate: Sat Dec 13 13:50:29 2014 +0100 Check with witch exit-code sendmail/spost exit and give an better error message. So the User sees better wat's wrong. At the moment only exit-code 75 is handlel extra. :100644 100644 e1e75186... adb2039f... M uip/send.c commit 245f268ee4818198f9db76fd809942ece9fa0fc3 Author: markus schnalke AuthorDate: Sun Dec 7 20:32:36 2014 +0100 Commit: markus schnalke CommitDate: Sun Dec 7 20:32:36 2014 +0100 Adjusted tests/new/test-basic to mmh. :100644 100644 772b72f4... 96bb9e1c... M test/tests/new/test-basic commit 768131a744e94e1aeadf0608854f4ccb75f2c952 Author: markus schnalke AuthorDate: Sun Dec 7 20:27:53 2014 +0100 Commit: markus schnalke CommitDate: Sun Dec 7 20:27:53 2014 +0100 mhparam: Renamed some sequences We should fix these names once and for all! :100644 100644 d29f73ad... dce2d753... M uip/mhparam.c commit 6e2f32e99cb31f65e86913e0706c92e257ab4169 Author: markus schnalke AuthorDate: Fri Nov 28 12:21:39 2014 +0100 Commit: markus schnalke CommitDate: Fri Nov 28 12:21:39 2014 +0100 tests: Adjusted most of the tests to mmh. :100755 100755 edab1629... 88676618... M test/runtest :100644 100644 8d466ac8... 8a3251ef... M test/tests/bad-input/test-header :100644 100644 ff293108... 72d559e2... M test/tests/folder/test-total :100644 100644 7582a7d3... 7d6604b1... M test/tests/repl/test-if-str :100644 100644 780a69dc... 88082eed... M test/tests/scan/test-scan :100644 100644 53a772a5... 07609b56... R085 test/tests/mhshow/test-cte-binary test/tests/show/test-cte-binary :100644 100644 74d70eef... f702379f... R093 test/tests/mhshow/test-qp test/tests/show/test-qp :100644 100644 1a36d8d6... 8932bc3f... M test/tests/whatnow/test-attach-detach :100644 100644 3e0ddc43... 44fecb6c... M test/tests/whatnow/test-cd :100644 100644 e0dc9696... 15d0824a... M test/tests/whatnow/test-ls commit c3ed524435c792523deeb78f3a6936b7ded0393e Author: markus schnalke AuthorDate: Fri Nov 28 11:46:33 2014 +0100 Commit: markus schnalke CommitDate: Fri Nov 28 11:46:33 2014 +0100 tests: Supress progress meter if non-interactive. :100644 100644 7f09867e... 0fd3afb9... M test/common.sh commit 2dfc2b7e8d543372cd1a66a3d7dc02f7f5e40b7d Author: markus schnalke AuthorDate: Fri Nov 28 11:05:17 2014 +0100 Commit: markus schnalke CommitDate: Fri Nov 28 11:05:17 2014 +0100 Added more include directories to fix building in another directory. I discovered these problems when I tried to build from a git clone (which has no config.h in the source directory). :100644 100644 80eb4097... 4bdad8e5... M config/Makefile.in :100644 100644 9539c0fb... 64ecb9eb... M sbr/Makefile.in :100644 100644 bf235316... 8fe7197f... M uip/Makefile.in commit 92009746ef66e8a9a9dc6643845e839e0debaf18 Author: markus schnalke AuthorDate: Fri Nov 28 00:07:13 2014 +0100 Commit: markus schnalke CommitDate: Fri Nov 28 00:07:13 2014 +0100 Fixed the test framework by adjusting it to mmh. In the same go: Cleaned up its code a bit and added a summary to test/runalltests. Adjusting the individual tests to mmh still needs to be done. ... and afterwards we can ;dd a lot more of them. :-) (But before we write our own tests, we first incorporate all the ones they've added to nmh in the meanwhile. ;-) ) :100644 100644 94b5ab15... e37a4eec... M test/README :100644 100644 5d46c8c2... 7f09867e... M test/common.sh :100755 100755 0497c52b... 279ced53... M test/runalltests :100755 100755 0b186530... edab1629... M test/runtest :100755 100755 fab26a0e... ffd9e644... M test/setup-test :100755 100755 7e169e41... 8c930b17... M test/teardown-test commit 1b97b10a0b0455edff975e23e2783c0c0b4b60d4 Author: markus schnalke AuthorDate: Thu Nov 27 23:35:18 2014 +0100 Commit: markus schnalke CommitDate: Thu Nov 27 23:35:18 2014 +0100 gitignore: ignore test dir name file :100644 100644 768e5233... b9250e08... M .gitignore commit a1c4e3d343ae3cf290466a81f470d74dbd839d05 Author: markus schnalke AuthorDate: Thu Nov 27 23:34:24 2014 +0100 Commit: markus schnalke CommitDate: Thu Nov 27 23:34:24 2014 +0100 uip/mmh.sh: minor cleanup :100755 100755 10fc070b... fe519c32... M uip/mmh.sh commit cc87eac5c0e4025fba81abe8433315df84489c56 Author: markus schnalke AuthorDate: Thu Nov 27 22:48:46 2014 +0100 Commit: markus schnalke CommitDate: Thu Nov 27 22:48:46 2014 +0100 Fixed building in different build directory, as described in INSTALL. :100644 100644 cde8cc39... fa2713c7... M INSTALL :100644 100644 9e01e93a... 2246c175... M man/Makefile.in :100644 100644 6bda3700... 9539c0fb... M sbr/Makefile.in commit fe95918ce103e911f20bd14874907d8fd7e1abaa Author: markus schnalke AuthorDate: Thu Nov 27 20:26:36 2014 +0100 Commit: markus schnalke CommitDate: Thu Nov 27 20:26:36 2014 +0100 mhsign: Ignore expired, revoked, invalid, and similar public keys. :100755 100755 9a060532... 66ab142d... M uip/mhsign.sh commit 3730bae9fe289aee86ce0ba57fdfd43857fcedc0 Author: markus schnalke AuthorDate: Thu Nov 27 18:30:31 2014 +0100 Commit: markus schnalke CommitDate: Thu Nov 27 18:30:31 2014 +0100 mhparam: Added more items for direct query and -debug listing. Most new values are not included in the -all listing because they are not part of the profile or context but are mainly internal configuration values. The -debug listing has now section headings (pipe through `grep -v ^#' to remove them). The motivation for this change was querying the default inbox name. If `Inbox' wasn't set in the profile, `mhparam inbox' had failed. Now it prints `+inbox' (if the defaultfolder has not been changed on your installation). :100644 100644 4e1fc210... d29f73ad... M uip/mhparam.c commit bc38ebb2e95e0a4d4a672b49366130f433e72aec Author: markus schnalke AuthorDate: Tue Nov 25 08:47:31 2014 +0100 Commit: markus schnalke CommitDate: Tue Nov 25 08:47:31 2014 +0100 mhpgp: Bugfix for 2932d136debcf53a45c44891ee80e6d34e61f109 (I should do better testing ...) :100755 100755 f3a39ea0... 4929358e... M uip/mhpgp.sh commit 2932d136debcf53a45c44891ee80e6d34e61f109 Author: markus schnalke AuthorDate: Tue Nov 25 08:21:12 2014 +0100 Commit: markus schnalke CommitDate: Tue Nov 25 08:21:12 2014 +0100 mhpgp: remove unused sed label OpenBSD complained about it. Reported by Dominik Lang . Thanks. :100755 100755 c562c645... f3a39ea0... M uip/mhpgp.sh commit c8ffcfd9b2c3f8550a097f3cab5e88c5d95aa535 Author: markus schnalke AuthorDate: Tue Nov 25 07:43:56 2014 +0100 Commit: markus schnalke CommitDate: Tue Nov 25 07:43:56 2014 +0100 pick: Clarified the man page with respect to -ddd. -ddd is an argument to e.g. -after, not a separate switch. :100644 100644 2f06a22f... 7b1263fd... M man/pick.man1 commit f36530fd658fd2ccfac328c5097f7b44712eceac Author: markus schnalke AuthorDate: Tue Nov 25 07:01:31 2014 +0100 Commit: markus schnalke CommitDate: Tue Nov 25 07:09:37 2014 +0100 mhsign: Bugfix: Don't ignore MMHPGPKEY and the Pgpkey profile entry. Bugreport and patch by Philipp Takacs . Thanks. Additionally: use `test -z'. :100755 100755 e6f54b39... 9a060532... M uip/mhsign.sh commit 98bb940e0e5a38128465e834e9ee99f2e6060d93 Author: markus schnalke AuthorDate: Fri Nov 21 11:55:22 2014 +0100 Commit: markus schnalke CommitDate: Fri Nov 21 11:55:22 2014 +0100 spost: If we add a From header, we add a qualified email address. Also clarified a comment and changed the description for blind distribution lists to the one that is most common today. :100644 100644 9b2ffcbc... 7a59d591... M uip/spost.c commit ed234233579b906c3aeaec8fb809c79079ee69d5 Author: markus schnalke AuthorDate: Thu Nov 20 11:38:28 2014 +0100 Commit: markus schnalke CommitDate: Thu Nov 20 11:38:28 2014 +0100 TODO: removed the double-dash TODO item, because it will not be done The GNU style double-dashes collide with MH's command line concepts. It makes no sense to simply allow a second dash, because all the rest is different. (Think of `pick --component'.) It's more important to keep the concepts clean than trying to imitate different concepts. :100644 100644 a9de6ddf... cfc0dc50... M docs/TODO commit 0285fea2ad25319da1cbc6637e8e72e2f223b4c0 Author: markus schnalke AuthorDate: Thu Nov 20 11:27:49 2014 +0100 Commit: markus schnalke CommitDate: Thu Nov 20 11:27:49 2014 +0100 rmm: Use `refile -src' instead of a folder changing hack. This is a cleanup for a ``hackish'' solution. Thanks to Philipp Takacs for discovering this improvement possibility and for preparing a patch. :100644 100644 4b1d7d3b... f6026411... M uip/rmm.c commit a72c94d4e0c02b5095ca6798de2474768490ef94 Author: markus schnalke AuthorDate: Thu Nov 20 10:57:46 2014 +0100 Commit: markus schnalke CommitDate: Thu Nov 20 10:57:46 2014 +0100 Fixed a possible uninitialized variable access. (Thanks to the compiler for reporting.) :100644 100644 8ffe8b83... 57fddc8e... M uip/whom.c commit e8b419a01421de7b88997d9a0220522dd38cbe8b Author: markus schnalke AuthorDate: Thu Nov 20 07:06:31 2014 +0100 Commit: markus schnalke CommitDate: Thu Nov 20 07:06:31 2014 +0100 coding style: Added braces even for one-line blocks This commit changes only uip/rmm.c. It would be tedious to change it everywhere. We can do this bit by bit as we go ... :100644 100644 51be03a9... 4b1d7d3b... M uip/rmm.c commit 0347722f5b69de06a867b73ddc23388d082ab219 Author: markus schnalke AuthorDate: Mon Nov 3 07:33:54 2014 +0100 Commit: markus schnalke CommitDate: Mon Nov 3 07:33:54 2014 +0100 Converted msgstats macros & Co. to functions and added range checks This change is a reaction to bug, fixed in changeset 5b093c3. Although the bug was fixed on a higher level, it would have been detected much earlier if we would have had the range checks that we now have. This patch was prepared by Philipp Takacs . :100644 100644 1331a14a... f3fda880... M h/mh.h :100644 100644 9b76d07a... 26981f89... M h/prototypes.h :100644 100644 dfd6c385... 6bda3700... M sbr/Makefile.in :000000 100644 00000000... 40b84746... A sbr/seq_msgstats.c commit 5b093c3d779ddbbd09a233c8cf7a20c0d0d15d1c Author: markus schnalke AuthorDate: Fri Sep 26 15:38:18 2014 +0200 Commit: markus schnalke CommitDate: Fri Sep 26 15:38:18 2014 +0200 send: Check the draft folder only if we send msgs, not when sneding files. Send can send files (specified by Unix path names) or messages (specified by MH message names/sequences. (NB: It cannot send msgs from other folders yet.) In case we've only specified files (this is done by whatnow, for instance) we don't need to care if there is a draft folder and if it contains any msgs. This commit probably fixes a problem discovered by . :100644 100644 bf376004... e1e75186... M uip/send.c commit 5babc068babfeb0c02075f550c9c3b156f44ed15 Author: markus schnalke AuthorDate: Thu Sep 25 13:17:14 2014 +0200 Commit: markus schnalke CommitDate: Thu Sep 25 13:17:14 2014 +0200 stringdex(): Clarified what it does `stringdex' stands for `string index'. (See Changlog for why the `g' was added.) This function is different to strcasestr() ... in the order of the arguments and in the return value. :100644 100644 2513b306... b3a2b74d... M sbr/strindex.c commit 786ff643f5933939b8c5173155aa0ae5a3a00eba Author: markus schnalke AuthorDate: Thu Sep 25 13:04:24 2014 +0200 Commit: markus schnalke CommitDate: Thu Sep 25 13:04:24 2014 +0200 uprf: We don't have to implement it ourselves but can use strncasecmp() Also clarified what an ``unsigned prefix'' really is. I haven't changed all uses of uprf() in the code to strncasecmp(). This could be done. I'm not sure if it would enhance the clarity of the code. We don't need a prototype for strncasecmp(), because it's declared in strings.h. :100644 100644 ed7f1aed... 9b76d07a... M h/prototypes.h :100644 100644 f283a1bc... f370b5c2... M sbr/uprf.c commit 6c0952c1d53bc73b1beefc46ef9ee08cd5213ac3 Author: markus schnalke AuthorDate: Thu Sep 25 12:23:19 2014 +0200 Commit: markus schnalke CommitDate: Thu Sep 25 12:23:19 2014 +0200 Use trim() to strip whitespace from the end of header fields The main motivation was to ease adding attachments. You'll easy happen to have trailing whitespace there, whereas you'll probably never want to send files that have a name with whitespace at the end ... at least you should never want to have or even send such files. I don't know if it is a good idea to strip the trailing whitespace in `anno -list' as well. I couldn't come up with an example when I would want to keep it, hence I decided to remove it. This can be changed back, if needed. :100644 100644 07bd32c6... d545f2de... M man/anno.man1 :100644 100644 2647d971... e8742385... M uip/anno.c :100644 100644 e63074ca... bf376004... M uip/send.c commit d854cd83e7b14f3bc686688ef7099b5d75157647 Author: markus schnalke AuthorDate: Thu Sep 25 12:20:11 2014 +0200 Commit: markus schnalke CommitDate: Thu Sep 25 12:20:11 2014 +0200 sbr/trim.c: New helper function trim(). Strips whitespace from a string. There is already trimcpy(), which does a bit more work, but adding trim() appears to be a useful investment. The static function trim() in slocal needed to be renamed to not collide. :100644 100644 a22eac68... ed7f1aed... M h/prototypes.h :100644 100644 5da6f89f... dfd6c385... M sbr/Makefile.in :000000 100644 00000000... 9f08d99d... A sbr/trim.c :100644 100644 107117f9... 837f038d... M uip/slocal.c commit ffabbf91237cb3b11f0dcb03334fe8f1e688d3e3 Author: markus schnalke AuthorDate: Wed Sep 24 16:38:06 2014 +0200 Commit: markus schnalke CommitDate: Wed Sep 24 16:38:06 2014 +0200 mhbuild: Transfer-encode MIME parts of type application always with base64 Application files likely contain NUL bytes. scan_content(), however, uses stdio to check the files to attach. NUL bytes break these checks. Instead of improving the checks to allow e.g. application/x-tex files to be sent using 7bit or QP encoding, it was chosen to take the easy way and send application files base64-encoded. This solves a bug when attaching tar files. (tar files begin with a header mostly filled with NUL bytes). Thanks to for discovering and reporting the bug. :100644 100644 1b2afa58... fde4a1d7... M uip/mhbuild.c commit 4f825c626f62534945940d0a6f863d76a50ffac5 Author: markus schnalke AuthorDate: Wed Sep 24 11:32:48 2014 +0200 Commit: markus schnalke CommitDate: Wed Sep 24 11:32:48 2014 +0200 print-mimetype: fixed a syntax error :100755 100755 2149902a... 76dd4aed... M uip/print-mimetype.sh commit bbd44053cddc15beb67cd3326c887b629140a96e Author: markus schnalke AuthorDate: Wed Sep 24 09:58:55 2014 +0200 Commit: markus schnalke CommitDate: Wed Sep 24 09:58:55 2014 +0200 repl: use different format as the lead-in to quotes in replies This format is prefered because it does not include words and is thus independent of the language of the user. :100644 100644 3498263b... 0caf5db2... M etc/mhl.reply :100644 100644 3b943809... 8a766798... M etc/replcomps :100644 100644 789633f2... f6af3a98... M etc/replgroupcomps commit f3380fda9da04a7c26a76070888ece92ae5648e9 Author: markus schnalke AuthorDate: Mon May 27 21:28:24 2013 +0200 Commit: markus schnalke CommitDate: Mon May 27 21:28:24 2013 +0200 mhbuild: Don't fail if one attaches an rfc822 message as a file Although the form attach: +folder 1234 is preferred, one may as well use attach: /path/to/message.rfc822 A warning is printed though. :100644 100644 5ad0fc10... 1b2afa58... M uip/mhbuild.c commit fa2bd173317d54c22a6e011d1e7becce7648f597 Author: markus schnalke AuthorDate: Sat Dec 8 23:25:26 2012 +0100 Commit: markus schnalke CommitDate: Sat Dec 8 23:25:26 2012 +0100 Bump version number. This is version 0.1 plus some development changes. :100644 100644 49d59571... 20958024... M VERSION commit ead9a2fc590517178695c9808aa692909ab8b15e Author: markus schnalke AuthorDate: Sat Dec 8 23:14:36 2012 +0100 Commit: markus schnalke CommitDate: Sat Dec 8 23:14:36 2012 +0100 This is mmh-0.1. Eventually, I managed to release it ... :100644 100644 233c5544... 44242e74... M DATE :100644 100644 f1f91430... 49d59571... M VERSION commit 2e868836b84ec7278248258451e496cea226174a Author: markus schnalke AuthorDate: Sat Dec 8 23:12:32 2012 +0100 Commit: markus schnalke CommitDate: Sat Dec 8 23:12:32 2012 +0100 docs/README.developers: minor cleanups. :100644 100644 7cb5eecf... a4505980... M docs/README.developers commit 1bf67e248d0a555170b03355c40332717902357c Author: markus schnalke AuthorDate: Sat Dec 8 23:05:26 2012 +0100 Commit: markus schnalke CommitDate: Sat Dec 8 23:05:26 2012 +0100 Added docs/DIFFERENCES_mmh_nmh. The list is not perfect, but better than nothing. Also added docs/schnalke-mmh.pdf to the distributed files. :000000 100644 00000000... 8063b83f... A docs/DIFFERENCES_mmh_nmh :100644 100644 2a220049... 4d6c6967... M docs/Makefile.in commit ca9795df89c225393b48e47ea252496167893414 Author: markus schnalke AuthorDate: Sat Dec 8 12:01:42 2012 +0100 Commit: markus schnalke CommitDate: Sat Dec 8 12:01:42 2012 +0100 Added my master's thesis, which explains mmh. See also: http://marmaro.de/docs/master :000000 100644 00000000... 8a79a8e0... A docs/schnalke-mmh.pdf commit 28208133c250bf189331314c955ab957639fc112 Author: markus schnalke AuthorDate: Sat Dec 8 11:17:05 2012 +0100 Commit: markus schnalke CommitDate: Sat Dec 8 11:17:05 2012 +0100 README.developers: Various minor updates. I also dropped the ugly double-spacing. :100644 100644 e1456fff... 7cb5eecf... M docs/README.developers commit b33ba7a7953d06a123ee59811903f0eb7f69e120 Author: markus schnalke AuthorDate: Sat Dec 8 11:15:12 2012 +0100 Commit: markus schnalke CommitDate: Sat Dec 8 11:15:12 2012 +0100 sbr/getpass.c: Removed nmh_getpass() for it is not used anymore. :100644 100644 a9e081d2... a22eac68... M h/prototypes.h :100644 100644 c6801b39... 5da6f89f... M sbr/Makefile.in :100644 000000 3fd4528e... 00000000... D sbr/getpass.c commit a0a71f2905d8aac9c08980d0faf69d14636e5ae0 Author: markus schnalke AuthorDate: Sat Dec 8 10:59:18 2012 +0100 Commit: markus schnalke CommitDate: Sat Dec 8 10:59:18 2012 +0100 Updated the list of documentation files to be distributed. :100644 100644 a9dfcc85... 2a220049... M docs/Makefile.in commit d6ee7d1acc9351a251337d173ad86f4aebd57a83 Author: markus schnalke AuthorDate: Sat Dec 8 10:57:47 2012 +0100 Commit: markus schnalke CommitDate: Sat Dec 8 10:57:47 2012 +0100 Makefile.in: Removed mmhrelease target because it's not used for mmh. :100644 100644 79746abb... 058e7d8b... M Makefile.in commit c5c062b01edad7c7c16417b4570446c9ba2ce683 Author: markus schnalke AuthorDate: Fri Dec 7 23:51:46 2012 +0100 Commit: markus schnalke CommitDate: Fri Dec 7 23:51:46 2012 +0100 Reworked docs/README.developes to match mmh. :100644 100644 935d0d16... e1456fff... M docs/README.developers commit 785be3a8cc773812aa8377936df59c3f6d9f89d4 Author: markus schnalke AuthorDate: Fri Dec 7 23:04:43 2012 +0100 Commit: markus schnalke CommitDate: Fri Dec 7 23:04:43 2012 +0100 Delete docs/pending-release-notes as this is without value for mmh. :100644 000000 47b01061... 00000000... D docs/pending-release-notes commit f9d8a8284d239ec66edca5c864ba1ac3296ae393 Author: markus schnalke AuthorDate: Fri Dec 7 23:02:55 2012 +0100 Commit: markus schnalke CommitDate: Fri Dec 7 23:02:55 2012 +0100 COPYRIGHT: Add a note to include mmh into nmh. This appears to be most simple. The remaining question: How to handle the year of the copyright notice? :100644 100644 07872da8... 00c1070e... M COPYRIGHT commit 8f5709a938fd28c98f5bf177023f06af97259b92 Author: markus schnalke AuthorDate: Fri Dec 7 23:02:20 2012 +0100 Commit: markus schnalke CommitDate: Fri Dec 7 23:02:20 2012 +0100 Updated the installation instructions in INSTALL. :100644 100644 8f3b7d3f... cde8cc39... M INSTALL commit ea1312104afee995b3416fa3b0bf01974ca13009 Author: markus schnalke AuthorDate: Fri Dec 7 23:00:57 2012 +0100 Commit: markus schnalke CommitDate: Fri Dec 7 23:00:57 2012 +0100 Included the relevant parts of docs/README.about into README. Also updated the information to mmh. :100644 100644 b61ba4cc... 81705d8e... M README :100644 100644 e9092a0d... a9dfcc85... M docs/Makefile.in :100644 000000 41f44828... 00000000... D docs/README.about commit 08143f93922ca7b651f5c01bcd0917144ed770e9 Author: markus schnalke AuthorDate: Tue Dec 4 23:04:08 2012 +0100 Commit: markus schnalke CommitDate: Tue Dec 4 23:04:08 2012 +0100 Updated man page mh-profile(5): file(1) is not from GNU. btw: Thanks to Dennis Herrmann (dhn) for pointing me to the whole issue. :100644 100644 1499c06a... 109d3c40... M man/mh-profile.man5 commit 10e03b3fba3e01052baf92c963c46a2a5529b4e0 Author: markus schnalke AuthorDate: Tue Dec 4 22:45:23 2012 +0100 Commit: markus schnalke CommitDate: Tue Dec 4 22:45:23 2012 +0100 Report useful error message on broken file(1). GNU file-4.26, for instance, is known to be broken. file(1) is the default Mime-Type-Query program. :100644 100644 76280aa6... e63074ca... M uip/send.c commit 7cc63591b9ee67a7475017c85eb95ed4fb003652 Author: markus schnalke AuthorDate: Mon Jul 16 10:29:07 2012 +0200 Commit: markus schnalke CommitDate: Mon Jul 16 10:29:07 2012 +0200 Updated man page mmh-intro(7): Replaced obsolete sequence names. Plus further minor cleanups. :100644 100644 7f059b3d... e9d0f136... M man/mmh-intro.man7 commit f072aa337e0be4c4dcac15a53c824cd0ba9ee741 Author: markus schnalke AuthorDate: Mon Jul 16 10:15:37 2012 +0200 Commit: markus schnalke CommitDate: Mon Jul 16 10:15:37 2012 +0200 Updated DATE, finally. :100644 100644 4a3bde85... 233c5544... M DATE commit f48c73769649f56fc2ce30407672216c983a35d5 Author: markus schnalke AuthorDate: Mon Jul 16 10:09:31 2012 +0200 Commit: markus schnalke CommitDate: Mon Jul 16 10:09:31 2012 +0200 mhl forms: Display the sender header before the recipient headers. This is the more natural order. :100644 100644 8533744d... 9636dbbf... M etc/mhl.format :100644 100644 8d726157... 1a01a7f9... M etc/mhl.headers commit d75e489f46f183946a7d1b5639b341de21b5741e Author: markus schnalke AuthorDate: Tue Jul 10 20:54:48 2012 +0200 Commit: markus schnalke CommitDate: Tue Jul 10 20:54:48 2012 +0200 Minor man page fix. :100644 100644 2febe2cb... 39991522... M man/mhsign.man1 commit 58cf09aa36e9f7f352a127158bbf1c5678bc6ed8 Author: markus schnalke AuthorDate: Tue Jul 10 20:53:05 2012 +0200 Commit: markus schnalke CommitDate: Tue Jul 10 20:53:05 2012 +0200 Added Neil Rickert's mhpgp, the companion to mhsign. Currently it is only usable on the command line directly. In the future, it should be invoked by show(1) as needed. :100644 100644 cd4425b5... 768e5233... M .gitignore :100644 100644 0866e0d4... 9e01e93a... M man/Makefile.in :000000 100644 00000000... 7d5af3b5... A man/mhpgp.man1 :100644 100644 7686ac1f... 7f059b3d... M man/mmh-intro.man7 :100644 100644 12cf74e6... bf235316... M uip/Makefile.in :000000 100755 00000000... c562c645... A uip/mhpgp.sh commit 00e24678854acd95c3cac1e49c8aafb6010dfdb9 Author: markus schnalke AuthorDate: Mon Jul 9 23:59:34 2012 +0200 Commit: markus schnalke CommitDate: Mon Jul 9 23:59:34 2012 +0200 Improved portability of mhsend(1). Thanks to Dennis Herrmann for the bug report and patch. :100755 100755 ac56bc26... e6f54b39... M uip/mhsign.sh commit 95d5b894202f6c42eae6a584f77bf9a80c5331f3 Author: markus schnalke AuthorDate: Sat Jul 7 15:30:29 2012 +0200 Commit: markus schnalke CommitDate: Sat Jul 7 15:30:29 2012 +0200 show: Print type of MIME part instead of error message if not displayable. A further step in the general rework of show/mhshow. Print less error messages. Not being able to directly display some attachment is no exceptional event, but quite normal. Therefore, no error message should be printed but an information message that there is a MIME part. Printing to stdout makes the message to be integrated into the normal output. There's more rework of show needed. :100644 100644 b5ecd099... 71c16992... M uip/mhshowsbr.c commit 4cb212cf82fa0c832ee3247da33e733f5cce04d6 Author: markus schnalke AuthorDate: Sat Jul 7 12:33:31 2012 +0200 Commit: markus schnalke CommitDate: Sat Jul 7 12:33:31 2012 +0200 spost: Don't send Sign: or Enc: headers out. Also, fixed the format of header fields with empty values. The trailing newline is no longer stripped. :100644 100644 de4a6d28... 9b2ffcbc... M uip/spost.c commit c7b5e1df086bcc37ff40163ee67571f076cf6683 Author: markus schnalke AuthorDate: Sat Jul 7 12:31:38 2012 +0200 Commit: markus schnalke CommitDate: Sat Jul 7 12:31:38 2012 +0200 send: Sign and encrypt messages automatically, based on Sign: and Enc: Hdrs. Currently, the value of the header fields is ignored. The sole presence of such a header caused signing or encryption. :100644 100644 935c92d8... 52ef4364... M config/config.c :100644 100644 bee55189... 1331a14a... M h/mh.h :100644 100644 a3f5ae29... 1499c06a... M man/mh-profile.man5 :100644 100644 1b00bf96... d93d04bd... M sbr/readconfig.c :100644 100644 87b4d175... 4e1fc210... M uip/mhparam.c :100644 100644 0660e958... 76280aa6... M uip/send.c commit c04ddf6908d7d3e3d41408d03f086273dee47b6e Author: markus schnalke AuthorDate: Sat Jul 7 11:14:20 2012 +0200 Commit: markus schnalke CommitDate: Sat Jul 7 11:14:20 2012 +0200 Removed old man page of whom. :100644 000000 a060d143... 00000000... D man/whom.man commit 921ea2dd0444ebe67a980b54b8017125d371c8e6 Author: markus schnalke AuthorDate: Sat Jul 7 11:13:18 2012 +0200 Commit: markus schnalke CommitDate: Sat Jul 7 11:13:18 2012 +0200 whom: Suppress the separator if no hidden rcpts are present. :100644 100644 718ef2e6... b40787b8... M man/whom.man1 :100644 100644 0451699b... 8ffe8b83... M uip/whom.c commit f45cdc98117a84f071759462c7ae212f4bc5ab2e Author: markus schnalke AuthorDate: Sat Jul 7 10:54:20 2012 +0200 Commit: markus schnalke CommitDate: Sat Jul 7 10:54:20 2012 +0200 Added Neil Rickert's mhsign. It is adjusted to mmh and thus somehow different to the original version. mhpgp will follow soon. :100644 100644 5c91101e... cd4425b5... M .gitignore :000000 100644 00000000... 61269c6a... A docs/README.mhsign-mhpgp :100644 100644 5b34a348... 0866e0d4... M man/Makefile.in :000000 100644 00000000... 2febe2cb... A man/mhsign.man1 :100644 100644 f8c7aaeb... 7686ac1f... M man/mmh-intro.man7 :100644 100644 f0c258e9... 12cf74e6... M uip/Makefile.in :000000 100755 00000000... ac56bc26... A uip/mhsign.sh commit 5c86fbdc071e1c322ccf341855eaa813807776b4 Author: markus schnalke AuthorDate: Sat Jul 7 10:17:05 2012 +0200 Commit: markus schnalke CommitDate: Sat Jul 7 10:17:05 2012 +0200 whatnow: Changes for consistency. Removed comments and arg names in prototypes. :100644 100644 6cb96f77... c60a11c6... M uip/whatnow.c commit 4246358611c366d8f9458afd5b121c2e5cf54aa1 Author: markus schnalke AuthorDate: Sat Jul 7 10:14:03 2012 +0200 Commit: markus schnalke CommitDate: Sat Jul 7 10:14:03 2012 +0200 whatnow: Re-integrated whom(1); cleanups. Removed reference to `send -watch', which was removed in 9677896bbb11f7b49ca3e1665601407b6c7a459f Reordered the options. :100644 100644 54f0ef86... e13fbfd3... M man/whatnow.man1 :100644 100644 63a60f30... 6cb96f77... M uip/whatnow.c commit 204c305913a20d207cba063ec2da8d0275d2da5d Author: markus schnalke AuthorDate: Fri Jul 6 17:51:37 2012 +0200 Commit: markus schnalke CommitDate: Fri Jul 6 17:51:37 2012 +0200 Re-added whom(1). This implementation is written from scratch. This new version of whom(1) is quite different to the old one, yet it serves the same purpose: listing the recipients of a message. It still misses the ability to process +folder and msgs arguments. As this implementation is new and not much practically tested, it may change in the future, if flaws appear. :100644 100644 cf79c474... 5b34a348... M man/Makefile.in :000000 100644 00000000... 718ef2e6... A man/whom.man1 :100644 100644 04df4050... f0c258e9... M uip/Makefile.in :000000 100644 00000000... 0451699b... A uip/whom.c commit c3b491e413335224388481939948dd6af4179851 Author: markus schnalke AuthorDate: Fri Jul 6 17:47:04 2012 +0200 Commit: markus schnalke CommitDate: Fri Jul 6 17:47:04 2012 +0200 Minor wording change in an error message. :100644 100644 6c5a8f65... b07c32d2... M uip/refile.c commit ca0b3e830b86700d9e5e31b1784de2bdcaf58fc5 Author: markus schnalke AuthorDate: Fri Jun 29 00:20:45 2012 +0200 Commit: markus schnalke CommitDate: Fri Jun 29 00:20:45 2012 +0200 Completely removed the backup-prefix (,). We move to +trash instead. mhbuild does not create `,foo.orig' but `foo.orig' now. Maybe it should move the file to +trash as well ... this is likely to be changed. Temporary files of bcc mails get removed now. :100644 100644 cfd5fe5b... 935c92d8... M config/config.c :100644 100644 37678db2... bee55189... M h/mh.h :100644 100644 8d368957... a3f5ae29... M man/mh-profile.man5 :100644 100644 5545fffc... 62d01be5... M man/mhbuild.man1 :100644 100644 b2c2cf49... 34c4a221... M man/send.man1 :100644 100644 f7cd8d34... c6801b39... M sbr/Makefile.in :100644 100644 35dc1950... 4265763b... M sbr/folder_read.c :100644 000000 bdb0e866... 00000000... D sbr/m_backup.c :100644 100644 fe7b4867... 1b00bf96... M sbr/readconfig.c :100644 100644 1ad8e42f... a9a52b10... M uip/distsbr.c :100644 100644 b22c137d... 5ad0fc10... M uip/mhbuild.c :100644 100644 a3399458... 87b4d175... M uip/mhparam.c :100644 100644 05b3e962... a0c68a36... M uip/rmf.c :100644 100644 5e1f0a10... 0660e958... M uip/send.c :100644 100644 da02d279... de4a6d28... M uip/spost.c commit 12824674d1fad93674dbe77419326301f62f14bd Author: markus schnalke AuthorDate: Fri Jun 29 00:14:21 2012 +0200 Commit: markus schnalke CommitDate: Fri Jun 29 00:14:21 2012 +0200 spost.man8: spost does read the profile now. :100644 100644 98c08fac... c66ba10a... M man/spost.man8 commit b5e6b7321a4aa439a32ae448e43343568fa13cbe Author: markus schnalke AuthorDate: Thu Jun 28 23:45:01 2012 +0200 Commit: markus schnalke CommitDate: Thu Jun 28 23:45:01 2012 +0200 mhbuild: Fixed order of file names in error messages. (The argument order is: rename(src, dest) and admonish("foo", "%s", "bar") produces: ``bar foo''.) :100644 100644 113ff388... b22c137d... M uip/mhbuild.c commit 68af8da96bea87a5541988870130b6209ce396f6 Author: markus schnalke AuthorDate: Thu Jun 28 20:08:16 2012 +0200 Commit: markus schnalke CommitDate: Thu Jun 28 20:08:16 2012 +0200 Removed context_foil(). We don't need it anymore. To not read the profile and context, don't call context_read(). Anyway, all mmh tools should read the context. slocal, which is not truly part of mmh, does not. :100644 100644 20820b5c... a9e081d2... M h/prototypes.h :100644 100644 ca49c469... f7cd8d34... M sbr/Makefile.in :100644 000000 5a38030f... 00000000... D sbr/context_foil.c :100644 100644 600efab2... abf666c6... M sbr/context_read.c commit 4d83cd450b889b65ffab1c352d6580bd5632aae1 Author: markus schnalke AuthorDate: Wed Jun 27 22:01:55 2012 +0200 Commit: markus schnalke CommitDate: Wed Jun 27 22:01:55 2012 +0200 ali: Either read default alias files or the ones on command line. Renamed -alias to -file because the semantic changed and the new name appears to be better suited. :100644 100644 72898c0c... b45fb928... M man/ali.man1 :100644 100644 e1e14fcc... 90cb9bae... M man/mh-alias.man5 :100644 100644 b5bbfbe3... 2c80147e... M uip/ali.c commit 9fca5fd33b87291cdcb326c7aab6ab9574244289 Author: markus schnalke AuthorDate: Wed Jun 27 14:52:42 2012 +0200 Commit: markus schnalke CommitDate: Wed Jun 27 14:52:42 2012 +0200 send,spost: No more use of -alias, spost reads Aliasfile from the profile. The profile entry Aliasfile was introduced in MH-6.7 to replace the -alias switches. Later, the profile entry was enhanced to support multiple files. Now that spost reads the profile itself, there is no more need to pass the file with switches. Operating with varying sets of alias files is now only possible with different profiles, but that should be a rare setup. :100644 100644 095a0f3a... 8d368957... M man/mh-profile.man5 :100644 100644 cbbf1185... b2c2cf49... M man/send.man1 :100644 100644 fda53f4a... 98c08fac... M man/spost.man8 :100644 100644 245bf3ce... 5e1f0a10... M uip/send.c :100644 100644 fe2e34b5... da02d279... M uip/spost.c commit 3e017a7abbdf69bf0dff7a4073275961eda1ded8 Author: markus schnalke AuthorDate: Wed Jun 27 14:23:35 2012 +0200 Commit: markus schnalke CommitDate: Wed Jun 27 14:23:35 2012 +0200 spost: Read profile and context now. Removed -library switch. spost is a full part of the mmh toolchest, hence, it shall read the profile/context. This will remove the need to pass profile information from send to spost via command line switches. In January 2012, there had been a discussion on the nmh-workers ML whether post should read the profile/context. There wasn't a clear answer. It behavior was mainly motivated by the historic situation, it seems. My opinion on the topic goes into the direction that every tool that is part of the mmh toolchest should read the profile. That is a clear and simple concept. Using MH tools without wanting to interact with MH (like mhmail had been) is no more a practical problem. :100644 100644 c454f765... 245bf3ce... M uip/send.c :100644 100644 ff1e80ac... fe2e34b5... M uip/spost.c commit 32d4f9daaa70519be3072479232ff7be0500d009 Author: markus schnalke AuthorDate: Wed Jun 27 13:15:47 2012 +0200 Commit: markus schnalke CommitDate: Wed Jun 27 13:15:47 2012 +0200 mhmail: Read the context! mhmail will change from a mailx-replacment to an alternative to `comp -ed prompter', thus being a send front-end. Hence, mhmail should not stay outside the profile/context respecting mmh toolchest. :100644 100644 78567d87... b2381c17... M man/mhmail.man1 :100644 100644 b3a9acb5... 7e170a8b... M uip/mhmail.c commit 3b3e228976ad0b0173c53c4193ab49fb3a6a7132 Author: markus schnalke AuthorDate: Wed Jun 27 12:30:38 2012 +0200 Commit: markus schnalke CommitDate: Wed Jun 27 12:30:38 2012 +0200 slocal: Do not at all interact with the context or profile. Slocal is not a true part of mmh, it is an MDA that is (currently) shipped with the MUA mmh. :100644 100644 4d660b20... f6c78d45... M man/slocal.man1 :100644 100644 9d468025... 107117f9... M uip/slocal.c commit 0c9207459097089a931399ff7d384884288bc4ac Author: markus schnalke AuthorDate: Sat Jun 23 16:29:40 2012 +0200 Commit: markus schnalke CommitDate: Sat Jun 23 16:29:40 2012 +0200 Added missing header. Reported by Dennis Herrmann. It had worked on GNU/Linux, but not on FreeBSD. :100644 100644 e946664c... 95c0a3f9... M sbr/mts.c commit 9677896bbb11f7b49ca3e1665601407b6c7a459f Author: markus schnalke AuthorDate: Fri Jun 22 19:17:11 2012 +0200 Commit: markus schnalke CommitDate: Fri Jun 22 19:17:11 2012 +0200 Removed the -[no]watch flags of send and post. Without direct SMTP delivery, they are useless. :100644 100644 22c37fc9... cbbf1185... M man/send.man1 :100644 100644 849d42b6... fda53f4a... M man/spost.man8 :100644 100644 bcbd54dd... c454f765... M uip/send.c :100644 100644 30e283f4... ff1e80ac... M uip/spost.c commit f2a6db98791abab22db95b9a4a01516859d92103 Author: markus schnalke AuthorDate: Fri Jun 22 19:06:36 2012 +0200 Commit: markus schnalke CommitDate: Fri Jun 22 19:06:36 2012 +0200 whatnow: Improved the listing of available commands in the WhatNow shell. :100644 100644 98ac75f2... 63a60f30... M uip/whatnow.c commit 921908704b980c90c3c68545be7f4d42718bfba4 Author: markus schnalke AuthorDate: Fri Jun 22 15:58:34 2012 +0200 Commit: markus schnalke CommitDate: Fri Jun 22 15:58:34 2012 +0200 mhl: Removed remaining code of obsolete -sleep switch. The switch was used for the faceproc, for Face: header field handling. :100644 100644 5280ade6... fedf78fa... M uip/mhl.c commit 7cf0c30b2e1364bfb9633638dbdaf5c924191520 Author: markus schnalke AuthorDate: Wed Jun 20 16:37:38 2012 +0200 Commit: markus schnalke CommitDate: Wed Jun 20 16:37:38 2012 +0200 Updated man page send(1) for mime-type-query instead of mhshow-suffix. This aligns the man page to the code. :100644 100644 d8e18862... 22c37fc9... M man/send.man1 commit b46f3952feb22813f2f9f4f3d8504b9849f82161 Author: markus schnalke AuthorDate: Fri Jun 15 11:02:09 2012 +0200 Commit: markus schnalke CommitDate: Fri Jun 15 11:02:09 2012 +0200 whatnow: Call send(1) as `send', not as `whatnow'. :100644 100644 118afe85... 98ac75f2... M uip/whatnow.c commit 7d3201b86a4f310a8c185a9c40f0bb516f6402f1 Author: markus schnalke AuthorDate: Fri Jun 15 09:22:03 2012 +0200 Commit: markus schnalke CommitDate: Fri Jun 15 09:22:03 2012 +0200 mmh.sh: Changed from -version to -Version, here too. :100755 100755 68cf1201... 10fc070b... M uip/mmh.sh commit 6e8e22e2ff93a8778f53b56246c42bf7f4dd8026 Author: markus schnalke AuthorDate: Thu Jun 14 02:19:43 2012 +0200 Commit: markus schnalke CommitDate: Thu Jun 14 02:19:43 2012 +0200 spost: Just a move of some code. :100644 100644 73f9b0a3... 30e283f4... M uip/spost.c commit e6705626cc95da96d367bc147ed0419a56f7c37a Author: markus schnalke AuthorDate: Wed Jun 13 12:02:06 2012 +0200 Commit: markus schnalke CommitDate: Wed Jun 13 12:02:06 2012 +0200 Renamed switches variable to ease automatic text extraction. Now, it's easier to get a list of all switches of a program from the source code. The change improves the homogeneity, too. :100644 100644 18d0176c... 5280ade6... M uip/mhl.c :100644 100644 4c1210ba... 73f9b0a3... M uip/spost.c :100644 100644 273921c9... 118afe85... M uip/whatnow.c commit 6b1eba7d43dcd9d28c0d4ac2bae23a55f487a9b8 Author: markus schnalke AuthorDate: Fri Jun 8 10:18:47 2012 +0200 Commit: markus schnalke CommitDate: Fri Jun 8 10:18:47 2012 +0200 Whatnow prompt: From now on, detaching only by numbers. -n flag of `detach' is now default and thus removed. (`alist' prints the numbers by default.) If by mistake a whole bunch of of files was added (e.g. `attach *'), these attachments should be removed with the editor in the draft. :100644 100644 36295acd... 54f0ef86... M man/whatnow.man1 :100644 100644 798d0e24... 273921c9... M uip/whatnow.c commit 6d6b17fd2311daa48928e36bb131cda8fd1c91eb Author: markus schnalke AuthorDate: Fri Jun 8 10:04:59 2012 +0200 Commit: markus schnalke CommitDate: Fri Jun 8 10:04:59 2012 +0200 Fixed `alist' command at whatnow prompt. :100644 100644 bbb468da... 798d0e24... M uip/whatnow.c commit ccf4f175ef4c4e7522f9510a4a1149c15d810dd9 Author: markus schnalke AuthorDate: Mon Jun 4 20:23:28 2012 +0200 Commit: markus schnalke CommitDate: Mon Jun 4 20:23:28 2012 +0200 Removed configure flag --disable-locale and have it always enabled. Todays system are assumed to have locale support. :100644 100644 f757b3f7... 2633228c... M configure.ac :100644 100644 8effd63d... b5bbfbe3... M uip/ali.c :100644 100644 c80b782b... 2647d971... M uip/anno.c :100644 100644 9f8e6f0f... c293a532... M uip/ap.c :100644 100644 1464cd6e... e657c33f... M uip/burst.c :100644 100644 680c0fc9... 4768fc4a... M uip/comp.c :100644 100644 d00f686f... c1f4f9d3... M uip/dist.c :100644 100644 aee4b292... 1a91678f... M uip/dp.c :100644 100644 2a002a5d... 057d5f4e... M uip/flist.c :100644 100644 fc94247c... a0e6e140... M uip/fmtdump.c :100644 100644 34b3d988... 8638151e... M uip/folder.c :100644 100644 b75bd2ee... 54b7c074... M uip/forw.c :100644 100644 4b75c6e2... f737d698... M uip/inc.c :100644 100644 c1da6445... d4a3729e... M uip/mark.c :100644 100644 76626dbb... 113ff388... M uip/mhbuild.c :100644 100644 8b29ee4b... 18d0176c... M uip/mhl.c :100644 100644 e507127a... c66b7cfe... M uip/mhlist.c :100644 100644 a85899de... b3a9acb5... M uip/mhmail.c :100644 100644 605d13c3... a8de5cb2... M uip/mhpath.c :100644 100644 e1bcf8f1... 0b49b7e8... M uip/mhshow.c :100644 100644 b0c08da1... ae812ad3... M uip/mhstore.c :100644 100644 d24694ee... 1c1684f4... M uip/mhtest.c :100644 100644 7c3191aa... a79845c0... M uip/new.c :100644 100644 b565c164... 763b6e70... M uip/packf.c :100644 100644 b817a0b8... e94c2593... M uip/pick.c :100644 100644 e1f0bff8... 823760ef... M uip/prompter.c :100644 100644 fa2a170b... 2ba60977... M uip/rcvdist.c :100644 100644 fe98a449... 79c34504... M uip/rcvpack.c :100644 100644 8121e2d1... bb14ed98... M uip/rcvstore.c :100644 100644 76384dd4... 6c5a8f65... M uip/refile.c :100644 100644 462498e9... 9c9e5ce9... M uip/repl.c :100644 100644 9d207522... 05b3e962... M uip/rmf.c :100644 100644 0aab0ba0... 51be03a9... M uip/rmm.c :100644 100644 269193ff... ba90e401... M uip/scan.c :100644 100644 06058e86... bcbd54dd... M uip/send.c :100644 100644 ec788e31... 9d468025... M uip/slocal.c :100644 100644 4cd999d8... ed091815... M uip/sortm.c :100644 100644 4384bc4c... 4c1210ba... M uip/spost.c :100644 100644 ead1bd5c... bbb468da... M uip/whatnow.c commit 8810b53f7b81388844036358cdd96f17eb9d87f7 Author: markus schnalke AuthorDate: Fri Jun 1 17:27:25 2012 +0200 Commit: markus schnalke CommitDate: Fri Jun 1 17:27:25 2012 +0200 show: Don't display strange headers by default. This follows a suggestion by steve on the nmh-workers mailing list. :100644 100644 9bd6ed99... 8d726157... M etc/mhl.headers commit 1a775e9cebd5de511e1ab50db894db43e6c2e802 Author: markus schnalke AuthorDate: Mon May 21 21:20:38 2012 +0200 Commit: markus schnalke CommitDate: Mon May 21 21:20:38 2012 +0200 (Ignore!) Again a whitespace change for testing purposes. :100644 100644 09346dab... d7f43af0... M h/fmt_scan.h commit 6e31ed26e82a28c2f65197102c178e6ae8633d80 Author: markus schnalke AuthorDate: Mon May 21 21:13:32 2012 +0200 Commit: markus schnalke CommitDate: Mon May 21 21:13:32 2012 +0200 (Ignore!) Removed a trailing whitespace line, just for a test. :100644 100644 6dacd5c9... b61ba4cc... M README commit f1b5a26561ad625f8fc87fe19c77097e719b9aed Author: markus schnalke AuthorDate: Wed May 16 11:00:55 2012 +0200 Commit: markus schnalke CommitDate: Wed May 16 11:00:55 2012 +0200 Fixed mhl's -nobody switch. :100644 100644 8c2094ed... 8b29ee4b... M uip/mhl.c commit 2ad400e58233fb80e4c331e1d97c25c6d7312dd4 Author: markus schnalke AuthorDate: Sat May 5 12:25:21 2012 +0200 Commit: markus schnalke CommitDate: Sat May 5 12:25:21 2012 +0200 Remove -dist from man page spost(8) because it's a hidden switch. :100644 100644 d55b9922... 849d42b6... M man/spost.man8 commit 350ad6d3542a07639213cf2a4fe524e829c1e7b6 Author: markus schnalke AuthorDate: Sat May 5 12:19:03 2012 +0200 Commit: markus schnalke CommitDate: Sat May 5 12:19:03 2012 +0200 mhl: Removed unused digest features from mhl. Only MIME-digest are supported now, with `forw -digest ...'. :100644 100644 efec5dbc... 8277cc8b... M etc/Makefile.in :100644 000000 ea4a6d51... 00000000... D etc/mhl.digest :100644 100644 328db8fc... 8c2094ed... M uip/mhl.c commit 0bd9750710cdbab80cfb4036dd87af20afe1552f Author: markus schnalke AuthorDate: Sat May 5 11:48:11 2012 +0200 Commit: markus schnalke CommitDate: Sat May 5 11:48:11 2012 +0200 prompter: Various rework. Removed -kill and -erase as they are not needed anymore today. Removed -doteof/-nodoteof. -nodoteof had been the default already. Made the yet hidden switches -body/-nobody visible, but with a slightly different meaning. See recent changes in the man page prompter(1) for details. (Eventually, one can have mutt-like message composing.) :100644 100644 01b468c2... 4d701c6e... M man/prompter.man1 :100644 100644 024f6049... e1f0bff8... M uip/prompter.c commit aeca8a417f58825dc5c5c3fbd9d958251d6763fe Author: markus schnalke AuthorDate: Sat May 5 11:43:24 2012 +0200 Commit: markus schnalke CommitDate: Sat May 5 11:43:24 2012 +0200 mhmail: For mailx(1) compat: A period alone on a line means EOF. Also renamed the -body switch to -bodytext because its argument is the body text and not a file containing the body text. The rename should clarify this. After all, typing `-body' results in the same as typing `-bodytext' or only `-b'. Now, fgets() is used instead of fread(), thus not allowing null-bytes in the input anymore. This should be no restriction. :100644 100644 d2dcaae5... 78567d87... M man/mhmail.man1 commit ec1868939da034be930a7c86f967036c282680ff Author: markus schnalke AuthorDate: Sat May 5 11:38:23 2012 +0200 Commit: markus schnalke CommitDate: Sat May 5 11:38:23 2012 +0200 mhmail: For mailx(1) compat: A period alone on a line means EOF. Also renamed the -body switch to -bodytext because its argument is the body text and not a file containing the body text. The rename should clarify this. After all, typing `-body' results in the same as typing `-bodytext' or only `-b'. :100644 100644 0210c73d... d2dcaae5... M man/mhmail.man1 :100644 100644 5c7f002d... a85899de... M uip/mhmail.c commit 853cad7faa5eed9a5988825ac24f462887e12494 Author: markus schnalke AuthorDate: Sat May 5 08:14:26 2012 +0200 Commit: markus schnalke CommitDate: Sat May 5 08:14:26 2012 +0200 mhmail: Removed hidden -resent and -queued switches. Mhmail is intended to provide only a simple mail(1) interface to mmh for the system. For all fancy stuff, use the mmh tools directly. The -queued switch is not supported by spost anyway. For resending messages, use dist not mhmail. :100644 100644 6506b7d2... 5c7f002d... M uip/mhmail.c commit 5f2b39344cca1086c975d47b730929d8f1904214 Author: markus schnalke AuthorDate: Sat May 5 08:05:22 2012 +0200 Commit: markus schnalke CommitDate: Sat May 5 08:05:22 2012 +0200 Require at least 2 chars for `no' variants of switches. This results in: ali -n --> -normalize ali -no --> ambiguous folder -n --> unknown (don't know if this case is good) folder -no --> ambiguous :100644 100644 73f71668... 8effd63d... M uip/ali.c :100644 100644 3958eb14... c80b782b... M uip/anno.c :100644 100644 3bb2bf0b... 9f8e6f0f... M uip/ap.c :100644 100644 8d6e69b4... 1464cd6e... M uip/burst.c :100644 100644 1c45a982... 680c0fc9... M uip/comp.c :100644 100644 3db8cfc0... d00f686f... M uip/dist.c :100644 100644 ac680806... 2a002a5d... M uip/flist.c :100644 100644 584bb768... 34b3d988... M uip/folder.c :100644 100644 cbff866d... b75bd2ee... M uip/forw.c :100644 100644 e1557847... 4b75c6e2... M uip/inc.c :100644 100644 3818c29b... c1da6445... M uip/mark.c :100644 100644 12e65489... 76626dbb... M uip/mhbuild.c :100644 100644 7129ce5a... e507127a... M uip/mhlist.c :100644 100644 fe984610... a3399458... M uip/mhparam.c :100644 100644 1ee5c82f... e1bcf8f1... M uip/mhshow.c :100644 100644 259acf39... b0c08da1... M uip/mhstore.c :100644 100644 871270ee... d24694ee... M uip/mhtest.c :100644 100644 fa5531a5... b817a0b8... M uip/pick.c :100644 100644 6db0455a... 024f6049... M uip/prompter.c :100644 100644 5602dbc9... 8121e2d1... M uip/rcvstore.c :100644 100644 e4433bd9... 76384dd4... M uip/refile.c :100644 100644 d8478409... 462498e9... M uip/repl.c :100644 100644 096a9bf2... 9d207522... M uip/rmf.c :100644 100644 0316c2c6... 0aab0ba0... M uip/rmm.c :100644 100644 84e05dfb... 06058e86... M uip/send.c :100644 100644 bd6b0a27... ec788e31... M uip/slocal.c :100644 100644 9e96d5a4... 4cd999d8... M uip/sortm.c :100644 100644 f3630d25... 4384bc4c... M uip/spost.c commit bd60514e13b4b1d4e2f726e6fc54da9eff6a263e Author: markus schnalke AuthorDate: Sat May 5 07:55:20 2012 +0200 Commit: markus schnalke CommitDate: Sat May 5 07:55:20 2012 +0200 Don't require a length for switch prefixes without good reason. E.g. there's no reason (anymore?) to require the user to type `whatnow -prom' when `whatnow -p' is already distinguishing. :100644 100644 7ede7e05... 3958eb14... M uip/anno.c :100644 100644 de3c0be4... 7c3191aa... M uip/new.c :100644 100644 d409b5cb... fa2a170b... M uip/rcvdist.c :100644 100644 085cc7fa... 269193ff... M uip/scan.c :100644 100644 e3a411ad... ead1bd5c... M uip/whatnow.c commit ea21fe2c4bd23c639bef251398fae809875732ec Author: markus schnalke AuthorDate: Sat May 5 07:53:09 2012 +0200 Commit: markus schnalke CommitDate: Sat May 5 07:53:09 2012 +0200 flist: Removed the hidden -total switch. It was simply the inverse of the visible -fast switch. -nofast was -total and -fast was -nototal. Now, the hidden pair went away. :100644 100644 71ae8e85... ac680806... M uip/flist.c commit 00140a3c86e9def69d98ba2ffd4d6e50ef6326ea Author: markus schnalke AuthorDate: Sat May 5 07:51:52 2012 +0200 Commit: markus schnalke CommitDate: Sat May 5 07:51:52 2012 +0200 sortm: Removed the hidden -subject switch, which provided compat only. Use `-textfield subject' instead. :100644 100644 d7dae612... 9e96d5a4... M uip/sortm.c commit c4a4ae457b089b440ba4cb62bca2e2ca59940ac1 Author: markus schnalke AuthorDate: Sat May 5 07:51:32 2012 +0200 Commit: markus schnalke CommitDate: Sat May 5 07:51:32 2012 +0200 forw: Fixed -build switch. :100644 100644 b1148b09... cbff866d... M uip/forw.c commit ac2834b4173be67edde1334819d3d3c16e4d484e Author: markus schnalke AuthorDate: Sat May 5 07:51:04 2012 +0200 Commit: markus schnalke CommitDate: Sat May 5 07:51:04 2012 +0200 Added comment and removed whitespace. :100644 100644 d8edbcaa... fa5531a5... M uip/pick.c :100644 100644 f8af5caa... d8478409... M uip/repl.c commit 30292c537fe4eab052f303f1d3179c0e2fd037d8 Author: markus schnalke AuthorDate: Tue May 1 17:16:34 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 17:16:34 2012 +0200 Removed the altmsglink (named `@') and env var `$editalt' for repl and dist. The env var $mhaltmsg already provides everything. We just get rid of compat redundancy. We also dropped the lstat() check. lstat() is POSIX and we assume any modern Unix system to support symbolic links. Also, there's only one invocation of lstat() left in uip/flist.c. :100644 100644 d6677d2c... cfd5fe5b... M config/config.c :100644 100644 3df3d8b5... f757b3f7... M configure.ac :100644 100644 9eed2d08... 37678db2... M h/mh.h :100644 100644 87b8676a... 8e27f663... M man/dist.man1 :100644 100644 19250b32... 095a0f3a... M man/mh-profile.man5 :100644 100644 18e02a2b... 26fd0945... M man/repl.man1 :100644 100644 53ee8a43... 35dc1950... M sbr/folder_read.c :100644 100644 c238a26f... fe7b4867... M sbr/readconfig.c :100644 100644 6c6fedbc... fe984610... M uip/mhparam.c :100644 100644 b9c1969b... 096a9bf2... M uip/rmf.c :100644 100644 7217096a... e3a411ad... M uip/whatnow.c :100644 100644 f3c46f84... e20df682... M uip/whatnowproc.c commit 5c43bb739797c078c3fd6aa982183e15af456d31 Author: markus schnalke AuthorDate: Tue May 1 16:18:52 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 16:18:52 2012 +0200 Man pages: Replaced \*(lq and \*(rq with ` and '. Using the quotes directly is staight-forward and convenient to read and write. :100644 100644 a6edee8d... 0d435eff... M docs/README.manpages :100644 100644 55ec128e... 72898c0c... M man/ali.man1 :100644 100644 36308a85... b5babf60... M man/burst.man1 :100644 100644 da522b9a... 2f1cda08... M man/comp.man1 :100644 100644 ebf2216f... 87b8676a... M man/dist.man1 :100644 100644 fc1be7a8... a2ba53a4... M man/flist.man1 :100644 100644 d6bfbb43... 704809d8... M man/folder.man1 :100644 100644 073d9044... ae4f6708... M man/forw.man1 :100644 100644 fc74195f... 415ebcbb... M man/inc.man1 :100644 100644 eeda4380... 6577f64d... M man/mark.man1 :100644 100644 39609f4f... e1e14fcc... M man/mh-alias.man5 :100644 100644 eebae889... 40ab6264... M man/mh-draft.man7 :100644 100644 ca07c512... e86e9ce6... M man/mh-format.man5 :100644 100644 05e825b0... a6e66775... M man/mh-mail.man5 :100644 100644 7768f7a1... 19250b32... M man/mh-profile.man5 :100644 100644 874f63e0... 60568edc... M man/mh-sequence.man7 :100644 100644 60545daa... 097242b2... M man/mh-tailor.man5 :100644 100644 1322967f... 5545fffc... M man/mhbuild.man1 :100644 100644 909db5cb... 37577f8c... M man/mhl.man1 :100644 100644 351999ff... e0724b27... M man/mhlist.man1 :100644 100644 ce298d7f... 0210c73d... M man/mhmail.man1 :100644 100644 ecc93396... 1c35fcd1... M man/mhpath.man1 :100644 100644 e92a82f2... 8445a5f4... M man/mhstore.man1 :100644 100644 ac54e121... f8c7aaeb... M man/mmh-intro.man7 :100644 100644 cfa7e8f5... d92016e2... M man/new.man1 :100644 100644 398d49f8... c07204a5... M man/packf.man1 :100644 100644 4fdac785... 2f06a22f... M man/pick.man1 :100644 100644 f83a9dbb... 01b468c2... M man/prompter.man1 :100644 100644 a8bacc28... 33ec5b60... M man/rcvdist.man1 :100644 100644 26bd690f... c9c64b99... M man/rcvstore.man1 :100644 100644 eaf8c095... 3bc85f7b... M man/refile.man1 :100644 100644 c1eb1d89... 18e02a2b... M man/repl.man1 :100644 100644 fa26c010... 7dccb69f... M man/rmf.man1 :100644 100644 73032794... 997ade20... M man/scan.man1 :100644 100644 4292a2d4... d8e18862... M man/send.man1 :100644 100644 4468e8d5... 434be091... M man/sendfiles.man1 :100644 100644 1fcfacd6... f7b30fd1... M man/show.man1 :100644 100644 914fd7b5... 4d660b20... M man/slocal.man1 :100644 100644 582e6ff5... 72ee22d0... M man/sortm.man1 :100644 100644 695cd94d... d55b9922... M man/spost.man8 :100644 100644 c11da838... 36295acd... M man/whatnow.man1 :100644 100644 10ae7d0b... a060d143... M man/whom.man commit bb9360ead7eb7a3fedcce2eeedfc660014e41dbe Author: markus schnalke AuthorDate: Tue May 1 15:30:39 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 15:30:39 2012 +0200 Removed msgchk(1) as it is hardly useful without POP support. It is questionable if msgchk(1) provides more information than: ls -l /var/mail/meillo It does separate between old and new mail, but that's not very useful and can be found out with stat(1) too. A very small shell script should be equally useful, if there's someone who really uses msgchk(1) and not simply `inc's. Concerning the administrative uses of msgchk(1), i.e. querying a set of users, that's no MUA's task and thus a reason to remove the tool. But eventually, the question remains the same: What does it provide more than `ls -l' and `ls -lu'? Is it worth to keep it around? IMO, no. :100644 100644 14ae90ff... 8f3b7d3f... M INSTALL :100644 100644 da206718... 35cdf9f7... M docs/COMPLETION-BASH :100644 100644 27d36228... cf79c474... M man/Makefile.in :100644 100644 212f392c... ac54e121... M man/mmh-intro.man7 :100644 000000 ff41dd01... 00000000... D man/msgchk.man1 :100644 100644 4e68ee11... 04df4050... M uip/Makefile.in :100644 000000 dfbdd69e... 00000000... D uip/msgchk.c commit 32b2354dbaf4bf934936eb5b102a4a3d2fdd209a Author: markus schnalke AuthorDate: Tue May 1 15:01:36 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 15:13:14 2012 +0200 Renamed -version switch to -Version to remove the conflict with -verbose. Now, `mhlist -V' prints the version and `mhlist -v' lists verbosely. There are only a few switches left that conflict on the first character, apart from the inverted (no*) variants. :100644 100644 c26783a6... da206718... M docs/COMPLETION-BASH :100644 100644 5e1004b3... a6edee8d... M docs/README.manpages :100644 100644 480c3631... 55ec128e... M man/ali.man1 :100644 100644 e35899e6... 07bd32c6... M man/anno.man1 :100644 100644 3e14e971... c96770ce... M man/ap.man8 :100644 100644 aba04576... 36308a85... M man/burst.man1 :100644 100644 bc723a91... da522b9a... M man/comp.man1 :100644 100644 df4173aa... ebf2216f... M man/dist.man1 :100644 100644 e0080cfd... b19c50b9... M man/dp.man8 :100644 100644 f505ba8d... fc1be7a8... M man/flist.man1 :100644 100644 a39b4dbd... 6156c395... M man/fmtdump.man8 :100644 100644 e162a8e3... d6bfbb43... M man/folder.man1 :100644 100644 2a2a8f3f... 073d9044... M man/forw.man1 :100644 100644 334bcd70... fc74195f... M man/inc.man1 :100644 100644 b0b93cad... eeda4380... M man/mark.man1 :100644 100644 bb5f2d3b... 1322967f... M man/mhbuild.man1 :100644 100644 95c5405a... 909db5cb... M man/mhl.man1 :100644 100644 a94a7df1... 351999ff... M man/mhlist.man1 :100644 100644 f244ae0e... ce298d7f... M man/mhmail.man1 :100644 100644 6d7a4b06... 11a1346f... M man/mhparam.man1 :100644 100644 3cdcf501... ecc93396... M man/mhpath.man1 :100644 100644 ea370377... e92a82f2... M man/mhstore.man1 :100644 100644 8e408e31... 212f392c... M man/mmh-intro.man7 :100644 100644 82117deb... 0069435a... M man/mmh.man1 :100644 100644 deef4ce6... 1bec9c80... M man/mmhwrap.man1 :100644 100644 1b58ee5c... ff41dd01... M man/msgchk.man1 :100644 100644 8bfc5d8d... cfa7e8f5... M man/new.man1 :100644 100644 916db9e1... 398d49f8... M man/packf.man1 :100644 100644 e9d1941c... 4fdac785... M man/pick.man1 :100644 100644 9f183e37... f83a9dbb... M man/prompter.man1 :100644 100644 d6723c82... a8bacc28... M man/rcvdist.man1 :100644 100644 290f5ccb... e4447093... M man/rcvpack.man1 :100644 100644 1fff18f0... 26bd690f... M man/rcvstore.man1 :100644 100644 5e837f5b... eaf8c095... M man/refile.man1 :100644 100644 286ee9c0... c1eb1d89... M man/repl.man1 :100644 100644 ee294510... fa26c010... M man/rmf.man1 :100644 100644 a2717130... 07d6cc3e... M man/rmm.man1 :100644 100644 24ced2ce... 73032794... M man/scan.man1 :100644 100644 ef0695ee... 4292a2d4... M man/send.man1 :100644 100644 8e34f714... 1fcfacd6... M man/show.man1 :100644 100644 7d649524... 914fd7b5... M man/slocal.man1 :100644 100644 8932d646... 582e6ff5... M man/sortm.man1 :100644 100644 1e0429dd... 695cd94d... M man/spost.man8 :100644 100644 a181ccaa... c11da838... M man/whatnow.man1 :100644 100644 856c2a09... 10ae7d0b... M man/whom.man :100644 100644 df29930c... 73f71668... M uip/ali.c :100644 100644 34d301b5... 7ede7e05... M uip/anno.c :100644 100644 623e0030... 3bb2bf0b... M uip/ap.c :100644 100644 23b737ec... 8d6e69b4... M uip/burst.c :100644 100644 5c088a83... 1c45a982... M uip/comp.c :100644 100644 57efc4e3... 3db8cfc0... M uip/dist.c :100644 100644 d64a0b9e... aee4b292... M uip/dp.c :100644 100644 9302a8a3... 71ae8e85... M uip/flist.c :100644 100644 b59cf5c7... fc94247c... M uip/fmtdump.c :100644 100644 cc400593... 584bb768... M uip/folder.c :100644 100644 adf0faaa... b1148b09... M uip/forw.c :100644 100644 2bdb9278... e1557847... M uip/inc.c :100644 100644 1917e84f... 3818c29b... M uip/mark.c :100644 100644 67b2e0e8... 12e65489... M uip/mhbuild.c :100644 100644 2c1d907b... 328db8fc... M uip/mhl.c :100644 100644 dd954a06... 7129ce5a... M uip/mhlist.c :100644 100644 2ab9cfd9... 6506b7d2... M uip/mhmail.c :100644 100644 664e5d08... 6c6fedbc... M uip/mhparam.c :100644 100644 5c0de057... 605d13c3... M uip/mhpath.c :100644 100644 54aa78d9... 1ee5c82f... M uip/mhshow.c :100644 100644 f4d664d2... 259acf39... M uip/mhstore.c :100644 100644 33b8026e... 871270ee... M uip/mhtest.c :100755 100755 6e93eb19... 68cf1201... M uip/mmh.sh :100644 100644 ee812268... dfbdd69e... M uip/msgchk.c :100644 100644 dab17ada... de3c0be4... M uip/new.c :100644 100644 23ee3354... b565c164... M uip/packf.c :100644 100644 0f0dda3b... d8edbcaa... M uip/pick.c :100644 100644 6c780d4a... 6db0455a... M uip/prompter.c :100644 100644 ac191497... d409b5cb... M uip/rcvdist.c :100644 100644 e00e1fd5... fe98a449... M uip/rcvpack.c :100644 100644 fc98b4ac... 5602dbc9... M uip/rcvstore.c :100644 100644 2fe25b49... e4433bd9... M uip/refile.c :100644 100644 b29ae9fd... f8af5caa... M uip/repl.c :100644 100644 77e05838... b9c1969b... M uip/rmf.c :100644 100644 ecc9b9b4... 0316c2c6... M uip/rmm.c :100644 100644 5cdd5b96... 085cc7fa... M uip/scan.c :100644 100644 6be46db1... 84e05dfb... M uip/send.c :100644 100644 765bcbd6... bd6b0a27... M uip/slocal.c :100644 100644 6ba8a9c2... d7dae612... M uip/sortm.c :100644 100644 093bad56... f3630d25... M uip/spost.c :100644 100644 f26dcb7c... 7217096a... M uip/whatnow.c commit 601cc73d1fa05ce96faa728f036d6c51b91701c7 Author: markus schnalke AuthorDate: Tue May 1 14:48:59 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 14:48:59 2012 +0200 folder: Never display column headers (removed -header). Also removed the full-stop (dot) at the end of each line. It looked rather strange to have it there. :100644 100644 4858486e... e162a8e3... M man/folder.man1 :100644 100644 616f57b9... cc400593... M uip/folder.c commit a7ce7b4a580d77b6c2c4d980812beb589aa4c643 Author: markus schnalke AuthorDate: Tue May 1 14:38:44 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 14:38:44 2012 +0200 Bring in all of the mh-e support that is actually used to be compiled by default, and garbage collect the stuff that is not used. Pulled in from nmh. Thanks to Ken Hornstein. Concerning mmh only: - The FIXME comments about the missing checks for existing drafts. - mh-e support of mmh is not much more than providing the -build switches. It might get dropped in the future. :100644 100644 7b375cfe... 14ae90ff... M INSTALL :100644 100644 04f23d1e... 3df3d8b5... M configure.ac :100644 100644 378ce70d... 2a2a8f3f... M man/forw.man1 :100644 100644 df825fb5... 7768f7a1... M man/mh-profile.man5 :100644 100644 6b7c4851... 286ee9c0... M man/repl.man1 :100644 100644 e4c1b7f7... 53ee8a43... M sbr/folder_read.c :100644 100644 fe056f4a... adf0faaa... M uip/forw.c :100644 100644 2fbb9b65... 2bdb9278... M uip/inc.c :100644 100644 4523365e... b29ae9fd... M uip/repl.c :100644 100644 043ecd69... 77e05838... M uip/rmf.c commit e68b1fb49f49b3f68b7a1a5eeb449b2c26b196a8 Author: markus schnalke AuthorDate: Tue May 1 13:53:32 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 13:53:32 2012 +0200 mhbuild: Removed -contentid switch, which was an Outlook 2002 workaround. Explanation: Outlook 2002 won't display attachments that have a Content-ID header. This is a bug in Outlook 2002, not in mhbuild. There used to be this -nocontentid switch to prevent Content-ID headers to be inserted. As I consider it wrong to complicate all other MUAs instead of forcing the developers and users of broken MUAs to fix or change their software, I removed it. You can still workaround the bug in the following way: invoke `e mhbuild' manually at the Whatnow prompt and edit the draft again thereafter, removing the Content-ID headers. Then send it. :100644 100644 32df6518... bb5f2d3b... M man/mhbuild.man1 :100644 100644 0fb53151... 67b2e0e8... M uip/mhbuild.c commit b24f96523aaf60e44e04a3ffb1d22e69a13a602f Author: markus schnalke AuthorDate: Tue May 1 13:33:10 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 13:33:10 2012 +0200 mhlist: Always display the column header (removed -headers). :100644 100644 19369590... a94a7df1... M man/mhlist.man1 :100644 100644 685c8ff7... dd954a06... M uip/mhlist.c :100644 100644 c2db9871... dc85bcc6... M uip/mhlistsbr.c commit a6e6452e21cb56d1ccd593341e0bdd865e3bcbe5 Author: markus schnalke AuthorDate: Tue May 1 13:21:16 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 13:21:16 2012 +0200 mhbuild: Don't list anything (removed -list and -header). For displaying the MIME structure, use mhlist(1). If you are curious what mhbuild(1) had created, simply run mhlist(1) on the same file afterwards. :100644 100644 c2614e4e... 32df6518... M man/mhbuild.man1 :100644 100644 6b1469f3... 4e68ee11... M uip/Makefile.in :100644 100644 fd6cee0e... 0fb53151... M uip/mhbuild.c commit 658569d39048e3e810be570210649ff9f628e835 Author: markus schnalke AuthorDate: Tue May 1 13:20:40 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 13:20:40 2012 +0200 mhoutsbr.c: writeBase64aux() needs not to be exported. :100644 100644 25495eb2... 4d04b652... M uip/mhoutsbr.c commit 3363e2624dce0eb8164cf8b3f1ab385c8ff72e88 Author: markus schnalke AuthorDate: Tue May 1 12:32:04 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 12:32:04 2012 +0200 mhbuild: Removed -rfc934mode switch, which is only useful for non-MIME systems. We require MIME facilities to be available. :100644 100644 cca26e97... 1954d897... M h/mhparse.h :100644 100644 b7c12e67... c2614e4e... M man/mhbuild.man1 :100644 100644 5cccd2a7... fd6cee0e... M uip/mhbuild.c :100644 100644 d517e6e8... 25495eb2... M uip/mhoutsbr.c commit 01a3480928da485b4d6109d36d751dfa71799d58 Author: markus schnalke AuthorDate: Tue May 1 11:37:53 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 11:37:53 2012 +0200 mhbuild: Removed the -ebcdicsafe switch. It only influenced MIME messages, where quoted-printable encoding encoded some punctuation chars (e.g. $) as well. I guess this is not much of a problem anymore today. The switch was deactivated by default and didn't even appear in the 1991's version of Jerry Peek's MH book. In the 1999's version there is a parenthesed note about the switch, not more. I guess we won't miss it. :100644 100644 2c4bcce8... b7c12e67... M man/mhbuild.man1 :100644 100644 cc319f5d... 5cccd2a7... M uip/mhbuild.c :100644 100644 5d267ef7... d517e6e8... M uip/mhoutsbr.c :100644 100644 a19475bd... 33b8026e... M uip/mhtest.c commit 8d8f1c3abc586c005c904e52c4adbfe694d2201c Author: markus schnalke AuthorDate: Tue May 1 11:19:24 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 11:19:24 2012 +0200 mhlist, mhbuild: Always evaluate realsizes of the MIME parts. This already had been the default. Now I removed the -[no]realsize switches. :100644 100644 4fa75b52... 2c4bcce8... M man/mhbuild.man1 :100644 100644 395d8384... 19369590... M man/mhlist.man1 :100644 100644 d22e455d... cc319f5d... M uip/mhbuild.c :100644 100644 99b2cc78... 685c8ff7... M uip/mhlist.c :100644 100644 5dee1157... c2db9871... M uip/mhlistsbr.c :100644 100644 9b7e7b05... b5ecd099... M uip/mhshowsbr.c commit 104b0f8f0b2b5141baeaea3b96915ae24b51ff40 Author: markus schnalke AuthorDate: Tue May 1 10:51:40 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 10:51:40 2012 +0200 Minor improvements of man page sendfiles(1). :100644 100644 2920b691... 4468e8d5... M man/sendfiles.man1 commit 0115eef2665d92589cb4acec6ce3fc04f81da967 Author: markus schnalke AuthorDate: Tue May 1 10:44:40 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 10:44:40 2012 +0200 Minor fix: Font in man page. :100644 100644 488d2dc1... deef4ce6... M man/mmhwrap.man1 commit 68a686adeb39223a5e1ad35e4a24890ec053679d Author: markus schnalke AuthorDate: Tue May 1 10:28:52 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 10:28:52 2012 +0200 burst: Fixed handling of trailing text; removed -inplace and -quiet. The trailing text had been part of the last message extracted, now it is ignored, conforming to the documentation. Removing the -inplace switch (thus making -noinplace the default) simplified the code and removed the possibility to lose data. -quiet supressed warnings (``message is not in digest format''). Warnings should be displayed. To though suppress them, redirect stderr to /dev/null. I was unsure if I should make -verbose the default (i.e. remove -verbose but have -quiet) as it provides similar useful information like inc(1). I decided against it, because in Unix silence rules. However, I like to have ``burst: -verbose'' in my profile. :100644 100644 5569f750... aba04576... M man/burst.man1 :100644 100644 d0d06b6d... 23b737ec... M uip/burst.c commit 9413eae50c4f1843dc7cab43dc11fe79fd28b744 Author: markus schnalke AuthorDate: Tue May 1 08:20:23 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 08:20:23 2012 +0200 Minor refactoring. :100644 100644 ed4aca04... 6be46db1... M uip/send.c commit 8bdc45422ae3279fde81b1d1e7eb9dcf881f961f Author: markus schnalke AuthorDate: Tue May 1 08:09:56 2012 +0200 Commit: markus schnalke CommitDate: Tue May 1 08:09:56 2012 +0200 whatnow: Simplified and clarified (or fixed?) the situation of failed edits. If the initial edit fails, no new draft is created, but any existing re-used draft is preserved. Failures of later edits are ignored and another prompt is printed. :100644 100644 5ea88aa4... bc723a91... M man/comp.man1 :100644 100644 42956c15... a181ccaa... M man/whatnow.man1 :100644 100644 08e3be84... f26dcb7c... M uip/whatnow.c commit 75fca31a5b9d5c1a99c74ab14c94438d8852fba9 Author: markus schnalke AuthorDate: Mon Apr 30 22:58:54 2012 +0200 Commit: markus schnalke CommitDate: Mon Apr 30 22:58:54 2012 +0200 Removed the -noeditor switches and made them replaceable by `-editor ""'. :100644 100644 d8231f5a... 20820b5c... M h/prototypes.h :100644 100644 f9b59dbf... 5ea88aa4... M man/comp.man1 :100644 100644 aaaa6122... df4173aa... M man/dist.man1 :100644 100644 a970a3e4... 378ce70d... M man/forw.man1 :100644 100644 f8f6eb13... 6b7c4851... M man/repl.man1 :100644 100644 ce6c9c23... 42956c15... M man/whatnow.man1 :100644 100644 cbe24d86... 5c088a83... M uip/comp.c :100644 100644 b169352f... 57efc4e3... M uip/dist.c :100644 100644 4fbd45f3... fe056f4a... M uip/forw.c :100644 100644 b0956fcb... 4523365e... M uip/repl.c :100644 100644 efdf02d4... 08e3be84... M uip/whatnow.c :100644 100644 fbea9416... f3c46f84... M uip/whatnowproc.c commit ee4f43cf2ef0084ec698e4e87159a94c01940622 Author: markus schnalke AuthorDate: Mon Apr 30 20:38:46 2012 +0200 Commit: markus schnalke CommitDate: Mon Apr 30 20:38:46 2012 +0200 Removed -nowhatnowproc switch as it does nothing useful. The result of using it is the same as using `-whatnowproc /bin/true': The draft gets created and left in the draft folder. As a replacement exists, we surely don't need keep -nowhatnowproc. :100644 100644 70ac3b2c... c26783a6... M docs/COMPLETION-BASH :100644 100644 70cc287e... 4d67d927... M docs/COMPLETION-ZSH :100644 100644 6258d207... f9b59dbf... M man/comp.man1 :100644 100644 e48525fb... aaaa6122... M man/dist.man1 :100644 100644 628942da... a970a3e4... M man/forw.man1 :100644 100644 26a2cddb... f8f6eb13... M man/repl.man1 :100644 100644 87953ad2... cbe24d86... M uip/comp.c :100644 100644 dabfec75... b169352f... M uip/dist.c :100644 100644 140136a9... 4fbd45f3... M uip/forw.c :100644 100644 af147a12... b0956fcb... M uip/repl.c commit 8d77b48284c58c135a6b2787e721597346ab056d Author: markus schnalke AuthorDate: Mon Apr 30 18:52:19 2012 +0200 Commit: markus schnalke CommitDate: Mon Apr 30 18:52:19 2012 +0200 Rework in charset code. (Includes renaming.) Renamed check_charset() to is_native_charset(), and sbr/check_charset.c to sbr/charset.c. Removed caching in favor for simpler code. is_native_charset() does not check for prefixes anymore. The code didn't match the comments anyway and it matched when comparing the first 10 [sic!] chars of `ISO-8859-1whatever' with `ISO-8859-11', which is not wanted. :100644 100644 f2c4652a... d8231f5a... M h/prototypes.h :100644 100644 6c3d2c2b... ca49c469... M sbr/Makefile.in :000000 100644 00000000... 56f085cc... A sbr/charset.c :100644 000000 d11d7729... 00000000... D sbr/check_charset.c :100644 100644 dc123e53... 4e8231fc... M sbr/fmt_rfc2047.c :100644 100644 2a8bbf92... 9b7e7b05... M uip/mhshowsbr.c commit 4c1efddfd499300c7e74263e57d8aa137e84c853 Author: markus schnalke AuthorDate: Mon Apr 30 16:33:55 2012 +0200 Commit: markus schnalke CommitDate: Mon Apr 30 16:33:55 2012 +0200 Dropped old show(1) and renamed mhshow(1) to show(1). If you do want to display non-MIME messages the old way, you can use: mhl `mhpath ...` The choice of renaming was hard to decide because I will introduce confusion and breaks the interface (mmh broke it already!). I though renamed, because the new situation is what we actually want: One program to display messages in a sane way. We used to type `show' and silently got `mhshow' when it contained non-trivial MIME content. That was a workaround and clearly not straight-forward. The improve the situation show(1) needed to be dropped. Because users don't want to type `mhshow', I decided to renamed it to `show'. Hope I won't introduce too many inconveniences with this decision. :100644 100644 78e1390b... 7b375cfe... M INSTALL :100644 100644 1caea472... d6677d2c... M config/config.c :100644 100644 28aa29fd... 70ac3b2c... M docs/COMPLETION-BASH :100644 100644 2b47557b... 70cc287e... M docs/COMPLETION-ZSH :100644 100644 acd3072a... 27d36228... M man/Makefile.in :100644 100644 083222be... df825fb5... M man/mh-profile.man5 :100644 100644 1633b076... 874f63e0... M man/mh-sequence.man7 :100644 100644 9c68f365... 4fa75b52... M man/mhbuild.man1 :100644 100644 f42498b2... 395d8384... M man/mhlist.man1 :100644 000000 d3326ac6... 00000000... D man/mhshow.man1 :100644 100644 54495d74... ea370377... M man/mhstore.man1 :100644 100644 d2fe715e... 8e408e31... M man/mmh-intro.man7 :100644 100644 a61fc373... ef0695ee... M man/send.man1 :100644 100644 b4671222... 8e34f714... M man/show.man1 :100644 100644 66db1866... 6b1469f3... M uip/Makefile.in :100644 100644 fa7f2562... 54aa78d9... M uip/mhshow.c :100644 100644 13a65e40... 2a8bbf92... M uip/mhshowsbr.c :100644 000000 34fa826a... 00000000... D uip/show.c commit da2ccd847bcb978a51b946e934ac91a2af7347fa Author: markus schnalke AuthorDate: Mon Apr 30 16:28:30 2012 +0200 Commit: markus schnalke CommitDate: Mon Apr 30 16:28:30 2012 +0200 Noted that the testcases are not maintained and thus became broken. :100644 100644 c61647eb... 94b5ab15... M test/README commit 264f6e648f566f8efaa0188fb6a9e4908329d6d6 Author: markus schnalke AuthorDate: Mon Apr 30 16:16:08 2012 +0200 Commit: markus schnalke CommitDate: Mon Apr 30 16:16:08 2012 +0200 Code style: Fixed indent and comment style. :100644 100644 dc8e380b... af460e6a... M uip/mhparse.c commit 1e1eead55e3f03af9f826b21649c77b90d886a4c Author: markus schnalke AuthorDate: Mon Apr 30 12:15:14 2012 +0200 Commit: markus schnalke CommitDate: Mon Apr 30 12:15:14 2012 +0200 Install scan.meillo. (Wasn't enough to just add the file to the VCS.) :100644 100644 65844712... efec5dbc... M etc/Makefile.in commit 0da86af19c369b20713d0cedf7b0b3319560f69e Author: markus schnalke AuthorDate: Sat Apr 14 22:32:02 2012 +0200 Commit: markus schnalke CommitDate: Sat Apr 14 22:32:02 2012 +0200 mhshow: Add header and separation when displaying multiple messages. We do it similar to the way mhl(1) does it. The -header of show(1) is not added to mhshow(1). You can though have it, by using the mhl `MessageName' pseudo-component. :100644 100644 ecd2e9dd... d3326ac6... M man/mhshow.man1 :100644 100644 4f67d325... 13a65e40... M uip/mhshowsbr.c commit 2017eab468c8506da64eacc01d829c2b946e5faa Author: markus schnalke AuthorDate: Sat Apr 14 22:09:52 2012 +0200 Commit: markus schnalke CommitDate: Sat Apr 14 22:09:52 2012 +0200 mhshow: Fixed segfault. (Care that c_charset is set.) :100644 100644 3bcf84f9... 4f67d325... M uip/mhshowsbr.c commit 3480effefa433e71db02129a1e30e454400a54ce Author: markus schnalke AuthorDate: Sat Apr 14 20:37:31 2012 +0200 Commit: markus schnalke CommitDate: Sat Apr 14 20:37:31 2012 +0200 mhshow: Can now be called as `next' or `prev' as well. This is a step in replacing show(1) by mhshow(1). :100644 100644 c3238672... fa7f2562... M uip/mhshow.c commit 0e46503be3c855bddaeae3843e1b659279c35d70 Author: markus schnalke AuthorDate: Sat Apr 14 20:13:04 2012 +0200 Commit: markus schnalke CommitDate: Sat Apr 14 20:13:04 2012 +0200 mhl: Don't invoke the pager anymore. As show(1) will soon be replaced by mhshow(1), mhl will be hidden behind mhshow(1), which does invoke a pager now itself. Hence, no need for mhl(1) to deal with it. :100644 100644 f9536c07... 95c5405a... M man/mhl.man1 :100644 100644 58c7d2b0... 2c1d907b... M uip/mhl.c commit a4197ea6ffc5c1550e8b52d5a654bcaaaee04a4e Author: markus schnalke AuthorDate: Sat Apr 14 19:59:54 2012 +0200 Commit: markus schnalke CommitDate: Sat Apr 14 19:59:54 2012 +0200 mhshow: Automatically invoke (one) pager for the whole message, if on TTY. Mhshow used to invoke the pager for each of the text/plain parts independently. Now, we invoke it once for the whole message. Remember: We serialize! (Mhl(1) invokes a pager too, currently, but not much longer.) :100644 100644 79975ef6... ecd2e9dd... M man/mhshow.man1 :100644 100644 53f96f24... c3238672... M uip/mhshow.c commit 7ca05c3df912f540c1f25b3be4d1733f5a3ad1b4 Author: markus schnalke AuthorDate: Sat Apr 14 19:44:41 2012 +0200 Commit: markus schnalke CommitDate: Sat Apr 14 19:44:41 2012 +0200 mhshow: Wait for children synchonously because we run them serialized. :100644 100644 4a7fc0ca... 3bcf84f9... M uip/mhshowsbr.c commit b6e0badc41f8368a0cb74eecb78666fd8d641529 Author: markus schnalke AuthorDate: Sat Apr 14 18:45:20 2012 +0200 Commit: markus schnalke CommitDate: Sat Apr 14 18:45:20 2012 +0200 Updated man page of mhshow(1) to recent changes. :100644 100644 9b6465da... 79975ef6... M man/mhshow.man1 commit a20d405db09b7ccca74d3e8c57550883da49e1ae Author: markus schnalke AuthorDate: Sat Apr 14 18:06:04 2012 +0200 Commit: markus schnalke CommitDate: Sat Apr 14 18:06:04 2012 +0200 mhshow-show-*: Made %e escape the default, i.e. always serialize the output. Never invoke several content display processes in parallel, but always wait for the previous to finish before executing the next one. The idea behind this is generating console output only, but not spawning any graphical windows. All output of displaying one message should go to one single pager invocation. Any other kinds of attachments are to be stored and afterwards displayed manually. This is the way all the other MUAs do it and it matches the modern understanding of emails: a message and attachments. This is contrary to the original design of MIME, true. Also, removed the %p alias for the %l escape. :100644 100644 e2cde4dd... 4a7fc0ca... M uip/mhshowsbr.c commit 7fba80493bf077322a16e98bfeb11990a9c89340 Author: markus schnalke AuthorDate: Sat Apr 14 17:52:51 2012 +0200 Commit: markus schnalke CommitDate: Sat Apr 14 17:52:51 2012 +0200 Don't do a shell `exec' on mhshow-show-* contents to make `foo; bar' possible. :100644 100644 fe3afc4c... e2cde4dd... M uip/mhshowsbr.c commit 2433122c20baccb10b70b49c04c6b0497b5b3b60 Author: markus schnalke AuthorDate: Sat Apr 14 17:35:18 2012 +0200 Commit: markus schnalke CommitDate: Sat Apr 14 17:35:18 2012 +0200 No more mhshow-charset-* but instead automatic invocation of iconv(1). Unless there is an mhshow-show-* rule, text/plain content types are automatically piped through iconv(1) if their charset is foreign. For mhshow-show-* rules, there's a new %c escape, which expands to the foreign charset. The contents of the files, referenced by %f/%F are still in foreign encoding. One might want to use `iconv -f %c %f | mycommand' for custom mhshow-show-* rules. We depend on iconv(1) now! But this may change to dependence on iconv(3), soon. This field is inconsistent and not at all finished, yet. :100644 100644 6778654a... cca26e97... M h/mhparse.h :100644 100644 5fe5b2d9... bf3382c5... M uip/mhfree.c :100644 100644 1777cf4b... 5dee1157... M uip/mhlistsbr.c :100644 100644 cf264c6f... dc8e380b... M uip/mhparse.c :100644 100644 adb0da7b... fe3afc4c... M uip/mhshowsbr.c commit 559039d546e7eb1d160c4e3bd3538845b645546e Author: markus schnalke AuthorDate: Sat Apr 14 15:17:16 2012 +0200 Commit: markus schnalke CommitDate: Sat Apr 14 15:17:16 2012 +0200 anno: Fixed test for intermixture of file and msgs/folder. :100644 100644 fe0d65f2... 34d301b5... M uip/anno.c commit e15c750b678ec42965c68106cc645e33a9e45109 Author: markus schnalke AuthorDate: Sat Apr 14 14:31:27 2012 +0200 Commit: markus schnalke CommitDate: Sat Apr 14 14:31:27 2012 +0200 Remove unused struct component. :100644 100644 2d88127f... 6778654a... M h/mhparse.h commit c9d2227d8c81c7d1a04e8182622e73b2770ee1a4 Author: markus schnalke AuthorDate: Thu Apr 12 23:14:13 2012 +0200 Commit: markus schnalke CommitDate: Thu Apr 12 23:14:13 2012 +0200 mhmail is for sending, but not for reading mail. :100644 100644 5cd77a3e... d2fe715e... M man/mmh-intro.man7 commit 55e1d8c654ee0f7c45b9361ce34617983b454c32 Author: markus schnalke AuthorDate: Thu Apr 12 23:05:47 2012 +0200 Commit: markus schnalke CommitDate: Thu Apr 12 23:05:47 2012 +0200 mhshow/mhstore: Removed support for retrieving message/external-body parts. These tools won't download the contents automatically anymore. Instead, they print the information needed to get the contents. If someone should really receive one of those rare message/external-body messages, he can do the job manually. We save nearly a thousand lines of code. That's worth it! (The profile entry `nmh-access-ftp' and sbr/ruserpass.c for reading ~/.netrc are gone now.) :100644 100644 70a9a403... 1caea472... M config/config.c :100644 100644 14f42f4b... 9eed2d08... M h/mh.h :100644 100644 af9b8caa... 2d88127f... M h/mhparse.h :100644 100644 ba33a03c... f2c4652a... M h/prototypes.h :100644 100644 b9b098cc... f42498b2... M man/mhlist.man1 :100644 100644 8ebc7ba3... 9b6465da... M man/mhshow.man1 :100644 100644 15f4939c... 54495d74... M man/mhstore.man1 :100644 100644 1f1b79b5... 6c3d2c2b... M sbr/Makefile.in :100644 000000 0e169a5b... 00000000... D sbr/ruserpass.c :100644 100644 f659a30b... d22e455d... M uip/mhbuild.c :100644 100644 dd1277c8... 5fe5b2d9... M uip/mhfree.c :100644 100644 9cd331a8... 1777cf4b... M uip/mhlistsbr.c :100644 100644 01170a14... cf264c6f... M uip/mhparse.c :100644 100644 2b69c197... adb0da7b... M uip/mhshowsbr.c :100644 100644 50c911c8... f4d664d2... M uip/mhstore.c commit c164fa6824a65205d96c9d1450dc656bec66553a Author: markus schnalke AuthorDate: Thu Apr 12 23:03:23 2012 +0200 Commit: markus schnalke CommitDate: Thu Apr 12 23:03:23 2012 +0200 Cleanup addon to `mhbuild: Removed support for message/external-body'. :100644 100644 03aff614... 5d267ef7... M uip/mhoutsbr.c commit 90d53cbbe431a89ac2066a527bbfe46ac0f3cbe7 Author: markus schnalke AuthorDate: Thu Apr 12 18:28:49 2012 +0200 Commit: markus schnalke CommitDate: Thu Apr 12 18:28:49 2012 +0200 mhbuild: Removed support for creating message/external-body parts. Although I really like the concept, I remove the support because I haven't seen any such message in my life. Less code through removing hardly used features is more appealing to me than having support for such nice but hardly used features. The world took a different road than the one MIME proposed. :100644 100644 babc1b2c... 9c68f365... M man/mhbuild.man1 :100644 100644 e12f272b... f659a30b... M uip/mhbuild.c commit 41b6eadbcecf63c9a66aa5e582011987494abefb Author: markus schnalke AuthorDate: Thu Apr 12 17:30:56 2012 +0200 Commit: markus schnalke CommitDate: Thu Apr 12 17:30:56 2012 +0200 mhstore -auto: Never store into subdirs, but use basename of filename. Now, the only remaining problem with -auto is overwriting of existing files. But actually that's no problem of -auto, because the behavior is the same with -noauto. :100644 100644 faf8ea5d... 15f4939c... M man/mhstore.man1 :100644 100644 6f6746de... 50c911c8... M uip/mhstore.c commit 3410b680416c49a7617491af38bc1929855a331d Author: markus schnalke AuthorDate: Thu Apr 12 16:12:43 2012 +0200 Commit: markus schnalke CommitDate: Thu Apr 12 16:12:43 2012 +0200 mhstore: Made -auto the default. Now, that tar files are not extracted automatically anymore, it's quite safe to have -auto, as nothing unexpected will happen. Still, existing files will be overwritten, but that's the case with -noauto too. :100644 100644 61e2ab2c... faf8ea5d... M man/mhstore.man1 :100644 100644 992d4293... 6f6746de... M uip/mhstore.c commit 94c80042eae3383c812d9552089953f9846b1bb6 Author: markus schnalke AuthorDate: Thu Apr 12 15:18:12 2012 +0200 Commit: markus schnalke CommitDate: Thu Apr 12 15:18:12 2012 +0200 Don't treat application/octet-stream with type=tar special. Don't auto-extract such parts with `mhstore -auto'. This makes -auto less a security problem. The auto-extract feature of mhshow that had been described in its man page seems to not exist, anyway. :100644 100644 e3fbdb76... 8ebc7ba3... M man/mhshow.man1 :100644 100644 fcd833df... 61e2ab2c... M man/mhstore.man1 :100644 100644 ed36c960... 992d4293... M uip/mhstore.c commit d1fefd9f614e4dc3cda16da6c69133c1b2005269 Author: markus schnalke AuthorDate: Wed Apr 11 17:23:59 2012 +0200 Commit: markus schnalke CommitDate: Wed Apr 11 17:23:59 2012 +0200 Remove caching of external MIME parts. I.e. -rcache/-wcache switches and nmh-cache/nmh-private-cache profile entries. External MIME parts are *very* rare nowadays, who cares about caching them, anyway? :100644 100644 f38866b9... 70a9a403... M config/config.c :100644 100644 de70d7a9... 78db70b2... M h/Makefile.in :100644 100644 05300510... 14f42f4b... M h/mh.h :100644 000000 77caabf5... 00000000... D h/mhcachesbr.h :100644 100644 e6016bca... b9b098cc... M man/mhlist.man1 :100644 100644 57bfa311... e3fbdb76... M man/mhshow.man1 :100644 100644 0a338e7b... fcd833df... M man/mhstore.man1 :100644 100644 6d6347d5... 66db1866... M uip/Makefile.in :100644 100644 e6caba39... e12f272b... M uip/mhbuild.c :100644 000000 8d251320... 00000000... D uip/mhcachesbr.c :100644 100644 66f9d894... 99b2cc78... M uip/mhlist.c :100644 100644 2ee95f43... 01170a14... M uip/mhparse.c :100644 100644 ac6b0c3e... 53f96f24... M uip/mhshow.c :100644 100644 950483b7... ed36c960... M uip/mhstore.c :100644 100644 c7afd66d... a19475bd... M uip/mhtest.c commit 70bc44ec2fd9f4033a6190868979991338ba6664 Author: markus schnalke AuthorDate: Wed Apr 11 16:46:27 2012 +0200 Commit: markus schnalke CommitDate: Wed Apr 11 16:46:27 2012 +0200 Removed #ifdef lint. :100644 100644 dd0b52af... 173f12d4... M sbr/fmt_compile.c :100644 100644 483ad847... 2ee95f43... M uip/mhparse.c commit 31dc797eb5178970d68962ca8939da3fd9a8efda Author: markus schnalke AuthorDate: Wed Apr 11 15:41:05 2012 +0200 Commit: markus schnalke CommitDate: Wed Apr 11 15:41:05 2012 +0200 Removed RFC 1864 (Content-MD5) support. I.e. -check switches. Transfer integrity should be cared for in the transfer protocols. Data integrity is better covered with digital signatures. :100644 100644 f0152ddf... de70d7a9... M h/Makefile.in :100644 000000 8a1104ad... 00000000... D h/md5.h :100644 100644 71c3563d... af9b8caa... M h/mhparse.h :100644 100644 dc37db2a... 22c23495... M h/mime.h :100644 100644 db44f02e... babc1b2c... M man/mhbuild.man1 :100644 100644 14912a25... e6016bca... M man/mhlist.man1 :100644 100644 13cb0151... 57bfa311... M man/mhshow.man1 :100644 100644 ec4c7a1e... 0a338e7b... M man/mhstore.man1 :100644 100644 0ae31675... 6d6347d5... M uip/Makefile.in :100644 000000 6737a3ea... 00000000... D uip/md5.c :100644 100644 5f29d0e6... e6caba39... M uip/mhbuild.c :100644 100644 201ce514... 8d251320... M uip/mhcachesbr.c :100644 100644 45f3e9d4... 66f9d894... M uip/mhlist.c :100644 100644 130b4e55... 03aff614... M uip/mhoutsbr.c :100644 100644 bf65480e... 483ad847... M uip/mhparse.c :100644 100644 6e694c41... ac6b0c3e... M uip/mhshow.c :100644 100644 75633b76... 2b69c197... M uip/mhshowsbr.c :100644 100644 ea35f8eb... 950483b7... M uip/mhstore.c :100644 100644 164d3905... c7afd66d... M uip/mhtest.c commit 85efd688c798fc782567d3f9c283064a01d5c9fe Author: markus schnalke AuthorDate: Wed Apr 11 15:18:39 2012 +0200 Commit: markus schnalke CommitDate: Wed Apr 11 15:18:39 2012 +0200 Man page mhbuild(1): Tried to make the structure more clear through markup. :100644 100644 3d3260f8... db44f02e... M man/mhbuild.man1 commit 2679bb7e1305b30e1f0bef4612760b5a858456da Author: markus schnalke AuthorDate: Wed Apr 11 12:22:13 2012 +0200 Commit: markus schnalke CommitDate: Wed Apr 11 12:22:13 2012 +0200 Added docs/README.start-devel, which recommends who to start with nmh. I've written this more than a year ago, in pre-mmh times, but my advices are still the same. :000000 100644 00000000... 192c3ff5... A docs/README.start-devel commit d0581ba306a7299113a346f9b4c46ce97bc4cef6 Author: markus schnalke AuthorDate: Wed Apr 11 11:52:12 2012 +0200 Commit: markus schnalke CommitDate: Wed Apr 11 11:52:12 2012 +0200 Don't display multipart/parallel in parallel. Always serialize displaying. :100644 100644 0a6513b6... 13cb0151... M man/mhshow.man1 :100644 100644 b43d5a81... 6e694c41... M uip/mhshow.c :100644 100644 d3ddb948... 75633b76... M uip/mhshowsbr.c :100644 100644 cb411d8c... ea35f8eb... M uip/mhstore.c commit ff2832024ce5363103365c0caff85e75e4590b83 Author: markus schnalke AuthorDate: Wed Apr 11 11:09:16 2012 +0200 Commit: markus schnalke CommitDate: Wed Apr 11 11:09:16 2012 +0200 Merged man pages next(1) and prev(1) into show(1). :100644 100644 2b44d9fe... b756c040... M man/next.man1 :100644 100644 06464d43... b756c040... M man/prev.man1 :100644 100644 047baf5c... b4671222... M man/show.man1 commit 7b4682fe054f605f05e6d38033188b5961aac096 Author: markus schnalke AuthorDate: Wed Apr 11 11:07:59 2012 +0200 Commit: markus schnalke CommitDate: Wed Apr 11 11:07:59 2012 +0200 show: Fixed -checkmime for msgs. Only check for MIME-Version header from now on. :100644 100644 a0178fe9... 34fa826a... M uip/show.c commit d50bc5836dcb94dc6b92e7953c7d0cf62469ee52 Author: markus schnalke AuthorDate: Wed Apr 11 00:05:26 2012 +0200 Commit: markus schnalke CommitDate: Wed Apr 11 00:05:26 2012 +0200 Scanning an empty mbox file is no error. Of course there won't be a delimiter, but mail drop files are frequently empty, though existing. This solution is more of a hack, but it works. Improvements welcome! :100644 100644 c7f4279b... 5bd6bbba... M sbr/m_getfld.c commit dda8c13ffa51100f1482af9a2429290269068955 Author: markus schnalke AuthorDate: Wed Apr 11 00:04:35 2012 +0200 Commit: markus schnalke CommitDate: Wed Apr 11 00:04:35 2012 +0200 Default scan format: Added leading zeros, which I've forgotten. :100644 100644 592474da... 91b2ff67... M h/scansbr.h commit 7966c20b9cd851df25a903f5ecc47547b26af185 Author: markus schnalke AuthorDate: Tue Apr 10 23:45:02 2012 +0200 Commit: markus schnalke CommitDate: Tue Apr 10 23:45:02 2012 +0200 Added my own scan format: scan.meillo :000000 100644 00000000... 53f7bb9f... A etc/scan.meillo commit aec4cbb08264ca2edd59f00f4563cd4528e0ff0e Author: markus schnalke AuthorDate: Tue Apr 10 23:44:14 2012 +0200 Commit: markus schnalke CommitDate: Tue Apr 10 23:44:14 2012 +0200 Added HH:MM to the default scan format. :100644 100644 1f0d0873... 592474da... M h/scansbr.h commit 7c2ba0786dc15d32519719791d9fc5a990e84242 Author: markus schnalke AuthorDate: Tue Apr 10 23:30:23 2012 +0200 Commit: markus schnalke CommitDate: Tue Apr 10 23:30:23 2012 +0200 Minor layout fix in man page mhparam(1). :100644 100644 323bc243... 6d7a4b06... M man/mhparam.man1 commit a8a894a102eb7f31662d49355312d6e64e081664 Author: markus schnalke AuthorDate: Tue Apr 10 23:24:07 2012 +0200 Commit: markus schnalke CommitDate: Tue Apr 10 23:24:07 2012 +0200 Removed -(no)push and -(no)forward flags from send, spost and whatnow. We don't send directly (with SMTP) anymore. We only execute sendmail, which, on modern systems, takes few time. Thus we do it directly instead of having more complexity for the rare wish to run sendmail in the background and also be unable to deal with possible errors directly. :100644 100644 26ec56e0... 334bcd70... M man/inc.man1 :100644 100644 09e3f408... a61fc373... M man/send.man1 :100644 100644 00f1d7ba... 1e0429dd... M man/spost.man8 :100644 100644 0406e45a... ce6c9c23... M man/whatnow.man1 :100644 100644 a2e99329... ed4aca04... M uip/send.c :100644 100644 369f03e2... 093bad56... M uip/spost.c :100644 100644 0576ff84... efdf02d4... M uip/whatnow.c commit 3e59699457d12fe6cef2e6426d097f92361269c9 Author: markus schnalke AuthorDate: Sun Apr 1 22:46:30 2012 +0200 Commit: markus schnalke CommitDate: Sun Apr 1 22:46:30 2012 +0200 Added a bunch of good quality code. That will improve mmh for decades! :000000 100644 00000000... e722c851... A docs/m_getfld.c.humor commit d54c8db8bdf01e8381890f7729bc0ef4a055ea11 Author: markus schnalke AuthorDate: Fri Mar 30 18:07:52 2012 +0200 Commit: markus schnalke CommitDate: Fri Mar 30 18:07:52 2012 +0200 Put structure into anno(1) and its man page. The ``newly'' added features (-list, -delete, ...) were simply added on top, but without rethinking and adjusting anno(1)'s structure. (I agree, however, that it was the right decision to add these features to anno(1) instead of writing another tool.) I've reworked anno now to give it a clear structure. And I've reworked its man page to propagate this structure. :100644 100644 1e27cf50... e35899e6... M man/anno.man1 :100644 100644 3b1d1377... fe0d65f2... M uip/anno.c commit 3d6f5c837570d47d61e12df7e98ebec25ad08d46 Author: markus schnalke AuthorDate: Thu Mar 29 23:17:59 2012 +0200 Commit: markus schnalke CommitDate: Thu Mar 29 23:17:59 2012 +0200 Updated man page mh-mail(5). :100644 100644 34d983cb... 05e825b0... M man/mh-mail.man5 commit a0a7003193b14d2965fdeb6e07cd20605d179e1f Author: markus schnalke AuthorDate: Thu Mar 29 23:00:30 2012 +0200 Commit: markus schnalke CommitDate: Thu Mar 29 23:00:30 2012 +0200 Added missing NULL sentinels in switches array. :100644 100644 5142ae3a... 2fbb9b65... M uip/inc.c :100644 100644 3104e6f8... 45f3e9d4... M uip/mhlist.c :100644 100644 4a07d016... b43d5a81... M uip/mhshow.c :100644 100644 37174dea... 164d3905... M uip/mhtest.c :100644 100644 e2707d33... ee812268... M uip/msgchk.c commit 07ac3f117098490f03b7f61e0257dc2d07583402 Author: markus schnalke AuthorDate: Thu Mar 29 22:53:19 2012 +0200 Commit: markus schnalke CommitDate: Thu Mar 29 22:53:19 2012 +0200 mmh.sh: Minimal change. :100755 100755 cb27ae82... 6e93eb19... M uip/mmh.sh commit 155ab56dceb237b491a9d551e2a74aa8d74a16c0 Author: markus schnalke AuthorDate: Thu Mar 29 22:51:59 2012 +0200 Commit: markus schnalke CommitDate: Thu Mar 29 22:51:59 2012 +0200 Added wrapper mmhwrap for parallel installations with nmh or a small $PATH. It might be helpful. :100644 100644 d83d8705... 5c91101e... M .gitignore :100644 100644 4703ebd9... acd3072a... M man/Makefile.in :000000 100644 00000000... 488d2dc1... A man/mmhwrap.man1 :100644 100644 1f5a495e... 0ae31675... M uip/Makefile.in :000000 100644 00000000... dfd308af... A uip/mmhwrap.sh commit 412b2e54251ff6e20537f83b95c8ee76ea8c5c40 Author: markus schnalke AuthorDate: Thu Mar 29 18:18:21 2012 +0200 Commit: markus schnalke CommitDate: Thu Mar 29 18:18:21 2012 +0200 Folded fileproc to constant `refile'. Also moved sbr/refile.c into uip/whatnow.c :100644 100644 31acdbb1... f38866b9... M config/config.c :100644 100644 ac8e6653... 05300510... M h/mh.h :100644 100644 973da677... ba33a03c... M h/prototypes.h :100644 100644 5c39a501... 6258d207... M man/comp.man1 :100644 100644 7f9f952d... 628942da... M man/forw.man1 :100644 100644 65a2d6f1... 083222be... M man/mh-profile.man5 :100644 100644 5643286b... 26a2cddb... M man/repl.man1 :100644 100644 36844a07... 0406e45a... M man/whatnow.man1 :100644 100644 f2f1a9ed... 1f1b79b5... M sbr/Makefile.in :100644 100644 280d25b3... c238a26f... M sbr/readconfig.c :100644 000000 55ba754e... 00000000... D sbr/refile.c :100644 100644 7a1c5126... 664e5d08... M uip/mhparam.c :100644 100644 93283cc1... 369f03e2... M uip/spost.c :100644 100644 6e58052b... 0576ff84... M uip/whatnow.c commit 5f6cb9c6ca7a84cbb7b7e3fd4d033af99caa9e18 Author: markus schnalke AuthorDate: Thu Mar 29 17:12:37 2012 +0200 Commit: markus schnalke CommitDate: Thu Mar 29 17:12:37 2012 +0200 Migrated man page post(8) to spost(8). It would be nice to have it improved a bit more. Spost is located in section 8 (maintenance commands) of the manual, but it is located in the bindir, rather than the sbindir. This is on purpose. The sections of the manual are mostly informational (today), whereas directories are either in $PATH or not, and thus cause a functional difference. Hence, I don't blindly link sbindir to section 8. :100644 100644 08a2bc11... 4703ebd9... M man/Makefile.in :100644 000000 5bac6f73... 00000000... D man/post.man8 :000000 100644 00000000... 00f1d7ba... A man/spost.man8 commit 3c7a396c28e665f8cc2e94f18e1a84b3e1d2efd4 Author: markus schnalke AuthorDate: Thu Mar 29 16:13:21 2012 +0200 Commit: markus schnalke CommitDate: Thu Mar 29 16:13:21 2012 +0200 mhl: removed -folder switch and folder output for messagename pseudo component. :100644 100644 ecc9ef4d... 65a2d6f1... M man/mh-profile.man5 :100644 100644 f408604d... f9536c07... M man/mhl.man1 :100644 100644 c78619ee... 58c7d2b0... M uip/mhl.c :100644 100644 9a3c46e9... a0178fe9... M uip/show.c commit aac09b48aeb1e822be418a6b6a01b3e2f357b8cd Author: markus schnalke AuthorDate: Thu Mar 29 15:17:06 2012 +0200 Commit: markus schnalke CommitDate: Thu Mar 29 15:17:06 2012 +0200 Removed dead code within never set define WHATNOW. :100644 100644 318d5556... 2fe25b49... M uip/refile.c :100644 100644 4abc3d74... 9a3c46e9... M uip/show.c commit 8edc5aaf86f9f77124664f6801bc6c6cdf258173 Author: markus schnalke AuthorDate: Thu Mar 29 15:08:49 2012 +0200 Commit: markus schnalke CommitDate: Thu Mar 29 15:08:49 2012 +0200 Trash folder replaces rmmproc. Rework of rmm(1) and refile(1). Removed several switches from refile and changed its behavior. (Although, rmm does not use backup prefixes anymore, other tools still do.) :100644 100644 82c66c3b... 31acdbb1... M config/config.c :100644 100644 49389030... 28aa29fd... M docs/COMPLETION-BASH :100644 100644 cb21f3fa... 2b47557b... M docs/COMPLETION-ZSH :100644 100644 8d698f48... ac8e6653... M h/mh.h :100644 100644 0e608d00... 973da677... M h/prototypes.h :100644 100644 5c051fba... ecc9ef4d... M man/mh-profile.man5 :100644 100644 b864caa9... 323bc243... M man/mhparam.man1 :100644 100644 036baab5... 5e837f5b... M man/refile.man1 :100644 100644 0cf138fa... a2717130... M man/rmm.man1 :100644 100644 d6e63b6c... 17b99bef... M sbr/folder_delmsgs.c :100644 100644 3749452b... bdb0e866... M sbr/m_backup.c :100644 100644 bcff1da2... 280d25b3... M sbr/readconfig.c :100644 100644 20a95e7b... 7a1c5126... M uip/mhparam.c :100644 100644 e699a144... 318d5556... M uip/refile.c :100644 100644 35983bd6... ecc9b9b4... M uip/rmm.c :100644 100644 d0b0f93a... 6e58052b... M uip/whatnow.c commit dfecfa4b4b77983ddf8253b1b8effaf5c1a0ce80 Author: markus schnalke AuthorDate: Wed Mar 28 21:16:08 2012 +0200 Commit: markus schnalke CommitDate: Wed Mar 28 21:16:08 2012 +0200 Fixed programming mistakes, detected by cppcheck. Two memory leaks and a possibly not terminated string. (There also is a false positive in sbr/path.c.) (sbr/dtimep.c has warnings, but I believe lex is correct. ;-) ) :100644 100644 8ccffc50... e4c1b7f7... M sbr/folder_read.c :100644 100644 ee512197... 5142ae3a... M uip/inc.c :100644 100644 b83a2686... 765bcbd6... M uip/slocal.c commit 12fc1bc3b016c93fa00712de76a286c09dc1ee39 Author: markus schnalke AuthorDate: Tue Mar 27 18:22:13 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 18:22:13 2012 +0200 Removed -realsize from man page because mhshow doesn't support it. Pulled in from nmh. Thanks to David Levine. :100644 100644 4f14ae47... 0a6513b6... M man/mhshow.man1 commit e1b2a81e2b5f77605973a47734a895cd3e83b73c Author: markus schnalke AuthorDate: Tue Mar 27 18:11:49 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 18:11:49 2012 +0200 Enhance fix of 0b81a300d9e7cf78b6bc11d8c870f57fa81fcdc4. Ken Hornstein did the same fix for nmh. He showed me that I had missed the second, similar, case. Thanks. :100644 100644 7fa7558f... fd18a117... M sbr/seq_add.c commit 18272eafd1dd4c2c594724da3d850e794f191566 Author: markus schnalke AuthorDate: Tue Mar 27 17:39:32 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 17:39:32 2012 +0200 Automated generation of mh-chart.man7. Moved mh-chart from section 1 to section 7, in the same go. Based upon a pull-in from nmh. Thanks a lot to David Levine. Autogenerating is the only sensible approach to mh-chart. :100644 100644 b5b89d68... d83d8705... M .gitignore :100644 100644 e7f58be2... 08a2bc11... M man/Makefile.in :000000 100755 00000000... 72a2b381... A man/mh-chart-gen.sh :100644 000000 9190405c... 00000000... D man/mh-chart.man1 :100644 100644 b55b7481... e9d1941c... M man/pick.man1 :100644 100644 aa7b4fcc... 9f183e37... M man/prompter.man1 :100644 100644 f2015b48... 2920b691... M man/sendfiles.man1 commit b9650770c24af625e4ddc6d791b9d5b652c1e8b2 Author: markus schnalke AuthorDate: Tue Mar 27 15:40:17 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 15:40:17 2012 +0200 Trivial change. :100644 100644 75d9a9b6... d0b0f93a... M uip/whatnow.c commit c986c4f537fa8adc7d84f338976613ac4475bea3 Author: markus schnalke AuthorDate: Tue Mar 27 15:31:14 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 15:31:14 2012 +0200 Add some more default MIME content suffixes. Some of them originated from: cat /etc/mime.types | perl -ane 'if ($F[1] ne "") {print "mhshow-suffix-$F[0]:.$F[1]\n"}' Pulled in from nmh. Thanks to Ken Hornstein, David Levine and Steve Rader. :100644 100644 023ad610... 71c754d0... M etc/mhn.defaults commit 6cdade9983a7ebd5a5bb8296daa49d5475f07af8 Author: markus schnalke AuthorDate: Tue Mar 27 15:22:43 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 15:22:43 2012 +0200 Clean up prototypes. Pulled in from nmh. Thanks to Ken Hornstein. :100644 100644 7f8d39a7... 0f0dda3b... M uip/pick.c commit 9baa20b6178dec82264945744200af013c05b3bd Author: markus schnalke AuthorDate: Tue Mar 27 15:18:49 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 15:18:49 2012 +0200 Make sure we don't send Envelope-From if we're using spost. Pulled in from nmh. Thanks to Ken Hornstein. :100644 100644 69d47082... 93283cc1... M uip/spost.c commit 1ab6dbe9907901b0abe84c451ead6b25a74fbb5b Author: markus schnalke AuthorDate: Tue Mar 27 15:14:46 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 15:14:46 2012 +0200 Create proper prototypes for formataddr(). Pulled in from nmh. Thanks to Ken Hornstein. :100644 100644 a2058683... 09346dab... M h/fmt_scan.h :100644 100644 8414829b... ec086a13... M sbr/fmt_scan.c commit 5aa54cbb20ba640e73e6c9132f9b8c13bec07607 Author: markus schnalke AuthorDate: Tue Mar 27 15:11:24 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 15:11:24 2012 +0200 Fixed mhstore to honor nmh-storage profile entry even with -auto [Bug #35303]. Pulled in from nmh. Thanks to David Levine. :100644 100644 f05c10c0... ec4c7a1e... M man/mhstore.man1 :100644 100644 764237e5... cb411d8c... M uip/mhstore.c commit 047888a8a1d311b772b3207dca48b607c7126507 Author: markus schnalke AuthorDate: Tue Mar 27 15:07:59 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 15:07:59 2012 +0200 Fixed two fd leaks in mhparse.c. 1) In openQuoted(), the decoded contents file was opened twice in succession. The second open was added by a patch in March 2000. 2) openBase64(), openQuoted(), and open7Bit() could open the contents file, but it never would be closed. Added code to each to close the file if the function opened it. [Bug #24004: (debbug 344182)] Pulled in from nmh. Thanks to David Levine. :100644 100644 d38f2515... bf65480e... M uip/mhparse.c commit b2d16fa4e961d55fec5f83eadc0a15503af2fe38 Author: markus schnalke AuthorDate: Tue Mar 27 14:57:18 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 14:57:18 2012 +0200 Replaced UTC-8 with UTF-8. Pulled in from nmh. Thanks to David Levine. :100644 100644 ddd30faa... 96014314... M docs/MACHINES commit 0fb9981d2aff1a53d665123ef73857949a0e86f8 Author: markus schnalke AuthorDate: Tue Mar 27 14:55:17 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 14:55:17 2012 +0200 Fixed a bunch of minor man page formating problems. (Revealed by `groff -ww'.) Pulled in from nmh. Thanks to David Levine. :100644 100644 0977c77f... 3e14e971... M man/ap.man8 :100644 100644 0d5cd40d... 7f9f952d... M man/forw.man1 :100644 100644 ae0e8b0d... ca07c512... M man/mh-format.man5 :100644 100644 98564e0d... 1633b076... M man/mh-sequence.man7 :100644 100644 a04464d3... f408604d... M man/mhl.man1 :100644 100644 2f2b6412... d6723c82... M man/rcvdist.man1 :100644 100644 42e371f9... 24ced2ce... M man/scan.man1 :100644 100644 e8defa55... 7d649524... M man/slocal.man1 commit 6bd5e1baa07e971d42188391a12f330b82174c48 Author: markus schnalke AuthorDate: Tue Mar 27 14:48:42 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 14:48:42 2012 +0200 Fixed mhlist -verbose to work with all content types [Bug #35219]. Pulled in from nmh. Thanks to David Levine. :100644 100644 4c788d16... 9cd331a8... M uip/mhlistsbr.c commit eea4d1cb63d62652e6413edfae2eaf5d4944d80f Author: markus schnalke AuthorDate: Tue Mar 27 14:40:38 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 14:40:38 2012 +0200 Added -verbose/-noverbose to mhlist synopsis Pulled in from nmh. Thanks to David Levine. :100644 100644 9738de9a... 9190405c... M man/mh-chart.man1 :100644 100644 91b35e2f... 14912a25... M man/mhlist.man1 commit a451512234838dcaf6f0a625b228761d0b2575a7 Author: markus schnalke AuthorDate: Tue Mar 27 14:37:36 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 14:37:36 2012 +0200 Escape spaces in DEFAULTS sections of man pages so they no longer are lost. Pulled in from nmh. Thanks to David Levine. :100644 100644 7e1f19d6... a04464d3... M man/mhl.man1 :100644 100644 b99de6c9... 91b35e2f... M man/mhlist.man1 :100644 100644 a3330c00... 4f14ae47... M man/mhshow.man1 :100644 100644 5ad0137a... f05c10c0... M man/mhstore.man1 commit 9463774dee55bf3d8ab4d5dc8ac68816511aa684 Author: markus schnalke AuthorDate: Tue Mar 27 14:32:20 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 14:32:20 2012 +0200 Removed ignored -verbose (and -noverbose) options to mhstore. (In contrast to nmh, we also change the code.) Pulled in from nmh. Thanks to David Levine. :100644 100644 ef5a939a... 9738de9a... M man/mh-chart.man1 :100644 100644 395b76a0... 5ad0137a... M man/mhstore.man1 :100644 100644 e510d139... 764237e5... M uip/mhstore.c commit 582a56a15d79dac8e142b97bf08f29ccb8df3a2a Author: markus schnalke AuthorDate: Tue Mar 27 14:25:10 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 14:25:10 2012 +0200 Fixed example to show that mhparam preserves case of component name. Pulled in from nmh. Thanks to David Levine. :100644 100644 ce62a52b... b864caa9... M man/mhparam.man1 commit 651d89ca77b0c62dec629b029ef8e25d0df1d4cb Author: markus schnalke AuthorDate: Tue Mar 27 14:20:24 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 14:20:24 2012 +0200 Fixed `mhbuild -check': use the correct file. mhbuild -check would always fail because it tried to build the digest for the decoded contents file (cefile), which can be null. If it is, use the contents file itself. Pulled in from nmh. Thanks to David Levine. :100644 100644 739aa462... 5f29d0e6... M uip/mhbuild.c commit 8051c625ea98a42e6f8f0b4276babeeae49b339f Author: markus schnalke AuthorDate: Tue Mar 27 13:58:45 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 13:58:45 2012 +0200 Make -volume switch actually work (it always got overridden). As far as I can tell, this never worked. Found by the nmh test suite! Pulled in from nmh. Thanks to Ken Hornstein. :100644 100644 be1242b3... 140136a9... M uip/forw.c commit 89500484352c5b5bf741879db73b1ed0c84770da Author: markus schnalke AuthorDate: Tue Mar 27 13:55:34 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 13:55:34 2012 +0200 Suppress echoing of man page build lines. One of them says "warning", and it's handy to check that build output doesn't say that. Pulled in from nmh. Thanks to David Levine. :100644 100644 27c67cb8... e7f58be2... M man/Makefile.in commit db9aeea968d1810261a964a10042b2cecabbd004 Author: markus schnalke AuthorDate: Tue Mar 27 13:49:16 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 13:49:16 2012 +0200 Updated docs to reflect that all of the lists are on nongnu.org. Pulled in from nmh. Thanks to David Levine. :100644 100644 767291c0... ca6c7c35... M docs/MAILING-LISTS :100644 100644 153f815c... 935d0d16... M docs/README.developers commit 75f03a965d10d34099b13799e6fe0ed43f56e257 Author: markus schnalke AuthorDate: Tue Mar 27 12:41:58 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 12:41:58 2012 +0200 Report an error when the width used by putaddr is less than the label width. Pulled in from nmh. Thanks to Ken Hornstein. :100644 100644 113b8cff... 8414829b... M sbr/fmt_scan.c commit 0dc43cbf916830e524ee705664bc9d1e1addaee2 Author: markus schnalke AuthorDate: Tue Mar 27 12:33:35 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 12:33:35 2012 +0200 new: Improve the fix with the NULL-sentinel. With multiple sequence arguments on the command line you might end up with garbage in the sequence[] array (it needs the last argument to be a NULL. So do two things: make the first two arguments NULL, and as we add arguments to sequence[] make sure the list has a NULL on the end. This is another problem discovered by the nmh test suite. Pulled in from nmh. Thanks to Ken Hornstein. :100644 100644 f6ac3642... dab17ada... M uip/new.c commit 38ada11179b45273156ad158afb2833d2e31b98c Author: markus schnalke AuthorDate: Tue Mar 27 12:30:34 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 12:30:34 2012 +0200 Correct the maximum number of sequences in the mark(1) man page. Also add a note explaining the somewhat low limit. (Note: mmh's value is different to nmh's.) Pulled in from nmh. Thanks to Ken Hornstein. :100644 100644 24d84ff9... b0b93cad... M man/mark.man1 commit 7c5f2d98b1e0519cd3bfcc3b01be06db3eafb27d Author: markus schnalke AuthorDate: Tue Mar 27 12:21:43 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 12:21:43 2012 +0200 Show assignment of configure variables using VAR=VALUE instead of in the env. Pulled in from nmh. Thanks to David Levine. :100644 100644 b8f0409b... 78e1390b... M INSTALL commit 2e5668919988fce4e523cbf2294698841b1106a0 Author: markus schnalke AuthorDate: Tue Mar 27 12:12:06 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 12:12:06 2012 +0200 We have only numeric timezone support (e.g. +0200) from now on. That's an mmh decision. Pulled in from nmh is the following part: Removed use of tzset()/tzname in dtimezone(). They caused the returned timezone string to be for the user's current timezone, but the function is supposed to return the string representation of the timezone of its argument. Thanks to David Levine. :100644 100644 289a6732... 420275ce... M h/tws.h :100644 100644 1273112b... 738ffd59... M sbr/dtime.c :100644 100644 5103dbd7... 113b8cff... M sbr/fmt_scan.c :100644 100644 b1d86678... 3b1d1377... M uip/anno.c :100644 100644 53b09683... be1242b3... M uip/forw.c :100644 100644 98fffef1... ee512197... M uip/inc.c :100644 100644 b5b02c91... e2707d33... M uip/msgchk.c :100644 100644 3fb853cd... 7f8d39a7... M uip/pick.c :100644 100644 c0f0922d... b83a2686... M uip/slocal.c :100644 100644 43d3d106... 69d47082... M uip/spost.c commit 701adc46db60b3ca1f2e5087805eba59ffe87976 Author: markus schnalke AuthorDate: Tue Mar 27 11:42:39 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 11:42:39 2012 +0200 new: sequences[0] needs to be initialized to NULL. This was caught by the nmh test suite. Pulled in from nmh. Thanks to David Levine. :100644 100644 a4da6357... f6ac3642... M uip/new.c commit 694fc4000bfe9e5091c30773c49b14c8fbc5c1ad Author: markus schnalke AuthorDate: Tue Mar 27 11:35:56 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 11:35:56 2012 +0200 Added error message if COMPLETION-BASH is source directly. Pulled in from nmh. Thanks to David Levine. :100644 100644 e4af65d2... 49389030... M docs/COMPLETION-BASH commit b448acfe8fded2f2b29ae889c734d68245481529 Author: markus schnalke AuthorDate: Tue Mar 27 11:34:53 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 11:34:53 2012 +0200 Exit with error message if no library could be found with tgetent(). Pulled in from nmh. Thanks to David Levine. :100644 100644 2595cff0... 04f23d1e... M configure.ac commit d132c52459d18f45fa9d227e5f3afebad43f7cfc Author: markus schnalke AuthorDate: Tue Mar 27 11:20:22 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 11:27:35 2012 +0200 Replace www.ics.uci.edu/~mh/ links with corresponding rand-mh.sf.net links. The former ones are dead. Pulled in from nmh. Thanks to David Levine. :100644 100644 e6a7e17e... b8f0409b... M INSTALL :100644 100644 328f383f... 6dacd5c9... M README commit 7617aba98c430c925ae133c029d2ab9f570e95b5 Author: markus schnalke AuthorDate: Tue Mar 27 11:06:46 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 11:06:46 2012 +0200 abs() is part of C89. :100644 100644 6a5cf9fc... 8d698f48... M h/mh.h :100644 100644 48e13dbb... 1273112b... M sbr/dtime.c commit 6195a89359453dc49064c8f7a28c02165d2cb972 Author: markus schnalke AuthorDate: Tue Mar 27 11:03:04 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 11:03:04 2012 +0200 FreeBSD needs the HAVE_STRUCT_TM_TM_GMTOFF test. FreeBSD has a timezone() function, not a timezone global variable (that's visible with our default configuration). Undid most of 0e4bc6fa7fa8ad74a1c3e855411bdc0e63bc6a2e. Pulled in from nmh. Thanks to David Levine. :100644 100644 f55a9824... 2595cff0... M configure.ac :100644 100644 5a73934c... 48e13dbb... M sbr/dtime.c commit 5a4836db0e18fe3fa32ba5d3deff2010d8a1b418 Author: markus schnalke AuthorDate: Tue Mar 27 10:58:05 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 10:58:05 2012 +0200 uip/termsbr.c: remove references to PC. Pulled in from nmh. Thanks to Lyndon Nerenberg. :100644 100644 e1ea5f8c... fbf5f162... M uip/termsbr.c commit 54c43692649e392a42bb9559ea12cdaff056b965 Author: markus schnalke AuthorDate: Tue Mar 27 10:46:38 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 10:46:38 2012 +0200 s/AC_CHECK_NETLIBS/NMH_CHECK_NETLIBS/, since it's not part of autoconf. Pulled in from nmh. Thanks to Ken Hornstein. :100644 100644 89e6f976... 872f5f9e... M aclocal.m4 :100644 100644 51a4d1af... f55a9824... M configure.ac commit 403bc56ffdf4679f5159d926c5774ad042c55ac9 Author: markus schnalke AuthorDate: Tue Mar 27 10:44:30 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 10:44:30 2012 +0200 Removed the undocumented `select' option of slocal(1) and thus removed utmp. :100644 100644 0387a189... 51a4d1af... M configure.ac :100644 100644 9f2e54b7... c0f0922d... M uip/slocal.c commit 0e4bc6fa7fa8ad74a1c3e855411bdc0e63bc6a2e Author: markus schnalke AuthorDate: Tue Mar 27 10:20:25 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 10:20:25 2012 +0200 Removed HAVE_STRUCT_TM_TM_GMTOFF support. timezone, tzname, and tzset() are all POSIX. Pulled in from nmh. Thanks to David Levine. :100644 100644 b3b517bd... 0387a189... M configure.ac :100644 100644 e0405e99... 5a73934c... M sbr/dtime.c commit ecb956c6724be7422b2d512dd6492f3cf3b8451a Author: markus schnalke AuthorDate: Tue Mar 27 10:13:26 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 10:13:26 2012 +0200 Removed unused parameter of replout(). :100644 100644 2c14224a... af147a12... M uip/repl.c commit d5b5e6e4813b7fd77dc1664df4304537f3002cf3 Author: markus schnalke AuthorDate: Tue Mar 27 10:09:19 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 10:09:19 2012 +0200 Changed types and added casts so that build is clean with gcc -Wsign-compare. Pulled in from nmh. Thanks to David Levine. :100644 100644 435740ec... dd0b52af... M sbr/fmt_compile.c :100644 100644 94285a6f... 5103dbd7... M sbr/fmt_scan.c :100644 100644 734bdb58... 85d4e587... M sbr/m_convert.c :100644 100644 5886ffc0... c4e1e758... M sbr/pidstatus.c :100644 100644 b1228098... 7fa7558f... M sbr/seq_add.c :100644 100644 e342d1cb... 5555f115... M sbr/seq_del.c :100644 100644 5707dae9... bfecaf01... M sbr/seq_read.c :100644 100644 6a68c51a... 8b32826b... M uip/aliasbr.c :100644 100644 d03c99cc... b1d86678... M uip/anno.c :100644 100644 fdc78f43... d0d06b6d... M uip/burst.c :100644 100644 a9d25437... 87953ad2... M uip/comp.c :100644 100644 4eba2eb8... dabfec75... M uip/dist.c :100644 100644 124e5ab5... 3c3e1052... M uip/dropsbr.c :100644 100644 c69055ab... 9302a8a3... M uip/flist.c :100644 100644 e79e3958... 53b09683... M uip/forw.c :100644 100644 79763ff2... 1917e84f... M uip/mark.c :100644 100644 321c5f98... c78619ee... M uip/mhl.c :100644 100644 6a77d500... 2ab9cfd9... M uip/mhmail.c :100644 100644 f82cc6c3... 130b4e55... M uip/mhoutsbr.c :100644 100644 ea9f72e0... d3ddb948... M uip/mhshowsbr.c :100644 100644 896c37b3... 3fb853cd... M uip/pick.c :100644 100644 04b62d85... fc98b4ac... M uip/rcvstore.c :100644 100644 125991cc... 6ba8a9c2... M uip/sortm.c commit 517661967774d60716ecff152c642b417195f900 Author: markus schnalke AuthorDate: Tue Mar 27 09:46:59 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 09:46:59 2012 +0200 Proper field initialization. gcc -Wmissing-field-initializers noticed several struct initializations that didn't explicitly list all fields. They were of no consequence because they were for static data, so they were initialized properly. Also, changed the initialization of global.c_ovtxt from "" to NULL because free_queue () freed it if non-NULL, though I think the "" was always overwritten. Pulled in from nmh. Thanks to David Levine. :100644 100644 4876d09f... e7590887... M sbr/addrsbr.c :100644 100644 69797adb... 321c5f98... M uip/mhl.c :100644 100644 07ec48c0... 2c14224a... M uip/repl.c commit ac7004d83eba4b4685d9a03d9e3b2a5acab36a84 Author: markus schnalke AuthorDate: Tue Mar 27 09:36:56 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 09:36:56 2012 +0200 Documented support of OURDEFS to pass compile flags to configure. Pulled in from nmh. Thanks to David Levine. :100644 100644 32e6d42e... e6a7e17e... M INSTALL commit 5518634037521728ddcb11b8eb4c6dcd7f046f83 Author: markus schnalke AuthorDate: Tue Mar 27 09:31:47 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 09:31:47 2012 +0200 Add some comments to the format compiler and engine. Pulled in from nmh. Thanks to Ken Hornstein. :100644 100644 c49a6eab... 435740ec... M sbr/fmt_compile.c :100644 100644 b7137d78... 94285a6f... M sbr/fmt_scan.c commit 2d6064d0d2ceefa70d0220d9319030f47a49d924 Author: markus schnalke AuthorDate: Tue Mar 27 09:22:52 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 09:22:52 2012 +0200 Update README.developers with the correct version of autoconf we need. Pulled in from nmh. Thanks to Ken Hornstein. :100644 100644 83b240c6... 153f815c... M docs/README.developers commit f58df8a711003c845bb2f899574ac8ed9ffa30fd Author: markus schnalke AuthorDate: Tue Mar 27 09:19:56 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 09:19:56 2012 +0200 Remove some unused macros. Pulled in from nmh. Thanks to David Levine. :100644 100644 f7271775... b7137d78... M sbr/fmt_scan.c :100644 100644 e7db876f... e946664c... M sbr/mts.c :100644 100644 c98a3f06... c69055ab... M uip/flist.c :100644 100644 932da206... b5b02c91... M uip/msgchk.c commit b3628819b4ab903269cd83cc68e453b13534346c Author: markus schnalke AuthorDate: Tue Mar 27 09:10:44 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 09:10:44 2012 +0200 Completely remove the use of TIME_WITH_SYS_TIME. Removed the autoconf test but never removed the code, and this caused some problems on systems that needed some prototypes in . Pulled in from nmh. Thanks to Ken Hornstein. :100644 100644 b5fac4fd... 133a9ab1... M sbr/dtimep.lex :100644 100644 797c192a... c49a6eab... M sbr/fmt_compile.c :100644 100644 f26b02bb... f7271775... M sbr/fmt_scan.c :100644 100644 5d0be840... d15c9395... M sbr/lock_file.c :100644 100644 06a353ac... 739aa462... M uip/mhbuild.c :100644 100644 2d6c5965... 201ce514... M uip/mhcachesbr.c :100644 100644 73babadf... 896c37b3... M uip/pick.c :100644 100644 e39ab800... a2e99329... M uip/send.c commit 1ec4ef34243a756d1f51718e7e15b094f4b36618 Author: markus schnalke AuthorDate: Tue Mar 27 08:58:17 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 08:58:17 2012 +0200 Remove OS-specific defines. Remove GECOS ampersand-magic, along with it. Pulled in from nmh. Thanks to Ken Hornstein. :100644 100644 a1f287c2... b3b517bd... M configure.ac :100644 100644 e38e5b0b... d3eabd0e... M sbr/discard.c :100644 100644 2ebb44a2... c7f4279b... M sbr/m_getfld.c :100644 100644 7c70e46b... e7db876f... M sbr/mts.c :100644 100644 975d2e13... 2d6c5965... M uip/mhcachesbr.c :100644 100644 c566de23... 865f2f72... M uip/scansbr.c commit 74ed4c043b3e22fa7e16fd892c381e9b16ca8c27 Author: markus schnalke AuthorDate: Tue Mar 27 08:48:32 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 08:48:32 2012 +0200 Clean up time handling; always assume we have tzset(). Also assume that the right prototype is in time.h (both are valid in POSIX). Pulled in from nmh. Thanks to Ken Hornstein. :100644 100644 466a9ddc... a1f287c2... M configure.ac :100644 100644 b427dfda... e0405e99... M sbr/dtime.c :100644 100644 a3533934... b5fac4fd... M sbr/dtimep.lex commit ac0b9fcce4167e2959ebc5b8d6efb8511acec66d Author: markus schnalke AuthorDate: Tue Mar 27 08:23:52 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 08:23:52 2012 +0200 We are making POSIX signal support a requirement. Remove all support for other signal interfaces. Pulled in from nmh. Thanks to Ken Hornstein. :100644 100644 7b2666cf... 466a9ddc... M configure.ac :100644 100644 b8f08650... 480bf6d0... M h/signals.h :100644 100644 1a381db2... d1371d01... M sbr/context_save.c :100644 100644 11531dfb... 5d0be840... M sbr/lock_file.c :100644 100644 15d3f1c7... 745fa25b... M sbr/seq_save.c :100644 100644 77d61ce0... 5b55fc42... M sbr/signals.c :100644 100644 e139a833... 69797adb... M uip/mhl.c :100644 100644 374c8fd4... 6a77d500... M uip/mhmail.c :100644 100644 217e890c... ea9f72e0... M uip/mhshowsbr.c :100644 100644 2f39f29d... 6c780d4a... M uip/prompter.c :100644 100644 086fac31... 9f2e54b7... M uip/slocal.c commit fc71710f8695ea07d852284286b058ecb3955317 Author: markus schnalke AuthorDate: Tue Mar 27 07:44:43 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 07:44:43 2012 +0200 Switch from using RETSIGTYPE via autoconf to void. POSIX says that's the type to use for a signal handler. Pulled in from nmh. Thanks to Ken Hornstein. (btw: `to pull in' describes my action better than `to merge'.) :100644 100644 9469adbf... 7b2666cf... M configure.ac :100644 100644 d805d192... b8f08650... M h/signals.h :100644 100644 af882d5f... 7254d6bd... M sbr/getans.c :100644 100644 6b74068c... 11531dfb... M sbr/lock_file.c :100644 100644 c1c53551... e139a833... M uip/mhl.c :100644 100644 fc8b751c... 3104e6f8... M uip/mhlist.c :100644 100644 ef1a050b... 374c8fd4... M uip/mhmail.c :100644 100644 ebbd8ec8... 4a07d016... M uip/mhshow.c :100644 100644 377e8dc7... e510d139... M uip/mhstore.c :100644 100644 dc381267... 37174dea... M uip/mhtest.c :100644 100644 a398832e... 2f39f29d... M uip/prompter.c :100644 100644 c8af725d... 086fac31... M uip/slocal.c commit 7ffcbc3d01bb58a071d56f5e7379948c579f634a Author: markus schnalke AuthorDate: Tue Mar 27 00:22:33 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 00:22:33 2012 +0200 The result from the call to parse_mime() was ignored. Detected by `gcc -Wempty-body'. It has been that way since the beginning of history and was probably of no consequence, but fixed anyway. Merged from nmh. Thanks to David Levine. :100644 100644 a06a6787... fc8b751c... M uip/mhlist.c :100644 100644 6d91e596... ebbd8ec8... M uip/mhshow.c :100644 100644 1c4cee64... 377e8dc7... M uip/mhstore.c :100644 100644 f6c14fbd... dc381267... M uip/mhtest.c commit 7fc4e63e1df72c45f45d4fd8f54015ab9ec46320 Author: markus schnalke AuthorDate: Tue Mar 27 00:18:24 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 00:18:24 2012 +0200 Removed hard-coded -I.. and -I../.. from INCLUDES. It was redundant given -I$(top_srcdir). Merged from nmh. Thanks to David Levine. :100644 100644 8f21039c... 80eb4097... M config/Makefile.in :100644 100644 13c0ecb7... f2f1a9ed... M sbr/Makefile.in :100644 100644 a9befee5... 5886ffc0... M sbr/pidstatus.c :100644 100644 9c2d3902... 1f5a495e... M uip/Makefile.in commit 3e300b97e9a54a3157e37948f8827abbe3eecf05 Author: markus schnalke AuthorDate: Tue Mar 27 00:13:25 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 00:13:25 2012 +0200 Added Content-Description header with the filename of the attachment. This seems to be common practice now and gives mhlist something useful to display. Merged from nmh. Thanks to David Levine. :100644 100644 7b368ea9... 09e3f408... M man/send.man1 :100644 100644 a735c677... e39ab800... M uip/send.c commit 750e5220c8e53347a635600171fd443ff3a64583 Author: markus schnalke AuthorDate: Tue Mar 27 00:03:50 2012 +0200 Commit: markus schnalke CommitDate: Tue Mar 27 00:03:50 2012 +0200 Added removal of autom4te.cache directory to mostlyclean-local. Merged from nmh. Thanks to David Levine. :100644 100644 a93ba70a... 79746abb... M Makefile.in commit 1e588a59440aa1bee55c8d6d69003059c1d2af97 Author: markus schnalke AuthorDate: Mon Mar 26 23:53:15 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 23:53:15 2012 +0200 Remove RPATH code though. Discussions on nmh-workers have convinced me. [2012-01-05] Lyndon Nerenberg: > [2012-01-05] Ken Hornstein: >> RPATHS - Construct Return-Path headers from "From " lines. >> I say keep it, since it's been around forever (a fair >> amount of code, actually). > I'm going to argue for the removal of this code, as well. The > Return-Path header should be inserted by the delivering MTA, and I > can't think of any modern MTA that doesn't. :100644 100644 bd484e91... 0e608d00... M h/prototypes.h :100644 100644 85a323b9... 2ebb44a2... M sbr/m_getfld.c :100644 100644 56583f15... c566de23... M uip/scansbr.c :100644 100644 98658399... c8af725d... M uip/slocal.c commit e9f7cdfaf76a410bc663735484bee44806f32894 Author: markus schnalke AuthorDate: Mon Mar 26 23:29:53 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 23:29:53 2012 +0200 Added datarootdir definitions to silence warnings from configure. Merged from nmh. Thanks to David Levine. :100644 100644 a3b6fe27... a93ba70a... M Makefile.in :100644 100644 df10b4b4... e9092a0d... M docs/Makefile.in :100644 100644 aab86f47... 27c67cb8... M man/Makefile.in commit f00bf5448d06f7e7876a6ce66c392631661114d2 Author: markus schnalke AuthorDate: Mon Mar 26 23:25:16 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 23:25:16 2012 +0200 Removed check for st_blksize; it's required by POSIX. It's unclear why the it was there at all as the define wasn't even used! Merged from nmh. Thanks to Ken Hornstein. :100644 100644 1cdbf9d0... 9469adbf... M configure.ac commit 1b12190af8b466a4bf081b5e798b4d7bde322123 Author: markus schnalke AuthorDate: Mon Mar 26 23:17:13 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 23:17:13 2012 +0200 Switch to standard autoconf macro for checking d_type field in struct dirent. Merged from nmh. Thanks to Ken Hornstein. :100644 100644 b678f475... 89e6f976... M aclocal.m4 :100644 100644 ac57b9c9... 1cdbf9d0... M configure.ac commit ad4522348870e01f3d95eec2dd4dc008410d4cd8 Author: markus schnalke AuthorDate: Mon Mar 26 23:07:24 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 23:07:24 2012 +0200 Remove #ifdef around use of sigsetjmp(). Merged from nmh. Thanks to Lyndon Nerenberg. :100644 100644 1eb0fdcb... ac57b9c9... M configure.ac :100644 100644 38167c8f... 217e890c... M uip/mhshowsbr.c commit 50c72f9094eea8ad222ffb3b11f51eb4bb52f024 Author: markus schnalke AuthorDate: Mon Mar 26 23:03:39 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 23:03:39 2012 +0200 Remove overrides for 'broken' stat macros. Remove redundant SEEK_* macro defs. Merged from nmh. Thanks to Lyndon Nerenberg. :100644 100644 d23079a2... 1eb0fdcb... M configure.ac :100644 100644 aa15d4c8... eb85a4a2... M h/nmh.h commit 5ae78fd67db80de17a995b1bc637bf131cfe2bb5 Author: markus schnalke AuthorDate: Mon Mar 26 22:59:03 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 22:59:03 2012 +0200 Nuke directory processing conditionals; use dirent.h. Merged from nmh. Thanks to Lyndon Nerenberg. :100644 100644 9fd84c85... d23079a2... M configure.ac :100644 100644 19549e43... aa15d4c8... M h/nmh.h commit 0c648c7c1509760370d4c4267a45a5a305885e7f Author: markus schnalke AuthorDate: Mon Mar 26 22:57:27 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 22:57:27 2012 +0200 Clean up process wait to use POSIX waitpid() interface. Merged from nmh. Thanks to Lyndon Nerenberg. :100644 100644 8c9262ba... 9fd84c85... M configure.ac :100644 100644 f845058a... a9befee5... M sbr/pidstatus.c :100644 100644 ebee02ec... ba9bae21... M sbr/pidwait.c :100644 100644 3ed31f98... 06a353ac... M uip/mhbuild.c :100644 100644 7bd4cfbf... 975d2e13... M uip/mhcachesbr.c :100644 100644 8902f759... a06a6787... M uip/mhlist.c :100644 100644 00b538ca... f82cc6c3... M uip/mhoutsbr.c :100644 100644 ece4e8fe... d38f2515... M uip/mhparse.c :100644 100644 bbd99eaa... 6d91e596... M uip/mhshow.c :100644 100644 3e730cec... 38167c8f... M uip/mhshowsbr.c :100644 100644 2ed6a42b... 1c4cee64... M uip/mhstore.c :100644 100644 7dc9c07d... f6c14fbd... M uip/mhtest.c commit 0dc22c053a80549b21709e3a518d843203b5f65d Author: markus schnalke AuthorDate: Mon Mar 26 22:44:13 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 22:44:13 2012 +0200 Make use of mkstemp() unconditional (vs. mktemp()). Merged from nmh. Thanks to Lyndon Nerenberg. :100644 100644 c81fe610... 8c9262ba... M configure.ac :100644 100644 983d9d70... 6b74068c... M sbr/lock_file.c commit e5fbf8a40dfba71da720bbc247c5367e6547abb0 Author: markus schnalke AuthorDate: Mon Mar 26 22:38:30 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 22:38:30 2012 +0200 No longer check for the mkstemp() function in the mkstemp library. Merged from nmh. Thanks to Ken Hornstein. :100644 100644 1c1b400b... c81fe610... M configure.ac commit 0052f1024deb0a0a2fc2e5bacf93d45a5a9c9b32 Author: markus schnalke AuthorDate: Mon Mar 26 22:34:56 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 22:34:56 2012 +0200 Remove compatibility functions that are always provided by the POSIX host env. Merged from nmh. Thanks to Lyndon Nerenberg. Well, if the nmh folks now believe that snprintf() can be expected to be available on recent hosts, we remove it again. ;-) :100644 100644 133c71df... 1c1b400b... M configure.ac :100644 100644 aaaf31c6... 13c0ecb7... M sbr/Makefile.in :100644 000000 1dd4a65c... 00000000... D sbr/snprintf.c :100644 000000 2d30d86e... 00000000... D sbr/strdup.c commit a567638a9445d091f6334ac2de2fc0e57309eb42 Author: markus schnalke AuthorDate: Mon Mar 26 22:28:34 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 22:28:34 2012 +0200 Ignore OSPEED/ospeed in termcap. Nothing current should need this. Remove autoconf ospeed checks. Merged from nmh. Thanks to Lyndon Nerenberg and Ken Hornstein. :100644 100644 4a6b8ee5... 133c71df... M configure.ac :100644 100644 b620e2c1... e1ea5f8c... M uip/termsbr.c commit 7e421e1fd5cf1c4ce33edc005fa63784d9c5a2e6 Author: markus schnalke AuthorDate: Mon Mar 26 22:23:33 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 22:23:33 2012 +0200 Collapse termio/termios/sgtty terminal interface down to Posix termios. No longer check for termio.h or termios.h Merge from nmh. Thanks to Lyndon Nerenberg and Ken Hornstein. :100644 100644 5b2f6409... 4a6b8ee5... M configure.ac :100644 100644 03eaa102... e38e5b0b... M sbr/discard.c :100644 100644 db61fb34... a398832e... M uip/prompter.c :100644 100644 defc93fc... b620e2c1... M uip/termsbr.c commit 768b5edd9623b7238e12ec8dfc409b82a1ed9e2d Author: markus schnalke AuthorDate: Mon Mar 26 22:12:41 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 22:12:41 2012 +0200 Eliminate '#ifdef HAVE_FOO' for Posix-mandated FOOs. Update configure file for removal of POSIX-mandated header files. Merged from nmh. Thanks to Lyndon Nerenberg and Ken Hornstein. :100644 100644 4bedb050... 5b2f6409... M configure.ac :100644 100644 896786f5... 19549e43... M h/nmh.h :100644 100644 bb4c38b4... bd484e91... M h/prototypes.h :100644 100644 b4a1547e... 983d9d70... M sbr/lock_file.c :100644 100644 6a7eb78f... 124e5ab5... M uip/dropsbr.c commit b6fbaae87d9cf00b74d94050c10ba3e700545178 Author: markus schnalke AuthorDate: Mon Mar 26 21:37:26 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 21:43:07 2012 +0200 Deprecate uname() in favour of (Posix) gethostname(). Merged from nmh. Thanks to Lyndon Nerenberg and Ken Hornstein. :100644 100644 cb5a79a3... 4bedb050... M configure.ac :100644 100644 a4644931... 7c70e46b... M sbr/mts.c commit adf591eb56d60000e806e20c42eb1907e2cc6fcd Author: markus schnalke AuthorDate: Mon Mar 26 21:32:32 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 21:32:32 2012 +0200 Moved #endif so that lockit () is only declared with DOT_LOCKING, to avoid compile warning without it. Merged from nmh. Thanks to David Levine. :100644 100644 e065c93e... b4a1547e... M sbr/lock_file.c commit d75b71ec84578fcb66e6d4e1ccd5cc8c45363cbd Author: markus schnalke AuthorDate: Mon Mar 26 21:29:45 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 21:29:45 2012 +0200 Changed second argument of calls to part_ok() and type_ok() from 0 to 1, to match what store_multi() in mhstoresbr.c does. A test case is below. Without this fix, the following command: mhshow -part 1.1 -form mhl.null produced no output. mhlist showed a part 1.1: msg part type/subtype size description 1231 multipart/mixed 276 1 multipart/related 107 1.1 text/plain 29 and "mhstore -part 1.1" properly stored it. With this fix, mhshow behaves properly and shows the part. Analogous behavior happened with -type text/plain. test case: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="NextPart_001" Content-class: urn:content-classes:message Date: Thu, 19 May 2011 00:00:00 -0000 From: sender@example.com To: recipient@example.com This is a multi-part message in MIME format. --NextPart_001 Content-Type: multipart/related; type="multipart/alternative"; boundary="NextPart_002" --NextPart_002 Content-Type: text/plain; charset="utf-8" This is the text/plain part. --NextPart_002-- --NextPart_001-- Merged from nmh. Thanks to David Levine. :100644 100644 9f69c54d... 3e730cec... M uip/mhshowsbr.c commit 9c859e43ce6889f4f0b4bc34f346334999605884 Author: markus schnalke AuthorDate: Mon Mar 26 21:27:37 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 21:27:37 2012 +0200 Replaced cvs with git references. Merged from nmh. Thanks to David Levine. :100644 100644 de321851... 83b240c6... M docs/README.developers commit 002555d3d68d553044facbe4fad7bd008a42ac5e Author: markus schnalke AuthorDate: Mon Mar 26 21:12:29 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 21:12:29 2012 +0200 Removed unused local variables to eliminate warnings from gcc 4.6.2. Merged from nmh. Thanks to David Levine. :100644 100644 a7fe9f45... b59cf5c7... M uip/fmtdump.c commit 4cdff8cfe893e7039b4ef8272ed66a8a05bc8e04 Author: markus schnalke AuthorDate: Mon Mar 26 14:17:06 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 14:17:06 2012 +0200 There's no need for killpg(). We can use kill() instead. (Also removed a now unused define.) :100644 100644 20bcbd12... cb5a79a3... M configure.ac :100644 100644 26eb0a2b... 896786f5... M h/nmh.h :100644 100644 608ddf29... 98658399... M uip/slocal.c commit 8b235097cbd11d728c07b966cf131aa7133ce5a9 Author: markus schnalke AuthorDate: Mon Mar 26 14:00:09 2012 +0200 Commit: markus schnalke CommitDate: Mon Mar 26 14:00:09 2012 +0200 Removed conflict(8), because checking passwd, /var/mail, etc. is not our job. Conflict did check for: - duplicate users - duplicate groups - existence of group members - valid group ids - orphaned maildrops ... and by the way for valid format of alias files. The latter task can be covered by ali(1) without address arguments. All the other tasks have nothing to do with the MUA. Actually, most of them can be covered with shell one-liners. :100644 100644 47742c2a... aab86f47... M man/Makefile.in :100644 100644 b0d47128... 480c3631... M man/ali.man1 :100644 000000 ff2246c4... 00000000... D man/conflict.man8 :100644 100644 597b1556... 39609f4f... M man/mh-alias.man5 :100644 100644 5e8a7033... ef5a939a... M man/mh-chart.man1 :100644 100644 dd356eda... 5cd77a3e... M man/mmh-intro.man7 :100644 100644 e592a255... 9c2d3902... M uip/Makefile.in :100644 000000 3670e8e7... 00000000... D uip/conflict.c commit 59fa35679d83dd2e4d0cf13c2a1d2cf8fbb9de76 Author: markus schnalke AuthorDate: Sat Mar 24 18:59:41 2012 +0100 Commit: markus schnalke CommitDate: Sat Mar 24 18:59:41 2012 +0100 Removed the now irrelevant parts of the ``history section'' in m_getfld.c. :100644 100644 df480265... 85a323b9... M sbr/m_getfld.c commit 611d68d19204d7cbf5bd585391249cb5bafca846 Author: markus schnalke AuthorDate: Sat Mar 24 18:30:19 2012 +0100 Commit: markus schnalke CommitDate: Sat Mar 24 18:30:19 2012 +0100 CHANGE OF THE DECADE: I finally gave m_unknown() a name: thisisanmbox(). The ``magic invocation'' of this function informs m_getfld() that it is reading a packed mbox file and not an MH-style (one-file-per-message) file. m_getfld() needs to care for message delimiters then. The ``magic'' of m_unknown() had vanished some time ago, already. Back then, it needed to guess which kind of mailbox format the file is. With dropping the support for MMDF (^A^A^A^A) maildrops, we converted m_unknown() into a plain dump function ... and now, it also got a boring name. Well ... :100644 100644 94ee2b97... bb4c38b4... M h/prototypes.h :100644 100644 548b3eaf... df480265... M sbr/m_getfld.c :100644 100644 be6be22a... 98fffef1... M uip/inc.c :100644 100644 92dadf69... 5cdd5b96... M uip/scan.c commit 5e8e1811bd39ba43dda7a3446694474ab16ab960 Author: markus schnalke AuthorDate: Sat Mar 24 18:13:34 2012 +0100 Commit: markus schnalke CommitDate: Sat Mar 24 18:13:34 2012 +0100 s/unixbuf/fromline/ and minor refactoring. :100644 100644 cefedec6... 548b3eaf... M sbr/m_getfld.c commit 71ca16329d950bccd713a739ea430998b802aa23 Author: markus schnalke AuthorDate: Sat Mar 24 17:06:15 2012 +0100 Commit: markus schnalke CommitDate: Sat Mar 24 17:06:15 2012 +0100 Replaced msg_style with the boolean ismbox. We only need to differ between mbox and MH-default (one msg per file). :100644 100644 0738f420... 6a5cf9fc... M h/mh.h :100644 100644 5dd69739... cefedec6... M sbr/m_getfld.c commit be6a3c548620f6d908ccaff321c8fb372b615406 Author: markus schnalke AuthorDate: Sat Mar 24 17:01:37 2012 +0100 Commit: markus schnalke CommitDate: Sat Mar 24 17:01:37 2012 +0100 We don't need m_msgdef.c separately and some minor rework in m_getfld.c. :100644 100644 8f66669d... 0738f420... M h/mh.h :100644 100644 ed1f64cb... aaaf31c6... M sbr/Makefile.in :100644 100644 47c7e7de... 5dd69739... M sbr/m_getfld.c :100644 000000 cdab622c... 00000000... D sbr/m_msgdef.c commit fdc012cb43b5fc0baa6f4470b47be397bfc3f21b Author: markus schnalke AuthorDate: Sat Mar 24 16:40:16 2012 +0100 Commit: markus schnalke CommitDate: Sat Mar 24 16:40:16 2012 +0100 Removed support to handle ARPAnet (RFC733) addresses containing ` at '. :100644 100644 53752a34... 6338a6ef... M sbr/mf.c commit bca1c9b36980c74f4dcc66a2d23e5d09083e0201 Author: markus schnalke AuthorDate: Sat Mar 24 16:17:30 2012 +0100 Commit: markus schnalke CommitDate: Sat Mar 24 16:17:30 2012 +0100 Removed personal flavor for ISI. Logically: Don't add myself more than once with `repl -cc me' and the like. :100644 100644 3c9e483d... 07ec48c0... M uip/repl.c commit 69b07982861716d278845f962c2f2c1365a3153f Author: markus schnalke AuthorDate: Sat Mar 24 15:58:50 2012 +0100 Commit: markus schnalke CommitDate: Sat Mar 24 15:58:50 2012 +0100 Merged folder_pack.c into folder.c. :100644 100644 3c0dc3c8... 94ee2b97... M h/prototypes.h :100644 100644 5de54a2e... ed1f64cb... M sbr/Makefile.in :100644 000000 c2b59116... 00000000... D sbr/folder_pack.c :100644 100644 b1398e45... 616f57b9... M uip/folder.c commit d4f5f9d551c05931478fcdfb5cd4ac06b419eeda Author: markus schnalke AuthorDate: Sat Mar 24 15:47:11 2012 +0100 Commit: markus schnalke CommitDate: Sat Mar 24 15:47:11 2012 +0100 Replaced folder_exists() by a call to create_folder(). Changed inc(1) to create non-existing folders with -silent, instead of silently failing in this case. I consider the new behavior to follow the POLS. :100644 100644 7ee6046a... a8059ea2... M h/utils.h :100644 100644 eb51bc1d... 26ec56e0... M man/inc.man1 :100644 100644 5c5b0f51... 297ad45c... M sbr/utils.c :100644 100644 05df0f02... be6be22a... M uip/inc.c commit 8589851acf19172bce7d6ecb44e3a4215beff3e5 Author: markus schnalke AuthorDate: Sat Mar 24 15:41:46 2012 +0100 Commit: markus schnalke CommitDate: Sat Mar 24 15:41:46 2012 +0100 Fixed `inc -silent' by not building a scan line if we don't want to print it. scan() is still ugly and I'm still not pleased with the scan/inc merge, but I don't see a better solution yet. :100644 100644 eba09f04... 56583f15... M uip/scansbr.c commit 1577ee015a08dd21f0f57f8a8f9a9396c31e884d Author: markus schnalke AuthorDate: Sat Mar 24 14:02:18 2012 +0100 Commit: markus schnalke CommitDate: Sat Mar 24 14:02:18 2012 +0100 In-sourced copyip() and could make the code simpler. The function had had a bad name and it's use in mhl.c was complex, anyway. :100644 100644 b05535d7... 3c0dc3c8... M h/prototypes.h :100644 100644 d96807c8... 5de54a2e... M sbr/Makefile.in :100644 000000 e5ded829... 00000000... D sbr/copyip.c :100644 100644 3432ccc9... 3ed31f98... M uip/mhbuild.c :100644 100644 38926b6d... c1c53551... M uip/mhl.c commit 5f08476e3bc5c134ce57d924b01d1c1fcacd53db Author: markus schnalke AuthorDate: Sat Mar 24 12:28:35 2012 +0100 Commit: markus schnalke CommitDate: Sat Mar 24 12:28:35 2012 +0100 closefds() doesn't seem relevant or large enough to be a function. I should beware in-sourcing too much ... :100644 100644 528da473... b05535d7... M h/prototypes.h :100644 100644 5b40ab32... d96807c8... M sbr/Makefile.in :100644 000000 8a4da493... 00000000... D sbr/closefds.c :100644 100644 be4eb402... 3c9e483d... M uip/repl.c :100644 100644 5054273b... a735c677... M uip/send.c :100644 100644 f03d4871... 608ddf29... M uip/slocal.c commit c490c51b3c0f8871b6953bd0c74551404f840a74 Author: markus schnalke AuthorDate: Sat Mar 24 12:14:00 2012 +0100 Commit: markus schnalke CommitDate: Sat Mar 24 12:14:00 2012 +0100 Replaced atooi() with strtoul(..., 8). That's part of C89 and thus okay for us. :100644 100644 0e725ee4... 82c66c3b... M config/config.c :100644 100644 0f61ce45... 528da473... M h/prototypes.h :100644 100644 c6524284... 5c051fba... M man/mh-profile.man5 :100644 100644 d3782ff3... 5b40ab32... M sbr/Makefile.in :100644 000000 cb557b7d... 00000000... D sbr/atooi.c :100644 100644 9c86e77e... 377be095... M sbr/m_gmprot.c :100644 100644 a76f9108... ea393852... M sbr/makedir.c commit 2968a0027b4c64664076f0d03a37f9744fe26782 Author: markus schnalke AuthorDate: Sat Mar 24 11:14:42 2012 +0100 Commit: markus schnalke CommitDate: Sat Mar 24 11:14:42 2012 +0100 whatnow: alist will now always list in long and numbered format. :100644 100644 9274246c... 36844a07... M man/whatnow.man1 :100644 100644 ae0c30b2... 75d9a9b6... M uip/whatnow.c commit fac725ffc663490c44a7e6930a35402834869402 Author: markus schnalke AuthorDate: Sat Mar 24 11:04:47 2012 +0100 Commit: markus schnalke CommitDate: Sat Mar 24 11:04:47 2012 +0100 etcpath(): The unchanged argument is the ultimate fall-back. :100644 100644 27af5b3f... 21796a7a... M sbr/path.c commit 9e6d91313f01c96b4058d6bf419a8ca9a207bc33 Author: markus schnalke AuthorDate: Fri Mar 23 16:17:43 2012 +0100 Commit: markus schnalke CommitDate: Fri Mar 23 16:17:43 2012 +0100 Merged annosbr.c into anno.c, as it is no longer used be the other tools. :100644 100644 61e2c491... 0f61ce45... M h/prototypes.h :100644 100644 7d4f4220... e592a255... M uip/Makefile.in :100644 100644 15128237... d03c99cc... M uip/anno.c :100644 000000 170d76bc... 00000000... D uip/annosbr.c commit 34940cc59d658e50484f05ad11abe848ad724526 Author: markus schnalke AuthorDate: Fri Mar 23 16:07:02 2012 +0100 Commit: markus schnalke CommitDate: Fri Mar 23 16:07:02 2012 +0100 We need to fix `anno -list -number'. Seems anno needs some more rework. :100644 100644 fbabfd43... 15128237... M uip/anno.c commit 469a4163c2a1a43731d412eaa5d9cae7d670c48b Author: markus schnalke AuthorDate: Fri Mar 23 16:06:23 2012 +0100 Commit: markus schnalke CommitDate: Fri Mar 23 16:06:23 2012 +0100 whatnow: call external anno(1) instead of internal annotate(). :100644 100644 2eabf62e... 7d4f4220... M uip/Makefile.in :100644 100644 874a7874... ae0c30b2... M uip/whatnow.c commit f8960957ae53f962fe12e5a5eb4c01eb54cb4228 Author: markus schnalke AuthorDate: Fri Mar 23 15:05:49 2012 +0100 Commit: markus schnalke CommitDate: Fri Mar 23 15:05:49 2012 +0100 whatnow: Some minor refactoring. :100644 100644 168384f7... 874a7874... M uip/whatnow.c commit aed384169af5204b8002d06e7a22f89197963d2d Author: markus schnalke AuthorDate: Fri Mar 23 15:01:34 2012 +0100 Commit: markus schnalke CommitDate: Fri Mar 23 15:01:34 2012 +0100 forw,repl: Replaced internal annotate() call with invokation of anno(1). :100644 100644 a2500ccc... 2eabf62e... M uip/Makefile.in :100644 100644 8992b33c... e79e3958... M uip/forw.c :100644 100644 3cba5120... be4eb402... M uip/repl.c commit f9444e331ec2a523098d72bdb98d08728488f9cc Author: markus schnalke AuthorDate: Fri Mar 23 14:39:25 2012 +0100 Commit: markus schnalke CommitDate: Fri Mar 23 14:39:25 2012 +0100 anno: Can annotate files now too. This feature is yet hidden and will change. :100644 100644 36ff4b51... fbabfd43... M uip/anno.c commit 704d9e7792a7d9f810ac58871ef2e05403c01f38 Author: markus schnalke AuthorDate: Fri Mar 23 12:20:01 2012 +0100 Commit: markus schnalke CommitDate: Fri Mar 23 12:20:01 2012 +0100 Fixed building in a separate build directory. Like this: mkdir /tmp/foo cd /tmp/foo /path/to/sources/configure -q make If you want to know more, search for VPATH. :100644 100644 d39e57ce... a2500ccc... M uip/Makefile.in commit ec31c208d8618994f39ec21aa14d6cf4b7fdae66 Author: markus schnalke AuthorDate: Fri Mar 23 12:07:44 2012 +0100 Commit: markus schnalke CommitDate: Fri Mar 23 12:07:44 2012 +0100 Make mhn.defaults a static file and removed the scripts that built it. This concept its likely to change in future anyway. :100644 100644 14c2a073... b5b89d68... M .gitignore :100644 100644 d93ff2c3... 32e6d42e... M INSTALL :100644 100644 2d40acfa... 65844712... M etc/Makefile.in :000000 100644 00000000... 023ad610... A etc/mhn.defaults :100755 000000 1c798fc2... 00000000... D etc/mhn.defaults.sh :100755 000000 4b4230d4... 00000000... D etc/mhn.find.sh commit e1f54ce0994fca960d2680d07b05a9deb9e5485b Author: markus schnalke AuthorDate: Fri Mar 23 10:49:52 2012 +0100 Commit: markus schnalke CommitDate: Fri Mar 23 10:49:52 2012 +0100 Removed unused defines. :100644 100644 befb8c91... 759c9a74... M h/aliasbr.h commit 9bc048fdbfba0a5330b5b447e4f4c8c8b11ee7be Author: markus schnalke AuthorDate: Fri Mar 23 10:27:18 2012 +0100 Commit: markus schnalke CommitDate: Fri Mar 23 10:27:18 2012 +0100 mhmail: If spost fails, preseverve draft by hand, not with mv(1). :100644 100644 033c6349... ef1a050b... M uip/mhmail.c commit 076d7cc09eccff3d01d153434d89455db375ac44 Author: markus schnalke AuthorDate: Fri Mar 23 09:43:17 2012 +0100 Commit: markus schnalke CommitDate: Fri Mar 23 09:43:17 2012 +0100 makedir(): Removed the strange RUID!=EUID code and the access(2) call. Dan couldn't find a reason for the code neither, hence I assume it's save to simply remove it. Ummm, why do we want to avoid creating directories with the effective user ID? None of the nmh tools are installed such that the effective should be different from the real, and if some parent process made the two be different, I don't see why it should be our job to enforce the real UID. Also, why the heck do we call the mkdir executable rather than the library function in this case?? If we do want to call the mkdir executable, we should at least be giving it -p (and change the single chmod() call below) so it can successfully create nested directories like the above code can. -- Dan Harkless Concerning access(2): We should better always just try the action instead of first asking if we are allowed to do it. :100644 100644 f064f773... a76f9108... M sbr/makedir.c commit 7ffb36d28e517a6f3a10272056fc127592ab1c19 Author: markus schnalke AuthorDate: Fri Mar 23 09:17:21 2012 +0100 Commit: markus schnalke CommitDate: Fri Mar 23 09:17:21 2012 +0100 scan(): Symbolic names instead of magic numbers. :100644 100644 18a93641... 1f0d0873... M h/scansbr.h :100644 100644 0c172685... 92dadf69... M uip/scan.c :100644 100644 4b2add59... eba09f04... M uip/scansbr.c commit 8e98a317c86f10e0c7e866c069e143bf48cf9814 Author: markus schnalke AuthorDate: Thu Mar 22 22:51:28 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 22:51:28 2012 +0100 Removed the trivial peekc() and put the code at the appropriate places. :100644 100644 7c105f62... 61e2c491... M h/prototypes.h :100644 100644 58f82935... d3782ff3... M sbr/Makefile.in :100644 000000 7d5f7f9c... 00000000... D sbr/peekc.c :100644 100644 725abec3... fdc78f43... M uip/burst.c commit e6a372ac5444651ff2f156580b01e6a6ee8e30de Author: markus schnalke AuthorDate: Thu Mar 22 22:42:03 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 22:42:03 2012 +0100 Removed now unused OfficialName(). (Had been for UUCP, AFAIK.) :100644 100644 2327e47a... 4876d09f... M sbr/addrsbr.c commit 8b248218b305a1af5292fccb710ab87afb725cab Author: markus schnalke AuthorDate: Thu Mar 22 22:38:41 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 22:38:41 2012 +0100 Remove accidentally added files. :100644 000000 79f2c0e1... 00000000... D create-deps.sh :100644 000000 bb42a9a9... 00000000... D deps.png :100644 000000 1f8da819... 00000000... D makedeps2dot commit f0bc769234fcf8b42c0ea8e8155d37524fe92400 Author: markus schnalke AuthorDate: Thu Mar 22 22:34:45 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 22:34:45 2012 +0100 Removed unused fdcompare(). :100644 100644 a078dc52... 7c105f62... M h/prototypes.h :100644 100644 82e7f53f... 58f82935... M sbr/Makefile.in :100644 000000 937d196e... 00000000... D sbr/fdcompare.c commit 66ef547b1aa9794afb6137927aa3cd7335522c64 Author: markus schnalke AuthorDate: Thu Mar 22 21:49:27 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 21:49:27 2012 +0100 Insourced push() into send. :100644 100644 6dedfb1f... 82e7f53f... M sbr/Makefile.in :100644 000000 eb6011a9... 00000000... D sbr/push.c :100644 100644 d87e211f... 5054273b... M uip/send.c commit 9ea776b2a10e7eec1933f79caf73220b691262b2 Author: markus schnalke AuthorDate: Thu Mar 22 21:40:36 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 21:40:36 2012 +0100 scansbr: Minor refactoring. :100644 100644 7dedf705... 4b2add59... M uip/scansbr.c commit d7b4f0034bc4f5b5c2f990d0984858e9b6f4131a Author: markus schnalke AuthorDate: Thu Mar 22 21:27:53 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 21:27:53 2012 +0100 scansbr: Removed the ``performance hack'' for inc as it wasn't faster. I tested a 150MB/500msgs mbox but couldn't see any time differences. In both cases it took 2-5s on my machine. Hence, I go for the much simpler and not ``we use strange internals'' version. If you really inc much larger mboxes, then just take some time. ;-) The explaining comment for the hack had been: Performance hack: some people like to run "inc" on things like net.sources or large digests. We do a copy directly into the output buffer rather than going through an intermediate buffer. We need the amount of data m_getfld found & don't want to do a strlen on the long buffer so there's a hack in m_getfld to save the amount of data it returned in the global "msg_count". :100644 100644 299027a9... 7dedf705... M uip/scansbr.c commit e51cee378fd6a0f8d6f3af2a125715036d1f2f8c Author: markus schnalke AuthorDate: Thu Mar 22 21:07:50 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 21:07:50 2012 +0100 scansbr: Fixed scan and inc. Writing to /dev/null had it's sense, as for scanning mboxes, the message size had been determined this way and the file pointer had been pushed forward. This is now done using the input file pointer instead of the output fp. :100644 100644 9f6306d2... 299027a9... M uip/scansbr.c commit 5b7d1b7785d365515b0a9b5cfcb88d6b0e13ec51 Author: markus schnalke AuthorDate: Thu Mar 22 20:30:56 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 20:30:56 2012 +0100 scansbr: Minor refactoring and some comments. :100644 100644 b15c908e... 9f6306d2... M uip/scansbr.c commit c6615b2fbf66e8c99a00330e23747787fb6c35cc Author: markus schnalke AuthorDate: Thu Mar 22 19:54:12 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 19:54:12 2012 +0100 Remove remainings from scan format `body' pseudo-component. Also, folded constant rlwidth var. :100644 100644 9f4143ea... b15c908e... M uip/scansbr.c commit b0f7bd3419973481892d77ab5937ce520700e185 Author: markus schnalke AuthorDate: Thu Mar 22 19:05:02 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 19:05:02 2012 +0100 scansbr: Further refactoring. :100644 100644 ca98c5ae... 9f4143ea... M uip/scansbr.c commit aa60b0ab5e804f8befa890c0a6df0e3143ce0723 Author: markus schnalke AuthorDate: Thu Mar 22 18:50:10 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 18:50:10 2012 +0100 scansbr: Only write to file if we're incing, but not when scanning. If the original author would have used logical flags instead of magic values in `outnum', the code wouldn't have been broken all the time. Writing to /dev/null instead of not writing at all ... oh my! :-/ :100644 100644 dca761c4... ca98c5ae... M uip/scansbr.c commit b8b075c77be7794f3ae9ff0e8cedb12b48fd139f Author: markus schnalke AuthorDate: Thu Mar 22 18:46:33 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 18:46:33 2012 +0100 Refactoring in scansbr.c. Especially, took the logic out of `outnum'. There's more to do here. :100644 100644 75dec1cf... dca761c4... M uip/scansbr.c commit d79920ed2519caaf0f4035edbb1f57ca73ed7249 Author: markus schnalke AuthorDate: Thu Mar 22 17:46:06 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 17:46:06 2012 +0100 Removed the DBMPWD (aka. DBM) define. It was per default enabled, anyway. The explanation of this option is: For sites with a dbm-style password file (such as with Yellow Pages), MH will not read the entire passwd file into a cache. At one site that runs YP on a large passwd file, using this showed a 6:1 performance improvement. I don't like performance optimization, but if the non-cached version is faster, then we surely take that one. :100644 100644 3ab8a469... 73522406... M acconfig.h :100644 100644 baeab6f2... 6a68c51a... M uip/aliasbr.c commit f0f858069d21111f0dbea510044593f89c9b0829 Author: markus schnalke AuthorDate: Thu Mar 22 17:17:58 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 17:17:58 2012 +0100 Merged mhstoresbr.c into mhstore.c, cause it's not used elsewhere. :100644 100644 a5ecae86... d39e57ce... M uip/Makefile.in :100644 100644 c1a3edbe... 2ed6a42b... M uip/mhstore.c :100644 000000 6a0cf049... 00000000... D uip/mhstoresbr.c commit 0503a6e9be34f24858b55b555a5c948182b9f24b Author: markus schnalke AuthorDate: Thu Mar 22 17:07:25 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 17:07:25 2012 +0100 Merged mhbuildsbr.c into mhbuild.c, cause it is not used elsewhere. :000000 100644 00000000... 79f2c0e1... A create-deps.sh :000000 100644 00000000... bb42a9a9... A deps.png :100644 100644 9d31c4ae... 71c3563d... M h/mhparse.h :000000 100644 00000000... 1f8da819... A makedeps2dot :100644 100644 d81985f7... a5ecae86... M uip/Makefile.in :100644 100644 63d7be2f... 3432ccc9... M uip/mhbuild.c :100644 000000 efbb8ac3... 00000000... D uip/mhbuildsbr.c :100644 100644 c6f0603b... 7bd4cfbf... M uip/mhcachesbr.c commit 3d3fd4b7278c48da489d2cc296c1027d7aa722f2 Author: markus schnalke AuthorDate: Thu Mar 22 15:26:19 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 15:26:19 2012 +0100 Rewrote late declations, which are part of C99, but not C89. :100644 100644 e5576b89... 27af5b3f... M sbr/path.c :100644 100644 dff8a9ec... 3cba5120... M uip/repl.c commit e87cd7100d4ae8d636895aebe30ec9dbf740c79b Author: markus schnalke AuthorDate: Thu Mar 22 15:25:41 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 15:25:41 2012 +0100 Added a note that I autoconf-2.59 should be enough. :100644 100644 806214c5... 20bcbd12... M configure.ac commit 8edf2fa76c7b6d224d3f1b8cc7a764e624c45816 Author: markus schnalke AuthorDate: Thu Mar 22 15:25:19 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 15:25:19 2012 +0100 Distribute autogen.sh in the tarballs. :100644 100644 89fa10b6... a3b6fe27... M Makefile.in commit 0ac9f5ab199e03ff8f6e5914437cb14d25171058 Author: markus schnalke AuthorDate: Thu Mar 22 14:59:24 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 14:59:24 2012 +0100 Updated message, as `install-mh' had been replaced by `mmh'. :100644 100644 5733d3fa... 600efab2... M sbr/context_read.c commit 731cbed5b971fac4bddd0ea525da0a90be54425b Author: markus schnalke AuthorDate: Thu Mar 22 14:44:00 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 14:44:00 2012 +0100 Moved and renamed some documentation files. :100644 100644 9d548b38... 89fa10b6... M Makefile.in :100644 100644 324dddc1... 324dddc1... R100 ChangeLog docs/ChangeLog_nmh :100644 100644 15401970... 15401970... R100 docs/DIFFERENCES docs/DIFFERENCES_nmh_MH :100644 100644 ddd30faa... ddd30faa... R100 MACHINES docs/MACHINES :100644 100644 a68ab2cb... df10b4b4... M docs/Makefile.in :100644 100644 ff9db2a3... ff9db2a3... R100 docs/README-ATTACHMENTS docs/README.attachments :100644 100644 714ba008... 714ba008... R100 docs/README-HOOKS docs/README.hooks :100644 100644 b0b5e8d0... b0b5e8d0... R100 docs/MAIL.FILTERING docs/README.mail-filtering commit 9d65b803e9cd65249ea2317c2f43495b9eed40bc Author: markus schnalke AuthorDate: Thu Mar 22 13:57:24 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 13:57:24 2012 +0100 Removed remaining absolute mmh program path names from the binaries. The mmh bindir must to be in PATH, but we are able to move the programs now. The etcdir is still compiled into the binaries. :100644 100644 eb70b5ae... 8f21039c... M config/Makefile.in :100644 100644 90c14101... 0e725ee4... M config/config.c commit 8cc6b9bed04847a5675f5eec39938b4e242b0b2d Author: markus schnalke AuthorDate: Thu Mar 22 13:33:49 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 13:33:49 2012 +0100 Call send directly, not via sendproc. Removed its profile entry, too. :100644 100644 bfdc242f... 90c14101... M config/config.c :100644 100644 f18f62b1... 8f66669d... M h/mh.h :100644 100644 d47b78f3... c6524284... M man/mh-profile.man5 :100644 100644 70b921ba... 9274246c... M man/whatnow.man1 :100644 100644 9a05a2b9... bcff1da2... M sbr/readconfig.c :100644 100644 d4564544... 20a95e7b... M uip/mhparam.c :100644 100644 046f3403... 43d3d106... M uip/spost.c :100644 100644 3d97716c... 168384f7... M uip/whatnow.c commit 3b91e463fc7a4db9e7b69e2e0f4f7909339beea5 Author: markus schnalke AuthorDate: Thu Mar 22 13:30:06 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 13:30:06 2012 +0100 Call spost directly, not via postproc. Remove the postproc profile entry. :100644 100644 bd83bcb3... bfdc242f... M config/config.c :100644 100644 0e3324c4... f18f62b1... M h/mh.h :100644 100644 150c0c1b... 5e8a7033... M man/mh-chart.man1 :100644 100644 47b5d3f6... d47b78f3... M man/mh-profile.man5 :100644 100644 29cf84f2... 2f2b6412... M man/rcvdist.man1 :100644 100644 66f37cea... 7b368ea9... M man/send.man1 :100644 100644 d01533a2... 856c2a09... M man/whom.man :100644 100644 f8813cba... 9a05a2b9... M sbr/readconfig.c :100644 100644 72771a7f... 033c6349... M uip/mhmail.c :100644 100644 38fc6448... d4564544... M uip/mhparam.c :100644 100644 58bf62dd... ac191497... M uip/rcvdist.c :100644 100644 51661a52... d87e211f... M uip/send.c commit 5b92ee6942b9b466914f5faa5fa4c00a2ebc6d35 Author: markus schnalke AuthorDate: Thu Mar 22 13:23:44 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 13:23:44 2012 +0100 Hardcoded mhmail instead of mailproc. :100644 100644 f0187adb... bd83bcb3... M config/config.c :100644 100644 5ebda8ea... 0e3324c4... M h/mh.h :100644 100644 773dc8a5... 47b5d3f6... M man/mh-profile.man5 :100644 100644 bb81ddb6... 66f37cea... M man/send.man1 :100644 100644 71fff7ad... f8813cba... M sbr/readconfig.c :100644 100644 0d9c78c4... 3670e8e7... M uip/conflict.c :100644 100644 7c436691... 38fc6448... M uip/mhparam.c :100644 100644 b3b07e48... ece4e8fe... M uip/mhparse.c :100644 100644 09bbcf80... 51661a52... M uip/send.c commit dfa0332c4e6144699dedd5c9795219adc0f9c0d2 Author: markus schnalke AuthorDate: Thu Mar 22 13:18:23 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 13:18:23 2012 +0100 Removed the mhlproc profile entry. Call mhl directly. :100644 100644 e650b0d2... f0187adb... M config/config.c :100644 100644 995dbf52... 9bd6ed99... M etc/mhl.headers :100644 100644 44363b61... 5ebda8ea... M h/mh.h :100644 100644 026b2cf7... 0d5cd40d... M man/forw.man1 :100644 100644 d3e6e31c... 773dc8a5... M man/mh-profile.man5 :100644 100644 af9f6307... ce62a52b... M man/mhparam.man1 :100644 100644 5c49255f... a3330c00... M man/mhshow.man1 :100644 100644 0b4be2f3... 5643286b... M man/repl.man1 :100644 100644 16659a99... 71fff7ad... M sbr/readconfig.c :100644 100644 4cad041b... 7c436691... M uip/mhparam.c :100644 100644 6dae3e8b... 9f69c54d... M uip/mhshowsbr.c :100644 100644 1a0e1430... dff8a9ec... M uip/repl.c commit 5ee5d678d59cf1deea31126bc886333f1be4571d Author: markus schnalke AuthorDate: Thu Mar 22 13:09:14 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 13:09:14 2012 +0100 Defined show(mime)proc locally and removed their profile entries. Their paths are relative now, too. :100644 100644 fa0b0fc4... e650b0d2... M config/config.c :100644 100644 dd049d32... 44363b61... M h/mh.h :100644 100644 3f38e107... d3e6e31c... M man/mh-profile.man5 :100644 100644 c32689a0... 2b44d9fe... M man/next.man1 :100644 100644 7cdb8e43... 06464d43... M man/prev.man1 :100644 100644 47cf7d00... 047baf5c... M man/show.man1 :100644 100644 d4187311... 16659a99... M sbr/readconfig.c :100644 100644 64ee5d77... 4cad041b... M uip/mhparam.c :100644 100644 2b53141a... 4abc3d74... M uip/show.c commit 612e67b21d1c9a6cc5db0e2903ddaeb5f2fbe2a0 Author: markus schnalke AuthorDate: Thu Mar 22 12:08:47 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 12:08:47 2012 +0100 Remove the rcvstoreproc/rcvpackproc vars. :100644 100644 b8a7c806... fa0b0fc4... M config/config.c :100644 100644 ef4ca62e... dd049d32... M h/mh.h :100644 100644 7f272268... f03d4871... M uip/slocal.c commit b1be13a498a0b7b7fbed6ea957ddf765a8d0d8f9 Author: markus schnalke AuthorDate: Thu Mar 22 12:04:59 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 12:04:59 2012 +0100 Removed absolute path from mailproc. The goal is to have as few path names compiled into the binaries. :100644 100644 c02243d4... b8a7c806... M config/config.c :100644 100644 9ffa1170... 3f38e107... M man/mh-profile.man5 commit f33f12af33361e5d688cd1700c1ee03af5988fd9 Author: markus schnalke AuthorDate: Thu Mar 22 11:58:31 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 11:58:31 2012 +0100 s/lproc/listproc/ :100644 100644 94c0760f... c02243d4... M config/config.c :100644 100644 93243302... ef4ca62e... M h/mh.h :100644 100644 4113a76e... 9ffa1170... M man/mh-profile.man5 :100644 100644 759bac40... 70b921ba... M man/whatnow.man1 :100644 100644 2350b24b... d4187311... M sbr/readconfig.c :100644 100644 1440dc32... 64ee5d77... M uip/mhparam.c :100644 100644 70df6935... 2b53141a... M uip/show.c :100644 100644 bd1a3d55... 3d97716c... M uip/whatnow.c commit bec79382afc185947279c0f3c724c5983944ee7f Author: markus schnalke AuthorDate: Thu Mar 22 11:51:14 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 11:51:14 2012 +0100 Removed the now unused incproc var. :100644 100644 e51397ad... 94c0760f... M config/config.c :100644 100644 ced6c77a... 93243302... M h/mh.h :100644 100644 b5e731ab... 4113a76e... M man/mh-profile.man5 :100644 100644 daa25099... 2350b24b... M sbr/readconfig.c :100644 100644 2d78cd95... 1440dc32... M uip/mhparam.c commit d36e56e695fe1c482c7920644bfbb6386ac9edb0 Author: markus schnalke AuthorDate: Thu Mar 22 11:46:47 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 11:46:47 2012 +0100 mhmail: Don't invoke inc when called without arguments. We can't provide a full mailx-replacement anyways. By magically invoking inc(1), we likely confuse the user. Instead tell him that he can invoke inc(1) himself. This doesn't mess with the important property: mhmail is a mailx replacement for scripts to send mail. :100644 100644 c6a3467c... f244ae0e... M man/mhmail.man1 :100644 100644 2b8589f5... 72771a7f... M uip/mhmail.c commit be0ae81623aea2eca09b8faf699b4b407f527267 Author: markus schnalke AuthorDate: Thu Mar 22 11:18:00 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 11:18:00 2012 +0100 Updated the INSTALL file. :100644 100644 009d4796... d93ff2c3... M INSTALL commit 068380df11432a5341882e658ec9cf5c0b54721d Author: markus schnalke AuthorDate: Thu Mar 22 11:03:52 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 11:03:52 2012 +0100 Removed the `mhbuild' indirection via `buildmimeproc'. We expect BINDIR to be in PATH if one executes mmh programs. :100644 100644 e9b3f2b3... e51397ad... M config/config.c :100644 100644 026f0dcf... ced6c77a... M h/mh.h :100644 100644 dc37bb99... b5e731ab... M man/mh-profile.man5 :100644 100644 048ae4ba... daa25099... M sbr/readconfig.c :100644 100644 0f9c487c... 2d78cd95... M uip/mhparam.c :100644 100644 2ef1fe76... 09bbcf80... M uip/send.c commit 865335e03bab5e0ceb47a4d20564c3afb3de30c4 Author: markus schnalke AuthorDate: Thu Mar 22 10:56:46 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 10:56:46 2012 +0100 Querying the pager here is not necessary. :100644 100644 09cc4bd5... 048ae4ba... M sbr/readconfig.c commit f85f4b7ae62e3d05a945dcd46ead51f0a2a89a9b Author: markus schnalke AuthorDate: Thu Mar 22 10:52:49 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 10:52:49 2012 +0100 Rework of Editor/defaulteditor, similar to Pager/defaultpager; new env vars. The priority order is: MMHEDITOR (env) > Editor (profile) > VISUAL (env) EDITOR (env) > vi :100644 100644 1f357015... dc37bb99... M man/mh-profile.man5 :100644 100644 d1b22ac6... 5733d3fa... M sbr/context_read.c :100644 100644 b809ebeb... bd1a3d55... M uip/whatnow.c :100644 100644 1b16e5d6... fbea9416... M uip/whatnowproc.c commit 0c4214ea2aec6497d0d67b436bbee9bc1d225f1e Author: markus schnalke AuthorDate: Thu Mar 22 10:18:23 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 10:18:23 2012 +0100 moreproc is now Pager/defaultpager; removed -moreproc flags; added env vars. The priority order is: MMHPAGER (env) > Pager (profile) > PAGER (env) > more :100644 100644 946ea6b2... e9b3f2b3... M config/config.c :100644 100644 39684af2... 026f0dcf... M h/mh.h :100644 100644 805bea85... 150c0c1b... M man/mh-chart.man1 :100644 100644 5051da60... 1f357015... M man/mh-profile.man5 :100644 100644 9c57dbe5... 7e1f19d6... M man/mhl.man1 :100644 100644 f451ccb4... 5c49255f... M man/mhshow.man1 :100644 100644 1e795b05... d1b22ac6... M sbr/context_read.c :100644 100644 b78eb06e... 09cc4bd5... M sbr/readconfig.c :100644 100644 3d8ad8d9... 38926b6d... M uip/mhl.c :100644 100644 db8e85af... 0f9c487c... M uip/mhparam.c :100644 100644 a1fff551... bbd99eaa... M uip/mhshow.c :100644 100644 fe9a6269... 6dae3e8b... M uip/mhshowsbr.c :100644 100644 2f5d9b43... 70df6935... M uip/show.c commit 9e9e918ec2a607aca26253fe945ea9569475aae3 Author: markus schnalke AuthorDate: Thu Mar 22 09:00:22 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 09:00:22 2012 +0100 slocal: Updated man page to recent change. :100644 100644 f8952bc4... e8defa55... M man/slocal.man1 commit 4c0c2fb7766546cb466f05f76e5febd5d8f682e0 Author: markus schnalke AuthorDate: Thu Mar 22 08:49:57 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 08:49:57 2012 +0100 slocal: Don't remove $PATH from env. Now execvp() searches as expected. Stripping the environment may rather keep the user from doing sensible things than it increases the security. Maybe we shouldn't strip it at all. :100644 100644 b6199522... 7f272268... M uip/slocal.c commit 7456ca0a9639bfb73899b721fe66323d90277160 Author: markus schnalke AuthorDate: Thu Mar 22 07:51:27 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 07:51:27 2012 +0100 slocal: must not read profile (indirectly through m_mktemp2()). :100644 100644 eecd760b... b6199522... M uip/slocal.c commit cde17f8d38bf9306df4706ac2acb528a2a686a29 Author: markus schnalke AuthorDate: Thu Mar 22 07:40:35 2012 +0100 Commit: markus schnalke CommitDate: Thu Mar 22 07:40:35 2012 +0100 slocal: use mhetcdir instead of NMHETCDIR. :100644 100644 bd114ce8... d81985f7... M uip/Makefile.in :100644 100644 d97af908... eecd760b... M uip/slocal.c commit d709572c12437b406a4685f04b4131f160687280 Author: markus schnalke AuthorDate: Wed Mar 21 21:59:15 2012 +0100 Commit: markus schnalke CommitDate: Wed Mar 21 21:59:15 2012 +0100 Ignore distribution tarballs in the git status listing. :100644 100644 d840b61b... 14c2a073... M .gitignore commit 5fbf37ee68e018998ada61eeab73e035b26834b6 Author: markus schnalke AuthorDate: Wed Mar 21 20:47:48 2012 +0100 Commit: markus schnalke CommitDate: Wed Mar 21 20:47:48 2012 +0100 On today's systems fork() will hardly fail, thus removed the fork retry loops. :100644 100644 44542b53... 1a381db2... M sbr/context_save.c :100644 100644 17c62eef... eb6011a9... M sbr/push.c :100644 100644 069ea85f... efbb8ac3... M uip/mhbuildsbr.c :100644 100644 f9e7fcd8... 2b8589f5... M uip/mhmail.c :100644 100644 86c16a9a... b3b07e48... M uip/mhparse.c :100644 100644 15991c18... fe9a6269... M uip/mhshowsbr.c :100644 100644 6fcccad0... 2ef1fe76... M uip/send.c :100644 100644 761fea1d... b809ebeb... M uip/whatnow.c commit 75a3bc56e890a9ca5e25f194acbb574e942de5c5 Author: markus schnalke AuthorDate: Wed Mar 21 20:43:27 2012 +0100 Commit: markus schnalke CommitDate: Wed Mar 21 20:43:27 2012 +0100 Minor refactoring. :100644 100644 7b7bcefb... baeab6f2... M uip/aliasbr.c commit e0422dfed4d6d236e5298cea579587870b83384a Author: markus schnalke AuthorDate: Wed Mar 21 20:27:03 2012 +0100 Commit: markus schnalke CommitDate: Wed Mar 21 20:27:03 2012 +0100 Rework in dist tools: removed -file switch; don't fork(); refactoring. :100644 100644 0bb35664... e48525fb... M man/dist.man1 :100644 100644 9edfc494... 29cf84f2... M man/rcvdist.man1 :100644 100644 869a906b... 4eba2eb8... M uip/dist.c :100644 100644 396aca8d... 1ad8e42f... M uip/distsbr.c :100644 100644 625bb4ce... 58bf62dd... M uip/rcvdist.c commit 33b33a0ac8a3f8f05c9bb0195c100306c00cce35 Author: markus schnalke AuthorDate: Wed Mar 21 17:50:59 2012 +0100 Commit: markus schnalke CommitDate: Wed Mar 21 17:50:59 2012 +0100 mh-format.man5: Restored the warning placeholder. We must have lost it somewhen. :100644 100644 b2925862... ae0e8b0d... M man/mh-format.man5 commit af675ccd40b7a3d92043e12cac0cdde8484f7cee Author: markus schnalke AuthorDate: Wed Mar 21 17:44:36 2012 +0100 Commit: markus schnalke CommitDate: Wed Mar 21 17:44:36 2012 +0100 configure.ac: Don't check for vfork and wait3 when we don't use them (anymore). :100644 100644 efae9fcc... 806214c5... M configure.ac commit 43beef6d732261080a1d9d63175ad5af9043df69 Author: markus schnalke AuthorDate: Wed Mar 21 17:03:53 2012 +0100 Commit: markus schnalke CommitDate: Wed Mar 21 17:03:53 2012 +0100 Removed unused code. :100644 100644 373a6928... 75245e05... M h/mf.h commit 83e04675b53374a1436029a367283d6d4ee05a07 Author: markus schnalke AuthorDate: Wed Mar 21 16:54:24 2012 +0100 Commit: markus schnalke CommitDate: Wed Mar 21 16:54:24 2012 +0100 Removed support for UUCP bang path addresses. If you still rely on UUCP, use nmh, not mmh. :100644 100644 5e19b788... a86a90df... M h/addrsbr.h :100644 100644 4a74bec5... a078dc52... M h/prototypes.h :100644 100644 aea64e43... f8952bc4... M man/slocal.man1 :100644 100644 27aa5976... d01533a2... M man/whom.man :100644 100644 a829c1db... 2327e47a... M sbr/addrsbr.c :100644 100644 4a8da144... f26b02bb... M sbr/fmt_scan.c :100644 100644 534f896c... 47c7e7de... M sbr/m_getfld.c :100644 100644 dd193bc4... a4644931... M sbr/mts.c :100644 100644 073b1b28... 7b7bcefb... M uip/aliasbr.c :100644 100644 3713954a... d97af908... M uip/slocal.c commit 205e60873e26bb542945dc2c48d7385af84ba120 Author: markus schnalke AuthorDate: Wed Mar 21 16:25:08 2012 +0100 Commit: markus schnalke CommitDate: Wed Mar 21 16:25:08 2012 +0100 Made DUMB the default and removed the the #ifdefs. DUMB had been the default and forces MH to use a full RFC 822 address parser instead of guessing on addresses. :100644 100644 06fab56c... 3ab8a469... M acconfig.h :100644 100644 42742d29... a829c1db... M sbr/addrsbr.c commit cc106b2d1d396a1d0b2554052d61b5af46cb252d Author: markus schnalke AuthorDate: Wed Mar 21 16:06:32 2012 +0100 Commit: markus schnalke CommitDate: Wed Mar 21 16:06:32 2012 +0100 Removed the not-used REALLYDUMB config option. :100644 100644 e83ec57e... 06fab56c... M acconfig.h commit 41b06dfc782cec511142f99db9cb6ae7c2b94fb9 Author: markus schnalke AuthorDate: Wed Mar 21 16:04:10 2012 +0100 Commit: markus schnalke CommitDate: Wed Mar 21 16:04:10 2012 +0100 Removed the not-used FIX_NON_Y2K_COMPLIANT_MUA_DATES config option. :100644 100644 581f6ad9... e83ec57e... M acconfig.h commit e954d689b5adafa4ec74e7dbd1e087dbf998f6d6 Author: markus schnalke AuthorDate: Wed Mar 21 15:59:09 2012 +0100 Commit: markus schnalke CommitDate: Wed Mar 21 15:59:09 2012 +0100 Made the RPATHS config option the default and removed the #ifdefs. :100644 100644 f4ca2dd2... 581f6ad9... M acconfig.h :100644 100644 ff38dd39... 4a74bec5... M h/prototypes.h :100644 100644 d64457f3... 534f896c... M sbr/m_getfld.c :100644 100644 fdfe4cd7... 75dec1cf... M uip/scansbr.c :100644 100644 813a3b59... 3713954a... M uip/slocal.c commit e711cf1c50af5e151a721f6f1690474bc9ef658d Author: markus schnalke AuthorDate: Wed Mar 21 15:52:15 2012 +0100 Commit: markus schnalke CommitDate: Wed Mar 21 15:52:15 2012 +0100 Slocal uses rcvpack now. Code beautification in slocal. :100644 100644 158dd7a3... 946ea6b2... M config/config.c :100644 100644 23b340ac... 39684af2... M h/mh.h :100644 100644 c5cf7cf5... aea64e43... M man/slocal.man1 :100644 100644 e53df573... bd114ce8... M uip/Makefile.in :100644 100644 4e8c30d7... 813a3b59... M uip/slocal.c commit 39d862d5f0ba0258707ef5a74cff63243f58e425 Author: markus schnalke AuthorDate: Wed Mar 21 14:25:55 2012 +0100 Commit: markus schnalke CommitDate: Wed Mar 21 14:25:55 2012 +0100 Renamed the mbx_* functions to mbox_*, because mbx is another mail box format. :100644 100644 c80770a4... f3270bee... M h/dropsbr.h :100644 100644 f093c2fd... 6a7eb78f... M uip/dropsbr.c :100644 100644 70065c0d... 23ee3354... M uip/packf.c :100644 100644 827373f2... e00e1fd5... M uip/rcvpack.c :100644 100644 6b78c1e6... 4e8c30d7... M uip/slocal.c commit ca1023716d4c2ab890696f3e41fa0d94267a940e Author: markus schnalke AuthorDate: Wed Mar 21 11:38:23 2012 +0100 Commit: markus schnalke CommitDate: Wed Mar 21 11:38:23 2012 +0100 packf prints to stdout now. :100644 100644 84bdc445... dd356eda... M man/mmh-intro.man7 :100644 100644 79dccacd... 916db9e1... M man/packf.man1 :100644 100644 fc7fcba0... 70065c0d... M uip/packf.c commit ef1216bc36bd48ceb7549ae76aa7c26e3be4d9e4 Author: markus schnalke AuthorDate: Wed Mar 21 11:19:50 2012 +0100 Commit: markus schnalke CommitDate: Wed Mar 21 11:19:50 2012 +0100 If rcvpack missed file argument, it prints to stdout; Removed unused code. The mbox variant we use is called `mboxo'. :100644 100644 2b21f10d... c80770a4... M h/dropsbr.h :100644 100644 366b0d53... 290f5ccb... M man/rcvpack.man1 :100644 100644 62ba424e... f093c2fd... M uip/dropsbr.c :100644 100644 62c09da3... fc7fcba0... M uip/packf.c :100644 100644 d6e10257... 827373f2... M uip/rcvpack.c :100644 100644 ae71c1b1... 6b78c1e6... M uip/slocal.c commit a3f1c902eb75f91ebbf0129d6e4f0e42477bb9cc Author: markus schnalke AuthorDate: Wed Mar 21 09:43:45 2012 +0100 Commit: markus schnalke CommitDate: Wed Mar 21 09:43:45 2012 +0100 Makefile: inc does not depend on dropsbr. :100644 100644 9f183b0c... e53df573... M uip/Makefile.in commit 06dc4fe836de4957b5d6e7e3a7ce5de85c11db8f Author: markus schnalke AuthorDate: Tue Mar 20 23:10:29 2012 +0100 Commit: markus schnalke CommitDate: Tue Mar 20 23:10:29 2012 +0100 Makefiles: s/nmh/mmh/; fixed generation of mmhdist. :100644 100644 2f63dad3... 9d548b38... M Makefile.in :100644 100644 491ff85e... eb70b5ae... M config/Makefile.in :100644 100644 38db87e9... a68ab2cb... M docs/Makefile.in :100644 100644 dabafd64... 2d40acfa... M etc/Makefile.in :100644 100644 ad2cbd1c... f0152ddf... M h/Makefile.in :100644 100644 4ad5db8c... 47742c2a... M man/Makefile.in :100644 100644 6c5d21e1... 6dedfb1f... M sbr/Makefile.in :100644 100644 67a7862a... 9f183b0c... M uip/Makefile.in commit ffe93d6dc707aaf92529cefb38a1814956b48c9e Author: markus schnalke AuthorDate: Tue Mar 20 22:51:04 2012 +0100 Commit: markus schnalke CommitDate: Tue Mar 20 22:51:04 2012 +0100 Replaced mkinstalldirs with `mkdir -p'. :100644 100644 efab8859... 2f63dad3... M Makefile.in :100644 100644 10111e7c... dabafd64... M etc/Makefile.in :100644 100644 4d4dec9d... 4ad5db8c... M man/Makefile.in :100755 000000 0801ec2c... 00000000... D mkinstalldirs :100644 100644 02bc94ed... 67a7862a... M uip/Makefile.in commit ae4273126b4b7b8ebaa1454630c1b632eba8cec9 Author: markus schnalke AuthorDate: Tue Mar 20 22:12:51 2012 +0100 Commit: markus schnalke CommitDate: Tue Mar 20 22:12:51 2012 +0100 Minor refactoring. :100644 100644 08a9b31c... 2f5d9b43... M uip/show.c commit 5e562b27955c06ac45be72ce82e30fe278e76b05 Author: markus schnalke AuthorDate: Tue Mar 20 21:58:17 2012 +0100 Commit: markus schnalke CommitDate: Tue Mar 20 21:58:17 2012 +0100 Ensured clean uninstall. :100644 100644 0d8631b9... 4d4dec9d... M man/Makefile.in :100644 100644 28b517f3... 02bc94ed... M uip/Makefile.in commit 426543622b377fc5d091455cba685e114b6df674 Author: markus schnalke AuthorDate: Tue Mar 20 21:39:17 2012 +0100 Commit: markus schnalke CommitDate: Tue Mar 20 21:39:17 2012 +0100 A bit refactoring. :100644 100644 e97afbf8... 36ff4b51... M uip/anno.c :100644 100644 d1e39b05... 170d76bc... M uip/annosbr.c commit 88a0787554de9c618e657c31940e734178a25730 Author: markus schnalke AuthorDate: Tue Mar 20 21:07:58 2012 +0100 Commit: markus schnalke CommitDate: Tue Mar 20 21:07:58 2012 +0100 anno: Undid the ``preserve argument hack''. :100644 100644 46a89ce9... ff38dd39... M h/prototypes.h :100644 100644 aacd8267... e97afbf8... M uip/anno.c :100644 100644 99422e6b... d1e39b05... M uip/annosbr.c :100644 100644 031c191b... 8992b33c... M uip/forw.c :100644 100644 469bdd90... 1a0e1430... M uip/repl.c :100644 100644 afe41293... 761fea1d... M uip/whatnow.c commit 0a6e4d979566bc9eae772e37d2577bed1aacef92 Author: markus schnalke AuthorDate: Tue Mar 20 19:26:48 2012 +0100 Commit: markus schnalke CommitDate: Tue Mar 20 19:26:48 2012 +0100 Updated the BUGS sections in the man pages. I expect users to know that they might need quoting in the shell. :100644 100644 699e9938... 0977c77f... M man/ap.man8 :100644 100644 af8577d6... 5c39a501... M man/comp.man1 :100644 100644 eead0079... e0080cfd... M man/dp.man8 :100644 100644 0acb412f... a39b4dbd... M man/fmtdump.man8 :100644 100644 1abc45b1... eb51bc1d... M man/inc.man1 :100644 100644 139f6f6d... b55b7481... M man/pick.man1 :100644 100644 60c54b55... 0b4be2f3... M man/repl.man1 :100644 100644 e4c357ac... 42e371f9... M man/scan.man1 :100644 100644 59295231... 759bac40... M man/whatnow.man1 commit 43ea5347b6b445d926082d6e3c1ddec376e8692d Author: markus schnalke AuthorDate: Tue Mar 20 19:06:44 2012 +0100 Commit: markus schnalke CommitDate: Tue Mar 20 19:06:44 2012 +0100 s/nfs/fmtstr/ and s/c_nfs/c_fstr/ in uip/mhl.c :100644 100644 aaa87629... 623e0030... M uip/ap.c :100644 100644 d9508335... a9d25437... M uip/comp.c :100644 100644 4e83a7b4... 869a906b... M uip/dist.c :100644 100644 fa3a2018... d64a0b9e... M uip/dp.c :100644 100644 923a46e9... a7fe9f45... M uip/fmtdump.c :100644 100644 b9c3c144... 031c191b... M uip/forw.c :100644 100644 6546ceac... 05df0f02... M uip/inc.c :100644 100644 4c2f06ee... 3d8ad8d9... M uip/mhl.c :100644 100644 6fbd5790... 0c172685... M uip/scan.c :100644 100644 69f385ab... fdfe4cd7... M uip/scansbr.c commit 6b80b3bb772e2cf9186cf964bf78109b677e1bef Author: markus schnalke AuthorDate: Tue Mar 20 18:02:32 2012 +0100 Commit: markus schnalke CommitDate: Tue Mar 20 18:02:32 2012 +0100 scan(): Replaced explicit noisy parameter with implicit nfs check. nfs is the ``new format string'' if it is NULL, we don't (and actually can't) print a scan line. :100644 100644 4e2e87aa... 18a93641... M h/scansbr.h :100644 100644 2297a036... 6546ceac... M uip/inc.c :100644 100644 ef13e39c... 6fbd5790... M uip/scan.c :100644 100644 1c68bc26... 69f385ab... M uip/scansbr.c commit 51d0e643f8daeb2db8de0a3d31d7d7f038b48380 Author: markus schnalke AuthorDate: Tue Mar 20 17:36:02 2012 +0100 Commit: markus schnalke CommitDate: Tue Mar 20 17:36:02 2012 +0100 Removed special `folder' and `dtimenow' format escapes from scan listings. Also removed the unused parameter `size'. :100644 100644 b07feef0... 4e2e87aa... M h/scansbr.h :100644 100644 04572c0b... 2297a036... M uip/inc.c :100644 100644 15205536... ef13e39c... M uip/scan.c :100644 100644 bbd46261... 1c68bc26... M uip/scansbr.c commit e6c75593757a6edb5eb8e98bfc50f0c1de36bf2f Author: markus schnalke AuthorDate: Tue Mar 20 16:14:53 2012 +0100 Commit: markus schnalke CommitDate: Tue Mar 20 16:14:53 2012 +0100 Removed internal version of fputs(). :100644 100644 4b712432... bbd46261... M uip/scansbr.c commit cd1299b02c2fbe61f408a8387402494364688337 Author: markus schnalke AuthorDate: Fri Mar 9 17:04:46 2012 +0100 Commit: markus schnalke CommitDate: Fri Mar 9 17:04:46 2012 +0100 Fixed paths (libdir->bindir); removed the now unused libdir reference. :100644 100644 da7d12ab... 491ff85e... M config/Makefile.in :100644 100644 3515dd08... 158dd7a3... M config/config.c :100644 100644 2a1d97e2... db8e85af... M uip/mhparam.c commit b26456a751067ad3182e9897966aae2363873585 Author: markus schnalke AuthorDate: Fri Mar 9 13:27:35 2012 +0100 Commit: markus schnalke CommitDate: Fri Mar 9 13:27:35 2012 +0100 Moved conflict, rcv*, slocal, spost from libdir to bindir. We should not hide them from the users. :100644 100644 dc05548f... ff2246c4... M man/conflict.man8 :100644 100644 d7939893... 805bea85... M man/mh-chart.man1 :100644 100644 b90cd971... 5051da60... M man/mh-profile.man5 :100644 100644 33c237e5... c6a3467c... M man/mhmail.man1 :100644 100644 14c3ae77... 5bac6f73... M man/post.man8 :100644 100644 66b43820... 9edfc494... M man/rcvdist.man1 :100644 100644 9ca59a25... 366b0d53... M man/rcvpack.man1 :100644 100644 571c2fd2... 1fff18f0... M man/rcvstore.man1 :100644 100644 6421714d... c5cf7cf5... M man/slocal.man1 :100644 100644 7dcbb855... 28b517f3... M uip/Makefile.in :100644 100644 fe1977fa... ae71c1b1... M uip/slocal.c commit 4b5944268ea0da7bb30598a27857304758ea9b44 Author: markus schnalke AuthorDate: Fri Mar 9 12:25:06 2012 +0100 Commit: markus schnalke CommitDate: Fri Mar 9 12:25:06 2012 +0100 Added new helper `print-mimetype' and added Mime-Type-Query to man page. Print-mimetype is useful if you don't have GNU file(1). :100644 100644 6dffc550... d840b61b... M .gitignore :100644 100644 2f67c639... b90cd971... M man/mh-profile.man5 :100644 100644 8d167595... 7dcbb855... M uip/Makefile.in :000000 100755 00000000... 2149902a... A uip/print-mimetype.sh commit 064527f7b57ab050e5af13e15ad99aeeab125857 Author: markus schnalke AuthorDate: Mon Feb 13 14:16:45 2012 +0100 Commit: markus schnalke CommitDate: Mon Feb 13 14:16:45 2012 +0100 Removed support for Encrypted: headers, which were removed in RFC 2822. This is a relict from RFC 822. :100644 100644 942ddcc3... 6d83b643... M etc/scan.MMDDYY :100644 100644 e91bcb1e... efe63d3c... M etc/scan.YYYYMMDD :100644 100644 27d18d32... 4f00a3cc... M etc/scan.mailx :100644 100644 b15a2815... 019bc3ee... M etc/scan.nmh :100644 100644 145e73f8... c6ead71d... M etc/scan.nomime :100644 100644 5f35b365... d595f7aa... M etc/scan.size :100644 100644 4c581337... 99df6663... M etc/scan.time :100644 100644 54f6d0a2... d8e07bed... M etc/scan.timely :100644 100644 2cd0b820... ba1fee32... M etc/scan.unseen :100644 100644 bf2e88f8... b07feef0... M h/scansbr.h :100644 100644 dccedad6... b2925862... M man/mh-format.man5 :100644 100644 b48c9ea6... 04572c0b... M uip/inc.c :100644 100644 aa95dd8a... 6a0cf049... M uip/mhstoresbr.c :100644 100644 d5cc50f9... 15205536... M uip/scan.c :100644 100644 a43044c8... 4b712432... M uip/scansbr.c commit 5a54c825a4c672e712e40c4c5ed0f0883fc99913 Author: markus schnalke AuthorDate: Mon Feb 13 13:58:13 2012 +0100 Commit: markus schnalke CommitDate: Mon Feb 13 13:58:13 2012 +0100 Trivial whitespace changes. :100644 100644 a90c6b24... 6fcccad0... M uip/send.c commit 3eaeef7c3cf27aa9d715e20ebb72982406ab1d53 Author: markus schnalke AuthorDate: Mon Feb 13 13:51:53 2012 +0100 Commit: markus schnalke CommitDate: Mon Feb 13 13:51:53 2012 +0100 Now, spost should be quite usable. Make use of m_mktemp2(), like elsewhere in the mmh code base. Various rework of the Bcc handling code. Still to do: - Fcc handling needs improvements. - Draft files for Bcc recipients are left existing in /tmp. :100644 100644 4a8ffdc5... 046f3403... M uip/spost.c commit 4c513fd6ebd0f1b08b8f9504b6d6c8aef2351d4a Author: markus schnalke AuthorDate: Sun Feb 12 17:49:57 2012 +0100 Commit: markus schnalke CommitDate: Sun Feb 12 17:49:57 2012 +0100 Various rework in spost. - Removed some unused flags. - Don't care for multiple Subject: headers. They aren't allowed. - Correctly handle headers that are folded before the first word of the value. - Outsourced code from putfmt() into new process_fcc(). :100644 100644 7b74dcc9... 4a8ffdc5... M uip/spost.c commit 80eeca1af5bc5120d9aeef933c2e162c382c9d29 Author: markus schnalke AuthorDate: Sun Feb 12 16:45:26 2012 +0100 Commit: markus schnalke CommitDate: Sun Feb 12 16:45:26 2012 +0100 Changed the Fcc handling code in spost. Both, the new as well as the old approach have their limitations. I'm far from confident with the new approach. At least it's simpler. It should be good enough for now. :100644 100644 8b4b8300... 7b74dcc9... M uip/spost.c commit fcde9624e6832e0dcdc6f21996b69b7e58745e3d Author: markus schnalke AuthorDate: Sun Feb 12 12:31:01 2012 +0100 Commit: markus schnalke CommitDate: Sun Feb 12 12:31:01 2012 +0100 Temporary state of spost rework: Things should work if you don't use Bcc: hdrs. The simple changes: Removed -[no]filter and did some minor refactoring. The complex changes: First steps in reworking the Bcc-related code. Don't use Bcc: headers with this state of code. They simply are ignored. :100644 100644 5afa435d... 8b4b8300... M uip/spost.c commit 3e1e29cd0fdaf54117d35f27525fb440e854ed0e Author: markus schnalke AuthorDate: Sat Feb 11 22:29:39 2012 +0100 Commit: markus schnalke CommitDate: Sat Feb 11 22:29:39 2012 +0100 Now truly: Removed the unused variable mhlforward. :100644 100644 20c62f5c... 3515dd08... M config/config.c :100644 100644 2775db8e... 23b340ac... M h/mh.h commit df3babef6d532cbd6e5b508b168d096ab9db2122 Author: markus schnalke AuthorDate: Sat Feb 11 22:28:00 2012 +0100 Commit: markus schnalke CommitDate: Sat Feb 11 22:28:00 2012 +0100 Revert "Removed unused mhlforward var." It had been the wrong variable... This reverts commit 4fbe60b6406be5253f50cc35b9d10e11f244da6f. :100644 100644 3515dd08... 20c62f5c... M config/config.c :100644 100644 09032677... 2775db8e... M h/mh.h commit 4fbe60b6406be5253f50cc35b9d10e11f244da6f Author: markus schnalke AuthorDate: Sat Feb 11 22:24:21 2012 +0100 Commit: markus schnalke CommitDate: Sat Feb 11 22:24:21 2012 +0100 Removed unused mhlforward var. :100644 100644 20c62f5c... 3515dd08... M config/config.c :100644 100644 2775db8e... 09032677... M h/mh.h commit b6d09bd20c57ba338690651d5922c724568bc7a0 Author: markus schnalke AuthorDate: Sat Feb 11 22:22:09 2012 +0100 Commit: markus schnalke CommitDate: Sat Feb 11 22:22:09 2012 +0100 Added absolute path to match the common style. :100644 100644 62852dfa... 20c62f5c... M config/config.c commit 3ba5286b78e674fe931790db49d207e12a45fd3c Author: markus schnalke AuthorDate: Sat Feb 11 22:16:56 2012 +0100 Commit: markus schnalke CommitDate: Sat Feb 11 22:16:56 2012 +0100 Removed unused stuff from makefile. :100644 100644 f916cea5... 6c5d21e1... M sbr/Makefile.in commit a1cae878ec58748fd8d602178fe279bf6116931d Author: markus schnalke AuthorDate: Sat Feb 11 22:02:27 2012 +0100 Commit: markus schnalke CommitDate: Sat Feb 11 22:02:27 2012 +0100 Removed unused catproc. :100644 100644 2ccf3790... 62852dfa... M config/config.c :100644 100644 52dc5049... 2775db8e... M h/mh.h commit fb0594cb913cab5e14e2c295b79eb48cc675bbbf Author: markus schnalke AuthorDate: Sat Feb 11 20:18:43 2012 +0100 Commit: markus schnalke CommitDate: Sat Feb 11 20:18:43 2012 +0100 Made show(1) the default lproc. `list' and `display' changed a bit. Already in 1984, MTR stated, that lproc should be show. I agree with him on this point, but I strongly disagree there: ``if lproc is "mhl", use mhlproc for consistency''. I thus removed this part and even more around it. The code became simpler but additional arguments to `list' and `display' are not recognized anymore. That won't be much inconvenience. :100644 100644 8d5bd7cd... 2ccf3790... M config/config.c :100644 100644 28fae32f... 2f67c639... M man/mh-profile.man5 :100644 100644 27a9ee54... 59295231... M man/whatnow.man1 :100644 100644 d05672cd... f916cea5... M sbr/Makefile.in :100644 000000 594b269f... 00000000... D sbr/showfile.c :100644 100644 be85fd1a... 08a9b31c... M uip/show.c :100644 100644 5b59c86c... afe41293... M uip/whatnow.c commit 0073224c28bf81dad1812d406bb9915b24b23eb6 Author: markus schnalke AuthorDate: Sat Feb 11 11:53:04 2012 +0100 Commit: markus schnalke CommitDate: Sat Feb 11 11:53:04 2012 +0100 Removed the -width option from ap and dp. Always print the whole string now. :100644 100644 b0ae6150... 699e9938... M man/ap.man8 :100644 100644 d07fa6b1... eead0079... M man/dp.man8 :100644 100644 ada59165... d7939893... M man/mh-chart.man1 :100644 100644 48b85248... 8d167595... M uip/Makefile.in :100644 100644 b49cdc27... aaa87629... M uip/ap.c :100644 100644 66f0f42b... fa3a2018... M uip/dp.c commit cebc12618d19409a25e332eef13e825df15a9bc2 Author: markus schnalke AuthorDate: Sat Feb 11 11:29:26 2012 +0100 Commit: markus schnalke CommitDate: Sat Feb 11 11:29:26 2012 +0100 Removed the now unused SOprint(). :100644 100644 274d43e0... 4c2f06ee... M uip/mhl.c :100644 100644 c81cf92d... 15991c18... M uip/mhshowsbr.c :100644 100644 0568bf31... defc93fc... M uip/termsbr.c commit 27826f9353e0f0b04590b7d0f8f83e60462b90f0 Author: markus schnalke AuthorDate: Sat Feb 11 11:17:53 2012 +0100 Commit: markus schnalke CommitDate: Sat Feb 11 11:17:53 2012 +0100 Merged picksbr.c into pick.c. :100644 100644 a2c40610... ad2cbd1c... M h/Makefile.in :100644 000000 31b904ed... 00000000... D h/picksbr.h :100644 100644 403147f7... 48b85248... M uip/Makefile.in :100644 100644 e4d13704... 73babadf... M uip/pick.c :100644 000000 872e18a0... 00000000... D uip/picksbr.c commit aa2b40c1486629abb9cc4628f38f0ce88be05ed6 Author: markus schnalke AuthorDate: Fri Feb 10 19:46:18 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 10 19:46:18 2012 +0100 Removed now unused dependencies (distsbr.o) in makefile. :100644 100644 752f185b... 403147f7... M uip/Makefile.in commit 5b9d883db0318ed2b84bb82dee880d7381f99188 Author: markus schnalke AuthorDate: Fri Feb 10 17:10:48 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 10 17:10:48 2012 +0100 Removed any knowledge of a screen length from mhl. Pagination is to be done by some pager. :100644 100644 54be038e... cb21f3fa... M docs/COMPLETION-ZSH :100644 100644 ba2ab369... ada59165... M man/mh-chart.man1 :100644 100644 9f841700... 9c57dbe5... M man/mhl.man1 :100644 100644 e778fc31... 274d43e0... M uip/mhl.c :100644 100644 0baf1983... a1fff551... M uip/mhshow.c :100644 100644 89602ef2... be85fd1a... M uip/show.c :100644 100644 a4b50748... 0568bf31... M uip/termsbr.c commit 943765e7ac5693ae177fd8d2b5a2440e53ce816e Author: markus schnalke AuthorDate: Fri Feb 10 16:43:55 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 10 16:43:55 2012 +0100 Removed the -clear switch from mhl. This stuff is the task of the pager, not the one of the formater mhl. :100644 100644 1dbf20fb... ba2ab369... M man/mh-chart.man1 :100644 100644 57e27cbb... 28fae32f... M man/mh-profile.man5 :100644 100644 de444489... 9f841700... M man/mhl.man1 :100644 100644 ef5f8609... e778fc31... M uip/mhl.c :100644 100644 efc2b540... 469bdd90... M uip/repl.c :100644 100644 e7ba35ae... a4b50748... M uip/termsbr.c commit e11983f44e59d8de236affa5b0d0d3067c192e24 Author: markus schnalke AuthorDate: Fri Feb 10 16:18:22 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 10 16:18:22 2012 +0100 Removed the -bell option from mhl. :100644 100644 c425bdcc... 1dbf20fb... M man/mh-chart.man1 :100644 100644 e453babe... de444489... M man/mhl.man1 :100644 100644 98e58d01... ef5f8609... M uip/mhl.c commit dee26acad9bca6aec7dca5c428b07a386909081b Author: markus schnalke AuthorDate: Fri Feb 10 16:05:20 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 10 16:05:20 2012 +0100 moreproc will always be set in config/config.c, thus eliminated the ISTTY case. :100644 100644 b1410ad1... 98e58d01... M uip/mhl.c :100644 100644 e05dddfb... c81cf92d... M uip/mhshowsbr.c commit b7764c4a6b71d37918a97594d866258f154017ca Author: markus schnalke AuthorDate: Fri Feb 10 15:42:19 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 10 15:42:19 2012 +0100 Removed the check for hardcopy terminals. There won't be any today. If you though do have one, then set moreproc to cat. :100644 100644 017d2f78... b1410ad1... M uip/mhl.c :100644 100644 3c45eb28... e7ba35ae... M uip/termsbr.c commit 39e87a75b5c2d3572ec72e717720b44af291e88a Author: markus schnalke AuthorDate: Fri Feb 10 15:33:50 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 10 15:33:50 2012 +0100 Removed the -nomoreproc switch from mhl, show, mhshow. We'll go for always having a moreproc after mhl. If you just want to cat out, then use `-moreproc cat'. mhl's very basic paging facility will be removed. :100644 100644 da0b0273... 54be038e... M docs/COMPLETION-ZSH :100644 100644 afb3fc19... c425bdcc... M man/mh-chart.man1 :100644 100644 b910f4d7... e453babe... M man/mhl.man1 :100644 100644 d3b74298... 017d2f78... M uip/mhl.c :100644 100644 bf5ef8bb... 0baf1983... M uip/mhshow.c :100644 100644 e302d3bd... e05dddfb... M uip/mhshowsbr.c :100644 100644 6e4f3168... 89602ef2... M uip/show.c commit d1da1f94ce62160aebb30df4063ccbc53768656b Author: markus schnalke AuthorDate: Fri Feb 10 15:12:59 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 10 15:12:59 2012 +0100 Merged mhlsbr.c into mhl.c. Also removed the unused function mhlsbr(). (It had been used by msh.) :100644 100644 db565283... 752f185b... M uip/Makefile.in :100644 100644 48b8f1db... d3b74298... M uip/mhl.c :100644 000000 5625fa18... 00000000... D uip/mhlsbr.c commit 41f62fc47ef6f2d223b7584b3bb912e65a630445 Author: markus schnalke AuthorDate: Fri Feb 10 14:54:26 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 10 14:54:26 2012 +0100 show: Special-cased -show(mime)proc for mhshow: it needs msgs not file args. A similar test had already been there before the last rework. :100644 100644 86092930... 6e4f3168... M uip/show.c commit 2d2016f0dfc9e036549ff035f0ae897c9b2d5fe4 Author: markus schnalke AuthorDate: Fri Feb 10 14:25:28 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 10 14:25:28 2012 +0100 show: Never call internal mhl(); always construct absolute argument paths. We don't want those fat binaries that call internal versions of unrelated tools. I.e. we do want modularization! No, fork() and exec() aren't too expensive ... but heavily interweaved code is! :100644 100644 93ab455a... 47cf7d00... M man/show.man1 :100644 100644 711fd39b... db565283... M uip/Makefile.in :100644 100644 1acaf70e... 86092930... M uip/show.c commit 0b40f7c1c35770622511eda71ec5353784ea1dc6 Author: markus schnalke AuthorDate: Fri Feb 10 12:00:28 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 10 12:00:28 2012 +0100 scan: Don't fflush manually. Let stdio care for this. Common stdio implementations flush stdout-on-TTY automatically on newline. :100644 100644 1b58eb5b... d5cc50f9... M uip/scan.c commit e57b17343dcb3ff373ef4dd089fbe778f0c7c270 Author: markus schnalke AuthorDate: Fri Feb 10 11:55:48 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 10 11:55:48 2012 +0100 Removed the -clear switch from scan(1). If you want to have a clear or form-feed, call `clear' or `printf "\f"' at the shell level. Anyway, what's the sense of a clear *after* the scan output? :100644 100644 3f3829c3... e4af65d2... M docs/COMPLETION-BASH :100644 100644 f6d01976... da0b0273... M docs/COMPLETION-ZSH :100644 100644 4da40940... afb3fc19... M man/mh-chart.man1 :100644 100644 2b9c0f6b... e4c357ac... M man/scan.man1 :100644 100644 cfcd3e4c... 1b58eb5b... M uip/scan.c commit 0a391e0c2c1509a98286212405c7bb8237cdaa12 Author: markus schnalke AuthorDate: Fri Feb 10 11:14:13 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 10 11:14:13 2012 +0100 Minor fix in man page. :100644 100644 8f798cba... 93ab455a... M man/show.man1 commit d7a8824aeaf72569a43d2a5f19d87af1a63d289b Author: markus schnalke AuthorDate: Fri Feb 10 11:13:25 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 10 11:13:25 2012 +0100 Updated shell completion files to recent changes in the programs. Well, some of the changes were not so recent. :100644 100644 926def42... 3f3829c3... M docs/COMPLETION-BASH :100644 100644 16e3e0dd... f6d01976... M docs/COMPLETION-ZSH commit 14767c94b3827be7c867196467ed7aea5f6f49b0 Author: markus schnalke AuthorDate: Fri Feb 10 10:56:19 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 10 10:56:19 2012 +0100 Removed rcvtty. Its use cases disappeared over time. And as asyncron notifications rip you out of your working flow, you usually don't want to have them. If you need this function though, then you can make use of write(1). :100644 100644 bc3ac32c... 926def42... M docs/COMPLETION-BASH :100644 100644 8998184a... 0d8631b9... M man/Makefile.in :100644 100644 25e27af6... 4da40940... M man/mh-chart.man1 :100644 100644 bddbda91... 84bdc445... M man/mmh-intro.man7 :100644 100644 21bc1dce... 66b43820... M man/rcvdist.man1 :100644 100644 55305f2d... 9ca59a25... M man/rcvpack.man1 :100644 100644 cbc21272... 571c2fd2... M man/rcvstore.man1 :100644 000000 b3112dd2... 00000000... D man/rcvtty.man1 :100644 100644 200d280c... 6421714d... M man/slocal.man1 :100644 100644 09e39ed6... 711fd39b... M uip/Makefile.in :100644 000000 8166dc91... 00000000... D uip/rcvtty.c commit 70294f36748ac18c98cb5c3941baf72a9cba88d3 Author: markus schnalke AuthorDate: Fri Feb 10 10:33:23 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 10 10:33:23 2012 +0100 Updated man page to recent changes. :100644 100644 784e9c0c... 57e27cbb... M man/mh-profile.man5 commit f51956be123db66b00138f80464d06f030dbb88d Author: markus schnalke AuthorDate: Fri Feb 10 10:20:47 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 10 10:20:47 2012 +0100 Removed `-format string' switches but made -form accept `=formatstring'. For all tools that take `-from file' or `-format string' switches, those were merged: `-format string' went away, but one may supply any such string to the -form switch by prepending it with an equal sign `='. Thus scan -format '%(msg) %{from}' is now written as scan -form '=%(msg) %{from}' Note: mhl isn't adjusted this way, yet. It's too complex to be understood by me, now. Thus, it still remains as it was: Any parameter to -form will be interepreted as a filter *file*. As show and mhshow use mhl, they are affected, too. In the same go: Compactified the new_fs() function: folded the arguments. :100644 100644 713c89b2... a2058683... M h/fmt_scan.h :100644 100644 01c6a592... 46a89ce9... M h/prototypes.h :100644 100644 f7a8e37b... bf2e88f8... M h/scansbr.h :100644 100644 af967dff... b0ae6150... M man/ap.man8 :100644 100644 27428068... d07fa6b1... M man/dp.man8 :100644 100644 55f9b99a... 0acb412f... M man/fmtdump.man8 :100644 100644 40a04c5c... 1abc45b1... M man/inc.man1 :100644 100644 51052683... 25e27af6... M man/mh-chart.man1 :100644 100644 d687eef1... b910f4d7... M man/mhl.man1 :100644 100644 3a141e3d... b3112dd2... M man/rcvtty.man1 :100644 100644 17328959... 2b9c0f6b... M man/scan.man1 :100644 100644 6cdcfcc7... 9fd34c8e... M sbr/fmt_new.c :100644 100644 a4e21894... b49cdc27... M uip/ap.c :100644 100644 6508ba67... d9508335... M uip/comp.c :100644 100644 39d65253... 4e83a7b4... M uip/dist.c :100644 100644 a9940d3a... 66f0f42b... M uip/dp.c :100644 100644 75ac4c21... 923a46e9... M uip/fmtdump.c :100644 100644 38ede22e... b9c3c144... M uip/forw.c :100644 100644 762a858d... b48c9ea6... M uip/inc.c :100644 100644 218d38d5... 5625fa18... M uip/mhlsbr.c :100644 100644 9adb5d47... 625bb4ce... M uip/rcvdist.c :100644 100644 99ae6806... 8166dc91... M uip/rcvtty.c :100644 100644 5943857c... efc2b540... M uip/repl.c :100644 100644 f8e2e116... cfcd3e4c... M uip/scan.c commit 84c6039eb7226c0ba0a8f708205e33d10950d2ae Author: markus schnalke AuthorDate: Thu Feb 9 21:22:35 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 21:22:35 2012 +0100 Replaced open_form() with new_fs() for the last time and dropped the function. :100644 100644 18d778e8... 7ee6046a... M h/utils.h :100644 100644 641a75db... 5c5b0f51... M sbr/utils.c :100644 100644 52e480ee... 39d65253... M uip/dist.c commit 4150402bbbee49b71286c9d278b5e7e9a5401bc2 Author: markus schnalke AuthorDate: Thu Feb 9 21:12:58 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 21:12:58 2012 +0100 Fixed dist(1): The link() must fail, because m_mktemp2() creates the file. I've decided to take the easy way: simply copy. :100644 100644 1529c0fa... a90c6b24... M uip/send.c commit 003cacd23c8f80054990c5ad3303f9a115241583 Author: markus schnalke AuthorDate: Thu Feb 9 20:48:26 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 20:48:26 2012 +0100 Replaced open_form() with new_fs() in forw.c. :100644 100644 feb60f96... 38ede22e... M uip/forw.c commit a0b824f146a18ad99633addede9e81a470d4cb59 Author: markus schnalke AuthorDate: Thu Feb 9 19:31:44 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 19:31:44 2012 +0100 Augmented new_fs() with an additional argument for a default form. This balances the arguments: user-form, user-string, def-form, def-string. In comp.c I've already replaced open_form() with new_fs(). forw.c and dist.c are to follow. :100644 100644 38e27934... 713c89b2... M h/fmt_scan.h :100644 100644 00768e5d... 01c6a592... M h/prototypes.h :100644 100644 9d818742... 6cdcfcc7... M sbr/fmt_new.c :100644 100644 e444cd89... a4e21894... M uip/ap.c :100644 100644 ce76cd85... 6508ba67... M uip/comp.c :100644 100644 d5f0c599... a9940d3a... M uip/dp.c :100644 100644 d948a063... 75ac4c21... M uip/fmtdump.c :100644 100644 b84632bd... feb60f96... M uip/forw.c :100644 100644 587bd846... 762a858d... M uip/inc.c :100644 100644 15360eaf... 218d38d5... M uip/mhlsbr.c :100644 100644 338455f9... 9adb5d47... M uip/rcvdist.c :100644 100644 86066ed5... 99ae6806... M uip/rcvtty.c :100644 100644 4e2c18ae... 5943857c... M uip/repl.c :100644 100644 d228c717... f8e2e116... M uip/scan.c commit 2d48b455c303a807041c35e4248955f8bec59eeb Author: markus schnalke AuthorDate: Thu Feb 9 19:08:37 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 19:08:37 2012 +0100 Removed the interactive prompt from comp when disposing an existing message. It became useless in the restructuring of the draft facility but remained until now. Also refactored this part of the code. :100644 100644 da503008... af8577d6... M man/comp.man1 :100644 100644 45363720... ce76cd85... M uip/comp.c commit 9d869b3c9748df468f2977807781315258e83f24 Author: markus schnalke AuthorDate: Thu Feb 9 18:06:58 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 18:06:58 2012 +0100 Cosmetic refactoring in fmt_new.c. :100644 100644 c7c519f3... 9d818742... M sbr/fmt_new.c commit e40215969ef46d66423bdf9f9d7b27da44fe676b Author: markus schnalke AuthorDate: Thu Feb 9 17:48:03 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 17:48:03 2012 +0100 Updated mh-chart(1) for spost. The man page post(8) still waits to be replaced by one for spost(8). :100644 100644 a945ab23... 51052683... M man/mh-chart.man1 commit f3cb7cde0e6f10451b6848678d95860d512224b9 Author: markus schnalke AuthorDate: Thu Feb 9 17:38:27 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 17:38:27 2012 +0100 Removed -format and -filter from send(1); they were just passed to (s)post(8). -(no)format switches normalization of addresses on/off. If spost would support address normalization, then it should be always enabled or disabled. But as spost doesn't support it it's a no-op in mmh anyway. -filter is for generating non-MIME messages for Bcc recipients. We'll use MIME in this case ... as soon as this code is written. Note: spost is still lagging behind the current development. :100644 100644 59263a39... a945ab23... M man/mh-chart.man1 :100644 100644 e4ee40c5... bb81ddb6... M man/send.man1 :100644 100644 c85ac8e5... 1529c0fa... M uip/send.c commit 67411b1f95d6ec987b4c732459e1ba8a8ac192c6 Author: markus schnalke AuthorDate: Thu Feb 9 17:22:52 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 17:22:52 2012 +0100 repl: renamed -noformat to -nofilter; removed -format; default to -filter. The new default: Filter with the default filter file. :100644 100644 d043d929... 59263a39... M man/mh-chart.man1 :100644 100644 08b6b6bd... 60c54b55... M man/repl.man1 :100644 100644 299185db... 4e2c18ae... M uip/repl.c commit 0ddc6c965ef307ff93f4fa642949d3130a700f9d Author: markus schnalke AuthorDate: Thu Feb 9 16:51:27 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 16:51:27 2012 +0100 repl: Changed the meaning of -mime: It's now orthogonal to -format/-filter. See changes in man page repl(1) for explanations. :100644 100644 c3178bbf... 08b6b6bd... M man/repl.man1 :100644 100644 a36b2c74... 299185db... M uip/repl.c commit 81744a46ac9f845d6c2b9908074d269275178d2e Author: markus schnalke AuthorDate: Thu Feb 9 16:25:08 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 16:25:08 2012 +0100 Merged replsbr.c into repl.c. :100644 100644 26b21073... 00768e5d... M h/prototypes.h :100644 100644 4a75a2a4... 09e39ed6... M uip/Makefile.in :100644 100644 a21b0dfb... a36b2c74... M uip/repl.c :100644 000000 624ffd60... 00000000... D uip/replsbr.c commit b9c033e20a676470ec3ead90654ee13f99fd85bc Author: markus schnalke AuthorDate: Thu Feb 9 16:14:46 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 16:14:46 2012 +0100 Added a note about formataddr(), because this had confused me. :100644 100644 852becd0... 624ffd60... M uip/replsbr.c commit 88d0e7601d67f8212791482433dcda4cb9d3eaac Author: markus schnalke AuthorDate: Thu Feb 9 15:47:14 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 15:47:14 2012 +0100 Removed the -fcc switch from repl(1). None of comp, dist, forw has it, why should repl then have it? It likely had been added as the replcomps are not just copied but processed. It had been quite easy to add this feature but nobody went far enough to process components, distcomps, forwcomps as well to be able to have such an -fcc switch for those tools as well. :100644 100644 918e2858... bc3ac32c... M docs/COMPLETION-BASH :100644 100644 86ee4b4b... 16e3e0dd... M docs/COMPLETION-ZSH :100644 100644 2520c8e3... 3b943809... M etc/replcomps :100644 100644 ff09c06b... 789633f2... M etc/replgroupcomps :100644 100644 d9b105b2... 26b21073... M h/prototypes.h :100644 100644 7412f557... d043d929... M man/mh-chart.man1 :100644 100644 ee59f716... dccedad6... M man/mh-format.man5 :100644 100644 05a97365... c3178bbf... M man/repl.man1 :100644 100644 354bb79c... a21b0dfb... M uip/repl.c :100644 100644 fbf31c73... 852becd0... M uip/replsbr.c commit 51676eb43e6b8aced3a78f45f84ae146c046a5f0 Author: markus schnalke AuthorDate: Thu Feb 9 15:31:20 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 15:31:20 2012 +0100 Minor cleanups. :100644 100644 786178d3... 15360eaf... M uip/mhlsbr.c commit 451a4d8564d347d126725760c2e20d924ec29dc0 Author: markus schnalke AuthorDate: Thu Feb 9 15:29:53 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 15:29:53 2012 +0100 Moved mhl(1) from libdir to bindir. The user should be able to use this tool normally, without inconveniences. :100644 100644 3cc7305e... 8d5bd7cd... M config/config.c :100644 100644 305e99ef... 7412f557... M man/mh-chart.man1 :100644 100644 ddde3392... d687eef1... M man/mhl.man1 :100644 100644 11cac870... af9f6307... M man/mhparam.man1 :100644 100644 e69b0196... 4a75a2a4... M uip/Makefile.in commit 6e271608b7b9c23771523f88d23a4d3593010cf1 Author: markus schnalke AuthorDate: Thu Feb 9 15:06:49 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 15:06:49 2012 +0100 forw(1) does always MIMEify now. Removed the -(no)mime, -(no)format, -filter switches. If you like to forward messages in non-MIME format, then manually read in the output of: mhl -forwall -form mhl.forward `mhpath MSGS...` Digest do get MIMEified too. To send non-MIME digests use: mhl -forwall -from mhl.digest -digest X -volume Y -issue Z `mhpath ...` :100644 100644 29d732d1... 49c8881e... M etc/digestcomps :100644 100644 dcbed35b... 026b2cf7... M man/forw.man1 :100644 100644 e9c6a1a6... 305e99ef... M man/mh-chart.man1 :100644 100644 c3474c5f... b84632bd... M uip/forw.c commit 8d102acadc29635b951f7e113c49d9ea686c7b2d Author: markus schnalke AuthorDate: Thu Feb 9 14:00:37 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 14:00:37 2012 +0100 Removed the -file switch from forw(1). :100644 100644 aa9e5ff7... dcbed35b... M man/forw.man1 :100644 100644 a66523be... e9c6a1a6... M man/mh-chart.man1 :100644 100644 44c32a02... c3474c5f... M uip/forw.c commit a00b90d9bf60cd3e6855a7632ee70cafb51c6327 Author: markus schnalke AuthorDate: Thu Feb 9 13:51:11 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 13:51:11 2012 +0100 comp(1) has no -file switch anymore. :100644 100644 d722bfd3... da503008... M man/comp.man1 :100644 100644 bea085b2... a66523be... M man/mh-chart.man1 commit a156e770d2b1f11e794d7b5eae8db1c4856933d4 Author: markus schnalke AuthorDate: Thu Feb 9 11:58:47 2012 +0100 Commit: markus schnalke CommitDate: Thu Feb 9 11:58:47 2012 +0100 Updated man pages: Removed the notice that whatnow could be called internally. This bug had been solved within the previous commits. :100644 100644 a9e75da1... d722bfd3... M man/comp.man1 :100644 100644 8bcec7d8... 0bb35664... M man/dist.man1 :100644 100644 356911e6... aa9e5ff7... M man/forw.man1 :100644 100644 115e78f1... 05a97365... M man/repl.man1 :100644 100644 526c71a8... 27a9ee54... M man/whatnow.man1 commit 5387b36c358138244d3ec2615cc26df61838837e Author: markus schnalke AuthorDate: Wed Feb 8 22:36:04 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 22:36:04 2012 +0100 Removed unnecessary dependencies from Makefile (annosbr.o). :100644 100644 6f153038... e69b0196... M uip/Makefile.in commit 3caf9e298a8861729ca8b8a84f57022b6f3ea742 Author: markus schnalke AuthorDate: Wed Feb 8 22:30:30 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 22:30:30 2012 +0100 Call anno(1) instead of compiling annosbr.c into send(1). This time we don't even get slower. Not that I'd care for speed ... :100644 100644 80e8001e... 6f153038... M uip/Makefile.in :100644 100644 3055df78... c85ac8e5... M uip/send.c commit c8195849d2e366c569271abb0f5f60f4ebf0b4d0 Author: markus schnalke AuthorDate: Wed Feb 8 21:47:20 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 21:47:20 2012 +0100 Annotations will always be done inplace from now on. :100644 100644 746f899b... 918e2858... M docs/COMPLETION-BASH :100644 100644 b5aeb25d... 86ee4b4b... M docs/COMPLETION-ZSH :100644 100644 cd282b0f... d9b105b2... M h/prototypes.h :100644 100644 65db87ef... 1e27cf50... M man/anno.man1 :100644 100644 a1eeab42... 8bcec7d8... M man/dist.man1 :100644 100644 2f3fa6e0... 356911e6... M man/forw.man1 :100644 100644 baaa28de... bea085b2... M man/mh-chart.man1 :100644 100644 d94f3018... 784e9c0c... M man/mh-profile.man5 :100644 100644 ed020c23... 115e78f1... M man/repl.man1 :100644 100644 68d721a7... aacd8267... M uip/anno.c :100644 100644 e8c03e17... 99422e6b... M uip/annosbr.c :100644 100644 7eee3f7e... 45363720... M uip/comp.c :100644 100644 57393769... 52e480ee... M uip/dist.c :100644 100644 9cdb793f... 44c32a02... M uip/forw.c :100644 100644 6231d469... 354bb79c... M uip/repl.c :100644 100644 907465ef... fbf31c73... M uip/replsbr.c :100644 100644 d52b9e35... 3055df78... M uip/send.c :100644 100644 b0819003... 5b59c86c... M uip/whatnow.c :100644 100644 12cd13af... 1b16e5d6... M uip/whatnowproc.c commit 7b300825615f4d13c2c1a1bd0d05462f9708b7e7 Author: markus schnalke AuthorDate: Wed Feb 8 21:17:43 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 21:17:43 2012 +0100 Removed left-overs from the -idanno removal. post (not spost) had written into a temp file those addresses to which it had delivered mail. annoaux() in send had read from this temp file and annotated the original message with each of those addresses. Now, no addresses at all get annotated, but only the date of the action. :100644 100644 2cf97576... d52b9e35... M uip/send.c commit f91306c3767cfdca47dd84ab865947c9dda9a745 Author: markus schnalke AuthorDate: Wed Feb 8 20:18:32 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 20:18:32 2012 +0100 Removed unnecessary prototypes. :100644 100644 4d93d9b3... cd282b0f... M h/prototypes.h :100644 100644 c1e937f0... 42742d29... M sbr/addrsbr.c :100644 100644 ef6e8794... 797c192a... M sbr/fmt_compile.c :100644 100644 ecdbbcfb... 86066ed5... M uip/rcvtty.c :100644 100644 a79e34fe... 2cf97576... M uip/send.c commit 275c6bc6c87156ea8ce804ae2c7d45e2d9294fe5 Author: markus schnalke AuthorDate: Wed Feb 8 20:10:43 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 20:10:43 2012 +0100 Cosmetic changes. :100644 100644 da401e62... a79e34fe... M uip/send.c commit 33dc8211a72df0c27fa11220f3b27583cd1c7e49 Author: markus schnalke AuthorDate: Wed Feb 8 18:38:54 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 18:38:54 2012 +0100 Merged h/mts.h into h/prototypes.h. Note: spost.c is not up to date. :100644 100644 dbf540ec... a2c40610... M h/Makefile.in :100644 000000 2155e055... 00000000... D h/mts.h :100644 100644 9425b6d4... 4d93d9b3... M h/prototypes.h :100644 100644 4059ce00... c1e937f0... M sbr/addrsbr.c :100644 100644 4dbd94fd... d64457f3... M sbr/m_getfld.c :100644 100644 f43b15de... dd193bc4... M sbr/mts.c :100644 100644 f1d74163... df29930c... M uip/ali.c :100644 100644 4f7f7603... e444cd89... M uip/ap.c :100644 100644 03de873a... 0d9c78c4... M uip/conflict.c :100644 100644 dd7a2df5... 62ba424e... M uip/dropsbr.c :100644 100644 1f03e2b7... 587bd846... M uip/inc.c :100644 100644 734d8ab2... 63d7be2f... M uip/mhbuild.c :100644 100644 43586062... 069ea85f... M uip/mhbuildsbr.c :100644 100644 13ab1534... c6f0603b... M uip/mhcachesbr.c :100644 100644 12480cf7... 8902f759... M uip/mhlist.c :100644 100644 e11cf5dc... 4c788d16... M uip/mhlistsbr.c :100644 100644 939275f6... 00b538ca... M uip/mhoutsbr.c :100644 100644 d2f69bc6... 86c16a9a... M uip/mhparse.c :100644 100644 1f37c0e8... bf5ef8bb... M uip/mhshow.c :100644 100644 b7452d8a... e302d3bd... M uip/mhshowsbr.c :100644 100644 2167a3fe... c1a3edbe... M uip/mhstore.c :100644 100644 0b1a9b30... aa95dd8a... M uip/mhstoresbr.c :100644 100644 0cfce9f8... 7dc9c07d... M uip/mhtest.c :100644 100644 5e10ad33... 932da206... M uip/msgchk.c :100644 100644 cff337db... 338455f9... M uip/rcvdist.c :100644 100644 f0f1bd18... d6e10257... M uip/rcvpack.c :100644 100644 ebf3e14d... 04b62d85... M uip/rcvstore.c :100644 100644 1dc38c4e... ecdbbcfb... M uip/rcvtty.c :100644 100644 18de4c48... d228c717... M uip/scan.c :100644 100644 0ef54c6f... fe1977fa... M uip/slocal.c commit c42222869e318fff5dec395eca3e776db3075455 Author: markus schnalke AuthorDate: Wed Feb 8 18:04:44 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 18:04:44 2012 +0100 Moved sendsbr.c into send.c as it is not compiled into other binaries anymore. :100644 100644 699c8b8b... 9425b6d4... M h/prototypes.h :100644 100644 b36bc758... 80e8001e... M uip/Makefile.in :100644 100644 7a8b8e6d... da401e62... M uip/send.c :100644 000000 029ccb75... 00000000... D uip/sendsbr.c commit 66153aae4e74cc270cbdbc48f20284b13fb700fc Author: markus schnalke AuthorDate: Wed Feb 8 17:52:49 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 17:52:49 2012 +0100 Updated .gitignore and removed the unused mts.conf.in. I've forgotten to remove the mts.conf.in some days ago. :100644 100644 15199ba1... 6dffc550... M .gitignore :100644 000000 ca31e0c7... 00000000... D etc/mts.conf.in commit 0e82199cf3c991a173e0ac8aa776efdb3ded61e6 Author: markus schnalke AuthorDate: Wed Feb 8 17:46:27 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 17:46:27 2012 +0100 Replaced sendfiles with a simpler version that uses send instead of viamail. Also moved it from etc/ to uip/. Updated man pages. Note: The splitting of large messages by sendfile/viamail/or elsewhere seems not to be available anymore, although it had been documented in the man page. Either the man pages don't match the code or I've not found this function yet. :100644 100644 5de4e41a... 10111e7c... M etc/Makefile.in :100755 000000 5582b2a8... 00000000... D etc/sendfiles.in :100644 100644 ddb43f81... 395b76a0... M man/mhstore.man1 :100644 100644 a2bf7beb... f2015b48... M man/sendfiles.man1 :100644 100644 1634f7b9... b36bc758... M uip/Makefile.in :000000 100755 00000000... 40d8f72e... A uip/sendfiles.sh commit eda72d6a7a7c20ff123043fb7f19c509ea01f932 Author: markus schnalke AuthorDate: Wed Feb 8 16:50:47 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 16:50:47 2012 +0100 Removed viamail. It is pretty much outdated. We can send files as MIME messages better with the new attachment system. :100644 100644 85ffa6c4... 1634f7b9... M uip/Makefile.in :100644 000000 76450ac4... 00000000... D uip/viamail.c commit 5e075c03338adb1e6904f09c2d85d7f04333f07c Author: markus schnalke AuthorDate: Wed Feb 8 15:59:16 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 15:59:16 2012 +0100 comp, dist, forw, repl don't depend on sendsbr anymore. I had forgotten to remove the deps in the makefile. :100644 100644 88b9bd75... 85ffa6c4... M uip/Makefile.in commit 308f5a6147ab19b6cac588d1160010e89d2e6060 Author: markus schnalke AuthorDate: Wed Feb 8 15:31:41 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 15:31:41 2012 +0100 Improved the patch for send(1) to handle absolute path name arguments. See changeset 3df5ab3c116e6d4a2fb4bb5cc9dfc5f781825815 :100644 100644 bdcd83be... 7a8b8e6d... M uip/send.c commit 9b4431bb9d1c74c2cd588afd79654a7bf5ce9064 Author: markus schnalke AuthorDate: Wed Feb 8 14:58:01 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 14:58:01 2012 +0100 Fixed mhmail. (It wanted to read the profile to create a temp file.) :100644 100644 a013ecb8... f9e7fcd8... M uip/mhmail.c commit d297b2240c664de09b6d51a07a071aab33c4bf32 Author: markus schnalke AuthorDate: Wed Feb 8 14:33:30 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 14:33:30 2012 +0100 Removed the `-delete' option from the `quit' command at the whatnow prompt. There already is a command `delete' that's equal to the removed `quit -delete'. :100644 100644 764234be... 526c71a8... M man/whatnow.man1 :100644 100644 7033cdf4... b0819003... M uip/whatnow.c commit 3df5ab3c116e6d4a2fb4bb5cc9dfc5f781825815 Author: markus schnalke AuthorDate: Wed Feb 8 14:24:08 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 14:24:08 2012 +0100 Separated send from whatnow, similar to the previous commit. Again, I traded execution speed for less (doubled) code, clearer interfaces, and modularization. Oh what an improvement! :100644 100644 63f71e2f... 88b9bd75... M uip/Makefile.in :100644 100644 da5f23bf... bdcd83be... M uip/send.c :100644 100644 0ec8e41a... 7033cdf4... M uip/whatnow.c commit c73c00bfccd22ec77e9593f47462aeca4a8cd9c0 Author: markus schnalke AuthorDate: Wed Feb 8 13:42:11 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 13:42:11 2012 +0100 Always exec whatnow; don't link the code into comp, repl, forw, dist. Although this might slow it a bit down, it makes the boundaries clearer. The main problem for me is the interweaving of the parts in nmh. Let's trade a bit of speed for better modularization. :100644 100644 6254ee98... 63f71e2f... M uip/Makefile.in :100644 100644 0488f94e... 0ec8e41a... M uip/whatnow.c :100644 100644 8d6830e4... 12cd13af... M uip/whatnowproc.c :100644 000000 bd409049... 00000000... D uip/whatnowsbr.c commit 946f59629730dd1683f54d7171ee381208ebe9f0 Author: markus schnalke AuthorDate: Wed Feb 8 13:32:06 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 13:32:06 2012 +0100 Cosmetic changes. :100644 100644 f8b415cb... 029ccb75... M uip/sendsbr.c :100644 100644 8cb67446... bd409049... M uip/whatnowsbr.c commit 3baec236a39c5c89a9bda8dbd988d643a21decc6 Author: markus schnalke AuthorDate: Wed Feb 8 11:19:50 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 11:19:50 2012 +0100 Better mime types for attachments. Use some command; e.g. `file --mime'. Up to now attachments had either been text/plain or application/octet-stream, if one hadn't added mhshow-suffix- profile entries for any possible type. Now we call mimetypequeryproc (default: `file -b --mime' for GNU file), this can be changed with the profile entry `Mime-Type-Query'. This command will be executed with the attachment filename as last argument. If your file(1) command does not print MIME types, you can still grep your profile for matching mhshow-suffix- entries. However, I suggest to store this data somewhere else. IMO the profile is not the right location for it. :100644 100644 cdf8f5a7... 3cc7305e... M config/config.c :100644 100644 ef7aa034... 52dc5049... M h/mh.h :100644 100644 4f20f557... 2a1d97e2... M uip/mhparam.c :100644 100644 89a07487... f8b415cb... M uip/sendsbr.c commit 9c3137c1ca74a287703fdd1d940a1a1cce86e3b2 Author: markus schnalke AuthorDate: Wed Feb 8 09:41:03 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 8 09:41:03 2012 +0100 Layouting and comment changes. (minor stuff) :100644 100644 8eb67cc8... 89a07487... M uip/sendsbr.c commit e31729d51e468c4cd56fa049850619a94e53840a Author: markus schnalke AuthorDate: Sat Feb 4 16:19:06 2012 +0100 Commit: markus schnalke CommitDate: Sat Feb 4 16:19:06 2012 +0100 Removed the -backup flag from spost. Post hadn't had it as renaming the draft is done by send. It appears as if it were only there for debugging purposes. :100644 100644 5b51ad4c... 5afa435d... M uip/spost.c commit 736132b163f34ce9eaa5b7604f49961df9f52329 Author: markus schnalke AuthorDate: Sat Feb 4 16:12:22 2012 +0100 Commit: markus schnalke CommitDate: Sat Feb 4 16:12:22 2012 +0100 Improved quoting the fullname. :100644 100644 6b8b3a2c... f43b15de... M sbr/mts.c commit ecd6d6a20cb7a1507e3a20d6c4cb3a1cf14c6bbf Author: markus schnalke AuthorDate: Sat Feb 4 13:39:32 2012 +0100 Commit: markus schnalke CommitDate: Sat Feb 4 13:39:32 2012 +0100 Removed the suppress dups feature from slocal for simplicity reasons. Now we don't need dbm anymore. This removed a heavy dependency and complicated configure code. :100644 100644 89c9ac83... 009d4796... M INSTALL :100644 100644 fcc5fbd7... b678f475... M aclocal.m4 :100644 100644 a6a55efb... efae9fcc... M configure.ac :100644 100644 81fbe0b5... baaa28de... M man/mh-chart.man1 :100644 100644 e2b6051e... 200d280c... M man/slocal.man1 :100644 100644 4a02564b... 6254ee98... M uip/Makefile.in :100644 100644 2573cbe0... 0ef54c6f... M uip/slocal.c commit d3540eaa4251b3a282115a72ed5d1bb39ce74b3f Author: markus schnalke AuthorDate: Sat Feb 4 13:08:51 2012 +0100 Commit: markus schnalke CommitDate: Sat Feb 4 13:08:51 2012 +0100 Removed mts.conf; the maildelivery option went into slocal directly. The MTS is a non-MUA part of MH, which is/gets removed in MMH. Now, you cannot change the global maildelivery file without changing the code. You stil can specify -maildelivery to slocal. I've also remove support for the env vars MHMTSCONF and MHMTSUSERCONF, which were added by Earl Hood in 2010. We might want to add support for them again. I need to think about the future of slocal anyway. :100644 100644 d4bd38fb... 89c9ac83... M INSTALL :100644 100644 90451b9d... 5e1004b3... M docs/README.manpages :100644 100644 0c7736d6... 5de4e41a... M etc/Makefile.in :100644 100644 a0f83dc2... 2155e055... M h/mts.h :100644 100644 de3c254a... 8998184a... M man/Makefile.in :100644 100644 0a5ac5a8... af967dff... M man/ap.man8 :100644 100644 4df70944... dc05548f... M man/conflict.man8 :100644 100644 1dc95890... 40a04c5c... M man/inc.man1 :100644 100644 e3a949a2... 60545daa... M man/mh-tailor.man5 :100644 000000 9d534fd1... 00000000... D man/mts.conf.man5 :100644 100644 3653f472... 21bc1dce... M man/rcvdist.man1 :100644 100644 8c9da9e9... 55305f2d... M man/rcvpack.man1 :100644 100644 f098b218... 3a141e3d... M man/rcvtty.man1 :100644 100644 bf6c210b... e2b6051e... M man/slocal.man1 :100644 100644 95ff94c0... d05672cd... M sbr/Makefile.in :100644 100644 a2dba260... 4dbd94fd... M sbr/m_getfld.c :100644 100644 503ec3c1... 6b8b3a2c... M sbr/mts.c :100644 100644 58a82af4... 4a02564b... M uip/Makefile.in :100644 100644 8907e69f... f1d74163... M uip/ali.c :100644 100644 ad3c9987... 4f7f7603... M uip/ap.c :100644 100644 527dd113... 03de873a... M uip/conflict.c :100644 100644 f000d476... 1f03e2b7... M uip/inc.c :100644 100644 5b75814c... 5e10ad33... M uip/msgchk.c :100644 100644 898073fa... cff337db... M uip/rcvdist.c :100644 100644 85de619d... f0f1bd18... M uip/rcvpack.c :100644 100644 ba3cfccd... ebf3e14d... M uip/rcvstore.c :100644 100644 a62d091f... 1dc38c4e... M uip/rcvtty.c :100644 100644 a11ca0da... 18de4c48... M uip/scan.c :100644 100644 7546cdd9... 2573cbe0... M uip/slocal.c :100644 100644 e3cf211d... 5b51ad4c... M uip/spost.c commit 4e38095f027a81c005a48a888d0f8937e98543a5 Author: markus schnalke AuthorDate: Sat Feb 4 11:57:16 2012 +0100 Commit: markus schnalke CommitDate: Sat Feb 4 11:57:16 2012 +0100 Removed the built-in FTP client. That's another of these things that are not the MUA's tasks. There are good FTP clients around, just use one of them. We could provide an external FTP wrapper script around wget or so, to use with nmh-access-ftp. However, I'm not sure how to deal with message/external-body in general. Although this concept is great, I've never seen any such message in all my email life. :100644 100644 43e4ad82... f4ca2dd2... M acconfig.h :100644 100644 bce55c15... f451ccb4... M man/mhshow.man1 :100644 100644 acf36947... ddb43f81... M man/mhstore.man1 :100644 100644 ee096aa0... 58a82af4... M uip/Makefile.in :100644 000000 b37d246a... 00000000... D uip/ftpsbr.c :100644 100644 f6677139... d2f69bc6... M uip/mhparse.c commit 6a7760a0fa8ccb36a056a7600aab31f3656f7cfa Author: markus schnalke AuthorDate: Sat Feb 4 10:51:26 2012 +0100 Commit: markus schnalke CommitDate: Sat Feb 4 10:51:26 2012 +0100 Refactoring in spost. :100644 100644 8fc2f211... e3cf211d... M uip/spost.c commit 2abae0bfd0ad5bf898461e50aa4b466d641f23d9 Author: markus schnalke AuthorDate: Fri Feb 3 18:42:55 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 3 18:42:55 2012 +0100 Removed the last masquerading type: username_extension. If you want some username extension, then change the From: line in the message draft. If you want real masquerading, then consult your MTA. mmh is an MUA, no MTA. (spost hadn't supported username_extension maquerading, anyway.) :100644 100644 40575357... d4bd38fb... M INSTALL :100644 100644 8b23986f... a6a55efb... M configure.ac :100644 100644 1216177e... 0c7736d6... M etc/Makefile.in :100644 100644 725a76bd... ca31e0c7... M etc/mts.conf.in :100644 100644 59187143... e3a949a2... M man/mh-tailor.man5 :100644 100644 4cc0006a... 4059ce00... M sbr/addrsbr.c :100644 100644 313cbbc4... 503ec3c1... M sbr/mts.c commit b14ea6073f77b4359aaf3fddd0e105989db9f306 Author: markus schnalke AuthorDate: Fri Feb 3 18:28:51 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 3 18:28:51 2012 +0100 Removed draft_from masquerading. We're an MUA and should not care for SMTP envelopes at all. :100644 100644 7049a409... 40575357... M INSTALL :100644 100644 e132f1ff... 8b23986f... M configure.ac :100644 100644 d4d4a0a7... 725a76bd... M etc/mts.conf.in :100644 100644 e4c2d1e4... 59187143... M man/mh-tailor.man5 :100644 100644 89ed1b64... 313cbbc4... M sbr/mts.c :100644 100644 ee36a6fb... 8fc2f211... M uip/spost.c commit 0836c8000ccb34b59410ef1c15b1b7feac70ce5f Author: markus schnalke AuthorDate: Fri Feb 3 18:07:11 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 3 18:07:11 2012 +0100 Removed mmailid masquerading. That's an MTA's task, but mmh is an MUA. :100644 100644 7d86fe30... 7049a409... M INSTALL :100644 100644 3de6bf62... e132f1ff... M configure.ac :100644 100644 65b9d1d5... d4d4a0a7... M etc/mts.conf.in :100644 100644 7bb331be... e4c2d1e4... M man/mh-tailor.man5 :100644 100644 ced0cf73... 89ed1b64... M sbr/mts.c commit de448e64862babc8ea92d6ee3f61f68ba3915128 Author: markus schnalke AuthorDate: Fri Feb 3 17:02:11 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 3 17:02:11 2012 +0100 Removed unused parameter from mbx_copy(). :100644 100644 2349dbbd... 2b21f10d... M h/dropsbr.h :100644 100644 007186e0... dd7a2df5... M uip/dropsbr.c :100644 100644 071cc3d0... 62c09da3... M uip/packf.c :100644 100644 fd1c2aa2... 85de619d... M uip/rcvpack.c :100644 100644 7b148e8c... 7546cdd9... M uip/slocal.c commit 4ab286d12be3ccc5f3000673857b4f69b689c69b Author: markus schnalke AuthorDate: Fri Feb 3 12:25:42 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 3 12:25:42 2012 +0100 Major bugfix: inc does not lose data anymore. What have I done in 70b2643e0da8485174480c644ad9785c84f5bff4 ? Producing scan listings and inc'ing mail are too closely related. By removing the body component from scan listings, I also had removed the ability to copy bodies during inc. Hence this commit undos the changes. (And reintroduces the body component in scan listings. :-( ) The code is too much interweaved! :100644 100644 9617237a... a43044c8... M uip/scansbr.c commit 4d9ffab89f18b962c7d440053079c5f9b00af659 Author: markus schnalke AuthorDate: Fri Feb 3 11:16:05 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 3 11:16:05 2012 +0100 Removed the -(no)remove switches from spost. I wonder why it existed, as the draft can get printed to stdout with -debug. That should be enough for debugging without modifying source code. :100644 100644 36923637... ee36a6fb... M uip/spost.c commit 60c047ea25679aa76137d3152cc64d10e4244e68 Author: markus schnalke AuthorDate: Fri Feb 3 10:50:13 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 3 10:50:13 2012 +0100 Comment changes. :100644 100644 6c99b5d7... b1228098... M sbr/seq_add.c commit 0b81a300d9e7cf78b6bc11d8c870f57fa81fcdc4 Author: markus schnalke AuthorDate: Fri Feb 3 10:42:49 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 3 10:42:49 2012 +0100 Fixed abort of e.g. comp when draft folder is empty. In this case mp->lowoff is 1 but mp->lowmsg equal mp->hghmsg equal 0. Hence we have an access at mp->msgstats[-1], which corrupted our mem. Gdb hadn't helped me for this, but valgrind showed me the problem. :100644 100644 5d0987ce... 6c99b5d7... M sbr/seq_add.c commit 0bfc482371bf63c4c312c749ba0bfc50483772ba Author: markus schnalke AuthorDate: Fri Feb 3 10:15:19 2012 +0100 Commit: markus schnalke CommitDate: Fri Feb 3 10:15:19 2012 +0100 Syntactic and comment changes. :100644 100644 d383d788... 2930254e... M sbr/folder_free.c :100644 100644 51955920... 8ccffc50... M sbr/folder_read.c :100644 100644 f1b703f4... e69b833f... M sbr/folder_realloc.c :100644 100644 1cd3dc93... 641a75db... M sbr/utils.c :100644 100644 e021055e... 872e18a0... M uip/picksbr.c commit 6d71dfbec7c6f3bec1c04d18479a87d63c1120ef Author: markus schnalke AuthorDate: Wed Feb 1 00:47:35 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 1 00:47:35 2012 +0100 spost: refactoring; removed -(no)format switches as they were not used. :100644 100644 73787f79... 36923637... M uip/spost.c commit 5276fe8873c9201f9b4ba8c6fcb5efb3887eab77 Author: markus schnalke AuthorDate: Wed Feb 1 00:36:54 2012 +0100 Commit: markus schnalke CommitDate: Wed Feb 1 00:36:54 2012 +0100 spost: refactoring, added comments, removed unused code :100644 100644 f2552dc9... 73787f79... M uip/spost.c commit 70b2643e0da8485174480c644ad9785c84f5bff4 Author: markus schnalke AuthorDate: Mon Jan 30 16:16:26 2012 +0100 Commit: markus schnalke CommitDate: Mon Jan 30 16:16:26 2012 +0100 Scan listings shall not contain body content. Hence, removed this feature. Scan listings shall operator on message headers and non-message information only. Displaying the beginning of the body complicates everything too much. That's no surprise, because it's something completely different. If you want to examine the body, then use show(1)/mhshow(1). Changed the default scan formats accordingly. :100644 100644 dd20b290... 942ddcc3... M etc/scan.MMDDYY :100644 100644 741681de... e91bcb1e... M etc/scan.YYYYMMDD :100644 100644 a59116cf... b15a2815... M etc/scan.nmh :100644 100644 8e2cedf6... 145e73f8... M etc/scan.nomime :100644 100644 a6b6698c... 5f35b365... M etc/scan.size :100644 100644 ee54a523... 4c581337... M etc/scan.time :100644 100644 06c068c2... 54f6d0a2... M etc/scan.timely :100644 100644 d1cd195c... 2cd0b820... M etc/scan.unseen :100644 100644 9629de55... ee59f716... M man/mh-format.man5 :100644 100644 ba59b453... 17328959... M man/scan.man1 :100644 100644 e1f5e942... a62d091f... M uip/rcvtty.c :100644 100644 a43044c8... 9617237a... M uip/scansbr.c commit 2759257a7d892584d45cdaf5113da06a264e9c9c Author: markus schnalke AuthorDate: Mon Jan 30 14:32:10 2012 +0100 Commit: markus schnalke CommitDate: Mon Jan 30 14:32:10 2012 +0100 Removed another deprecated mhn check. The comment appeared to be wrong ... maybe inverted. I removed it. :100644 100644 38bb4b53... 1acaf70e... M uip/show.c commit 58160ee7bcee7dcc7dbf8e2d5377009e48bcf40b Author: markus schnalke AuthorDate: Mon Jan 30 14:27:19 2012 +0100 Commit: markus schnalke CommitDate: Mon Jan 30 14:27:19 2012 +0100 Removed the, in 1997 deprecated, send option -noshowproc and env var NOMHNPROC. :100644 100644 ae1e71f1... b5aeb25d... M docs/COMPLETION-ZSH :100644 100644 3310d2f5... 8f798cba... M man/show.man1 :100644 100644 e7ecb72d... 38bb4b53... M uip/show.c commit a4605f68e8ff04d4539e402a6fb00ff188944e1c Author: markus schnalke AuthorDate: Mon Jan 30 12:42:06 2012 +0100 Commit: markus schnalke CommitDate: Mon Jan 30 12:42:06 2012 +0100 Removed -pause from mhshow(1). My goal is to have show/mhshow generate a single stream of bytes to be piped through a pager. Content not convertable to text shall not be displayed directly. This is my idea currently. :100644 100644 6a1caeb0... 81fbe0b5... M man/mh-chart.man1 :100644 100644 1d5d99d7... bce55c15... M man/mhshow.man1 :100644 100644 b9e76a11... 8d466ac8... M test/tests/bad-input/test-header :100644 100644 359d42e6... 53a772a5... M test/tests/mhshow/test-cte-binary :100644 100644 ae6ec056... 74d70eef... M test/tests/mhshow/test-qp :100644 100644 b1f3d3d0... 1f37c0e8... M uip/mhshow.c :100644 100644 ee401a78... b7452d8a... M uip/mhshowsbr.c commit bf5e3d96f882fe51157059787cd658d4a7ddd840 Author: markus schnalke AuthorDate: Mon Jan 30 12:00:49 2012 +0100 Commit: markus schnalke CommitDate: Mon Jan 30 12:00:49 2012 +0100 Bugfix: Removed -reverse switch from scan(1). No more to say but to quote MTR: -[no]reverse under #ifdef BERK (I really HATE this) And JLR: Lists messages in reverse order with the `-reverse' switch. This should be considered a bug. :100644 100644 73f5efcf... 746f899b... M docs/COMPLETION-BASH :100644 100644 666f7e1b... ae1e71f1... M docs/COMPLETION-ZSH :100644 100644 d4e5501e... 6a1caeb0... M man/mh-chart.man1 :100644 100644 30021bc0... ba59b453... M man/scan.man1 :100644 100644 e5fb55a6... a11ca0da... M uip/scan.c commit f61367c1118de22149e1ddff4a2c2c2437d758f0 Author: markus schnalke AuthorDate: Mon Jan 30 11:33:59 2012 +0100 Commit: markus schnalke CommitDate: Mon Jan 30 11:33:59 2012 +0100 Alias: Removed the address group `*', which meant everyone on the system. Therefore could remove `everyone' and `noshell' from mts.conf. If one really needs to write mail to everyone on the system (not just all regular users, which probably are in a group `user'), then he shurely can invest a bit more effort to do so. Likely, the simple condition to uids > 200 and not the shell `noshell' would anyways be to limited. Better use awk or the like and do it by hand. :100644 100644 1e053356... befb8c91... M h/aliasbr.h :100644 100644 50926674... a0f83dc2... M h/mts.h :100644 100644 c8368beb... 597b1556... M man/mh-alias.man5 :100644 100644 265c3cfd... 7bb331be... M man/mh-tailor.man5 :100644 100644 2830bb70... ced0cf73... M sbr/mts.c :100644 100644 b9b32fa1... 073b1b28... M uip/aliasbr.c commit 684ec30d81e1223a282764452f4902ed4ad1c754 Author: markus schnalke AuthorDate: Mon Jan 30 11:03:29 2012 +0100 Commit: markus schnalke CommitDate: Mon Jan 30 11:03:29 2012 +0100 Rest of the MMDF-style mail drop support removal. Only Unix-style (mbox) mail drops are supported now. Their location is in `mailspool', which is reported in the configure summary now. If users like to have different locations, they can use the environment variable MAILDROP or the profile entry MailDrop to overrule the default. From mts.conf, mmdfldir and mmdflfil were removed. msgchk(1) received several cleanups. I touched sbr/m_getfld.c ... Wooohh ... :100644 100644 c1b16bd6... da7d12ab... M config/Makefile.in :100644 100644 30c95749... cdf8f5a7... M config/config.c :100644 100644 0d3dc69e... 3de6bf62... M configure.ac :100644 100644 c5fd01c0... 65b9d1d5... M etc/mts.conf.in :100644 100644 116abdb1... ef7aa034... M h/mh.h :100644 100644 5ddd837e... 50926674... M h/mts.h :100644 100644 fc2f8d79... 4df70944... M man/conflict.man8 :100644 100644 8213cb74... 265c3cfd... M man/mh-tailor.man5 :100644 100644 1b9843b6... 1b58ee5c... M man/msgchk.man1 :100644 100644 8fd83643... a2dba260... M sbr/m_getfld.c :100644 100644 a3ea0f81... 2830bb70... M sbr/mts.c :100644 100644 4251ab2d... 527dd113... M uip/conflict.c :100644 100644 e3199c04... f000d476... M uip/inc.c :100644 100644 36edccb4... 5b75814c... M uip/msgchk.c :100644 100644 a81afa90... 7b148e8c... M uip/slocal.c commit a0f6183a0f52f9c0f48ce42b4f10592ceec2b014 Author: markus schnalke AuthorDate: Sat Jan 28 20:46:46 2012 +0100 Commit: markus schnalke CommitDate: Sat Jan 28 20:46:46 2012 +0100 Removed mmdelim[12], which were the delimiters for MMDF-style mail drops. :100644 100644 1601c147... 8213cb74... M man/mh-tailor.man5 :100644 100644 4f9d0581... a3ea0f81... M sbr/mts.c commit 507688ab0777c8274a1fd05775f22b7accbce3b7 Author: markus schnalke AuthorDate: Sat Jan 28 20:45:13 2012 +0100 Commit: markus schnalke CommitDate: Sat Jan 28 20:45:13 2012 +0100 Removed paragraphs which looked like forgotten to remove. :100644 100644 0cf54dde... 1601c147... M man/mh-tailor.man5 commit 3916ab66ad5d183705ac12357621ea8661afd3c0 Author: markus schnalke AuthorDate: Sat Jan 28 20:40:31 2012 +0100 Commit: markus schnalke CommitDate: Sat Jan 28 20:40:31 2012 +0100 Removed support for MMDF-style mail drops. I'm not sure yet if I've removed all of it but it should be most of it. :100644 100644 e4361e01... 43e4ad82... M acconfig.h :100644 100644 b32d316a... 2349dbbd... M h/dropsbr.h :100644 100644 8eac96ff... d4e5501e... M man/mh-chart.man1 :100644 100644 f0e6a3d9... 79dccacd... M man/packf.man1 :100644 100644 ca00d6b2... 8c9da9e9... M man/rcvpack.man1 :100644 100644 cc822f0e... bf6c210b... M man/slocal.man1 :100644 100644 86812776... 007186e0... M uip/dropsbr.c :100644 100644 6a756d98... e3199c04... M uip/inc.c :100644 100644 faf199c0... 071cc3d0... M uip/packf.c :100644 100644 f9687d8f... fd1c2aa2... M uip/rcvpack.c :100644 100644 85bc52a0... a81afa90... M uip/slocal.c commit d455d79d05331347130d3ab59628c3fd77b87279 Author: markus schnalke AuthorDate: Sat Jan 28 18:58:07 2012 +0100 Commit: markus schnalke CommitDate: Sat Jan 28 18:58:07 2012 +0100 Synced man page mh-chart with send. The man page mh-chart definately should be generated! Automate this task, man! :100644 100644 178687d9... 8eac96ff... M man/mh-chart.man1 commit 556e1267b7be84fd25c2d52aa754d623889d52ac Author: markus schnalke AuthorDate: Sat Jan 28 18:40:02 2012 +0100 Commit: markus schnalke CommitDate: Sat Jan 28 18:40:02 2012 +0100 Fixed path lookup for alias files: ali, send, whatnow. :100644 100644 3d450d72... 8907e69f... M uip/ali.c :100644 100644 85260d83... b9b32fa1... M uip/aliasbr.c :100644 100644 a5589eba... da5f23bf... M uip/send.c :100644 100644 79f75e5a... 8cb67446... M uip/whatnowsbr.c commit 3a2993ae0a411209ac7d51180c781662139f882b Author: markus schnalke AuthorDate: Sat Jan 28 16:05:54 2012 +0100 Commit: markus schnalke CommitDate: Sat Jan 28 16:05:54 2012 +0100 forw/repl/dist annotations won't add address lists anymore. spost does not support it and I wonder if we need it. Remove the undocumented -idanno switch, actually a no-op, from spost. :100644 100644 59bcd19b... a1eeab42... M man/dist.man1 :100644 100644 4ed1f423... 2f3fa6e0... M man/forw.man1 :100644 100644 48378d74... ed020c23... M man/repl.man1 :100644 100644 b2a298cd... 8eb67cc8... M uip/sendsbr.c :100644 100644 947904e8... f2552dc9... M uip/spost.c commit b9b14fd176e7146fb6d37485bb0eecb1753d0e0b Author: markus schnalke AuthorDate: Sat Jan 28 15:21:44 2012 +0100 Commit: markus schnalke CommitDate: Sat Jan 28 15:21:44 2012 +0100 Trivial typesetting fix in man page. :100644 100644 a1874835... 48378d74... M man/repl.man1 commit b872e8606e7880bf1d32e95271493dcd5d8394fa Author: markus schnalke AuthorDate: Sat Jan 28 13:35:42 2012 +0100 Commit: markus schnalke CommitDate: Sat Jan 28 13:35:42 2012 +0100 Removed the ATTVIBUG compile option. If you do have the bug, then workaround it like described in the FAQ: Subject: 06.01 What to do with "Problems with edit - draft removed". From: John Romine Date: Mon, 1 May 1995 00:00:00 -0800 If your users are using an AT&T version of "vi", it's exiting with non-zero status (supposedly a count of the "errors" during the edit). Move "vi" to "broken_vi" and put it its place : #! /bin/sh /usr/ucb/broken_vi "$@" exit 0 Alternatively, compile MH with the ATTVIBUG option. Then complain to your vendor that "vi" is broken, and they shouldfix it. btw: ex-vi does not have this bug. :100644 100644 f3d9ca34... e4361e01... M acconfig.h :100644 100644 3ed0ea4a... 79f75e5a... M uip/whatnowsbr.c commit 357003235f891fa019995f8bc69e6bd11149a5fd Author: markus schnalke AuthorDate: Sat Jan 28 13:10:50 2012 +0100 Commit: markus schnalke CommitDate: Sat Jan 28 13:10:50 2012 +0100 Removed EISREMOTE check. It's not in POSIX and Google finds only nmh code containing it. Maybe it was some BSD experiment. Who knows. :100644 100644 7a4a9826... 69083cc8... M sbr/folder_addmsg.c :100644 100644 e6d61dc5... a5589eba... M uip/send.c commit 47a78dcb28c6a836574f73f40b05d4adc9c3ad81 Author: markus schnalke AuthorDate: Sat Jan 28 13:04:59 2012 +0100 Commit: markus schnalke CommitDate: Sat Jan 28 13:04:59 2012 +0100 Removed the undocumented -unique switches. Seems they were JLR-only stuff. :100644 100644 c19cf4fa... e6d61dc5... M uip/send.c :100644 100644 9c335bd9... b2a298cd... M uip/sendsbr.c :100644 100644 79f7c6f9... 3ed0ea4a... M uip/whatnowsbr.c commit 869aa60129811d7b160f353892dc5956a8aaac22 Author: markus schnalke AuthorDate: Sat Jan 28 12:54:36 2012 +0100 Commit: markus schnalke CommitDate: Sat Jan 28 12:54:36 2012 +0100 Removed the -width switch from send, spost and repl. Adressee header fields will always be folded for OUTPUTLINELEN (=72) chars. :100644 100644 d80ab5a5... 699c8b8b... M h/prototypes.h :100644 100644 85ee9094... 178687d9... M man/mh-chart.man1 :100644 100644 9f8cc8fc... a1874835... M man/repl.man1 :100644 100644 3cb64abc... e4ee40c5... M man/send.man1 :100644 100644 077f912c... 898073fa... M uip/rcvdist.c :100644 100644 3b490045... 6231d469... M uip/repl.c :100644 100644 2cdd847e... 907465ef... M uip/replsbr.c :100644 100644 e77f2b10... c19cf4fa... M uip/send.c :100644 100644 8c55c06e... 947904e8... M uip/spost.c commit 4d4f3e6367922ac4237d87ccfb070dbbcb6ff6be Author: markus schnalke AuthorDate: Sat Jan 28 12:26:36 2012 +0100 Commit: markus schnalke CommitDate: Sat Jan 28 12:26:36 2012 +0100 Removed options to deactivate dashstuffing. Always dashstuff. Maybe there are few RFC 934 messages around, but dashstuffing is IMO more useful than bad. :100644 100644 806c9340... 73f5efcf... M docs/COMPLETION-BASH :100644 100644 5f99bfaf... 4ed1f423... M man/forw.man1 :100644 100644 94000d73... 85ee9094... M man/mh-chart.man1 :100644 100644 b0d4601e... 9cdb793f... M uip/forw.c :100644 100644 1764aa5f... 786178d3... M uip/mhlsbr.c commit 875a8bcc360e2cbb611b8163ff3d2234287be3bc Author: markus schnalke AuthorDate: Sat Jan 28 12:12:21 2012 +0100 Commit: markus schnalke CommitDate: Sat Jan 28 12:12:21 2012 +0100 Removed unneeded options from send. Most of them were supported by post but are not by spost. We don't need them. (More about dashstuffing soon.) :100644 100644 6e7b19e5... 3cb64abc... M man/send.man1 :100644 100644 2092c372... e77f2b10... M uip/send.c :100644 100644 45f33c7f... 79f7c6f9... M uip/whatnowsbr.c commit 2c3b7da72126a21f05130e9ed6bb70f43624ce25 Author: markus schnalke AuthorDate: Wed Jan 25 22:56:43 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 25 22:56:43 2012 +0100 Removed the UCI code to read the signatur (= name) from ~/.signature. If we want to read something from ~/.signature, then those lines that form the footer of a mail message. What is called ``signature'' here is the name of the sender; the name that is put into the From: line. There are already several options to put it: - environment variable: SIGNATURE (to change temporary) - profile entry: Signature: (to set only for the mail system) - GECOS field in passwd (fallback and global) These should be enough. :100644 100644 5ad243de... d94f3018... M man/mh-profile.man5 :100644 100644 eb140c9f... 2092c372... M uip/send.c :100644 100644 4e93a1ab... 45f33c7f... M uip/whatnowsbr.c commit 1c6fe69a6025e8249c7ed30af0c2ebe9ff9da4c3 Author: markus schnalke AuthorDate: Wed Jan 25 22:38:54 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 25 22:38:54 2012 +0100 Removed UCI-specific group leader code from conflict(8). :100644 100644 4a20e4ba... 4251ab2d... M uip/conflict.c :100644 100644 374d752a... 043ecd69... M uip/rmf.c commit 565f869c5ab6d61d372d164058079c6a094707e7 Author: markus schnalke AuthorDate: Wed Jan 25 22:36:49 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 25 22:36:49 2012 +0100 Removed the UCI alternative name of anno(1): `fanno'. fanno didn't add the date. If you want this, run `anno -nodate'. Hey, you can create a shell alias for it. What about that? ;-) :100644 100644 7de86005... 68d721a7... M uip/anno.c commit c477dc5d1d03fa6d9a8ab3dd3508c63cbddc044e Author: markus schnalke AuthorDate: Wed Jan 25 22:29:34 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 25 22:29:34 2012 +0100 Removed the -header option from scan(1). The heading had been very simple since the advent of format strings anyway. If someone wants a heading, he can run folder(1) before. :100644 100644 3a1ffa2b... 94000d73... M man/mh-chart.man1 :100644 100644 a4007d35... 30021bc0... M man/scan.man1 :100644 100644 cb4bac46... e5fb55a6... M uip/scan.c commit 3fe7a0704e4ab592003af2e66c3003718ecde2c1 Author: markus schnalke AuthorDate: Wed Jan 25 22:21:56 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 25 22:21:56 2012 +0100 Removed (allmost all) JLR-specific code. There still is one fragment in fmt_scan(), of which I don't understand the logic. I don't want to remove stuff I don't understand. :100644 100644 26096796... 4a8da144... M sbr/fmt_scan.c :100644 100644 6881c340... cb4bac46... M uip/scan.c :100644 100644 8e02e575... a43044c8... M uip/scansbr.c commit 5d4f603fcfc7cf4a238b27de2b18567a733bb6b4 Author: markus schnalke AuthorDate: Wed Jan 25 22:05:07 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 25 22:05:07 2012 +0100 Removed LBL compile condition (format: addtoseq). :100644 100644 d60ac4a8... a84efaed... M h/fmt_compile.h :100644 100644 7f5d73d1... 9629de55... M man/mh-format.man5 :100644 100644 cf5c497b... ef6e8794... M sbr/fmt_compile.c :100644 100644 2c16dfef... 26096796... M sbr/fmt_scan.c :100644 100644 160daaff... d948a063... M uip/fmtdump.c :100644 100644 f3e5a4fa... 6881c340... M uip/scan.c commit 9f9bfa91d88b3ca4cd9206c1f2b17c6d13ebcaba Author: markus schnalke AuthorDate: Wed Jan 25 22:00:58 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 25 22:00:58 2012 +0100 Removed several `#if 0' fragments. We better don't carry dead code with us, it might start smelling. :100644 100644 737f9988... b427dfda... M sbr/dtime.c :100644 100644 34d743e5... e065c93e... M sbr/lock_file.c :100644 100644 1ff8e320... 8fd83643... M sbr/m_getfld.c :100644 100644 e07c847b... 3d450d72... M uip/ali.c :100644 100644 4c504859... 725abec3... M uip/burst.c :100644 100644 f65b6e32... 43586062... M uip/mhbuildsbr.c :100644 100644 478e4a69... f3e5a4fa... M uip/scan.c :100644 100644 6eca9314... 8e02e575... M uip/scansbr.c :100644 100644 e958ef37... 4e93a1ab... M uip/whatnowsbr.c commit 72d1181d50ccb0b410e3745f4fd3981fd673d647 Author: markus schnalke AuthorDate: Wed Jan 25 13:31:36 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 25 13:31:36 2012 +0100 Finally fixed the annoying `Invalid cross-device link' problem. Due to a missing slash (/), temporary files were put into the parent directory instead of the same one. See: mhbuild: unable to rename output /home/meillo/Mail/send0zxfDu to /home/meillo/MailmhbuildzQjMUm: Invalid cross-device link :100644 100644 4a1eed17... 4c7703cd... M sbr/m_mktemp.c commit 1b91fa72064a70b6ecf24c085cead38ff91fedb9 Author: markus schnalke AuthorDate: Wed Jan 25 00:04:05 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 25 00:04:05 2012 +0100 Updated the man pages to the recent changes. :100644 100644 46dd70b1... 5f99bfaf... M man/forw.man1 :100644 100644 38b81231... 5ad243de... M man/mh-profile.man5 :100644 100644 280782e4... 3d3260f8... M man/mhbuild.man1 :100644 100644 accb38e8... 9f8cc8fc... M man/repl.man1 :100644 100644 057c2174... 764234be... M man/whatnow.man1 commit f41f04cf4ceca7355232cf7413e59afafccc9550 Author: markus schnalke AuthorDate: Wed Jan 25 00:01:51 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 25 00:01:51 2012 +0100 Fixed -mime for forw and repl. If the value of an attachment header starts with `+', then it is treated as the specification of a message in MH style: ``+folder msg'' :100644 100644 8dc26b79... b0d4601e... M uip/forw.c :100644 100644 2affe310... 2cdd847e... M uip/replsbr.c :100644 100644 150c175c... 9c335bd9... M uip/sendsbr.c commit dba36faad141d652c7b84d26295537c76fd2b5be Author: markus schnalke AuthorDate: Tue Jan 24 20:55:15 2012 +0100 Commit: markus schnalke CommitDate: Tue Jan 24 20:55:15 2012 +0100 Removed the mime command from whatnow and automimeproc (automhnproc). The man pages need to be updated. repl and forw are broken right now. :100644 100644 d07c37e4... e958ef37... M uip/whatnowsbr.c commit 8ff284ff9167eff8f5349481529332d59ed913b1 Author: markus schnalke AuthorDate: Tue Jan 24 20:08:35 2012 +0100 Commit: markus schnalke CommitDate: Tue Jan 24 20:08:35 2012 +0100 Activated Jon's attachment system by default and steamlined it. I had done similar work already some time ago. See: http://www.mail-archive.com/nmh-workers@nongnu.org/msg02112.html This time it's the second go. I changed Jon's attachment system to have a default attachment header field name, or get it from the profile. I removed the command line options. The new profile name is: `Attachment-Header'. Stored in attach_fmt. I removed the the choice between several attachment formats. A message gets mimeified if it has attachment headers or (and this is new) contains any non-ASCII character. The body won't be scanned for lines matching /^#/. The MIME structure is created automatically. The content-typing of unknown attachments is still poor and needs to be improved. You shouldn't use the `mime' command at the whatnow prompt anymore. :100644 100644 294352ae... 30c95749... M config/config.c :100644 100644 fe99246c... 116abdb1... M h/mh.h :100644 100644 0b191f06... d80ab5a5... M h/prototypes.h :100644 100644 053213a7... 38b81231... M man/mh-profile.man5 :100644 100644 a1a134ac... 6e7b19e5... M man/send.man1 :100644 100644 d1c5846a... 057c2174... M man/whatnow.man1 :100644 100644 fff8a84e... b78eb06e... M sbr/readconfig.c :100644 100644 5cf7881c... 4f20f557... M uip/mhparam.c :100644 100644 eb678245... eb140c9f... M uip/send.c :100644 100644 de00429e... 150c175c... M uip/sendsbr.c :100644 100644 ccb149c8... 76450ac4... M uip/viamail.c :100644 100644 8eeed10e... d07c37e4... M uip/whatnowsbr.c commit 6dc010d334b477ad4dee0b1a1d3ee6a6bdb7bd9a Author: markus schnalke AuthorDate: Tue Jan 24 16:28:36 2012 +0100 Commit: markus schnalke CommitDate: Tue Jan 24 16:28:36 2012 +0100 Added a comment and a variable initialization. :100644 100644 69ecaf2d... 5c0de057... M uip/mhpath.c :100644 100644 2ac56d63... a4da6357... M uip/new.c commit eec22f627f35bfb37d408463c4d810482b0d3dae Author: markus schnalke AuthorDate: Thu Jan 5 19:24:20 2012 +0100 Commit: markus schnalke CommitDate: Thu Jan 5 19:24:20 2012 +0100 Free memory after use in m_draft(). :100644 100644 427d2dbc... 3659ff3d... M sbr/m_draft.c commit d3ba09a465cb0e5fc9a74d0b152a7ed965f895cb Author: markus schnalke AuthorDate: Thu Jan 5 19:18:12 2012 +0100 Commit: markus schnalke CommitDate: Thu Jan 5 19:18:12 2012 +0100 Explicit checks for return values of strcmp(). The return value of strcmp() is unintuitive for string equality tests. I prefer explicit comparisions against 0. I changed this everywhere. :100644 100644 96acd562... 38e27934... M h/fmt_scan.h :100644 100644 6b3aa2f9... 4d813563... M sbr/context_replace.c :100644 100644 0693a216... 0185bd83... M sbr/crawl_folders.c :100644 100644 cdbf344d... 51955920... M sbr/folder_read.c :100644 100644 df128d7d... 734bdb58... M sbr/m_convert.c :100644 100644 db509fcc... 1ff8e320... M sbr/m_getfld.c :100644 100644 45bbecd4... 53752a34... M sbr/mf.c :100644 100644 9638f568... 4f9d0581... M sbr/mts.c :100644 100644 ca3a2c49... 02e6a3cf... M sbr/norm_charmap.c :100644 100644 f88fcef5... 0e169a5b... M sbr/ruserpass.c :100644 100644 38bbdcf6... 5d0987ce... M sbr/seq_add.c :100644 100644 92e2f1e7... e342d1cb... M sbr/seq_del.c :100644 100644 4605915d... 3c3b9106... M sbr/seq_getnum.c :100644 100644 a6cdbdaa... f051e38b... M sbr/seq_list.c :100644 100644 3a9633eb... 5707dae9... M sbr/seq_read.c :100644 100644 78eea645... 594b269f... M sbr/showfile.c :100644 100644 07c5e035... 85260d83... M uip/aliasbr.c :100644 100644 82dfdcc0... 4a20e4ba... M uip/conflict.c :100644 100644 cc668cdb... 86812776... M uip/dropsbr.c :100644 100644 c4d9a3b1... c98a3f06... M uip/flist.c :100644 100644 ae7bac53... b1398e45... M uip/folder.c :100644 100644 f82f51b9... b37d246a... M uip/ftpsbr.c :100644 100644 bf6f646f... 734d8ab2... M uip/mhbuild.c :100644 100644 ab8d99c1... f65b6e32... M uip/mhbuildsbr.c :100644 100644 313719f0... 0c8e644a... M uip/mhmisc.c :100644 100644 1ac7ea9a... f6677139... M uip/mhparse.c :100644 100644 5d5ac3e4... b1f3d3d0... M uip/mhshow.c :100644 100644 8fed651f... ee401a78... M uip/mhshowsbr.c :100644 100644 0afcc995... 0b1a9b30... M uip/mhstoresbr.c :100644 100644 48a555e9... 374d752a... M uip/rmf.c :100644 100644 999272b0... e7ecb72d... M uip/show.c :100644 100644 2ac93d1d... 85bc52a0... M uip/slocal.c :100644 100644 0699fcee... 8eeed10e... M uip/whatnowsbr.c commit b0b1dd37ff515578cf7cba51625189eb34a196cb Author: markus schnalke AuthorDate: Thu Jan 5 12:26:09 2012 +0100 Commit: markus schnalke CommitDate: Thu Jan 5 12:26:09 2012 +0100 Removed isprefix() and replaced it with strncmp(). isprefix() had been ssequal(), which had not been what it advertised to be. Now, all this is gone. We could get problems if one of the arguments is NULL, as isprefix() handled this situation, but strncmp() does not. It appears as if this case does not show up in the code. :100644 100644 5e5672ce... 0b191f06... M h/prototypes.h :100644 100644 b42dd49b... 95ff94c0... M sbr/Makefile.in :100644 000000 33c06998... 00000000... D sbr/isprefix.c :100644 100644 b535fe3a... df128d7d... M sbr/m_convert.c :100644 100644 7924fbc7... 3a70c545... M sbr/print_sw.c :100644 100644 c1ac9fa7... 3a9633eb... M sbr/seq_read.c :100644 100644 847bb365... c4d9a3b1... M uip/flist.c :100644 100644 224bb034... ae7bac53... M uip/folder.c :100644 100644 923f23ae... 48a555e9... M uip/rmf.c :100644 100644 671a4419... 999272b0... M uip/show.c commit 1f958f791cd9ee06e1de07c348555c920772af67 Author: markus schnalke AuthorDate: Thu Jan 5 11:56:44 2012 +0100 Commit: markus schnalke CommitDate: Thu Jan 5 11:56:44 2012 +0100 Removed forgotten unused variable. :100644 100644 77137c92... f283a1bc... M sbr/uprf.c commit 39cd310f18074231e3400e53f7e5234a8615a87e Author: markus schnalke AuthorDate: Thu Jan 5 11:52:03 2012 +0100 Commit: markus schnalke CommitDate: Thu Jan 5 11:52:03 2012 +0100 Removed the non-LOCALE character code and the #ifdefs and simplified. POSIX says: tolower() won't change its argument if it is not isupper(). And isupper() doesn't need an additional check for isalpha(). :100644 100644 bcd7b3d1... cf5c497b... M sbr/fmt_compile.c :100644 100644 4f9bce0e... 2c16dfef... M sbr/fmt_scan.c :100644 100644 2b9a0155... c90bfefd... M sbr/gans.c :100644 100644 03bf0d08... b903b7e8... M sbr/m_atoi.c :100644 100644 836a98b0... 77137c92... M sbr/uprf.c commit 99e89d0fcc69e509924b0a14a56e10d15721ccb0 Author: markus schnalke AuthorDate: Thu Jan 5 11:28:18 2012 +0100 Commit: markus schnalke CommitDate: Thu Jan 5 11:28:18 2012 +0100 Refactoring in sbr/m_convert.c :100644 100644 b42a5aaa... b535fe3a... M sbr/m_convert.c commit f3db6244253b548f4196ea5cf41f4bc8d400d0c3 Author: markus schnalke AuthorDate: Thu Jan 5 11:19:22 2012 +0100 Commit: markus schnalke CommitDate: Thu Jan 5 11:19:22 2012 +0100 Reserved special sequence names may be upper case too. Even without LOCALE. :100644 100644 98c47337... b42a5aaa... M sbr/m_convert.c commit 452df42b9645e99101184f28518652646ad75ba7 Author: markus schnalke AuthorDate: Thu Jan 5 11:11:13 2012 +0100 Commit: markus schnalke CommitDate: Thu Jan 5 11:11:13 2012 +0100 Much more straight-forward handling of the beyond sequence. Could remove the message flag SELECT_EMPTY in the same go. This frees one more space for a user-defined sequence. :100644 100644 73845a41... fe99246c... M h/mh.h :100644 100644 1350c371... 98c47337... M sbr/m_convert.c commit afd666e21d9a1bd391f037c82b7c097d69e7b2f4 Author: markus schnalke AuthorDate: Wed Jan 4 21:04:56 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 4 21:04:56 2012 +0100 Various minor cleanups in sbr/m_convert.c. :100644 100644 2837e0f4... 1350c371... M sbr/m_convert.c commit 2c8265621a3526d1d6791d28bef778df49501a29 Author: markus schnalke AuthorDate: Wed Jan 4 19:36:08 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 4 19:36:08 2012 +0100 Removed the unused message flag: DELETED. Now we can store one user-defines seq more. :100644 100644 1f8a23c1... 73845a41... M h/mh.h commit 0f56dec07e0eda5042276a5e65cb51ea95c23ff9 Author: markus schnalke AuthorDate: Wed Jan 4 18:57:18 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 4 18:57:18 2012 +0100 s/ALLOW_NEW/ALLOW_BEYOND/ :100644 100644 b8896d1a... 1f8a23c1... M h/mh.h :100644 100644 6e6acd7e... 2837e0f4... M sbr/m_convert.c :100644 100644 8492dd91... 427d2dbc... M sbr/m_draft.c :100644 100644 e1cf0ff9... 69ecaf2d... M uip/mhpath.c commit 3cc8ed080f6e741b8df04a3ebe764c659e75cb38 Author: markus schnalke AuthorDate: Wed Jan 4 18:29:23 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 4 18:29:23 2012 +0100 Renamed all standard sequences (e.g. cur->c) and made them globally changeable The full list: cur -> c first -> f last -> l next -> n prev -> p all -> a new -> b (mnemonic: one beyond the last) They are globally changeable in config/config.c Could be that I'll add the old names again, as convenience aliases. :100644 100644 6a1e0b1d... 294352ae... M config/config.c :100644 100644 5d72178b... b8896d1a... M h/mh.h :100644 100644 cd588e4c... c2b59116... M sbr/folder_pack.c :100644 100644 3065941a... 6e6acd7e... M sbr/m_convert.c :100644 100644 77ea394a... 8492dd91... M sbr/m_draft.c :100644 100644 d8f019ab... 38bbdcf6... M sbr/seq_add.c :100644 100644 1e2e606a... a6cdbdaa... M sbr/seq_list.c :100644 100644 f9ed1b0e... a61dd9c0... M sbr/seq_nameok.c :100644 100644 26337c03... c1ac9fa7... M sbr/seq_read.c :100644 100644 0de8b970... f8668b0c... M sbr/seq_setcur.c :100644 100644 5de385f0... 7de86005... M uip/anno.c :100644 100644 66831c1b... 4c504859... M uip/burst.c :100644 100644 5b9a9f14... 7eee3f7e... M uip/comp.c :100644 100644 9ecfea17... 57393769... M uip/dist.c :100644 100644 31d01c1a... 847bb365... M uip/flist.c :100644 100644 7f829f09... 224bb034... M uip/folder.c :100644 100644 d51c57c7... 8dc26b79... M uip/forw.c :100644 100644 2914a44f... 79763ff2... M uip/mark.c :100644 100644 05f1b35c... ab8d99c1... M uip/mhbuildsbr.c :100644 100644 c12a6b98... 12480cf7... M uip/mhlist.c :100644 100644 73d5e133... e1cf0ff9... M uip/mhpath.c :100644 100644 a090e2e0... 5d5ac3e4... M uip/mhshow.c :100644 100644 8ce7d620... 2167a3fe... M uip/mhstore.c :100644 100644 1f6846bc... 0cfce9f8... M uip/mhtest.c :100644 100644 a7b35ba1... faf199c0... M uip/packf.c :100644 100644 e8720df5... e4d13704... M uip/pick.c :100644 100644 b85186a3... e699a144... M uip/refile.c :100644 100644 95b4f698... 3b490045... M uip/repl.c :100644 100644 f214f59a... 923f23ae... M uip/rmf.c :100644 100644 c1b1608c... 35983bd6... M uip/rmm.c :100644 100644 ea05cd2b... 478e4a69... M uip/scan.c :100644 100644 2847add2... eb678245... M uip/send.c :100644 100644 f279cded... 671a4419... M uip/show.c :100644 100644 59247c2b... 125991cc... M uip/sortm.c :100644 100644 ed5647ef... 0699fcee... M uip/whatnowsbr.c commit a7771fd2e83d64228fb675749fc936151249dbd3 Author: markus schnalke AuthorDate: Wed Jan 4 14:49:09 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 4 14:49:09 2012 +0100 Inverted the second arg of seq_setunseen(), to be more natural. :100644 100644 2bb09b94... e6283932... M sbr/seq_setunseen.c :100644 100644 f7121521... 6a756d98... M uip/inc.c :100644 100644 07a05a9b... a090e2e0... M uip/mhshow.c :100644 100644 b9342209... ba3cfccd... M uip/rcvstore.c :100644 100644 80d7e6bd... f279cded... M uip/show.c commit 4b48c047da7d65a6d8db0b88becccdf520bd1f9c Author: markus schnalke AuthorDate: Wed Jan 4 14:46:58 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 4 14:46:58 2012 +0100 Another fix for the strchr() transition: Check for NULL arguments. Is now the point to reintroduce the brkany() helper? Hmm... :100644 100644 da42d619... 32dd37f7... M sbr/brkstring.c commit db74c2bd004b2dc9bf8086a6d8bf773ac051f3cc Author: markus schnalke AuthorDate: Wed Jan 4 12:35:19 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 4 12:35:19 2012 +0100 Activated default sequence negation (exclamation mark). :100644 100644 ae8e7e9d... 053213a7... M man/mh-profile.man5 :100644 100644 b96230ea... 98564e0d... M man/mh-sequence.man7 :100644 100644 05533f61... 3065941a... M sbr/m_convert.c commit c2360569e1d8d3678e294eb7c1354cb8bf7501c1 Author: markus schnalke AuthorDate: Wed Jan 4 12:04:44 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 4 12:04:44 2012 +0100 Activated a default unseen sequence; updated man pages to it. :100644 100644 feffaca6... ae8e7e9d... M man/mh-profile.man5 :100644 100644 eb54adc0... b96230ea... M man/mh-sequence.man7 :100644 100644 b18de5d2... 2bb09b94... M sbr/seq_setunseen.c :100644 100644 d2a04903... 31d01c1a... M uip/flist.c :100644 100644 7a5a06b6... 2ac56d63... M uip/new.c :100644 100644 69c2da97... ea05cd2b... M uip/scan.c commit 909cdf33782fb9803b8e18f7f378bfcec21e4b15 Author: markus schnalke AuthorDate: Wed Jan 4 11:16:12 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 4 11:16:12 2012 +0100 Fixed bug in brkstring(), newly introduced by the switch to strchr(). strchr() treats the trailing null byte surprisingly: ``The terminating null byte is considered to be part of the string.'' :100644 100644 68c7b703... da42d619... M sbr/brkstring.c commit 83bc095e820728da7dfe22d2f95962660c79de03 Author: markus schnalke AuthorDate: Wed Jan 4 10:06:51 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 4 10:06:51 2012 +0100 Globally defined the names for the standard sequences. I'll rework the whole code to use them and not have hard-coded names anymore. The `new' sequence will be called `beyond' sequence (`b') from now on. The `unseen' sequence will be set by default to `u' from now on. The sequence negation will be set by default to `!' from now on. :100644 100644 fb216021... 6a1e0b1d... M config/config.c :100644 100644 12bb9852... 5d72178b... M h/mh.h commit b25e57753f3f4fb3fdde4240e0f617ef8dbea043 Author: markus schnalke AuthorDate: Wed Jan 4 09:54:43 2012 +0100 Commit: markus schnalke CommitDate: Wed Jan 4 09:54:43 2012 +0100 sbr/brkstring.c: replaced static brkany() with call to strchr(); plus cleanups :100644 100644 4e71ab54... 68c7b703... M sbr/brkstring.c commit 026d896175424fed9b9d87c93b6c2fa49f0dc7ec Author: markus schnalke AuthorDate: Tue Jan 3 07:14:24 2012 +0100 Commit: markus schnalke CommitDate: Tue Jan 3 07:14:24 2012 +0100 Fixed minor typo in man page. :100644 100644 0cfb552b... eb54adc0... M man/mh-sequence.man7 commit c840e9f3c212b901300df2a8ec12fd359fb85a7f Author: markus schnalke AuthorDate: Tue Jan 3 06:41:27 2012 +0100 Commit: markus schnalke CommitDate: Tue Jan 3 06:41:27 2012 +0100 Removed remaining lines from the --with-pager=... removal, months ago. :100644 100644 b3fa70ad... 0d3dc69e... M configure.ac commit 40821f5c1316e9205a08375e7075909cc9968e7d Author: markus schnalke AuthorDate: Tue Jan 3 06:36:30 2012 +0100 Commit: markus schnalke CommitDate: Tue Jan 3 06:36:30 2012 +0100 s/vfork/fork/ I truly believe that vfork is wrong. Forking should not be too slow for us. :100644 100644 467718b0... 771d5589... M sbr/ext_hook.c :100644 100644 4950330a... d6e63b6c... M sbr/folder_delmsgs.c :100644 100644 d5d536ce... f064f773... M sbr/makedir.c :100644 100644 48f0b444... 55ba754e... M sbr/refile.c :100644 100644 3f23801f... 78eea645... M sbr/showfile.c :100644 100644 873b0e3a... 05f1b35c... M uip/mhbuildsbr.c :100644 100644 927d8454... 1764aa5f... M uip/mhlsbr.c :100644 100644 95f89121... 1ac7ea9a... M uip/mhparse.c :100644 100644 0136ca32... 8fed651f... M uip/mhshowsbr.c :100644 100644 a71a516e... e1f5e942... M uip/rcvtty.c :100644 100644 b63d0134... 2affe310... M uip/replsbr.c :100644 100644 42c2c21d... de00429e... M uip/sendsbr.c :100644 100644 cc163ac0... 8c55c06e... M uip/spost.c :100644 100644 82af31e8... ed5647ef... M uip/whatnowsbr.c commit 5b792c4424571f05bc2008e3109797d18d7d00d1 Author: markus schnalke AuthorDate: Tue Jan 3 06:16:30 2012 +0100 Commit: markus schnalke CommitDate: Tue Jan 3 06:16:30 2012 +0100 Relayouted all switch statements: case aligns with switch. Desired style is: switch (n) { case foo: ... } :100644 100644 77b6baa5... 4cc0006a... M sbr/addrsbr.c :100644 100644 e62aca83... 44542b53... M sbr/context_save.c :100644 100644 86211cf6... b788fefb... M sbr/cpydgst.c :100644 100644 4e563787... c7c519f3... M sbr/fmt_new.c :100644 100644 ac988833... 4f9bce0e... M sbr/fmt_scan.c :100644 100644 c28b4301... cdbf344d... M sbr/folder_read.c :100644 100644 919fd32d... af882d5f... M sbr/getans.c :100644 100644 586876a2... db509fcc... M sbr/m_getfld.c :100644 100644 d93ad265... 45bbecd4... M sbr/mf.c :100644 100644 2f5132f9... 9638f568... M sbr/mts.c :100644 100644 d664927b... 17c62eef... M sbr/push.c :100644 100644 72123038... fff8a84e... M sbr/readconfig.c :100644 100644 00647ddd... 48f0b444... M sbr/refile.c :100644 100644 3b7b50f7... 26337c03... M sbr/seq_read.c :100644 100644 289fa5dc... e07c847b... M uip/ali.c :100644 100644 19238676... 07c5e035... M uip/aliasbr.c :100644 100644 1d27a9e9... 5de385f0... M uip/anno.c :100644 100644 212d35cf... e8c03e17... M uip/annosbr.c :100644 100644 b835acb9... ad3c9987... M uip/ap.c :100644 100644 0e7c53a3... 66831c1b... M uip/burst.c :100644 100644 a256f712... 5b9a9f14... M uip/comp.c :100644 100644 30ff189b... 82dfdcc0... M uip/conflict.c :100644 100644 27be4a54... 9ecfea17... M uip/dist.c :100644 100644 319e496a... 396aca8d... M uip/distsbr.c :100644 100644 a5accf53... d5f0c599... M uip/dp.c :100644 100644 15cee8fb... cc668cdb... M uip/dropsbr.c :100644 100644 adda2944... 160daaff... M uip/fmtdump.c :100644 100644 e2191096... 7f829f09... M uip/folder.c :100644 100644 3ce0b216... d51c57c7... M uip/forw.c :100644 100644 7d6d72b4... f82f51b9... M uip/ftpsbr.c :100644 100644 c365470f... 13ab1534... M uip/mhcachesbr.c :100644 100644 6918e0e3... dd1277c8... M uip/mhfree.c :100644 100644 ecd6bacd... e11cf5dc... M uip/mhlistsbr.c :100644 100644 7bce5da2... 927d8454... M uip/mhlsbr.c :100644 100644 ebe8b764... a013ecb8... M uip/mhmail.c :100644 100644 85177811... 939275f6... M uip/mhoutsbr.c :100644 100644 6c28e192... 5cf7881c... M uip/mhparam.c :100644 100644 3aeb3511... 95f89121... M uip/mhparse.c :100644 100644 5009a2fe... 73d5e133... M uip/mhpath.c :100644 100644 7f3ef703... 0136ca32... M uip/mhshowsbr.c :100644 100644 14963b56... 0afcc995... M uip/mhstoresbr.c :100644 100644 7b29b54c... 36edccb4... M uip/msgchk.c :100644 100644 c4026ba4... 7a5a06b6... M uip/new.c :100644 100644 9bb61f50... a7b35ba1... M uip/packf.c :100644 100644 ffacb5db... e021055e... M uip/picksbr.c :100644 100644 5b2131ce... db61fb34... M uip/prompter.c :100644 100644 24cf48b7... 077f912c... M uip/rcvdist.c :100644 100644 84fcc26d... f9687d8f... M uip/rcvpack.c :100644 100644 20274e76... a71a516e... M uip/rcvtty.c :100644 100644 ff936bc0... 95b4f698... M uip/repl.c :100644 100644 1bdab9e9... b63d0134... M uip/replsbr.c :100644 100644 36c1eed2... f214f59a... M uip/rmf.c :100644 100644 5cac6264... 69c2da97... M uip/scan.c :100644 100644 8a07418a... 6eca9314... M uip/scansbr.c :100644 100644 051e357c... 2847add2... M uip/send.c :100644 100644 15344024... 42c2c21d... M uip/sendsbr.c :100644 100644 757b0018... 80d7e6bd... M uip/show.c :100644 100644 ac9225b1... 2ac93d1d... M uip/slocal.c :100644 100644 262e84db... cc163ac0... M uip/spost.c :100644 100644 007adb36... ccb149c8... M uip/viamail.c :100644 100644 aefe67f5... 82af31e8... M uip/whatnowsbr.c commit 8e5be81f784682822f5e868c1bf3c8624682bd23 Author: markus schnalke AuthorDate: Mon Jan 2 14:54:05 2012 +0100 Commit: markus schnalke CommitDate: Mon Jan 2 14:54:05 2012 +0100 Removed ``Face'' support in mhl. It appears to be about `Face:' headers, but neither Jerry Peek, nor Ken Hornstein knew more. :100644 100644 54fea67d... fb216021... M config/config.c :100644 100644 56ce885a... 12bb9852... M h/mh.h :100644 100644 3cc8b7b0... 72123038... M sbr/readconfig.c :100644 100644 2cd7c8fb... 7bce5da2... M uip/mhlsbr.c :100644 100644 d9ba2a37... 6c28e192... M uip/mhparam.c commit fd00a3b030ab9d854eac79641f7bf25e6538acc1 Author: markus schnalke AuthorDate: Mon Jan 2 11:50:35 2012 +0100 Commit: markus schnalke CommitDate: Mon Jan 2 11:50:35 2012 +0100 Removed references to unused default procs and commented config/config.c :100644 100644 9add9e29... 54fea67d... M config/config.c :100644 100644 0c0d81fa... 56ce885a... M h/mh.h :100644 100644 63633fde... feffaca6... M man/mh-profile.man5 :100644 100644 a557cda7... 3cc8b7b0... M sbr/readconfig.c :100644 100644 dc122add... d9ba2a37... M uip/mhparam.c commit 6c75e2f0f00732488aa03b967713d95037edd895 Author: markus schnalke AuthorDate: Mon Jan 2 11:20:00 2012 +0100 Commit: markus schnalke CommitDate: Mon Jan 2 11:20:00 2012 +0100 Removed the configuration option NOPUBLICSEQ. You can change it still, by setting mh_seq to NULL in config/config.c. :100644 100644 3f9d1061... 9add9e29... M config/config.c :100644 100644 1c231dd6... 3b7b50f7... M sbr/seq_read.c commit f12a3e5036a986f579b80861f4421bcb86f84cee Author: markus schnalke AuthorDate: Mon Jan 2 10:57:24 2012 +0100 Commit: markus schnalke CommitDate: Mon Jan 2 10:57:24 2012 +0100 Renames: s/+outbox/+sent/ and s/cc:/Cc:/ IMO ``sent'' specifies more exactly what it contains. ``outbox'' would mean to me that these messages are prepared for delivery, but are not already sent. :100644 100644 7f255ea5... 585814bf... M etc/components :100644 100644 d30819a1... aac13547... M etc/distcomps :100644 100644 7f255ea5... 585814bf... M etc/forwcomps :100644 100644 7f8a5672... 8533744d... M etc/mhl.format :100644 100644 82b4ebc7... a24462fe... M etc/mhl.forward :100644 100644 795eab2c... 995dbf52... M etc/mhl.headers :100644 100644 13fe8082... 872ffc08... M etc/rcvdistcomps.outbox :100644 100644 91664113... 2520c8e3... M etc/replcomps :100644 100644 210a3e00... ff09c06b... M etc/replgroupcomps :100644 100644 7b46eaa8... 59bcd19b... M man/dist.man1 :100644 100644 80021df7... 7f5d73d1... M man/mh-format.man5 :100644 100644 2f296402... 34d983cb... M man/mh-mail.man5 :100644 100644 9a78e021... 280782e4... M man/mhbuild.man1 :100644 100644 ba2edcbc... 33c237e5... M man/mhmail.man1 :100644 100644 50dd103a... 139f6f6d... M man/pick.man1 :100644 100644 6c58c14e... 14c3ae77... M man/post.man8 :100644 100644 3f52d6c1... accb38e8... M man/repl.man1 :100644 100644 c5bec46a... a1a134ac... M man/send.man1 :100644 100644 1dece262... 8e783744... M test/tests/mhbuild/test-forw :100644 100644 ded61947... 2cd7c8fb... M uip/mhlsbr.c :100644 100644 037246dd... ebe8b764... M uip/mhmail.c :100644 100644 fde41074... ac9225b1... M uip/slocal.c :100644 100644 76b68a4e... 262e84db... M uip/spost.c commit 0b5de876d3d1f915e6485a249f3e65749b437709 Author: markus schnalke AuthorDate: Mon Jan 2 10:20:49 2012 +0100 Commit: markus schnalke CommitDate: Mon Jan 2 10:20:49 2012 +0100 Updated INSTALL and changed `nmh' strings to `mmh' :100644 100644 179d11d7... 7d86fe30... M INSTALL :100755 100755 61d9637a... 5a9628c2... M config/version.sh :100644 100644 35d1b2d7... b3fa70ad... M configure.ac commit 5aaedc4256d58afe2481d667afdcb5162a914ba9 Author: markus schnalke AuthorDate: Fri Dec 23 12:09:55 2011 +0100 Commit: markus schnalke CommitDate: Fri Dec 23 12:09:55 2011 +0100 Reworked the man page system and some man page contents (mmh-intro). Now it's possible to have two equally named pages in two different sections. This appeared to be interesting for mmh(X), but I don't use it now. Let's see if we keep the new system or even rework it to become simpler. :100644 100644 6cdc7b62... 15199ba1... M .gitignore :100644 100644 e4add418... de3c254a... M man/Makefile.in :100644 100644 b0d47128... b0d47128... R100 man/ali.man man/ali.man1 :100644 100644 65db87ef... 65db87ef... R100 man/anno.man man/anno.man1 :100644 100644 0a5ac5a8... 0a5ac5a8... R100 man/ap.man man/ap.man8 :100644 100644 5569f750... 5569f750... R100 man/burst.man man/burst.man1 :100644 100644 0b080edf... a9e75da1... R099 man/comp.man man/comp.man1 :100644 100644 fc2f8d79... fc2f8d79... R100 man/conflict.man man/conflict.man8 :100644 100644 89b8537b... 7b46eaa8... R099 man/dist.man man/dist.man1 :100644 100644 27428068... 27428068... R100 man/dp.man man/dp.man8 :100644 100644 def7b904... f505ba8d... R098 man/flist.man man/flist.man1 :100644 100644 fbc6b9be... fbc6b9be... R100 man/flists.man man/flists.man1 :100644 100644 d8e5a68d... 55f9b99a... R097 man/fmtdump.man man/fmtdump.man8 :100644 100644 7529017e... 7529017e... R100 man/fnext.man man/fnext.man1 :100644 100644 4858486e... 4858486e... R100 man/folder.man man/folder.man1 :100644 100644 7c3e32aa... 7c3e32aa... R100 man/folders.man man/folders.man1 :100644 100644 0e79cfeb... 46dd70b1... R099 man/forw.man man/forw.man1 :100644 100644 7529017e... 7529017e... R100 man/fprev.man man/fprev.man1 :100644 100644 1dc95890... 1dc95890... R100 man/inc.man man/inc.man1 :100644 100644 71b24f63... 24d84ff9... R099 man/mark.man man/mark.man1 :100644 100644 c8368beb... c8368beb... R100 man/mh-alias.man man/mh-alias.man5 :100644 100644 3a1ffa2b... 3a1ffa2b... R100 man/mh-chart.man man/mh-chart.man1 :100644 100644 70e988fd... eebae889... R097 man/mh-draft.man man/mh-draft.man7 :100644 100644 80021df7... 80021df7... R100 man/mh-format.man man/mh-format.man5 :100644 100644 2f296402... 2f296402... R100 man/mh-mail.man man/mh-mail.man5 :100644 100644 43c3f2ed... 63633fde... R099 man/mh-profile.man man/mh-profile.man5 :100644 100644 ecb65026... 0cfb552b... R099 man/mh-sequence.man man/mh-sequence.man7 :100644 100644 0cf54dde... 0cf54dde... R100 man/mh-tailor.man man/mh-tailor.man5 :100644 100644 9a78e021... 9a78e021... R100 man/mhbuild.man man/mhbuild.man1 :100644 100644 ddde3392... ddde3392... R100 man/mhl.man man/mhl.man1 :100644 100644 b99de6c9... b99de6c9... R100 man/mhlist.man man/mhlist.man1 :100644 100644 ba2edcbc... ba2edcbc... R100 man/mhmail.man man/mhmail.man1 :100644 100644 11cac870... 11cac870... R100 man/mhparam.man man/mhparam.man1 :100644 100644 3cdcf501... 3cdcf501... R100 man/mhpath.man man/mhpath.man1 :100644 100644 1d5d99d7... 1d5d99d7... R100 man/mhshow.man man/mhshow.man1 :100644 100644 acf36947... acf36947... R100 man/mhstore.man man/mhstore.man1 :100644 100644 2006cf28... bddbda91... R071 man/nmh.man man/mmh-intro.man7 :100644 100644 c8d76324... 82117deb... R090 man/mmh.man man/mmh.man1 :100644 100644 1b9843b6... 1b9843b6... R100 man/msgchk.man man/msgchk.man1 :100644 100644 9d534fd1... 9d534fd1... R100 man/mts.conf.man man/mts.conf.man5 :100644 100644 8bfc5d8d... 8bfc5d8d... R100 man/new.man man/new.man1 :100644 100644 c32689a0... c32689a0... R100 man/next.man man/next.man1 :100644 100644 f0e6a3d9... f0e6a3d9... R100 man/packf.man man/packf.man1 :100644 100644 50dd103a... 50dd103a... R100 man/pick.man man/pick.man1 :100644 100644 6c58c14e... 6c58c14e... R100 man/post.man man/post.man8 :100644 100644 7cdb8e43... 7cdb8e43... R100 man/prev.man man/prev.man1 :100644 100644 aa7b4fcc... aa7b4fcc... R100 man/prompter.man man/prompter.man1 :100644 100644 3653f472... 3653f472... R100 man/rcvdist.man man/rcvdist.man1 :100644 100644 ca00d6b2... ca00d6b2... R100 man/rcvpack.man man/rcvpack.man1 :100644 100644 a14b5ab6... cbc21272... R098 man/rcvstore.man man/rcvstore.man1 :100644 100644 f098b218... f098b218... R100 man/rcvtty.man man/rcvtty.man1 :100644 100644 f50eacd8... 036baab5... R099 man/refile.man man/refile.man1 :100644 100644 9aa9fd4c... 3f52d6c1... R099 man/repl.man man/repl.man1 :100644 100644 ee294510... ee294510... R100 man/rmf.man man/rmf.man1 :100644 100644 0cf138fa... 0cf138fa... R100 man/rmm.man man/rmm.man1 :100644 100644 a4007d35... a4007d35... R100 man/scan.man man/scan.man1 :100644 100644 b27ecc00... c5bec46a... R099 man/send.man man/send.man1 :100644 100644 a2bf7beb... a2bf7beb... R100 man/sendfiles.man man/sendfiles.man1 :100644 100644 3310d2f5... 3310d2f5... R100 man/show.man man/show.man1 :100644 100644 cc822f0e... cc822f0e... R100 man/slocal.man man/slocal.man1 :100644 100644 8932d646... 8932d646... R100 man/sortm.man man/sortm.man1 :100644 100644 7529017e... 7529017e... R100 man/unseen.man man/unseen.man1 :100644 100644 7e2020e6... d1c5846a... R099 man/whatnow.man man/whatnow.man1 :100644 100644 9315b12b... 27aa5976... M man/whom.man commit 2676fdf95667cfa0fec45372dbb956c8645c1119 Author: markus schnalke AuthorDate: Fri Dec 23 09:00:59 2011 +0100 Commit: markus schnalke CommitDate: Fri Dec 23 09:00:59 2011 +0100 Be quiet! Only talk if you have something useful to say. :100644 100644 721cacb7... 1216177e... M etc/Makefile.in commit cba433a5b67a0eeb8b42663cd6be7d763505462e Author: markus schnalke AuthorDate: Fri Dec 23 08:32:41 2011 +0100 Commit: markus schnalke CommitDate: Fri Dec 23 08:32:41 2011 +0100 Adjusted Makefile to the rename: etc/scan.default -> etc/scan.nmh :100644 100644 e37b5f0d... 721cacb7... M etc/Makefile.in commit 363190329760d38060e89956206583831b0d084d Author: markus schnalke AuthorDate: Fri Dec 23 08:32:08 2011 +0100 Commit: markus schnalke CommitDate: Fri Dec 23 08:32:08 2011 +0100 Updated all man pages and renamed install-mh.man to mmh.man. :100644 100644 b23fb6bf... e4add418... M man/Makefile.in :100644 100644 4dbff4e0... b0d47128... M man/ali.man :100644 100644 1436f739... 65db87ef... M man/anno.man :100644 100644 30e5fb8a... 0a5ac5a8... M man/ap.man :100644 100644 d7e28d57... 5569f750... M man/burst.man :100644 100644 1e0c9f8a... 0b080edf... M man/comp.man :100644 100644 4f0ff85b... 89b8537b... M man/dist.man :100644 100644 e31e6264... 27428068... M man/dp.man :100644 100644 66f2f854... def7b904... M man/flist.man :100644 100644 00127e66... d8e5a68d... M man/fmtdump.man :100644 100644 9fffec63... 4858486e... M man/folder.man :100644 100644 e5c25c90... 0e79cfeb... M man/forw.man :100644 100644 817d98f6... 1dc95890... M man/inc.man :100644 000000 094ec4cd... 00000000... D man/install-mh.man :100644 100644 9b9766df... 71b24f63... M man/mark.man :100644 100644 35ff88f0... c8368beb... M man/mh-alias.man :100644 100644 a630b76e... 3a1ffa2b... M man/mh-chart.man :100644 100644 bd841660... 70e988fd... M man/mh-draft.man :100644 100644 48e4b6b3... 43c3f2ed... M man/mh-profile.man :100644 100644 12fdb1ca... ecb65026... M man/mh-sequence.man :100644 100644 b0af8810... 9a78e021... M man/mhbuild.man :100644 100644 d824b471... ddde3392... M man/mhl.man :100644 100644 f0ef31a8... b99de6c9... M man/mhlist.man :100644 100644 b5617814... 11cac870... M man/mhparam.man :100644 100644 e04c4a3f... 3cdcf501... M man/mhpath.man :100644 100644 27ebd95e... 1d5d99d7... M man/mhshow.man :100644 100644 af05bf2b... acf36947... M man/mhstore.man :000000 100644 00000000... c8d76324... A man/mmh.man :100644 100644 fd2b0f5f... 1b9843b6... M man/msgchk.man :100644 100644 5be7983f... 8bfc5d8d... M man/new.man :100644 100644 613b5003... c32689a0... M man/next.man :100644 100644 b3d3a290... 2006cf28... M man/nmh.man :100644 100644 cdc4ee69... f0e6a3d9... M man/packf.man :100644 100644 c5ef463f... 50dd103a... M man/pick.man :100644 100644 b99ed0de... 6c58c14e... M man/post.man :100644 100644 4703caed... 7cdb8e43... M man/prev.man :100644 100644 623abba6... aa7b4fcc... M man/prompter.man :100644 100644 f24ea8e5... 3653f472... M man/rcvdist.man :100644 100644 010e2381... a14b5ab6... M man/rcvstore.man :100644 100644 cfbf616b... f50eacd8... M man/refile.man :100644 100644 80096eb2... 9aa9fd4c... M man/repl.man :100644 100644 22c00463... ee294510... M man/rmf.man :100644 100644 0f8b5cee... 0cf138fa... M man/rmm.man :100644 100644 fb72ac3d... a4007d35... M man/scan.man :100644 100644 c1deede3... b27ecc00... M man/send.man :100644 100644 39a867a9... a2bf7beb... M man/sendfiles.man :100644 100644 b2b9dc94... 3310d2f5... M man/show.man :100644 100644 283cf124... 8932d646... M man/sortm.man :100644 100644 3f2c6f8e... 7e2020e6... M man/whatnow.man :100644 100644 6a5a9015... 9315b12b... M man/whom.man commit 849bead2b2f3f202280353636716ec7e83fc5645 Author: markus schnalke AuthorDate: Fri Dec 23 08:13:22 2011 +0100 Commit: markus schnalke CommitDate: Fri Dec 23 08:13:22 2011 +0100 Unimportant stuff. :100644 100644 a3dc4a2e... 6cdc7b62... M .gitignore :100644 100644 e7d7da8e... 5a38030f... M sbr/context_foil.c commit f387b393dfab5cb5c00974b1807e8633531e0774 Author: markus schnalke AuthorDate: Fri Dec 23 08:12:20 2011 +0100 Commit: markus schnalke CommitDate: Fri Dec 23 08:12:20 2011 +0100 Replaced C program `install-mh' by shell script `mmh'. It is updated to the separated directories. :100644 100644 f3a4caaa... a3dc4a2e... M .gitignore :100644 100644 d92d27a4... ee096aa0... M uip/Makefile.in :100644 000000 d5c16d9e... 00000000... D uip/install-mh.c :000000 100755 00000000... cb27ae82... A uip/mmh.sh commit 7030d7edb099bff36ded7548bb5380f7acab4f9b Author: markus schnalke AuthorDate: Fri Dec 23 08:00:58 2011 +0100 Commit: markus schnalke CommitDate: Fri Dec 23 08:00:58 2011 +0100 Split nmh dir into mmh dir (~/.mmh) and mail storage (~/Mail). The profile (~/.mh_profile) became (~/.mmh/profile). The idea was to separate the configuration files and the data (= messages). The environment variables changed accordingly: MH -> MMHP (profile) MHCONTEXT -> MMHC (context) new: MMH (mmh dir) mh-install is not adjusted, yet. :100644 100644 2bcc4359... 3f9d1061... M config/config.c :100644 100644 8ca6c441... 0c0d81fa... M h/mh.h :100644 100644 6ca9a3d6... 1e795b05... M sbr/context_read.c :100644 100644 fd05f346... e5576b89... M sbr/path.c :100644 100644 5bbd9fcd... dc122add... M uip/mhparam.c commit 8971a6f1301b3220c4d4b7e729772420cfcd2b53 Author: markus schnalke AuthorDate: Tue Dec 13 14:20:32 2011 +0100 Commit: markus schnalke CommitDate: Tue Dec 13 14:20:32 2011 +0100 Fixed bug, reported by Phil: Profile entry Draft-Folder was case sensitive. The components in the profile should be matched case*in*sensitive, always. :100644 100644 ef43bdee... a557cda7... M sbr/readconfig.c commit a3ba584be2a9daf451bbe3c488d73703d14e8d53 Author: markus schnalke AuthorDate: Tue Dec 13 14:19:40 2011 +0100 Commit: markus schnalke CommitDate: Tue Dec 13 14:19:40 2011 +0100 Cleanup in m_draft. There was some confusingly unnecessary code. :100644 100644 38584e4a... 77ea394a... M sbr/m_draft.c commit 8758071f649ab5b469ca183a8c011d44e41951e2 Author: markus schnalke AuthorDate: Tue Dec 13 13:10:15 2011 +0100 Commit: markus schnalke CommitDate: Tue Dec 13 13:10:15 2011 +0100 Minor change in output message :100644 100644 df81839d... 77b6baa5... M sbr/addrsbr.c commit fce8a87e8a4a443a08a98b24eef270451a63fab8 Author: markus schnalke AuthorDate: Mon Dec 12 14:09:44 2011 +0100 Commit: markus schnalke CommitDate: Mon Dec 12 14:09:44 2011 +0100 Removed the global alias file Either use personal alias files or the MTA alias file. :100644 100644 83ea0aed... 2bcc4359... M config/config.c :100644 000000 e8455db2... 00000000... D etc/MailAliases :100644 100644 c3265770... e37b5f0d... M etc/Makefile.in :100644 100644 c38223a8... 1e053356... M h/aliasbr.h :100644 100644 772e967f... 4dbff4e0... M man/ali.man :100644 100644 fc9cc993... fc2f8d79... M man/conflict.man :100644 100644 2087aea9... 35ff88f0... M man/mh-alias.man :100644 100644 bed0a555... b5617814... M man/mhparam.man :100644 100644 c90b4ee7... b99ed0de... M man/post.man :100644 100644 2edb7da1... c1deede3... M man/send.man :100644 100644 c054dcf2... 6a5a9015... M man/whom.man :100644 100644 a4ab2950... 289fa5dc... M uip/ali.c :100644 100644 43a0e1b6... 19238676... M uip/aliasbr.c :100644 100644 5710aab8... 30ff189b... M uip/conflict.c :100644 100644 0679ac6b... 76b68a4e... M uip/spost.c commit b4c29794c12099556151d93a860ee51badae2e35 Author: markus schnalke AuthorDate: Mon Dec 12 13:38:51 2011 +0100 Commit: markus schnalke CommitDate: Mon Dec 12 13:38:51 2011 +0100 Moved etcpath() from config/config.c to sbr/path.c :100644 100644 e282b257... 83ea0aed... M config/config.c :100644 100644 ca3595a1... fd05f346... M sbr/path.c commit ff99b7b6299a8ebe433a31f7bf15b158e9dcdea8 Author: markus schnalke AuthorDate: Fri Dec 9 22:12:34 2011 +0100 Commit: markus schnalke CommitDate: Fri Dec 9 22:12:34 2011 +0100 Code cosmetic :100644 100644 676ff236... a256f712... M uip/comp.c commit c20e315f9fb9f0f0955749726dbf4fd897cd9f48 Author: markus schnalke AuthorDate: Fri Dec 9 21:56:44 2011 +0100 Commit: markus schnalke CommitDate: Fri Dec 9 21:56:44 2011 +0100 Adjusted the default scan listing: remove the body preview The original listing is still available as etc/scan.nmh :100644 100644 f898e86c... a59116cf... R053 etc/scan.default etc/scan.nmh :100644 100644 45dd1fee... f7a8e37b... M h/scansbr.h commit 7a5e53498290dc876ee21feff9611c4640fabec4 Author: markus schnalke AuthorDate: Fri Dec 9 21:26:54 2011 +0100 Commit: markus schnalke CommitDate: Fri Dec 9 21:26:54 2011 +0100 Code cosmetics :100644 100644 7454666f... e282b257... M config/config.c commit 7e3bc577e84e13a47005a706718bd6ec0e6a0e0a Author: markus schnalke AuthorDate: Fri Dec 9 18:44:19 2011 +0100 Commit: markus schnalke CommitDate: Fri Dec 9 18:44:19 2011 +0100 We have `NULL' in order to not need to write `(char *)0' anymore. :100644 100644 2fba8974... 35d1b2d7... M configure.ac :100644 100644 57653ea2... 6ca9a3d6... M sbr/context_read.c :100644 100644 a4b09343... 467718b0... M sbr/ext_hook.c :100644 100644 391f5c81... 7a4a9826... M sbr/folder_addmsg.c :100644 100644 e9257bd7... 4950330a... M sbr/folder_delmsgs.c :100644 100644 034aa12a... 212d35cf... M uip/annosbr.c :100644 100644 fc2f7111... 0e7c53a3... M uip/burst.c :100644 100644 1834c920... f7121521... M uip/inc.c :100644 100644 615ac71f... d5c16d9e... M uip/install-mh.c :100644 100644 44fd19aa... 14963b56... M uip/mhstoresbr.c :100644 100644 99ec48c5... b9342209... M uip/rcvstore.c :100644 100644 10a4a103... 36c1eed2... M uip/rmf.c :100644 100644 a9ae46d7... 051e357c... M uip/send.c :100644 100644 8d85559a... 15344024... M uip/sendsbr.c :100644 100644 0d8e39da... 59247c2b... M uip/sortm.c :100644 100644 3fff44a4... 007adb36... M uip/viamail.c :100644 100644 032566e2... aefe67f5... M uip/whatnowsbr.c commit 246ca516a0f7b870316116bc184347b0fb2bc00b Author: markus schnalke AuthorDate: Fri Dec 9 18:34:39 2011 +0100 Commit: markus schnalke CommitDate: Fri Dec 9 18:34:39 2011 +0100 Removed void casts for ignored return values of function calls. IMO, this distracts from the important without being much worth. :100644 100644 4f744997... 57653ea2... M sbr/context_read.c :100644 100644 423384a0... 391f5c81... M sbr/folder_addmsg.c :100644 100644 ac93068d... e9257bd7... M sbr/folder_delmsgs.c :100644 100644 5280e30a... cd588e4c... M sbr/folder_pack.c :100644 100644 14f2242a... 3fd4528e... M sbr/getpass.c :100644 100644 e48f7d9f... 034aa12a... M uip/annosbr.c :100644 100644 ec507086... fc2f7111... M uip/burst.c :100644 100644 54eb70ef... 1834c920... M uip/inc.c :100644 100644 30ac8f6c... 615ac71f... M uip/install-mh.c :100644 100644 3808f548... 10a4a103... M uip/rmf.c :100644 100644 a8e09641... 8d85559a... M uip/sendsbr.c :100644 100644 0caab302... 0d8e39da... M uip/sortm.c :100644 100644 86878154... 032566e2... M uip/whatnowsbr.c commit 552fd7253e5ee9e554c5c7a8248a6322aa4363bb Author: markus schnalke AuthorDate: Fri Dec 9 18:21:27 2011 +0100 Commit: markus schnalke CommitDate: Fri Dec 9 18:21:27 2011 +0100 We don't want to use copy() anymore; but kept it for concat() only :100644 100644 b7d6bfbc... 5e5672ce... M h/prototypes.h :100644 100644 77809709... b42dd49b... M sbr/Makefile.in :100644 100644 4c3fcff3... 5c519e9f... M sbr/concat.c :100644 000000 80a1e549... 00000000... D sbr/copy.c :100644 100644 00104cfd... 3808f548... M uip/rmf.c commit 682962d94b21e120c78a52a8bdcb6aa994330a14 Author: markus schnalke AuthorDate: Fri Dec 9 18:11:10 2011 +0100 Commit: markus schnalke CommitDate: Fri Dec 9 18:11:10 2011 +0100 s/pfolder/curfolder/g :100644 100644 245ecdea... 7454666f... M config/config.c :100644 100644 4b846cf1... 8ca6c441... M h/mh.h :100644 100644 41328964... ca3595a1... M sbr/path.c :100644 100644 ec3590c4... 1d27a9e9... M uip/anno.c :100644 100644 b5414ad6... ec507086... M uip/burst.c :100644 100644 991f5cd1... 27be4a54... M uip/dist.c :100644 100644 d85ad61c... d2a04903... M uip/flist.c :100644 100644 70f497d3... e2191096... M uip/folder.c :100644 100644 3f940f7b... 3ce0b216... M uip/forw.c :100644 100644 2a866e92... 54eb70ef... M uip/inc.c :100644 100644 1fb68342... 30ac8f6c... M uip/install-mh.c :100644 100644 5fd27f66... 2914a44f... M uip/mark.c :100644 100644 b87e5221... c12a6b98... M uip/mhlist.c :100644 100644 35101207... 07a05a9b... M uip/mhshow.c :100644 100644 1fbd50e2... 8ce7d620... M uip/mhstore.c :100644 100644 df5985fa... 1f6846bc... M uip/mhtest.c :100644 100644 fc87b3a6... c4026ba4... M uip/new.c :100644 100644 b48a92d6... 9bb61f50... M uip/packf.c :100644 100644 2efac420... e8720df5... M uip/pick.c :100644 100644 32b7f15f... b85186a3... M uip/refile.c :100644 100644 058b5367... ff936bc0... M uip/repl.c :100644 100644 7d81a39b... 00104cfd... M uip/rmf.c :100644 100644 e599f6fd... c1b1608c... M uip/rmm.c :100644 100644 1276d5b1... 5cac6264... M uip/scan.c :100644 100644 977b0e41... 757b0018... M uip/show.c :100644 100644 5132c1f5... 0caab302... M uip/sortm.c commit cff0e16925e7edbd25b8b9d6d4fbdf03e0e60c01 Author: markus schnalke AuthorDate: Fri Dec 9 17:32:28 2011 +0100 Commit: markus schnalke CommitDate: Fri Dec 9 17:32:28 2011 +0100 "." is no longer an alias for "cur" Don't fear more typing, as "cur" will soon be cut down to "c", likewise the other predefined sequences. :100644 100644 a67305bb... 05533f61... M sbr/m_convert.c commit aa2bd5081731e83a2cedba6f7f2be61cde201e7d Author: markus schnalke AuthorDate: Fri Dec 9 17:17:50 2011 +0100 Commit: markus schnalke CommitDate: Fri Dec 9 17:17:50 2011 +0100 Removed the option to disable `~user' support (MHRC) :100644 100644 c8882cb4... f3d9ca34... M acconfig.h :100644 100644 cc121284... 245ecdea... M config/config.c commit d39e2c447b0d163a5a63f480b23d06edb7a73aa0 Author: markus schnalke AuthorDate: Fri Dec 9 16:34:57 2011 +0100 Commit: markus schnalke CommitDate: Fri Dec 9 16:34:57 2011 +0100 Completely reworked the path convertion functions Moved everything (from sbr/getfolder.c and sbr/m_maildir.c) into sbr/path.c, but actually replaced the code almost completely. See h/prototypes.h for the function changes. sbr/path.c provides explaining comments on the functions. None of them allocates memory automatically. Additionally: - Like for other ``files'', `inc -audit file' places file relative to the cwd, not relative to the mh-dir. This is for consistency. - Replaced add(foo, NULL) with getcpy(foo), which ist clearer. :100644 100644 24827e96... cc121284... M config/config.c :100644 100644 59b5c0f8... 4b846cf1... M h/mh.h :100644 100644 15031eab... b7d6bfbc... M h/prototypes.h :100644 100644 b581ec26... 817d98f6... M man/inc.man :100644 100644 ad54a951... 77809709... M sbr/Makefile.in :100644 100644 0995d4fa... 4f744997... M sbr/context_read.c :100644 100644 0e013abf... 80a1e549... M sbr/copy.c :100644 100644 222b490f... c28b4301... M sbr/folder_read.c :100644 000000 fc87e1e8... 00000000... D sbr/getfolder.c :100644 100644 df767ef2... 38584e4a... M sbr/m_draft.c :100644 000000 957e44b4... 00000000... D sbr/m_maildir.c :100644 100644 68f1a54e... 4a1eed17... M sbr/m_mktemp.c :100644 100644 3dd552c1... 41328964... M sbr/path.c :100644 100644 55be77c4... 1cd3dc93... M sbr/utils.c :100644 100644 66d8a0d4... ec3590c4... M uip/anno.c :100644 100644 44f6bfe9... b5414ad6... M uip/burst.c :100644 100644 95b5c94e... 676ff236... M uip/comp.c :100644 100644 d31c5c95... 991f5cd1... M uip/dist.c :100644 100644 aef291a6... d85ad61c... M uip/flist.c :100644 100644 735b5e79... 70f497d3... M uip/folder.c :100644 100644 666228b7... 3f940f7b... M uip/forw.c :100644 100644 9e6fb6f0... 2a866e92... M uip/inc.c :100644 100644 11f7bc56... 1fb68342... M uip/install-mh.c :100644 100644 03818f32... 5fd27f66... M uip/mark.c :100644 100644 50552656... bf6f646f... M uip/mhbuild.c :100644 100644 94c1ce73... 873b0e3a... M uip/mhbuildsbr.c :100644 100644 91affaa3... c365470f... M uip/mhcachesbr.c :100644 100644 92169a0a... b87e5221... M uip/mhlist.c :100644 100644 7830173b... ecd6bacd... M uip/mhlistsbr.c :100644 100644 6553ac35... 3aeb3511... M uip/mhparse.c :100644 100644 eb3b6182... 5009a2fe... M uip/mhpath.c :100644 100644 42e0ee06... 35101207... M uip/mhshow.c :100644 100644 0a527ad7... 7f3ef703... M uip/mhshowsbr.c :100644 100644 4a17547d... 1fbd50e2... M uip/mhstore.c :100644 100644 0fa70cac... 44fd19aa... M uip/mhstoresbr.c :100644 100644 454fa1d4... df5985fa... M uip/mhtest.c :100644 100644 c1ae0cc5... fc87b3a6... M uip/new.c :100644 100644 5e171475... b48a92d6... M uip/packf.c :100644 100644 f0dcec37... 2efac420... M uip/pick.c :100644 100644 f95ddbc3... ffacb5db... M uip/picksbr.c :100644 100644 5ed378a9... 99ec48c5... M uip/rcvstore.c :100644 100644 690b55b1... 32b7f15f... M uip/refile.c :100644 100644 fd92101f... 058b5367... M uip/repl.c :100644 100644 3b532e0e... 7d81a39b... M uip/rmf.c :100644 100644 b90b43e5... e599f6fd... M uip/rmm.c :100644 100644 80addfcc... 1276d5b1... M uip/scan.c :100644 100644 81633850... a9ae46d7... M uip/send.c :100644 100644 4670345c... a8e09641... M uip/sendsbr.c :100644 100644 fb517d12... 977b0e41... M uip/show.c :100644 100644 8b8d554c... fde41074... M uip/slocal.c :100644 100644 f9a4cff4... 5132c1f5... M uip/sortm.c :100644 100644 a5f88399... 86878154... M uip/whatnowsbr.c commit 6e8aba3714fe8ffc21dbb75ea9efdc41ab87b07f Author: markus schnalke AuthorDate: Mon Nov 21 11:29:03 2011 +0100 Commit: markus schnalke CommitDate: Mon Nov 21 11:29:03 2011 +0100 Cosmetic refactoring :100644 100644 ef391e67... d42c21b6... M sbr/m_name.c :100644 100644 1c13bb65... d5d536ce... M sbr/makedir.c commit 5048c3273f8780b3d73e81d0ea5b434f53a83f9f Author: markus schnalke AuthorDate: Sun Nov 20 21:19:43 2011 +0100 Commit: markus schnalke CommitDate: Sun Nov 20 21:19:43 2011 +0100 Cosmetic change :100644 100644 fd43a209... 03818f32... M uip/mark.c commit 70b12e63eda23f816d3c5330d2df4fb6c5b66a58 Author: markus schnalke AuthorDate: Sun Nov 20 21:17:44 2011 +0100 Commit: markus schnalke CommitDate: Sun Nov 20 21:17:44 2011 +0100 Cosmetic change :100644 100644 88cac063... aef291a6... M uip/flist.c commit 137b1ac9efd8d566e03708b74fe3f9d8d5c266f8 Author: markus schnalke AuthorDate: Sun Nov 20 21:14:29 2011 +0100 Commit: markus schnalke CommitDate: Sun Nov 20 21:14:29 2011 +0100 Added comment :100644 100644 99c55101... 55be77c4... M sbr/utils.c commit 8041c8a4001e576d7600efaaf6628a791263490d Author: markus schnalke AuthorDate: Sun Nov 20 21:13:07 2011 +0100 Commit: markus schnalke CommitDate: Sun Nov 20 21:13:07 2011 +0100 Simplification: Removed unnecessary variable :100644 100644 4d1feffb... df767ef2... M sbr/m_draft.c commit 3d78b9c80a95f4e7885ed607018f9b1b9be559b4 Author: markus schnalke AuthorDate: Sun Nov 20 12:38:17 2011 +0100 Commit: markus schnalke CommitDate: Sun Nov 20 12:38:17 2011 +0100 The existence of the profile entry Path is already enforced by context_read(). Hence, removed the obscure ``free(path("./", TFOLDER));'' calls. Still I don't see the sense in these lines, but they won't get executed, as the condition is checked before (and the program aborts then). Probably that's obsolete stuff that remained through several reworks. :100644 100644 3a0fa8cb... 66d8a0d4... M uip/anno.c :100644 100644 032c5b5c... 44f6bfe9... M uip/burst.c :100644 100644 9f0929d7... 95b5c94e... M uip/comp.c :100644 100644 131cda94... d31c5c95... M uip/dist.c :100644 100644 5d9dfcc3... 88cac063... M uip/flist.c :100644 100644 4fa9424b... 735b5e79... M uip/folder.c :100644 100644 002bb675... 666228b7... M uip/forw.c :100644 100644 d23bf32d... 9e6fb6f0... M uip/inc.c :100644 100644 d56a1615... fd43a209... M uip/mark.c :100644 100644 735a77e1... 50552656... M uip/mhbuild.c :100644 100644 5eb0937c... 92169a0a... M uip/mhlist.c :100644 100644 2281ba0e... eb3b6182... M uip/mhpath.c :100644 100644 bb7a8e71... 42e0ee06... M uip/mhshow.c :100644 100644 f61a5c02... 4a17547d... M uip/mhstore.c :100644 100644 581349f6... 454fa1d4... M uip/mhtest.c :100644 100644 727298cd... 5e171475... M uip/packf.c :100644 100644 69b94150... f0dcec37... M uip/pick.c :100644 100644 a120c665... 5ed378a9... M uip/rcvstore.c :100644 100644 34e55ce1... 690b55b1... M uip/refile.c :100644 100644 8d10e5d7... fd92101f... M uip/repl.c :100644 100644 94198d00... 3b532e0e... M uip/rmf.c :100644 100644 aca436a1... b90b43e5... M uip/rmm.c :100644 100644 4b0b3380... 80addfcc... M uip/scan.c :100644 100644 f7771558... 81633850... M uip/send.c :100644 100644 ceb90188... fb517d12... M uip/show.c :100644 100644 51518892... f9a4cff4... M uip/sortm.c commit cadeb41388928c84e39842b6a45d1bdce1773ad4 Author: markus schnalke AuthorDate: Sat Nov 5 19:07:47 2011 +0100 Commit: markus schnalke CommitDate: Sat Nov 5 19:07:47 2011 +0100 Code reformating. :100644 100644 5c1253d8... 99c55101... M sbr/utils.c commit 5bfae54a3c9f2be059454d04875ba66fcbf1e6d4 Author: markus schnalke AuthorDate: Sat Nov 5 18:40:23 2011 +0100 Commit: markus schnalke CommitDate: Sat Nov 5 18:40:23 2011 +0100 Improved pluspath() and used it instead of path() where appropriate. :100644 100644 39203157... 4d1feffb... M sbr/m_draft.c :100644 100644 b3a8fff5... 3dd552c1... M sbr/path.c :100644 100644 f391f617... 34e55ce1... M uip/refile.c :100644 100644 006cabea... 8d10e5d7... M uip/repl.c commit 32c2ca5c95ce1e43c158c28722097bcd2304eef2 Author: markus schnalke AuthorDate: Sat Nov 5 18:13:17 2011 +0100 Commit: markus schnalke CommitDate: Sat Nov 5 18:13:17 2011 +0100 Refactored sbr/getfolder.c :100644 100644 9a6b18bb... fc87e1e8... M sbr/getfolder.c commit 097c84b61603c4a4c5837f3dcc09c30a1e751702 Author: markus schnalke AuthorDate: Sat Nov 5 17:56:07 2011 +0100 Commit: markus schnalke CommitDate: Sat Nov 5 17:56:07 2011 +0100 Introduced FDEF and FCUR for speaking arguments to getfolder(). Maybe it would be better to two separate functions, but I cannot imagine good names for them ... :-( :100644 100644 2e3be95b... 59b5c0f8... M h/mh.h :100644 100644 95f72afb... 957e44b4... M sbr/m_maildir.c :100644 100644 8802eaa5... b3a8fff5... M sbr/path.c :100644 100644 b7c15636... 3a0fa8cb... M uip/anno.c :100644 100644 a8f42d0c... 032c5b5c... M uip/burst.c :100644 100644 7a493629... 9f0929d7... M uip/comp.c :100644 100644 5ff0d6cf... 131cda94... M uip/dist.c :100644 100644 4bf3f82c... 5d9dfcc3... M uip/flist.c :100644 100644 25ab068c... 4fa9424b... M uip/folder.c :100644 100644 13aaaa99... 002bb675... M uip/forw.c :100644 100644 c06c57c8... d23bf32d... M uip/inc.c :100644 100644 fa5c2cba... d56a1615... M uip/mark.c :100644 100644 23163f7e... 94c1ce73... M uip/mhbuildsbr.c :100644 100644 f33e39b0... 5eb0937c... M uip/mhlist.c :100644 100644 bce976dd... 2281ba0e... M uip/mhpath.c :100644 100644 ba5c037e... bb7a8e71... M uip/mhshow.c :100644 100644 7be91632... f61a5c02... M uip/mhstore.c :100644 100644 027dac65... 0fa70cac... M uip/mhstoresbr.c :100644 100644 17ca1ab7... 581349f6... M uip/mhtest.c :100644 100644 d4df05cf... 727298cd... M uip/packf.c :100644 100644 93a24006... 69b94150... M uip/pick.c :100644 100644 06b8b694... a120c665... M uip/rcvstore.c :100644 100644 a79e8be8... f391f617... M uip/refile.c :100644 100644 61ba08cf... 006cabea... M uip/repl.c :100644 100644 71fd017f... 94198d00... M uip/rmf.c :100644 100644 7f773401... aca436a1... M uip/rmm.c :100644 100644 b42d8a26... 4b0b3380... M uip/scan.c :100644 100644 b19f7627... ceb90188... M uip/show.c :100644 100644 ffe14f86... 51518892... M uip/sortm.c commit 64d621d6806432dabe5bd62282f17027bb08d418 Author: markus schnalke AuthorDate: Sat Nov 5 17:51:30 2011 +0100 Commit: markus schnalke CommitDate: Sat Nov 5 17:51:30 2011 +0100 Rearranged code in the file. :100644 100644 3b633d02... 8802eaa5... M sbr/path.c commit d318de52a08f7a84467a5e349b9b655b84ef6fca Author: markus schnalke AuthorDate: Sat Nov 5 17:35:13 2011 +0100 Commit: markus schnalke CommitDate: Sat Nov 5 17:35:13 2011 +0100 Refactoring in sbr/path.c. Especially: Replaced compath() with a more general packpath(). :100644 100644 b13c5fe6... 3b633d02... M sbr/path.c commit 240013872c392fe644bd4f79382d9f5314b4ea60 Author: markus schnalke AuthorDate: Sat Nov 5 14:04:02 2011 +0100 Commit: markus schnalke CommitDate: Sat Nov 5 14:04:02 2011 +0100 Renamed r1bindex() to mhbasename(), to make its function becomes clear. All calls to r1bindex() had '/' as second argument. For everything else one can use strrchr(3) instead of r1bindex(). :100644 100644 6200ea66... 15031eab... M h/prototypes.h :100644 100644 0cb7488a... ad54a951... M sbr/Makefile.in :100644 100644 db7bcec8... a4b09343... M sbr/ext_hook.c :100644 100644 77131b12... ac93068d... M sbr/folder_delmsgs.c :100644 100644 17f7ad59... 3749452b... M sbr/m_backup.c :100644 100644 c0c1a9c7... 68f1a54e... M sbr/m_mktemp.c :000000 100644 00000000... 038e506d... A sbr/mhbasename.c :100644 000000 49ac0f57... 00000000... D sbr/r1bindex.c :100644 100644 21d933c5... 00647ddd... M sbr/refile.c :100644 100644 c0d3608b... 3f23801f... M sbr/showfile.c :100644 100644 6b9dbf5f... a4ab2950... M uip/ali.c :100644 100644 a2cfc849... b7c15636... M uip/anno.c :100644 100644 41e990a1... b835acb9... M uip/ap.c :100644 100644 374eff52... a8f42d0c... M uip/burst.c :100644 100644 83b002a3... 7a493629... M uip/comp.c :100644 100644 909bbc8f... 5710aab8... M uip/conflict.c :100644 100644 89315c2c... 5ff0d6cf... M uip/dist.c :100644 100644 878e2c1c... a5accf53... M uip/dp.c :100644 100644 a857a1a8... 15cee8fb... M uip/dropsbr.c :100644 100644 a86d226c... 4bf3f82c... M uip/flist.c :100644 100644 2096c644... adda2944... M uip/fmtdump.c :100644 100644 ac931ce3... 25ab068c... M uip/folder.c :100644 100644 9ad28771... 13aaaa99... M uip/forw.c :100644 100644 186312ed... c06c57c8... M uip/inc.c :100644 100644 50854f0c... 11f7bc56... M uip/install-mh.c :100644 100644 bdd02ade... fa5c2cba... M uip/mark.c :100644 100644 e1ca05fb... 735a77e1... M uip/mhbuild.c :100644 100644 9ec8f5d9... f33e39b0... M uip/mhlist.c :100644 100644 2b32b643... 7830173b... M uip/mhlistsbr.c :100644 100644 c4e822b3... ded61947... M uip/mhlsbr.c :100644 100644 c7a7afaf... 037246dd... M uip/mhmail.c :100644 100644 575c7a7a... 5bbd9fcd... M uip/mhparam.c :100644 100644 db6f0ad9... 6553ac35... M uip/mhparse.c :100644 100644 6f53aba6... bce976dd... M uip/mhpath.c :100644 100644 ea66f32a... ba5c037e... M uip/mhshow.c :100644 100644 f79d42e6... 0a527ad7... M uip/mhshowsbr.c :100644 100644 dd5f5178... 7be91632... M uip/mhstore.c :100644 100644 8b2dc00a... 027dac65... M uip/mhstoresbr.c :100644 100644 621c701d... 17ca1ab7... M uip/mhtest.c :100644 100644 ffde2b49... 7b29b54c... M uip/msgchk.c :100644 100644 92366623... c1ae0cc5... M uip/new.c :100644 100644 14ecdaaf... d4df05cf... M uip/packf.c :100644 100644 040ebecd... 93a24006... M uip/pick.c :100644 100644 a75c5633... 5b2131ce... M uip/prompter.c :100644 100644 62ae2a85... 24cf48b7... M uip/rcvdist.c :100644 100644 e8934ca2... 84fcc26d... M uip/rcvpack.c :100644 100644 868ed47b... 06b8b694... M uip/rcvstore.c :100644 100644 1e2a3efc... 20274e76... M uip/rcvtty.c :100644 100644 b24e42eb... a79e8be8... M uip/refile.c :100644 100644 6893f569... 61ba08cf... M uip/repl.c :100644 100644 e26badd1... 1bdab9e9... M uip/replsbr.c :100644 100644 fff4abb7... 71fd017f... M uip/rmf.c :100644 100644 f8a1d236... 7f773401... M uip/rmm.c :100644 100644 03a260bd... b42d8a26... M uip/scan.c :100644 100644 2416baf9... f7771558... M uip/send.c :100644 100644 c7f4d447... 4670345c... M uip/sendsbr.c :100644 100644 f536af7c... b19f7627... M uip/show.c :100644 100644 2e7c257c... 8b8d554c... M uip/slocal.c :100644 100644 a5d0e118... ffe14f86... M uip/sortm.c :100644 100644 e87fcf1c... 0679ac6b... M uip/spost.c :100644 100644 bbae08b4... 3fff44a4... M uip/viamail.c :100644 100644 583f133c... 8d6830e4... M uip/whatnowproc.c :100644 100644 5a31a903... a5f88399... M uip/whatnowsbr.c commit c20b4fa14515c7ab388ce35411d89a7a92300711 Author: markus schnalke AuthorDate: Sat Nov 5 11:47:42 2011 +0100 Commit: markus schnalke CommitDate: Sat Nov 5 11:47:42 2011 +0100 Renamed ssequal() to isprefix(), because that's what it checks. :100644 100644 81c4801d... 6200ea66... M h/prototypes.h :100644 100644 65a62617... 0cb7488a... M sbr/Makefile.in :000000 100644 00000000... 33c06998... A sbr/isprefix.c :100644 100644 89da537d... a67305bb... M sbr/m_convert.c :100644 100644 b19415ab... b13c5fe6... M sbr/path.c :100644 100644 6f0c9816... 7924fbc7... M sbr/print_sw.c :100644 100644 141c1a2e... 1c231dd6... M sbr/seq_read.c :100644 000000 99b12498... 00000000... D sbr/ssequal.c :100644 100644 0f44555d... a86d226c... M uip/flist.c :100644 100644 06788b28... ac931ce3... M uip/folder.c :100644 100644 38a93ff8... fff4abb7... M uip/rmf.c :100644 100644 dc6d24e6... f536af7c... M uip/show.c commit 8529829823bebf483ab22fe8d24c96394647a298 Author: markus schnalke AuthorDate: Sat Nov 5 10:31:30 2011 +0100 Commit: markus schnalke CommitDate: Sat Nov 5 10:31:30 2011 +0100 Removed defines for obsolete BSD bcopy functions; Use getc() directly. :100644 100644 75d4d2a3... 26eb0a2b... M h/nmh.h :100644 100644 26707a27... 586876a2... M sbr/m_getfld.c commit 5d09b7206ae2602d3aedb2b552ef160b855d8054 Author: markus schnalke AuthorDate: Sat Nov 5 10:26:18 2011 +0100 Commit: markus schnalke CommitDate: Sat Nov 5 10:26:18 2011 +0100 We don't need macros for only putting two strings next to each other. :100644 100644 d72cd917... 24827e96... M config/config.c :100644 100644 3313aef2... 2f5132f9... M sbr/mts.c commit a2b61c58a3322ed9a1958b53d46ea8c844740e3f Author: markus schnalke AuthorDate: Sat Nov 5 09:43:56 2011 +0100 Commit: markus schnalke CommitDate: Sat Nov 5 09:43:56 2011 +0100 Removed references to bboards, as we don't support them anymore. :100644 100644 9057dde5... 2087aea9... M man/mh-alias.man :100644 100644 13e381cd... 48e4b6b3... M man/mh-profile.man commit ea9ebdabc3e32c94e906dfc1b8a85e78b1b68a77 Author: markus schnalke AuthorDate: Tue Nov 1 15:55:31 2011 +0100 Commit: markus schnalke CommitDate: Tue Nov 1 15:55:31 2011 +0100 Broke long lines. :100644 100644 ea7d5da8... 0995d4fa... M sbr/context_read.c commit 71b43c2803ffed08ec727c29d70a0d2de3ffb3f1 Author: markus schnalke AuthorDate: Tue Nov 1 09:29:08 2011 +0100 Commit: markus schnalke CommitDate: Tue Nov 1 09:29:08 2011 +0100 Don't call writev() anymore. It might be a sexy syscall, but it's not portable and more complex than the mainstream solution. For sexy source program, go elsewhere! :100644 100644 6a37f2fc... 2fba8974... M configure.ac :100644 100644 7db8d18c... d8313cec... M sbr/error.c commit a0b72ae951177e0262dbe9266582edbd83c9684e Author: markus schnalke AuthorDate: Tue Nov 1 09:10:19 2011 +0100 Commit: markus schnalke CommitDate: Tue Nov 1 09:10:19 2011 +0100 Removed outc(), which only called putchar(), while having the same signature. I substituted all outc() calls with calls to putchar(). :100644 100644 bb8a6077... 3c45eb28... M uip/termsbr.c commit 714b5c530ece27ea2835a313013f5b770163403c Author: markus schnalke AuthorDate: Tue Nov 1 09:05:30 2011 +0100 Commit: markus schnalke CommitDate: Tue Nov 1 09:05:30 2011 +0100 Removed the space between function names and the opening parenthesis. :100644 100644 5405531e... c38223a8... M h/aliasbr.h :100644 100644 e81acb17... afc249c2... M h/crawl_folders.h :100644 100644 2742ae6b... b32d316a... M h/dropsbr.h :100644 100644 f65dab1c... 96acd562... M h/fmt_scan.h :100644 100644 b5a78923... 373a6928... M h/mf.h :100644 100644 70bfee7b... 2e3be95b... M h/mh.h :100644 100644 bef3f4f8... 9d31c4ae... M h/mhparse.h :100644 100644 df1d9b5a... 5ddd837e... M h/mts.h :100644 100644 4ae127d7... 75d4d2a3... M h/nmh.h :100644 100644 d69825a1... 31b904ed... M h/picksbr.h :100644 100644 baf40d94... 81c4801d... M h/prototypes.h :100644 100644 bba2b449... 45dd1fee... M h/scansbr.h :100644 100644 645c340d... d805d192... M h/signals.h :100644 100644 77ccaa6e... 289a6732... M h/tws.h :100644 100644 c8eb0c81... df81839d... M sbr/addrsbr.c :100644 100644 6105a508... f2126b7e... M sbr/ambigsw.c :100644 100644 4496ae66... 4e71ab54... M sbr/brkstring.c :100644 100644 cba270d0... d11d7729... M sbr/check_charset.c :100644 100644 0f87bde4... 8a4da493... M sbr/closefds.c :100644 100644 65ded77c... 4c3fcff3... M sbr/concat.c :100644 100644 13414247... 6eebd7e0... M sbr/context_del.c :100644 100644 e5ba5ff6... 64ed8e07... M sbr/context_find.c :100644 100644 93b198da... e7d7da8e... M sbr/context_foil.c :100644 100644 1e1a84e3... ea7d5da8... M sbr/context_read.c :100644 100644 bb49a90a... 6b3aa2f9... M sbr/context_replace.c :100644 100644 7d99cc37... e62aca83... M sbr/context_save.c :100644 100644 e4253da5... e5ded829... M sbr/copyip.c :100644 100644 207bc032... 048579eb... M sbr/cpydata.c :100644 100644 04ca76e3... 86211cf6... M sbr/cpydgst.c :100644 100644 2691a781... 0693a216... M sbr/crawl_folders.c :100644 100644 eb7e7c87... 03eaa102... M sbr/discard.c :100644 100644 60ab9d76... 737f9988... M sbr/dtime.c :100644 100644 42511c92... 7db8d18c... M sbr/error.c :100644 100644 769c525a... 937d196e... M sbr/fdcompare.c :100644 100644 a2338e36... d6218b56... M sbr/fmt_addr.c :100644 100644 9d8f41d0... bcd7b3d1... M sbr/fmt_compile.c :100644 100644 7576ae42... 4e563787... M sbr/fmt_new.c :100644 100644 5bc78505... dc123e53... M sbr/fmt_rfc2047.c :100644 100644 8a8e4c15... ac988833... M sbr/fmt_scan.c :100644 100644 5d1690e0... 423384a0... M sbr/folder_addmsg.c :100644 100644 5df5b5f5... 77131b12... M sbr/folder_delmsgs.c :100644 100644 d88febea... d383d788... M sbr/folder_free.c :100644 100644 29ed6874... 5280e30a... M sbr/folder_pack.c :100644 100644 57431666... 222b490f... M sbr/folder_read.c :100644 100644 2418abd1... f1b703f4... M sbr/folder_realloc.c :100644 100644 27d91cdd... 2b9a0155... M sbr/gans.c :100644 100644 3e38d873... 919fd32d... M sbr/getans.c :100644 100644 47072556... 9bac0e52... M sbr/getanswer.c :100644 100644 5dbdf568... ce33c2ea... M sbr/getarguments.c :100644 100644 b2891b87... 478986a9... M sbr/getcpy.c :100644 100644 02910c37... 9a6b18bb... M sbr/getfolder.c :100644 100644 d3d447ee... 34d743e5... M sbr/lock_file.c :100644 100644 02225337... 03bf0d08... M sbr/m_atoi.c :100644 100644 e8c55662... 17f7ad59... M sbr/m_backup.c :100644 100644 cd184064... 89da537d... M sbr/m_convert.c :100644 100644 845fb961... 39203157... M sbr/m_draft.c :100644 100644 1ce52b6b... 26707a27... M sbr/m_getfld.c :100644 100644 999e6f79... 9c86e77e... M sbr/m_gmprot.c :100644 100644 1ba21c8f... 95f72afb... M sbr/m_maildir.c :100644 100644 9b9652bb... c0c1a9c7... M sbr/m_mktemp.c :100644 100644 20acffec... ef391e67... M sbr/m_name.c :100644 100644 89e90457... 1c13bb65... M sbr/makedir.c :100644 100644 8f7e3579... d93ad265... M sbr/mf.c :100644 100644 55c0f023... 3313aef2... M sbr/mts.c :100644 100644 502ad97a... b19415ab... M sbr/path.c :100644 100644 ff8cf48a... f845058a... M sbr/pidstatus.c :100644 100644 65c55b92... ebee02ec... M sbr/pidwait.c :100644 100644 a46a88b4... 039ab31f... M sbr/print_help.c :100644 100644 8e489dc3... 6f0c9816... M sbr/print_sw.c :100644 100644 162e1718... 8361c664... M sbr/print_version.c :100644 100644 70fba6c7... d664927b... M sbr/push.c :100644 100644 5b53298d... 5c7279b0... M sbr/putenv.c :100644 100644 cc8be82b... ef43bdee... M sbr/readconfig.c :100644 100644 ef95db88... 21d933c5... M sbr/refile.c :100644 100644 c1e92434... f88fcef5... M sbr/ruserpass.c :100644 100644 4e016921... d8f019ab... M sbr/seq_add.c :100644 100644 3d52ed50... 589bc03a... M sbr/seq_bits.c :100644 100644 1dbb0b82... 92e2f1e7... M sbr/seq_del.c :100644 100644 34e60498... 4605915d... M sbr/seq_getnum.c :100644 100644 87c5d04f... 1e2e606a... M sbr/seq_list.c :100644 100644 e9598c06... f9ed1b0e... M sbr/seq_nameok.c :100644 100644 e73424ef... 7cd7c1a1... M sbr/seq_print.c :100644 100644 448f9ef9... 141c1a2e... M sbr/seq_read.c :100644 100644 e6f5a5bb... 15d3f1c7... M sbr/seq_save.c :100644 100644 357c04b6... 0de8b970... M sbr/seq_setcur.c :100644 100644 530c11f6... c66c1328... M sbr/seq_setprev.c :100644 100644 8c9fe41c... b18de5d2... M sbr/seq_setunseen.c :100644 100644 ac9fc69f... c0d3608b... M sbr/showfile.c :100644 100644 1f1b0be0... 77d61ce0... M sbr/signals.c :100644 100644 655831c2... ce7bf8ac... M sbr/snprintb.c :100644 100644 95c67760... 99b12498... M sbr/ssequal.c :100644 100644 354fd0fb... 608b4a58... M sbr/strcasecmp.c :100644 100644 7696e5f8... 2d30d86e... M sbr/strdup.c :100644 100644 fdde7fdf... 2513b306... M sbr/strindex.c :100644 100644 1f590c31... 64dd8487... M sbr/trimcpy.c :100644 100644 ea0964ed... 836a98b0... M sbr/uprf.c :100644 100644 f450c58b... 5c1253d8... M sbr/utils.c :100644 100644 e9ed23ef... bd01a2c7... M sbr/vfgets.c :100644 100644 21b95e15... 6b9dbf5f... M uip/ali.c :100644 100644 094b1a56... 43a0e1b6... M uip/aliasbr.c :100644 100644 89679614... a2cfc849... M uip/anno.c :100644 100644 db748709... e48f7d9f... M uip/annosbr.c :100644 100644 a9f07756... 41e990a1... M uip/ap.c :100644 100644 9d33214c... 374eff52... M uip/burst.c :100644 100644 b39b6e7d... 83b002a3... M uip/comp.c :100644 100644 fdd6de20... 909bbc8f... M uip/conflict.c :100644 100644 86c564f6... 89315c2c... M uip/dist.c :100644 100644 7c46da1a... 319e496a... M uip/distsbr.c :100644 100644 67b2feee... 878e2c1c... M uip/dp.c :100644 100644 40de7638... a857a1a8... M uip/dropsbr.c :100644 100644 17916fb2... 0f44555d... M uip/flist.c :100644 100644 9b326a3c... 2096c644... M uip/fmtdump.c :100644 100644 a5326c17... 06788b28... M uip/folder.c :100644 100644 5c71c552... 9ad28771... M uip/forw.c :100644 100644 fb306f47... 7d6d72b4... M uip/ftpsbr.c :100644 100644 8947a66e... 186312ed... M uip/inc.c :100644 100644 ce07d5dc... 50854f0c... M uip/install-mh.c :100644 100644 9cca0ad5... bdd02ade... M uip/mark.c :100644 100644 cdec9352... e1ca05fb... M uip/mhbuild.c :100644 100644 ca69fbe6... 23163f7e... M uip/mhbuildsbr.c :100644 100644 100f9729... 91affaa3... M uip/mhcachesbr.c :100644 100644 356a4d7e... 6918e0e3... M uip/mhfree.c :100644 100644 743f22bc... 48b8f1db... M uip/mhl.c :100644 100644 91b11e73... 9ec8f5d9... M uip/mhlist.c :100644 100644 80c9ad69... 2b32b643... M uip/mhlistsbr.c :100644 100644 fbd25037... c4e822b3... M uip/mhlsbr.c :100644 100644 12a0bb59... c7a7afaf... M uip/mhmail.c :100644 100644 869fe1cf... 313719f0... M uip/mhmisc.c :100644 100644 e0a8cfa3... 85177811... M uip/mhoutsbr.c :100644 100644 f92a3ecd... 575c7a7a... M uip/mhparam.c :100644 100644 62fc7654... db6f0ad9... M uip/mhparse.c :100644 100644 b658f298... 6f53aba6... M uip/mhpath.c :100644 100644 d55f2c60... ea66f32a... M uip/mhshow.c :100644 100644 68576f66... f79d42e6... M uip/mhshowsbr.c :100644 100644 add5c028... dd5f5178... M uip/mhstore.c :100644 100644 e5b92e86... 8b2dc00a... M uip/mhstoresbr.c :100644 100644 f8e6e387... 621c701d... M uip/mhtest.c :100644 100644 0b2f3eb5... ffde2b49... M uip/msgchk.c :100644 100644 cb2abc49... 92366623... M uip/new.c :100644 100644 732be656... 14ecdaaf... M uip/packf.c :100644 100644 95f99cdf... 040ebecd... M uip/pick.c :100644 100644 c0692a8e... f95ddbc3... M uip/picksbr.c :100644 100644 88a56dfb... a75c5633... M uip/prompter.c :100644 100644 53d74552... 62ae2a85... M uip/rcvdist.c :100644 100644 a89d1fe7... e8934ca2... M uip/rcvpack.c :100644 100644 40adf865... 868ed47b... M uip/rcvstore.c :100644 100644 b3c1d52a... 1e2a3efc... M uip/rcvtty.c :100644 100644 b1c2aa98... b24e42eb... M uip/refile.c :100644 100644 f6016dea... 6893f569... M uip/repl.c :100644 100644 8e60a526... e26badd1... M uip/replsbr.c :100644 100644 050817bf... 38a93ff8... M uip/rmf.c :100644 100644 6e991b04... f8a1d236... M uip/rmm.c :100644 100644 3a0e6c64... 03a260bd... M uip/scan.c :100644 100644 67fc5eb2... 8a07418a... M uip/scansbr.c :100644 100644 043e05ed... 2416baf9... M uip/send.c :100644 100644 0cae8780... c7f4d447... M uip/sendsbr.c :100644 100644 6c795cae... dc6d24e6... M uip/show.c :100644 100644 52e323af... 2e7c257c... M uip/slocal.c :100644 100644 7d5a35c3... a5d0e118... M uip/sortm.c :100644 100644 63b49da8... e87fcf1c... M uip/spost.c :100644 100644 f2b0a53e... bb8a6077... M uip/termsbr.c :100644 100644 3bf341d7... bbae08b4... M uip/viamail.c :100644 100644 061c8449... 0488f94e... M uip/whatnow.c :100644 100644 9d4d06d2... 583f133c... M uip/whatnowproc.c :100644 100644 0dfc3d72... 5a31a903... M uip/whatnowsbr.c commit ced6090a330d3d83d0bce709f756aa3d7d65fea4 Author: markus schnalke AuthorDate: Mon Oct 31 15:06:33 2011 +0100 Commit: markus schnalke CommitDate: Mon Oct 31 15:06:33 2011 +0100 Reformated comments and long lines :100644 100644 5d11ef31... d72cd917... M config/config.c :100644 100644 7c997f66... 5e19b788... M h/addrsbr.h :100644 100644 aa38c42c... 5405531e... M h/aliasbr.h :100644 100644 a5ac7b4d... e81acb17... M h/crawl_folders.h :100644 100644 c2615416... 2742ae6b... M h/dropsbr.h :100644 100644 f3b2b9b9... d60ac4a8... M h/fmt_compile.h :100644 100644 ea348987... f65dab1c... M h/fmt_scan.h :100644 100644 0a750bef... 8a1104ad... M h/md5.h :100644 100644 7fd5ef5e... b5a78923... M h/mf.h :100644 100644 35c8b419... 70bfee7b... M h/mh.h :100644 100644 68bd2be3... 77caabf5... M h/mhcachesbr.h :100644 100644 e3abf318... bef3f4f8... M h/mhparse.h :100644 100644 9773293b... dc37db2a... M h/mime.h :100644 100644 20b42a05... df1d9b5a... M h/mts.h :100644 100644 f10ec1eb... 4ae127d7... M h/nmh.h :100644 100644 9c4b4752... d69825a1... M h/picksbr.h :100644 100644 c54172bc... baf40d94... M h/prototypes.h :100644 100644 98a7f18b... 6a622846... M h/rcvmail.h :100644 100644 d3b1c9fa... bba2b449... M h/scansbr.h :100644 100644 d65da58f... 645c340d... M h/signals.h :100644 100644 1db78c77... 77ccaa6e... M h/tws.h :100644 100644 bc5c2ec3... 18d778e8... M h/utils.h :100644 100644 d8f6a12a... c8eb0c81... M sbr/addrsbr.c :100644 100644 cd84ad65... 6105a508... M sbr/ambigsw.c :100644 100644 a0e4f74b... cb557b7d... M sbr/atooi.c :100644 100644 1e78b172... 4496ae66... M sbr/brkstring.c :100644 100644 e6debc23... cba270d0... M sbr/check_charset.c :100644 100644 99543f5c... 0f87bde4... M sbr/closefds.c :100644 100644 2d0bc603... 65ded77c... M sbr/concat.c :100644 100644 f2ff0a4e... 13414247... M sbr/context_del.c :100644 100644 da1ee103... e5ba5ff6... M sbr/context_find.c :100644 100644 94f687a8... 93b198da... M sbr/context_foil.c :100644 100644 24e6350a... 1e1a84e3... M sbr/context_read.c :100644 100644 dbe1014a... bb49a90a... M sbr/context_replace.c :100644 100644 d4a56edc... 7d99cc37... M sbr/context_save.c :100644 100644 4a0ef51e... 0e013abf... M sbr/copy.c :100644 100644 5ae52bdf... e4253da5... M sbr/copyip.c :100644 100644 c74b2ae8... 207bc032... M sbr/cpydata.c :100644 100644 7195cd15... 04ca76e3... M sbr/cpydgst.c :100644 100644 28116b7e... 2691a781... M sbr/crawl_folders.c :100644 100644 496bb7ab... eb7e7c87... M sbr/discard.c :100644 100644 e4efff3a... 3545d108... M sbr/done.c :100644 100644 0c229eea... 60ab9d76... M sbr/dtime.c :100644 100644 1c150067... 42511c92... M sbr/error.c :100644 100644 8986c039... db7bcec8... M sbr/ext_hook.c :100644 100644 72dff995... 769c525a... M sbr/fdcompare.c :100644 100644 bfb42d83... a2338e36... M sbr/fmt_addr.c :100644 100644 87e07694... 9d8f41d0... M sbr/fmt_compile.c :100644 100644 d6e2e9ff... 65890e9b... M sbr/fmt_def.c :100644 100644 4acabe79... 7576ae42... M sbr/fmt_new.c :100644 100644 debc81ec... 5bc78505... M sbr/fmt_rfc2047.c :100644 100644 14ec48be... 8a8e4c15... M sbr/fmt_scan.c :100644 100644 e26e3bf4... 5d1690e0... M sbr/folder_addmsg.c :100644 100644 0636d119... 5df5b5f5... M sbr/folder_delmsgs.c :100644 100644 985c7a46... d88febea... M sbr/folder_free.c :100644 100644 2e321b04... 29ed6874... M sbr/folder_pack.c :100644 100644 c77ea1ea... 57431666... M sbr/folder_read.c :100644 100644 1d2b140a... 2418abd1... M sbr/folder_realloc.c :100644 100644 270b7293... 27d91cdd... M sbr/gans.c :100644 100644 befbd9a9... 3e38d873... M sbr/getans.c :100644 100644 ed5fac05... 47072556... M sbr/getanswer.c :100644 100644 d133e068... 5dbdf568... M sbr/getarguments.c :100644 100644 2e94f08b... b2891b87... M sbr/getcpy.c :100644 100644 11e2b212... 02910c37... M sbr/getfolder.c :100644 100644 865a6c93... 14f2242a... M sbr/getpass.c :100644 100644 5bc83cc8... d3d447ee... M sbr/lock_file.c :100644 100644 21606c40... 02225337... M sbr/m_atoi.c :100644 100644 1b219a27... e8c55662... M sbr/m_backup.c :100644 100644 ee9ba5b9... cd184064... M sbr/m_convert.c :100644 100644 4a648047... 845fb961... M sbr/m_draft.c :100644 100644 f2c2ffa5... 1ce52b6b... M sbr/m_getfld.c :100644 100644 9bf7088c... 999e6f79... M sbr/m_gmprot.c :100644 100644 15e4a66a... 1ba21c8f... M sbr/m_maildir.c :100644 100644 6f2089ba... 9b9652bb... M sbr/m_mktemp.c :100644 100644 cddb4e9f... cdab622c... M sbr/m_msgdef.c :100644 100644 bc3a6818... 20acffec... M sbr/m_name.c :100644 100644 1e03caac... 89e90457... M sbr/makedir.c :100644 100644 fdad91e4... 8f7e3579... M sbr/mf.c :100644 100644 4e028315... 55c0f023... M sbr/mts.c :100644 100644 8ec544f2... ca3a2c49... M sbr/norm_charmap.c :100644 100644 a01385fa... 502ad97a... M sbr/path.c :100644 100644 cee75044... 7d5f7f9c... M sbr/peekc.c :100644 100644 6f5f5785... ff8cf48a... M sbr/pidstatus.c :100644 100644 d7dd1d79... 65c55b92... M sbr/pidwait.c :100644 100644 ff3f0f15... a46a88b4... M sbr/print_help.c :100644 100644 dad30d2a... 8e489dc3... M sbr/print_sw.c :100644 100644 28ce0c9a... 162e1718... M sbr/print_version.c :100644 100644 b2517b3a... 70fba6c7... M sbr/push.c :100644 100644 bade935f... 5b53298d... M sbr/putenv.c :100644 100644 93ec950c... 49ac0f57... M sbr/r1bindex.c :100644 100644 5db79206... cc8be82b... M sbr/readconfig.c :100644 100644 5637d6f8... ef95db88... M sbr/refile.c :100644 100644 54376741... c1e92434... M sbr/ruserpass.c :100644 100644 fb56bb9c... 4e016921... M sbr/seq_add.c :100644 100644 e93846ad... 3d52ed50... M sbr/seq_bits.c :100644 100644 44ae6ce9... 1dbb0b82... M sbr/seq_del.c :100644 100644 c5ff8b40... 34e60498... M sbr/seq_getnum.c :100644 100644 23bd5442... 87c5d04f... M sbr/seq_list.c :100644 100644 e10ef92e... e9598c06... M sbr/seq_nameok.c :100644 100644 2db66565... e73424ef... M sbr/seq_print.c :100644 100644 6945f004... 448f9ef9... M sbr/seq_read.c :100644 100644 0c14f47d... e6f5a5bb... M sbr/seq_save.c :100644 100644 fdf20288... 357c04b6... M sbr/seq_setcur.c :100644 100644 7e62b64d... 530c11f6... M sbr/seq_setprev.c :100644 100644 a1155643... 8c9fe41c... M sbr/seq_setunseen.c :100644 100644 b8e984b5... ac9fc69f... M sbr/showfile.c :100644 100644 00f516cd... 1f1b0be0... M sbr/signals.c :100644 100644 b22df66b... 5bee67ff... M sbr/smatch.c :100644 100644 baab61f4... 655831c2... M sbr/snprintb.c :100644 100644 2b198811... 1dd4a65c... M sbr/snprintf.c :100644 100644 e7a12adb... 95c67760... M sbr/ssequal.c :100644 100644 79fc5a85... 354fd0fb... M sbr/strcasecmp.c :100644 100644 3e206c77... 7696e5f8... M sbr/strdup.c :100644 100644 92245b2f... fdde7fdf... M sbr/strindex.c :100644 100644 f24563ce... 1f590c31... M sbr/trimcpy.c :100644 100644 7964a82e... ea0964ed... M sbr/uprf.c :100644 100644 3bde778e... f450c58b... M sbr/utils.c :100644 100644 1a99b761... e9ed23ef... M sbr/vfgets.c :100644 100644 00af8cee... 21b95e15... M uip/ali.c :100644 100644 752cda70... 094b1a56... M uip/aliasbr.c :100644 100644 7fd22c19... 89679614... M uip/anno.c :100644 100644 427daba8... db748709... M uip/annosbr.c :100644 100644 1e2151b8... a9f07756... M uip/ap.c :100644 100644 8f0a238c... 9d33214c... M uip/burst.c :100644 100644 554d310e... b39b6e7d... M uip/comp.c :100644 100644 b49c1cc5... fdd6de20... M uip/conflict.c :100644 100644 0b8edb3a... 86c564f6... M uip/dist.c :100644 100644 a40d3e40... 7c46da1a... M uip/distsbr.c :100644 100644 0db0ba52... 67b2feee... M uip/dp.c :100644 100644 0e3ce193... 40de7638... M uip/dropsbr.c :100644 100644 51eff1e2... 17916fb2... M uip/flist.c :100644 100644 e6561adc... 9b326a3c... M uip/fmtdump.c :100644 100644 6f0f8b87... a5326c17... M uip/folder.c :100644 100644 6e33dc3a... 5c71c552... M uip/forw.c :100644 100644 82955461... fb306f47... M uip/ftpsbr.c :100644 100644 f9aae76a... 8947a66e... M uip/inc.c :100644 100644 364cfb26... ce07d5dc... M uip/install-mh.c :100644 100644 e4d078e4... 9cca0ad5... M uip/mark.c :100644 100644 a40d2898... 6737a3ea... M uip/md5.c :100644 100644 dc71d838... cdec9352... M uip/mhbuild.c :100644 100644 1ca80910... ca69fbe6... M uip/mhbuildsbr.c :100644 100644 0cefa872... 100f9729... M uip/mhcachesbr.c :100644 100644 b9f15aa7... 356a4d7e... M uip/mhfree.c :100644 100644 7914b5fe... 743f22bc... M uip/mhl.c :100644 100644 1cd8357c... 91b11e73... M uip/mhlist.c :100644 100644 e5fecd6d... 80c9ad69... M uip/mhlistsbr.c :100644 100644 e7f34c21... fbd25037... M uip/mhlsbr.c :100644 100644 4939b027... 12a0bb59... M uip/mhmail.c :100644 100644 c32157fe... 869fe1cf... M uip/mhmisc.c :100644 100644 e3549586... e0a8cfa3... M uip/mhoutsbr.c :100644 100644 4d00717e... f92a3ecd... M uip/mhparam.c :100644 100644 c72c4154... 62fc7654... M uip/mhparse.c :100644 100644 aa38bbea... b658f298... M uip/mhpath.c :100644 100644 bbb7fb86... d55f2c60... M uip/mhshow.c :100644 100644 be03d962... 68576f66... M uip/mhshowsbr.c :100644 100644 2b413d4c... add5c028... M uip/mhstore.c :100644 100644 2683fae8... e5b92e86... M uip/mhstoresbr.c :100644 100644 9f21c012... f8e6e387... M uip/mhtest.c :100644 100644 5f316856... 0b2f3eb5... M uip/msgchk.c :100644 100644 49840a1b... cb2abc49... M uip/new.c :100644 100644 cb7caf24... 732be656... M uip/packf.c :100644 100644 a4f61bdc... 95f99cdf... M uip/pick.c :100644 100644 fd29c4cb... c0692a8e... M uip/picksbr.c :100644 100644 f92eda12... 88a56dfb... M uip/prompter.c :100644 100644 89ed0299... 53d74552... M uip/rcvdist.c :100644 100644 b1bc518e... a89d1fe7... M uip/rcvpack.c :100644 100644 2458852a... 40adf865... M uip/rcvstore.c :100644 100644 577873fa... b3c1d52a... M uip/rcvtty.c :100644 100644 2ac8916f... b1c2aa98... M uip/refile.c :100644 100644 db41ebba... f6016dea... M uip/repl.c :100644 100644 add1371d... 8e60a526... M uip/replsbr.c :100644 100644 f3c335e0... 050817bf... M uip/rmf.c :100644 100644 e04efaad... 6e991b04... M uip/rmm.c :100644 100644 52a40afe... 3a0e6c64... M uip/scan.c :100644 100644 7c0d1985... 67fc5eb2... M uip/scansbr.c :100644 100644 45b5e261... 043e05ed... M uip/send.c :100644 100644 f7c2a08d... 0cae8780... M uip/sendsbr.c :100644 100644 413daeba... 6c795cae... M uip/show.c :100644 100644 b82b5e2d... 52e323af... M uip/slocal.c :100644 100644 4b63bb6e... 7d5a35c3... M uip/sortm.c :100644 100644 80c6183c... 63b49da8... M uip/spost.c :100644 100644 ce1420c4... f2b0a53e... M uip/termsbr.c :100644 100644 25e65c2c... 3bf341d7... M uip/viamail.c :100644 100644 a6bb0f97... 061c8449... M uip/whatnow.c :100644 100644 44146d7e... 9d4d06d2... M uip/whatnowproc.c :100644 100644 f8b7223b... 0dfc3d72... M uip/whatnowsbr.c commit 337338b404931f06f0db2119c9e145e8ca5a9860 Author: markus schnalke AuthorDate: Sun Oct 30 11:35:54 2011 +0100 Commit: markus schnalke CommitDate: Sun Oct 30 11:35:54 2011 +0100 Removed the draft message in favor for a consistent draft folder facility - reworked sbr/m_draft.c (of course) - removed the -draftfolder/-draftmessage/-nodraftfolder switches - removed the -draft switch from anno and refile - no more need to question on existing draft message - yay! Everything is more consistent now. Cornercases went away. :-) (Also fixed the switch numbering, as already done for other files earlier.) :100644 100644 97a24ffd... 5d11ef31... M config/config.c :100644 100644 1e84c1ee... 806c9340... M docs/COMPLETION-BASH :100644 100644 fe8e4223... 666f7e1b... M docs/COMPLETION-ZSH :100644 100644 58d1e1de... 35c8b419... M h/mh.h :100644 100644 4907410b... c54172bc... M h/prototypes.h :100644 100644 f97efa5e... 1436f739... M man/anno.man :100644 100644 b9c4bc61... 1e0c9f8a... M man/comp.man :100644 100644 7598e468... 4f0ff85b... M man/dist.man :100644 100644 3ff187f3... e5c25c90... M man/forw.man :100644 100644 c498b749... a630b76e... M man/mh-chart.man :100644 100644 63b7b0df... bd841660... M man/mh-draft.man :100644 100644 f9b805aa... cfbf616b... M man/refile.man :100644 100644 bb4a7e54... 80096eb2... M man/repl.man :100644 100644 7d0a4a27... 2edb7da1... M man/send.man :100644 100644 bdca14fc... b2b9dc94... M man/show.man :100644 100644 087511fe... 3f2c6f8e... M man/whatnow.man :100644 100644 ceee73a8... 4a648047... M sbr/m_draft.c :100644 100644 1dfd99d8... 5db79206... M sbr/readconfig.c :100644 100644 db1b96cf... 7fd22c19... M uip/anno.c :100644 100644 f713b6f4... 554d310e... M uip/comp.c :100644 100644 10ef995d... 0b8edb3a... M uip/dist.c :100644 100644 8a7ed349... 6e33dc3a... M uip/forw.c :100644 100644 b18ddb4a... 4d00717e... M uip/mhparam.c :100644 100644 b8b64d02... 2ac8916f... M uip/refile.c :100644 100644 7a9384bb... db41ebba... M uip/repl.c :100644 100644 53103fd6... e04efaad... M uip/rmm.c :100644 100644 d1a183e5... 45b5e261... M uip/send.c :100644 100644 eda19cac... 413daeba... M uip/show.c :100644 100644 c0f331a2... f8b7223b... M uip/whatnowsbr.c commit dc6c45394a06750eab463a2523406eed6c77e2e1 Author: markus schnalke AuthorDate: Sun Oct 16 19:50:26 2011 +0200 Commit: markus schnalke CommitDate: Sun Oct 16 19:50:26 2011 +0200 Fixed broken swit numbering (there are more files to fix) :100644 100644 ca1cc726... f9aae76a... M uip/inc.c :100644 100644 0bec6756... 5f316856... M uip/msgchk.c :100644 100644 db16f382... 80c6183c... M uip/spost.c :100644 100644 ccca1153... 25e65c2c... M uip/viamail.c commit 18017df38ebb626f6eed6f339641fd1298c326e7 Author: markus schnalke AuthorDate: Sun Oct 16 11:48:09 2011 +0200 Commit: markus schnalke CommitDate: Sun Oct 16 11:48:09 2011 +0200 Removed the whom program, which relayed on post(8) functionality. We can later add one again, which only expands aliases but does not require the MTA to support -bv. :100644 100644 f5471a9c... 97a24ffd... M config/config.c :100644 100644 bdc584ff... 1e84c1ee... M docs/COMPLETION-BASH :100644 100644 02af265f... 644bcaf3... M docs/COMPLETION-TCSH :100644 100644 d2ba02ca... fe8e4223... M docs/COMPLETION-ZSH :100644 100644 d41ab958... 58d1e1de... M h/mh.h :100644 100644 2a5a77ae... b23fb6bf... M man/Makefile.in :100644 100644 ad47699a... 9057dde5... M man/mh-alias.man :100644 100644 1efacfd4... c498b749... M man/mh-chart.man :100644 100644 afe54445... 13e381cd... M man/mh-profile.man :100644 100644 6152ccb6... b3d3a290... M man/nmh.man :100644 100644 4fca2cd2... 087511fe... M man/whatnow.man :100644 100644 46644ebb... 1dfd99d8... M sbr/readconfig.c :100644 100644 d600813b... d92d27a4... M uip/Makefile.in :100644 100644 328ea6b5... b18ddb4a... M uip/mhparam.c :100644 100644 4d23fe5f... db16f382... M uip/spost.c :100644 100644 afc56fd2... c0f331a2... M uip/whatnowsbr.c :100644 000000 b68e3ae5... 00000000... D uip/whom.c commit 51cb63baa791f6ba84c0a7f8538ecfd00b013bcb Author: markus schnalke AuthorDate: Sun Oct 16 10:47:04 2011 +0200 Commit: markus schnalke CommitDate: Sun Oct 16 10:47:04 2011 +0200 Removed the split feature of send. It would split large messages into several partial ones, using MIME. But if a message contains one large file attached, it won't solve the problem. We better go without this feature and leave it to the user. :100755 100755 a3545d19... 5582b2a8... M etc/sendfiles.in :100644 100644 d51e3af6... 9773293b... M h/mime.h :100644 100644 adf2a56f... 1efacfd4... M man/mh-chart.man :100644 100644 a45eb8f8... 7d0a4a27... M man/send.man :100644 100644 ed67329b... 39a867a9... M man/sendfiles.man :100644 100644 91f1c168... d1a183e5... M uip/send.c :100644 100644 772c0063... f7c2a08d... M uip/sendsbr.c :100644 100644 1d876cbb... ccca1153... M uip/viamail.c :100644 100644 a41ee46a... afc56fd2... M uip/whatnowsbr.c commit b067ff5c465a5d243ce5a19e562085a9a1a97215 Author: markus schnalke AuthorDate: Fri Oct 7 10:41:15 2011 +0200 Commit: markus schnalke CommitDate: Fri Oct 7 10:41:15 2011 +0200 Removed unneeded sbr code. memmove() and strerror() removed again. ;-) Mmh takes C89, at least, for available. :100644 100644 e9d23548... 6a37f2fc... M configure.ac :100644 100644 9aaabd58... 7c997f66... M h/addrsbr.h :100644 100644 b84a6263... 7fd5ef5e... M h/mf.h :100644 100644 5ddd467f... 4907410b... M h/prototypes.h :100644 100644 9e699659... 65a62617... M sbr/Makefile.in :100644 100644 4ab3fece... d8f6a12a... M sbr/addrsbr.c :100644 000000 0dd4a67f... 00000000... D sbr/client.c :100644 100644 21fc88f9... 496bb7ab... M sbr/discard.c :100644 100644 5ff93949... 8986c039... M sbr/ext_hook.c :100644 100644 92e168ba... debc81ec... M sbr/fmt_rfc2047.c :100644 100644 97b2466d... f2c2ffa5... M sbr/m_getfld.c :100644 000000 a9294194... 00000000... D sbr/m_scratch.c :100644 000000 c0a60bca... 00000000... D sbr/m_tmpfil.c :100644 000000 fabe1331... 00000000... D sbr/memmove.c :100644 100644 063541b6... fdad91e4... M sbr/mf.c :100644 000000 397a6893... 00000000... D sbr/remdir.c :100644 100644 9bc163ab... 2b198811... M sbr/snprintf.c :100644 100644 c128f9b0... 79fc5a85... M sbr/strcasecmp.c :100644 000000 af8d58f7... 00000000... D sbr/strerror.c :100644 100644 7d0158aa... 3bde778e... M sbr/utils.c :100644 100644 a53fe4c9... f3c335e0... M uip/rmf.c commit a485ed478abbd599d8c9aab48934e7a26733ecb1 Author: markus schnalke AuthorDate: Fri Oct 7 08:35:27 2011 +0200 Commit: markus schnalke CommitDate: Fri Oct 7 08:35:27 2011 +0200 Rearranged whitespace (and comments) in all the code! The primary goal was to only indent with tabs and not mix them with spaces. Also, no more tabs should appear past the first printable char on each line. Now editing the sources will be much easier, no matter which editor one uses, and rearranging won't break aligned code. (Beware, the changeset is huge, but the `diff -w' changes are moderate.) :100644 100644 85dbf101... efab8859... M Makefile.in :100644 100644 1f1d5aa1... c1b16bd6... M config/Makefile.in :100644 100644 f03cd196... f5471a9c... M config/config.c :100755 100755 1ff7eed4... 61d9637a... M config/version.sh :100644 100644 f4d1dd65... e9d23548... M configure.ac :100644 100644 d6496f77... bdc584ff... M docs/COMPLETION-BASH :100644 100644 ea7cd58e... 4b7ecf8a... M docs/ChangeLog_MH-3_to_MH-6.6 :100644 100644 f086862b... 4786c025... M docs/FAQ :100644 100644 66d49a9b... 767291c0... M docs/MAILING-LISTS :100644 100644 695bdf0a... 38db87e9... M docs/Makefile.in :100644 100644 83b6bf76... 714ba008... M docs/README-HOOKS :100644 100644 eba3004f... 41f44828... M docs/README.about :100644 100644 8b3da500... de321851... M docs/README.developers :100644 100644 c4dc67bf... 90451b9d... M docs/README.manpages :100644 100644 5037a545... e8455db2... M etc/MailAliases :100644 100644 faefd099... c3265770... M etc/Makefile.in :100644 100644 7f5036d6... 29d732d1... M etc/digestcomps :100755 100755 0db5d3ae... 1c798fc2... M etc/mhn.defaults.sh :100755 100755 3e5e98a5... 4b4230d4... M etc/mhn.find.sh :100644 100644 b86878b6... c5fd01c0... M etc/mts.conf.in :100755 100755 85ec6f0f... a3545d19... M etc/sendfiles.in :100644 100644 d40a92b0... dbf540ec... M h/Makefile.in :100644 100644 a6c7a41c... 9aaabd58... M h/addrsbr.h :100644 100644 cc4da7fe... aa38c42c... M h/aliasbr.h :100644 100644 51fc882e... a5ac7b4d... M h/crawl_folders.h :100644 100644 5a84ae1a... c2615416... M h/dropsbr.h :100644 100644 22be4508... f3b2b9b9... M h/fmt_compile.h :100644 100644 9872e09c... ea348987... M h/fmt_scan.h :100644 100644 e49ef4e0... 0a750bef... M h/md5.h :100644 100644 6063e60f... b84a6263... M h/mf.h :100644 100644 5898831f... d41ab958... M h/mh.h :100644 100644 9c1db6a4... 68bd2be3... M h/mhcachesbr.h :100644 100644 48f221fc... e3abf318... M h/mhparse.h :100644 100644 3e50ce2c... d51e3af6... M h/mime.h :100644 100644 07fa8a28... 20b42a05... M h/mts.h :100644 100644 f1711d5c... f10ec1eb... M h/nmh.h :100644 100644 27c2e66c... 9c4b4752... M h/picksbr.h :100644 100644 c679ace7... 5ddd467f... M h/prototypes.h :100644 100644 b2a355e9... 98a7f18b... M h/rcvmail.h :100644 100644 f6cd35ca... d3b1c9fa... M h/scansbr.h :100644 100644 4ad2b57d... d65da58f... M h/signals.h :100644 100644 5d99cf5a... 1db78c77... M h/tws.h :100644 100644 b9660a53... bc5c2ec3... M h/utils.h :100644 100644 cee07474... 2a5a77ae... M man/Makefile.in :100644 100644 f2fb5801... 772e967f... M man/ali.man :100644 100644 c77b39ed... 30e5fb8a... M man/ap.man :100644 100644 bfb78b3c... b9c4bc61... M man/comp.man :100644 100644 f6905960... fc9cc993... M man/conflict.man :100644 100644 ae7be11c... 7598e468... M man/dist.man :100644 100644 363f44a5... e31e6264... M man/dp.man :100644 100644 0524f01f... 00127e66... M man/fmtdump.man :100644 100644 34d3fa01... 9fffec63... M man/folder.man :100644 100644 877b49bb... 3ff187f3... M man/forw.man :100644 100644 eff4bf00... 9b9766df... M man/mark.man :100644 100644 0ea33b01... adf2a56f... M man/mh-chart.man :100644 100644 8925b8cb... 80021df7... M man/mh-format.man :100644 100644 19399fbd... afe54445... M man/mh-profile.man :100644 100644 f8546c31... d824b471... M man/mhl.man :100644 100644 6e3cf13c... ba2edcbc... M man/mhmail.man :100644 100644 eecc0441... 613b5003... M man/next.man :100644 100644 9b1f9556... 6152ccb6... M man/nmh.man :100644 100644 fd32b3ab... cdc4ee69... M man/packf.man :100644 100644 1a1b0ff3... c5ef463f... M man/pick.man :100644 100644 2f771da7... c90b4ee7... M man/post.man :100644 100644 6ef0b8e8... 4703caed... M man/prev.man :100644 100644 26ba263c... ca00d6b2... M man/rcvpack.man :100644 100644 4b55fe1f... f9b805aa... M man/refile.man :100644 100644 9f2f4893... bb4a7e54... M man/repl.man :100644 100644 047db5a8... 22c00463... M man/rmf.man :100644 100644 6fa35472... a45eb8f8... M man/send.man :100644 100644 76b793a7... ed67329b... M man/sendfiles.man :100644 100644 581cc6db... 9e699659... M sbr/Makefile.in :100644 100644 79d7afe4... 4ab3fece... M sbr/addrsbr.c :100644 100644 c11b9e75... cd84ad65... M sbr/ambigsw.c :100644 100644 d62de170... a0e4f74b... M sbr/atooi.c :100644 100644 5375596d... 1e78b172... M sbr/brkstring.c :100644 100644 8ee93b1e... e6debc23... M sbr/check_charset.c :100644 100644 92e07113... 0dd4a67f... M sbr/client.c :100644 100644 d292112a... 99543f5c... M sbr/closefds.c :100644 100644 82979f5a... 2d0bc603... M sbr/concat.c :100644 100644 474e51c8... f2ff0a4e... M sbr/context_del.c :100644 100644 8c0675f7... da1ee103... M sbr/context_find.c :100644 100644 4a6e89b3... 94f687a8... M sbr/context_foil.c :100644 100644 a655effc... 24e6350a... M sbr/context_read.c :100644 100644 a0c50328... dbe1014a... M sbr/context_replace.c :100644 100644 4ee40ca8... d4a56edc... M sbr/context_save.c :100644 100644 cc35e95b... 4a0ef51e... M sbr/copy.c :100644 100644 84f724cf... 5ae52bdf... M sbr/copyip.c :100644 100644 d322ba9b... c74b2ae8... M sbr/cpydata.c :100644 100644 12829f13... 7195cd15... M sbr/cpydgst.c :100644 100644 d8bcdba3... 28116b7e... M sbr/crawl_folders.c :100644 100644 dbc865c4... 21fc88f9... M sbr/discard.c :100644 100644 05bcf524... e4efff3a... M sbr/done.c :100644 100644 2e978d79... 0c229eea... M sbr/dtime.c :100644 100644 01910868... a3533934... M sbr/dtimep.lex :100644 100644 6dc69957... 1c150067... M sbr/error.c :100644 100644 e94083b3... 5ff93949... M sbr/ext_hook.c :100644 100644 38174e02... 72dff995... M sbr/fdcompare.c :100644 100644 be9b4839... bfb42d83... M sbr/fmt_addr.c :100644 100644 a180c561... 87e07694... M sbr/fmt_compile.c :100644 100644 1edb7875... d6e2e9ff... M sbr/fmt_def.c :100644 100644 44a18b37... 4acabe79... M sbr/fmt_new.c :100644 100644 4d3fc296... 92e168ba... M sbr/fmt_rfc2047.c :100644 100644 97a0b4a3... 14ec48be... M sbr/fmt_scan.c :100644 100644 a0595e6e... e26e3bf4... M sbr/folder_addmsg.c :100644 100644 e6fac04f... 0636d119... M sbr/folder_delmsgs.c :100644 100644 ebb58ab4... 985c7a46... M sbr/folder_free.c :100644 100644 b0bc67b3... 2e321b04... M sbr/folder_pack.c :100644 100644 f642ed39... c77ea1ea... M sbr/folder_read.c :100644 100644 6a94a007... 1d2b140a... M sbr/folder_realloc.c :100644 100644 6b76b7ba... 270b7293... M sbr/gans.c :100644 100644 3229eb57... befbd9a9... M sbr/getans.c :100644 100644 d0ec6f8e... ed5fac05... M sbr/getanswer.c :100644 100644 0f8834b7... d133e068... M sbr/getarguments.c :100644 100644 66332480... 2e94f08b... M sbr/getcpy.c :100644 100644 6c6d2672... 11e2b212... M sbr/getfolder.c :100644 100644 f3ae8291... 865a6c93... M sbr/getpass.c :100644 100644 7eaa0de3... 5bc83cc8... M sbr/lock_file.c :100644 100644 174c4077... 21606c40... M sbr/m_atoi.c :100644 100644 41598507... 1b219a27... M sbr/m_backup.c :100644 100644 1696190c... ee9ba5b9... M sbr/m_convert.c :100644 100644 e4791869... ceee73a8... M sbr/m_draft.c :100644 100644 42bb72fb... 97b2466d... M sbr/m_getfld.c :100644 100644 92ead2d9... 9bf7088c... M sbr/m_gmprot.c :100644 100644 6c8c5841... 15e4a66a... M sbr/m_maildir.c :100644 100644 aa25636a... 6f2089ba... M sbr/m_mktemp.c :100644 100644 d6029736... cddb4e9f... M sbr/m_msgdef.c :100644 100644 18ee081c... bc3a6818... M sbr/m_name.c :100644 100644 3c63d092... a9294194... M sbr/m_scratch.c :100644 100644 291d9966... c0a60bca... M sbr/m_tmpfil.c :100644 100644 4337b7ce... 1e03caac... M sbr/makedir.c :100644 100644 62a303f2... fabe1331... M sbr/memmove.c :100644 100644 fd92e369... 063541b6... M sbr/mf.c :100644 100644 6418ef5e... 4e028315... M sbr/mts.c :100644 100644 ae81046f... 8ec544f2... M sbr/norm_charmap.c :100644 100644 5a9529de... a01385fa... M sbr/path.c :100644 100644 5ed8c3f1... cee75044... M sbr/peekc.c :100644 100644 f16f7e0b... 6f5f5785... M sbr/pidstatus.c :100644 100644 ef42e1aa... d7dd1d79... M sbr/pidwait.c :100644 100644 e045788c... ff3f0f15... M sbr/print_help.c :100644 100644 6d475aba... dad30d2a... M sbr/print_sw.c :100644 100644 b828b3cc... 28ce0c9a... M sbr/print_version.c :100644 100644 ce00f68d... b2517b3a... M sbr/push.c :100644 100644 dd665141... bade935f... M sbr/putenv.c :100644 100644 92818f9a... 93ec950c... M sbr/r1bindex.c :100644 100644 671ada30... 46644ebb... M sbr/readconfig.c :100644 100644 fc2793c6... 5637d6f8... M sbr/refile.c :100644 100644 4ce0b145... 397a6893... M sbr/remdir.c :100644 100644 882889c3... 54376741... M sbr/ruserpass.c :100644 100644 68fa7249... fb56bb9c... M sbr/seq_add.c :100644 100644 30dd3f53... e93846ad... M sbr/seq_bits.c :100644 100644 eb41ec40... 44ae6ce9... M sbr/seq_del.c :100644 100644 251b6091... c5ff8b40... M sbr/seq_getnum.c :100644 100644 b64e8cd8... 23bd5442... M sbr/seq_list.c :100644 100644 6887ac6a... e10ef92e... M sbr/seq_nameok.c :100644 100644 3d970380... 2db66565... M sbr/seq_print.c :100644 100644 e3491218... 6945f004... M sbr/seq_read.c :100644 100644 94b75432... 0c14f47d... M sbr/seq_save.c :100644 100644 f18a3887... fdf20288... M sbr/seq_setcur.c :100644 100644 11de1439... 7e62b64d... M sbr/seq_setprev.c :100644 100644 ea18d176... a1155643... M sbr/seq_setunseen.c :100644 100644 59ae7952... b8e984b5... M sbr/showfile.c :100755 100755 88beac1e... 699302c6... M sbr/sigmsg.awk :100644 100644 919b8e0e... 00f516cd... M sbr/signals.c :100644 100644 88a098b3... b22df66b... M sbr/smatch.c :100644 100644 5f3f1243... baab61f4... M sbr/snprintb.c :100644 100644 efb6df06... 9bc163ab... M sbr/snprintf.c :100644 100644 5ccf28fd... e7a12adb... M sbr/ssequal.c :100644 100644 04aad7d3... c128f9b0... M sbr/strcasecmp.c :100644 100644 251145a2... 3e206c77... M sbr/strdup.c :100644 100644 476a5741... af8d58f7... M sbr/strerror.c :100644 100644 9a1e4fe7... 92245b2f... M sbr/strindex.c :100644 100644 b640ea6f... f24563ce... M sbr/trimcpy.c :100644 100644 b3c81ff0... 7964a82e... M sbr/uprf.c :100644 100644 48969abc... 7d0158aa... M sbr/utils.c :100644 100644 3a376e10... 1a99b761... M sbr/vfgets.c :100644 100644 91180456... d600813b... M uip/Makefile.in :100644 100644 41f92a6e... 00af8cee... M uip/ali.c :100644 100644 b1a7e619... 752cda70... M uip/aliasbr.c :100644 100644 41716f7c... db1b96cf... M uip/anno.c :100644 100644 87e9580b... 427daba8... M uip/annosbr.c :100644 100644 a0f7f778... 1e2151b8... M uip/ap.c :100644 100644 fa3ac73c... 8f0a238c... M uip/burst.c :100644 100644 5ebce6ed... f713b6f4... M uip/comp.c :100644 100644 07e77fc9... b49c1cc5... M uip/conflict.c :100644 100644 4bad51ac... 10ef995d... M uip/dist.c :100644 100644 afd4e419... a40d3e40... M uip/distsbr.c :100644 100644 c94c8eac... 0db0ba52... M uip/dp.c :100644 100644 76bc00db... 0e3ce193... M uip/dropsbr.c :100644 100644 e3da709b... 51eff1e2... M uip/flist.c :100644 100644 fff45022... e6561adc... M uip/fmtdump.c :100644 100644 3e7c85d8... 6f0f8b87... M uip/folder.c :100644 100644 7668b4d7... 8a7ed349... M uip/forw.c :100644 100644 57f25ba6... 82955461... M uip/ftpsbr.c :100644 100644 7c91c259... ca1cc726... M uip/inc.c :100644 100644 c4847711... 364cfb26... M uip/install-mh.c :100644 100644 dd09b488... e4d078e4... M uip/mark.c :100644 100644 5e0ab3be... a40d2898... M uip/md5.c :100644 100644 1e862909... dc71d838... M uip/mhbuild.c :100644 100644 f01abd53... 1ca80910... M uip/mhbuildsbr.c :100644 100644 2223e80e... 0cefa872... M uip/mhcachesbr.c :100644 100644 38b830ec... b9f15aa7... M uip/mhfree.c :100644 100644 fdbd6799... 7914b5fe... M uip/mhl.c :100644 100644 cb6a3cf6... 1cd8357c... M uip/mhlist.c :100644 100644 1aac74a8... e5fecd6d... M uip/mhlistsbr.c :100644 100644 58b29783... e7f34c21... M uip/mhlsbr.c :100644 100644 e5868609... 4939b027... M uip/mhmail.c :100644 100644 7a231392... c32157fe... M uip/mhmisc.c :100644 100644 7e12c46a... e3549586... M uip/mhoutsbr.c :100644 100644 eae587de... 328ea6b5... M uip/mhparam.c :100644 100644 d40d78ce... c72c4154... M uip/mhparse.c :100644 100644 23ca5428... aa38bbea... M uip/mhpath.c :100644 100644 191eeff8... bbb7fb86... M uip/mhshow.c :100644 100644 4a3589f5... be03d962... M uip/mhshowsbr.c :100644 100644 7b44a965... 2b413d4c... M uip/mhstore.c :100644 100644 7c91184f... 2683fae8... M uip/mhstoresbr.c :100644 100644 5c10b8bc... 9f21c012... M uip/mhtest.c :100644 100644 7ee5df5d... 0bec6756... M uip/msgchk.c :100644 100644 99d8528b... 49840a1b... M uip/new.c :100644 100644 c3654409... cb7caf24... M uip/packf.c :100644 100644 24e6862c... a4f61bdc... M uip/pick.c :100644 100644 bd4c263e... fd29c4cb... M uip/picksbr.c :100644 100644 7c28aece... f92eda12... M uip/prompter.c :100644 100644 9038d5ff... 89ed0299... M uip/rcvdist.c :100644 100644 0b4dc9fc... b1bc518e... M uip/rcvpack.c :100644 100644 3131076f... 2458852a... M uip/rcvstore.c :100644 100644 8b04d61d... 577873fa... M uip/rcvtty.c :100644 100644 25f76299... b8b64d02... M uip/refile.c :100644 100644 d2b75df9... 7a9384bb... M uip/repl.c :100644 100644 ec140d6f... add1371d... M uip/replsbr.c :100644 100644 12473f89... a53fe4c9... M uip/rmf.c :100644 100644 7680008d... 53103fd6... M uip/rmm.c :100644 100644 077f824a... 52a40afe... M uip/scan.c :100644 100644 dd0e4989... 7c0d1985... M uip/scansbr.c :100644 100644 c8b77f7a... 91f1c168... M uip/send.c :100644 100644 b610ad85... 772c0063... M uip/sendsbr.c :100644 100644 b5b48c50... eda19cac... M uip/show.c :100644 100644 e6880fe0... b82b5e2d... M uip/slocal.c :100644 100644 cfad3d3c... 4b63bb6e... M uip/sortm.c :100644 100644 c7582ba0... 4d23fe5f... M uip/spost.c :100644 100644 740d0210... ce1420c4... M uip/termsbr.c :100644 100644 aea746d3... 1d876cbb... M uip/viamail.c :100644 100644 d3fccfd6... a6bb0f97... M uip/whatnow.c :100644 100644 6bf4b369... 44146d7e... M uip/whatnowproc.c :100644 100644 f5f78d74... a41ee46a... M uip/whatnowsbr.c :100644 100644 1b1660fa... b68e3ae5... M uip/whom.c commit f480c03187724e54e5391ee61b810827da319a6c Author: markus schnalke AuthorDate: Wed Oct 5 21:13:58 2011 +0200 Commit: markus schnalke CommitDate: Wed Oct 5 21:13:58 2011 +0200 Removed mhn, as it was already replaced by mhlist/mhshow/mhstore. :100644 100644 6811964f... 179d11d7... M INSTALL :100644 100644 81627980... c8882cb4... M acconfig.h :100644 100644 671292e6... f03cd196... M config/config.c :100644 100644 f759c357... d6496f77... M docs/COMPLETION-BASH :100644 100644 f75933ee... 02af265f... M docs/COMPLETION-TCSH :100644 100644 5c10cc89... d2ba02ca... M docs/COMPLETION-ZSH :100644 100644 8fee181c... 795eab2c... M etc/mhl.headers :100644 100644 589a0c81... cee07474... M man/Makefile.in :100644 100644 4414421d... 0ea33b01... M man/mh-chart.man :100644 000000 fc682ef1... 00000000... D man/mhn.man :100644 100644 4c2b59a8... 9b1f9556... M man/nmh.man :100644 100644 24231857... 91180456... M uip/Makefile.in :100644 100644 ac0c4c53... 7668b4d7... M uip/forw.c :100644 000000 a7644a39... 00000000... D uip/mhn.c :100644 100644 a63b8ed4... 4a3589f5... M uip/mhshowsbr.c :100644 100644 a1b5e2a8... 7c91184f... M uip/mhstoresbr.c :100644 100644 3dda4708... ec140d6f... M uip/replsbr.c :100644 100644 57ef0073... b610ad85... M uip/sendsbr.c commit 916690191222433a6923a4be54b0d8f6ac01bd02 Author: markus schnalke AuthorDate: Wed Oct 5 19:09:27 2011 +0200 Commit: markus schnalke CommitDate: Wed Oct 5 19:09:27 2011 +0200 Removed msh, vmh and wmh. The latter ones were long time obsolete; now they went away. Msh has hardly to do with everyday mmh usage, and we don't support bboards anymore. This one changeset saves us about 7,000 lines of code. *yay* :100644 100644 9b64e29b... 671292e6... M config/config.c :100644 100644 542fbdec... f4d1dd65... M configure.ac :100644 100644 e77e152e... f759c357... M docs/COMPLETION-BASH :100644 100644 b6165249... d40a92b0... M h/Makefile.in :100644 100644 25bb4754... 5898831f... M h/mh.h :100644 000000 585e50a4... 00000000... D h/msh.h :100644 100644 1bc19d43... c679ace7... M h/prototypes.h :100644 000000 0b5a9a3e... 00000000... D h/vmhsbr.h :100644 100644 c822d4a6... 589a0c81... M man/Makefile.in :100644 100644 cb1e6f4e... d7e28d57... M man/burst.man :100644 100644 0c413f87... 4414421d... M man/mh-chart.man :100644 100644 635fc320... 19399fbd... M man/mh-profile.man :100644 100644 4f2d755f... 0cf54dde... M man/mh-tailor.man :100644 000000 93d02828... 00000000... D man/msh.man :100644 100644 46fd8fb0... 4c2b59a8... M man/nmh.man :100644 000000 9fe9220a... 00000000... D man/vmh.man :100644 100644 12dab45f... 4a6e89b3... M sbr/context_foil.c :100644 100644 be871c4e... 42bb72fb... M sbr/m_getfld.c :100644 100644 6eca2861... 671ada30... M sbr/readconfig.c :100644 100644 2beef921... 24231857... M uip/Makefile.in :100644 100644 137a6356... eae587de... M uip/mhparam.c :100644 000000 c2d4e1a6... 00000000... D uip/msh.c :100644 000000 3bd4db35... 00000000... D uip/mshcmds.c :100644 000000 908df854... 00000000... D uip/vmh.c :100644 000000 eb6e0378... 00000000... D uip/vmhsbr.c :100644 000000 572bad54... 00000000... D uip/vmhtest.c commit ecc90fb56b43863f4c33ed62da4abe898b17d7fb Author: markus schnalke AuthorDate: Wed Oct 5 18:21:11 2011 +0200 Commit: markus schnalke CommitDate: Wed Oct 5 18:21:11 2011 +0200 Removed unused and not compiling program wmh. It was added 1986, and is not even mentioned in nmh's history. The website is (was?) http://wmh.sf.net :100644 100644 7b483fe4... 2beef921... M uip/Makefile.in :100644 000000 e5ff4903... 00000000... D uip/wmh.c commit f30f5410a04ab0a6eed8ebcd99f5eaf51759cf8b Author: markus schnalke AuthorDate: Wed Oct 5 18:14:41 2011 +0200 Commit: markus schnalke CommitDate: Wed Oct 5 18:14:41 2011 +0200 Removed obsolete MTS docs from README.developers :100644 100644 31a6e46f... 8b3da500... M docs/README.developers commit 97d33797dc936a9e9097cdfc8a6132fca65eac55 Author: markus schnalke AuthorDate: Wed Oct 5 12:29:01 2011 +0200 Commit: markus schnalke CommitDate: Wed Oct 5 12:29:01 2011 +0200 Clarification fix in man/mhparam.man, related to -debug. :100644 100644 f1e17a22... bed0a555... M man/mhparam.man commit e87123959d15f3b190494dffdd8bce335c137874 Author: markus schnalke AuthorDate: Wed Oct 5 12:25:09 2011 +0200 Commit: markus schnalke CommitDate: Wed Oct 5 12:25:09 2011 +0200 Reworked LINK, now named `altmsglink', similar to BACKUP_PREFIX. :100644 100644 25476022... 81627980... M acconfig.h :100644 100644 cc3bb009... 9b64e29b... M config/config.c :100644 100644 31b5f4d8... 25bb4754... M h/mh.h :100644 100644 b7e24ca9... 635fc320... M man/mh-profile.man :100644 100644 d59e7310... f642ed39... M sbr/folder_read.c :100644 100644 30585a23... 6eca2861... M sbr/readconfig.c :100644 100644 80b52a18... 137a6356... M uip/mhparam.c :100644 100644 878f22ad... 12473f89... M uip/rmf.c :100644 100644 4a29a64a... f5f78d74... M uip/whatnowsbr.c commit 104b36e0a37bafe6620062334fa78d484dce321c Author: markus schnalke AuthorDate: Wed Oct 5 11:42:08 2011 +0200 Commit: markus schnalke CommitDate: Wed Oct 5 11:42:08 2011 +0200 Moved default file/folder modes from acconfig.h to config/config.c :100644 100644 efd9f383... 25476022... M acconfig.h :100644 100644 82e72aeb... cc3bb009... M config/config.c commit 5d43a99db70c12a673028c7758c20cbe3e13ef5f Author: markus schnalke AuthorDate: Wed Oct 5 11:28:46 2011 +0200 Commit: markus schnalke CommitDate: Wed Oct 5 11:28:46 2011 +0200 Removed --with-{editor,pager} configure options. We keep defaulting to vi and more, but search in PATH at run time. Nowadays, both programs should be available via PATH everywhere. Otherwise, the the path in the profile. :100644 100644 d4f7f242... 6811964f... M INSTALL :100644 100644 89cd54e2... 85dbf101... M Makefile.in :100644 100644 79d54d5e... 1f1d5aa1... M config/Makefile.in :100644 100644 1a7b72f6... 82e72aeb... M config/config.c :100644 100644 274e08d2... 542fbdec... M configure.ac :100644 100644 5e995423... c822d4a6... M man/Makefile.in :100644 100644 93eaa8ff... b7e24ca9... M man/mh-profile.man :100644 100644 49c9220a... 80b52a18... M uip/mhparam.c commit d19e58487c8b73f12712982185e5007c97a2cdb0 Author: markus schnalke AuthorDate: Wed Oct 5 10:22:17 2011 +0200 Commit: markus schnalke CommitDate: Wed Oct 5 10:22:17 2011 +0200 Documented -debug switch or mhparam(1) :100644 100644 ba00fc69... f1e17a22... M man/mhparam.man commit 55348ded7496135cd482e3e4169e61aba2437260 Author: markus schnalke AuthorDate: Wed Oct 5 09:55:16 2011 +0200 Commit: markus schnalke CommitDate: Wed Oct 5 09:55:16 2011 +0200 Moved sendmail item to better place in man page mh-profile(5) :100644 100644 42d19473... 93eaa8ff... M man/mh-profile.man commit 6c40d481d661d532dd527eaf34cebb6d3f8ed086 Author: markus schnalke AuthorDate: Wed Oct 5 09:48:37 2011 +0200 Commit: markus schnalke CommitDate: Wed Oct 5 09:48:37 2011 +0200 Removed configure option --with-hash-prefix and moved backup-prefix to profile :100644 100644 9d961bdb... 1a7b72f6... M config/config.c :100644 100644 ee288373... 274e08d2... M configure.ac :100644 100644 7442071f... 31b5f4d8... M h/mh.h :100644 100644 46c8424f... 42d19473... M man/mh-profile.man :100644 100644 6bde76f9... e6fac04f... M sbr/folder_delmsgs.c :100644 100644 bb886598... d59e7310... M sbr/folder_read.c :100644 100644 c34c4097... 41598507... M sbr/m_backup.c :100644 100644 09cb44de... 30585a23... M sbr/readconfig.c :100644 100644 0d5b32c8... 49c9220a... M uip/mhparam.c :100644 100644 a49ba4cf... 878f22ad... M uip/rmf.c commit bd2221448c3c545993ccf6f20365f01b5e9782e9 Author: markus schnalke AuthorDate: Tue Oct 4 21:39:54 2011 +0200 Commit: markus schnalke CommitDate: Tue Oct 4 21:39:54 2011 +0200 Renamed configure.in to the more modern name configure.ac :100644 100644 81f7067d... 89cd54e2... M Makefile.in :100644 100644 20d123fe... fcc5fbd7... M aclocal.m4 :100644 100644 d15e9664... ee288373... R099 configure.in configure.ac :100644 100644 f026c741... 31a6e46f... M docs/README.developers commit 37910518c33a356c5da893c3db0dce6349b78aa0 Author: markus schnalke AuthorDate: Tue Oct 4 21:07:22 2011 +0200 Commit: markus schnalke CommitDate: Tue Oct 4 21:07:22 2011 +0200 Nicer structure in summary printing of the configure script. :100644 100644 12c29ca1... d15e9664... M configure.in commit 6f1a8c3b8d6f19bbe33e7d3fa746ae1d2e9ac455 Author: markus schnalke AuthorDate: Tue Oct 4 21:05:33 2011 +0200 Commit: markus schnalke CommitDate: Tue Oct 4 21:05:33 2011 +0200 Moved the sendmail path config line from mts.conf to the MH profile This another step in getting rid of the mts stuff. :100644 100644 23ded2a3... 79d54d5e... M config/Makefile.in :100644 100644 06033400... 9d961bdb... M config/config.c :100644 100644 abcf4451... 7442071f... M h/mh.h :100644 100644 c7606184... 07fa8a28... M h/mts.h :100644 100644 cd475246... 46c8424f... M man/mh-profile.man :100644 100644 7623a7ed... 4f2d755f... M man/mh-tailor.man :100644 100644 3588fecd... 6418ef5e... M sbr/mts.c :100644 100644 2a680192... 09cb44de... M sbr/readconfig.c :100644 100644 8384544d... 0d5b32c8... M uip/mhparam.c commit fecd5d34f65597a4dfa16aeabea7d74b191532c3 Author: markus schnalke AuthorDate: Tue Oct 4 19:04:28 2011 +0200 Commit: markus schnalke CommitDate: Tue Oct 4 19:04:28 2011 +0200 Removed TLS support. We don't need it anymore as we stopped talking SMTP Libcrypto and thelike went away also, as they were needed only for TLS. :100644 100644 29c0bc96... 12c29ca1... M configure.in :100644 100644 603e34ad... 0c413f87... M man/mh-chart.man :100644 100644 85edbc4e... 2f771da7... M man/post.man :100644 100644 e18ed20d... 6fa35472... M man/send.man :100644 100644 a97bab82... c8b77f7a... M uip/send.c :100644 100644 cb48bfdc... 4a29a64a... M uip/whatnowsbr.c :100644 100644 1d92ea36... 1b1660fa... M uip/whom.c commit 156d35f6425bea4c1ed3c4c79783dc613379c65b Author: markus schnalke AuthorDate: Tue Oct 4 18:53:49 2011 +0200 Commit: markus schnalke CommitDate: Tue Oct 4 18:53:49 2011 +0200 Removed SASL support. We don't need it anymore because we talk SMTP no more :100644 100644 6a4dfff1... 29c0bc96... M configure.in :100644 100644 c27b8d35... 603e34ad... M man/mh-chart.man :100644 100644 0f626317... 85edbc4e... M man/post.man :100644 100644 e75583eb... e18ed20d... M man/send.man :100644 100644 d06b6c4a... a97bab82... M uip/send.c :100644 100644 6541b42e... cb48bfdc... M uip/whatnowsbr.c :100644 100644 ddf99efb... 1d92ea36... M uip/whom.c commit f6aa95b724fd8c791164abe7ee5468bf5c34f226 Author: markus schnalke AuthorDate: Tue Oct 4 18:36:14 2011 +0200 Commit: markus schnalke CommitDate: Tue Oct 4 18:36:14 2011 +0200 Removed the MTS and post; now we always use /usr/sbin/sendmail -t Mmh won't talk SMTP (nor POP). Also moved OfficialName() from /mts/smtp/hosts.c to sbr/addrsbr.c. :100644 100644 9db70d21... d4f7f242... M INSTALL :100644 100644 1fe2d387... 81f7067d... M Makefile.in :100644 100644 de9e343f... 06033400... M config/config.c :100644 100644 7f0dabbe... 6a4dfff1... M configure.in :100644 100644 05807238... faefd099... M etc/Makefile.in :100644 100644 f6a1cca0... b86878b6... M etc/mts.conf.in :100644 100644 9894a5dd... c7606184... M h/mts.h :100644 100644 37fba4db... b2a355e9... M h/rcvmail.h :100644 100644 86659df7... 7623a7ed... M man/mh-tailor.man :100644 100644 b6e395e3... 0f626317... M man/post.man :100644 000000 eeafd3a3... 00000000... D mts/Makefile.in :100644 000000 b2a4059e... 00000000... D mts/smtp/Makefile.in :100644 000000 ec73e869... 00000000... D mts/smtp/hosts.c :100644 000000 e7a64a0c... 00000000... D mts/smtp/smtp.c :100644 000000 c88620ea... 00000000... D mts/smtp/smtp.h :100644 100644 484ec5ef... 79d7afe4... M sbr/addrsbr.c :100644 100644 46f5990e... 3588fecd... M sbr/mts.c :100644 100644 691bfe6f... 7b483fe4... M uip/Makefile.in :100644 100644 de12dde8... fdbd6799... M uip/mhl.c :100644 000000 d5760a29... 00000000... D uip/post.c :100644 100644 04dc2152... dd0e4989... M uip/scansbr.c :100644 100644 a59e10c3... b5b48c50... M uip/show.c commit 128545e06224233b7e91fc4c83f8830252fe16c9 Author: markus schnalke AuthorDate: Tue Oct 4 16:14:46 2011 +0200 Commit: markus schnalke CommitDate: Tue Oct 4 16:14:46 2011 +0200 Removed --with-smtpservers configure option and thelike :100644 100644 506288a8... 9db70d21... M INSTALL :100644 100644 6fc7f1e4... 7f0dabbe... M configure.in :100644 100644 4bec6a13... 05807238... M etc/Makefile.in :100644 100644 24d73f5e... f6a1cca0... M etc/mts.conf.in :100644 100644 6ec3a0be... 9894a5dd... M h/mts.h :100644 100644 4ad381d3... 86659df7... M man/mh-tailor.man :100644 100644 a10509cf... ec73e869... M mts/smtp/hosts.c :100644 100644 c558536c... 92e07113... M sbr/client.c :100644 100644 93c9fa93... 46f5990e... M sbr/mts.c commit ab7b48411962d26439f92f35ed084d3d6275459c Author: markus schnalke AuthorDate: Tue Oct 4 15:27:47 2011 +0200 Commit: markus schnalke CommitDate: Tue Oct 4 15:27:47 2011 +0200 Removed all POP support To retrieve mail from POP servers use external tools, e.g. fetchmail. :100644 100644 3c482943... 506288a8... M INSTALL :100644 100644 3649bf33... efd9f383... M acconfig.h :100644 100644 44f07b3d... 6fc7f1e4... M configure.in :100644 100644 b5bdfbc4... e77e152e... M docs/COMPLETION-BASH :100644 100644 24a85ab4... c06568be... M docs/README.SASL :100644 100644 97d4ef69... a9de6ddf... M docs/TODO :100644 100644 c3c946df... 24d73f5e... M etc/mts.conf.in :100644 100644 201c7ecb... 585e50a4... M h/msh.h :100644 100644 2d2aa958... 6ec3a0be... M h/mts.h :100644 000000 fc06f0b9... 00000000... D h/popsbr.h :100644 100644 c94ab008... 5e995423... M man/Makefile.in :100644 100644 540b3786... b581ec26... M man/inc.man :100644 100644 793562fb... c27b8d35... M man/mh-chart.man :100644 100644 15704eee... 4ad381d3... M man/mh-tailor.man :100644 100644 55d4a189... fd2b0f5f... M man/msgchk.man :100644 100644 0e013181... 93c9fa93... M sbr/mts.c :100644 100644 ba22ac9c... 691bfe6f... M uip/Makefile.in :100644 100644 8f99b7bd... 7c91c259... M uip/inc.c :100644 100644 9b56649a... 7ee5df5d... M uip/msgchk.c :100644 000000 2d03efdc... 00000000... D uip/popsbr.c commit 05b7f957ba42e79f49b3a62aea2502168c9abf7a Author: markus schnalke AuthorDate: Wed Sep 28 16:17:08 2011 +0200 Commit: markus schnalke CommitDate: Wed Sep 28 16:17:08 2011 +0200 We'll always use sendmail (spost) now :100644 100644 c2d307eb... de9e343f... M config/config.c :100644 100644 354aa613... 44f07b3d... M configure.in :100644 100644 dd2a18f5... eeafd3a3... M mts/Makefile.in :100644 100644 cd2a3d87... 0e013181... M sbr/mts.c :100644 100644 370fc15e... ba22ac9c... M uip/Makefile.in commit fb6d818f3d7fa5f4120aa6d4d1db297a12910fa2 Author: markus schnalke AuthorDate: Wed Sep 28 12:00:00 2011 +0200 Commit: markus schnalke CommitDate: Wed Sep 28 12:00:00 2011 +0200 Install to /usr/local/mmh :100644 100644 747f5aac... 354aa613... M configure.in commit 5667f6a234e66806941f95b48b229871b5d163d1 Author: markus schnalke AuthorDate: Fri Sep 9 21:05:43 2011 +0200 Commit: markus schnalke CommitDate: Fri Sep 9 21:05:43 2011 +0200 This is the birth of mmh. :-) :100644 100644 cd438c95... f1f91430... M VERSION :100644 100644 e93e173c... 747f5aac... M configure.in commit a01a41d031c796b526329a4170eb23f0ac93b949 Author: Ken Hornstein AuthorDate: Wed Apr 13 10:50:49 2011 -0400 Commit: Ken Hornstein CommitDate: Wed Apr 13 10:52:04 2011 -0400 Whoops, user & port were in the wrong order so msgchk didn't work for POP connections. :100644 100644 03525c87... 9b56649a... M uip/msgchk.c commit d9bed5c7b73965ffdc48176825690b94f096ec3b Author: Ken Hornstein AuthorDate: Mon Feb 21 20:44:30 2011 -0500 Commit: Ken Hornstein CommitDate: Mon Feb 21 20:44:30 2011 -0500 Updated the developer README with a few notes about the git conversion. Signed-off-by: Ken Hornstein :100644 100644 abfb3e56... f026c741... M docs/README.developers commit c6abf17d7aceffcce6ff2a871cc4d95bc31fc5bf Author: Paul Vixie AuthorDate: Mon Feb 7 14:13:54 2011 -0500 Commit: Ken Hornstein CommitDate: Mon Feb 7 14:13:54 2011 -0500 Signed-off-by: Ken Hornstein More documentation about the hooks support. :100644 100644 75464164... 83b6bf76... M docs/README-HOOKS commit 0ce746a6f402fd4a6a4bbdedd5ae65993ef56c38 Author: Peter Maydell AuthorDate: Tue Dec 21 16:50:24 2010 +0000 Commit: Peter Maydell CommitDate: Tue Dec 21 16:50:24 2010 +0000 Clean up code in inc.c Clean up the confusing use of a variable 'i' in inc.c. The case where it was being used as 'an error occurred which means we should not truncate the mailspool' is now called 'incerr' and merged with the equivalent 'p' variable used in the POP-specific code. Cases where it was being used as a random temporary are still called 'i' but now declared with a much more restricted scope. This fixes a compilation warning for some compilers. Signed-off-by: Peter Maydell :100644 100644 f461dd86... 8f99b7bd... M uip/inc.c commit 464b0345e434044712dffa4d72e72d36316d2b7c Author: Peter Maydell AuthorDate: Mon Dec 20 21:13:32 2010 +0000 Commit: Peter Maydell CommitDate: Mon Dec 20 21:13:32 2010 +0000 Suppress tsort diagnostic waffle tsort produces waffle to standard error if it detects loops in its input. For our purposes in ordering object files this is harmless, so just send it all to /dev/null. Signed-off-by: Peter Maydell :100644 100644 821caa8f... dd2a18f5... M mts/Makefile.in :100644 100644 e2f8cb4a... 581cc6db... M sbr/Makefile.in commit 4dd01e6c68874a5fc2988d63d6c26984889310a3 Author: Peter Maydell AuthorDate: Mon Dec 20 21:13:32 2010 +0000 Commit: Peter Maydell CommitDate: Mon Dec 20 21:13:32 2010 +0000 Fix unused-function warnings in lex output Fix the unused-function warnings in the output of lex. In particular, we silence a warning about yyunput being static but unused by exposing it as a global function. This costs us a few hundred bytes in the binary but the other available solutions are flex-specific or more complicated. YY_NO_UNPUT used to silence this but no longer works in recent flex. On the other hand YY_NO_INPUT does work to silence warnings about input(). Signed-off-by: Peter Maydell :100644 100644 c35c9bef... 01910868... M sbr/dtimep.lex commit a4e085dcc682da556af59d8b2c8a0afe44c6f257 Author: Peter Maydell AuthorDate: Mon Dec 20 21:13:32 2010 +0000 Commit: Peter Maydell CommitDate: Mon Dec 20 21:13:32 2010 +0000 Fix used-uninitialised warning in fmt_rfc2047.c Fix a used-uninitialised warning in fmt_rfc2047.c. I don't think it can actually be used uninitialised, but the code is too complicated for the compiler to realise this. Signed-off-by: Peter Maydell :100644 100644 6f208a12... 4d3fc296... M sbr/fmt_rfc2047.c commit 93f22073ff22b277206b0481c1f8f076aee1656d Author: Peter Maydell AuthorDate: Mon Dec 20 21:13:32 2010 +0000 Commit: Peter Maydell CommitDate: Mon Dec 20 21:13:32 2010 +0000 Fix used-uninitialised warning in new.c Fix a used-uninitialised warning in new.c by having the check_folders() routine return first=last=NULL for empty folder lists. This is a more sensible API anyway. (It would not actually have been possible for the code to try to use last while it was uninitialised, as it happens.) Signed-off-by: Peter Maydell :100644 100644 254950b2... 99d8528b... M uip/new.c commit 9530ace10a49d62c80c95914601fa9246099501b Author: Peter Maydell AuthorDate: Mon Dec 20 21:13:32 2010 +0000 Commit: Peter Maydell CommitDate: Mon Dec 20 21:13:32 2010 +0000 Fix crash if fnext/fprev are given an empty folder list Add a check for a NULL pointer, which stops fnext/fprev from segfaulting if given an empty folder list (for example via 'fnext -folders emptyfile'). Signed-off-by: Peter Maydell :100644 100644 41d2ebf8... 254950b2... M uip/new.c commit edcaa954bab2d48b54ab3dbcbe3788dc104044dc Author: Peter Maydell AuthorDate: Mon Dec 20 19:54:43 2010 +0000 Commit: Peter Maydell CommitDate: Mon Dec 20 19:54:43 2010 +0000 Fix warning in sbr/folder_addmsg.c by code cleanup Clean up some rather oddly written code in folder_addmsg() so it is easier to understand for both humans and for the compiler (and the compiler thus stops complaining about an uninitialised variable). Signed-off-by: Peter Maydell :100644 100644 52baa7ae... a0595e6e... M sbr/folder_addmsg.c commit 58fb17ea4d6c3f0178d75fbd05c3e1d9a2997313 Author: Ken Hornstein AuthorDate: Thu Dec 16 13:20:31 2010 -0500 Commit: Ken Hornstein CommitDate: Thu Dec 16 13:20:31 2010 -0500 Fix so this compiles without SASL support. Damn you, Oliver Kiddle, for finding all of the bugs I add to nmh! :100644 100644 470d72de... e7a64a0c... M mts/smtp/smtp.c commit 16fe088f7a4b204f3af67a1a378796b1bfe96694 Author: Ken Hornstein AuthorDate: Thu Dec 16 13:11:17 2010 -0500 Commit: Ken Hornstein CommitDate: Thu Dec 16 13:11:17 2010 -0500 All of the arguments to AC_ARG_ENABLE need to be quoted, otherwise the last action doesn't make it into the configure script. :100644 100644 d68f4f13... e93e173c... M configure.in commit bfb94f0084a3072a6b813f0f792ba4594c6ecf52 Author: Ken Hornstein AuthorDate: Thu Dec 16 13:02:32 2010 -0500 Commit: Ken Hornstein CommitDate: Thu Dec 16 13:02:32 2010 -0500 Make sure we ignore config.h.in~ :100644 100644 70f75d98... f3a4caaa... M .gitignore commit 8c7907f07f098ce5375e39e710f615931777ef4c Author: Markus Schnalke AuthorDate: Thu Dec 16 01:36:43 2010 +0100 Commit: Oliver Kiddle CommitDate: Thu Dec 16 01:36:43 2010 +0100 fix typo and clarify two sentences in mhpath man page :100644 100644 ab4d42f3... e04c4a3f... M man/mhpath.man commit 823a67fb93caa46a4451d86741cc6702f0003926 Author: Markus Schnalke AuthorDate: Thu Dec 16 01:25:11 2010 +0100 Commit: Oliver Kiddle CommitDate: Thu Dec 16 01:25:11 2010 +0100 improve mhparam man page :100644 100644 eb8caeca... ba00fc69... M man/mhparam.man commit 234c9cc4829d86589a079ace49cfa5bc251ef62c Author: Oliver Kiddle AuthorDate: Thu Dec 16 01:23:16 2010 +0100 Commit: Oliver Kiddle CommitDate: Thu Dec 16 01:23:16 2010 +0100 fix badly formatted code found by Markus Schnalke :100644 100644 19f418e9... 8384544d... M uip/mhparam.c commit 119362982fae61ae7aaa899eaf2544e4f4a84283 Author: Scott Snyder AuthorDate: Wed Dec 15 22:17:52 2010 +0100 Commit: Oliver Kiddle CommitDate: Wed Dec 15 22:17:52 2010 +0100 propagate and check return status of close() in slocal :100644 100644 3bd5c9be... 76bc00db... M uip/dropsbr.c :100644 100644 37173f65... e6880fe0... M uip/slocal.c commit 56a34bc502bde807ab722ee5f20d4db2901a5b23 Author: Markus Schnalke AuthorDate: Wed Dec 15 22:02:30 2010 +0100 Commit: Oliver Kiddle CommitDate: Wed Dec 15 22:05:59 2010 +0100 document msg parameter to folder :100644 100644 9b145275... 34d3fa01... M man/folder.man commit 56f52a606b02d40fdc92b9012c7835679163cd5c Author: Oliver Kiddle AuthorDate: Tue Dec 14 18:04:01 2010 +0100 Commit: Oliver Kiddle CommitDate: Tue Dec 14 18:04:28 2010 +0100 switches need to be renumbered following removal of some switches so, e.g. inc -version was not working :100644 100644 38ab6873... f461dd86... M uip/inc.c :100644 100644 fa2336f9... 03525c87... M uip/msgchk.c commit c05210483d82bf5f3786725ff80e12444088a701 Author: Ken Hornstein AuthorDate: Thu Dec 9 15:29:29 2010 -0500 Commit: Ken Hornstein CommitDate: Thu Dec 9 15:29:29 2010 -0500 Massive garbage collection. Remove functionality for APOP, RPOP, all NNTP support (including bboards) and MPOP. :100644 100644 e7ee1265... 324dddc1... M ChangeLog :100644 100644 f866c0a7... d68f4f13... M configure.in :100644 100644 09889137... b6165249... M h/Makefile.in :100644 100644 f782d676... 2d2aa958... M h/mts.h :100644 000000 54647157... 00000000... D h/nntp.h :100644 100644 168b8c61... fc06f0b9... M h/popsbr.h :100644 100644 7e7a787a... 540b3786... M man/inc.man :100644 100644 c451f62e... 793562fb... M man/mh-chart.man :100644 100644 31e5b902... 15704eee... M man/mh-tailor.man :100644 100644 219bfe60... 55d4a189... M man/msgchk.man :100644 100644 95c220d3... e2f8cb4a... M sbr/Makefile.in :100644 100644 6a9d84f4... cd2a3d87... M sbr/mts.c :100644 100644 31515ba8... 370fc15e... M uip/Makefile.in :100644 100644 f23a565f... 38ab6873... M uip/inc.c :100644 100644 e052b42e... fa2336f9... M uip/msgchk.c :100644 100644 aed4bc7d... c2d4e1a6... M uip/msh.c :100644 100644 0190beec... 3bd4db35... M uip/mshcmds.c :100644 100644 3ac88be4... 2d03efdc... M uip/popsbr.c commit 2ead8819603a21a03ee51440dc5617c5df1ed8da Author: David Levine AuthorDate: Wed Dec 8 14:36:36 2010 -0600 Commit: David Levine CommitDate: Wed Dec 8 14:36:36 2010 -0600 * uip/whatnowsbr.c: enforce requirement of at least one file argument to attach command. :100644 100644 1345dceb... e7ee1265... M ChangeLog :100644 100644 723d4087... 6541b42e... M uip/whatnowsbr.c commit 20dbca31df3ce9b0cebfb5977607d9c3ef0d86d7 Author: David Levine AuthorDate: Wed Dec 8 10:47:03 2010 -0600 Commit: David Levine CommitDate: Wed Dec 8 10:48:43 2010 -0600 man/send.man: added name= portion to Content-Type headers to reflect 2006-10-24 change to uip/sendsbr.c. That change allowed mhstore to use the (file)name when extracting attachments. :100644 100644 7fdb84b2... 1345dceb... M ChangeLog :100644 100644 0ac8c3ae... e75583eb... M man/send.man commit 5dd6771b28c257af405d7248639ed0e3bcdce38b Author: Ken Hornstein AuthorDate: Fri Dec 3 15:23:11 2010 -0500 Commit: Ken Hornstein CommitDate: Fri Dec 3 15:23:11 2010 -0500 Remove RCS keywords, since they no longer work after git migration. :100644 100644 e7a779b8... 3c482943... M INSTALL :100644 100644 c38c1a40... ddd30faa... M MACHINES :100644 100644 eecef1b6... 1fe2d387... M Makefile.in :100644 100644 1f740735... 328f383f... M README :100644 100644 6c4613d3... 23ded2a3... M config/Makefile.in :100644 100644 8a613b68... c2d307eb... M config/config.c :100755 100755 6257186f... 1ff7eed4... M config/version.sh :100644 100644 2c47c90a... f866c0a7... M configure.in :100644 100644 e65b9bb5... 66d49a9b... M docs/MAILING-LISTS :100644 100644 7421f217... 695bdf0a... M docs/Makefile.in :100644 100644 a9963642... ff9db2a3... M docs/README-ATTACHMENTS :100644 100644 bb5d6ee7... 75464164... M docs/README-HOOKS :100644 100644 224600dc... 24a85ab4... M docs/README.SASL :100644 100644 1038ed34... eba3004f... M docs/README.about :100644 100644 23a1d2df... abfb3e56... M docs/README.developers :100644 100644 fa423def... c4dc67bf... M docs/README.manpages :100644 100644 c5be1413... 5037a545... M etc/MailAliases :100644 100644 cffd9399... 4bec6a13... M etc/Makefile.in :100755 100755 fc5a6682... 0db5d3ae... M etc/mhn.defaults.sh :100755 100755 8f128f79... 3e5e98a5... M etc/mhn.find.sh :100755 100755 b443067e... 85ec6f0f... M etc/sendfiles.in :100644 100644 7b4a2769... 09889137... M h/Makefile.in :100644 100644 e3aa7e80... a6c7a41c... M h/addrsbr.h :100644 100644 d379cfc5... cc4da7fe... M h/aliasbr.h :100644 100644 d04287a6... 51fc882e... M h/crawl_folders.h :100644 100644 146a63bf... 5a84ae1a... M h/dropsbr.h :100644 100644 eb79751c... 22be4508... M h/fmt_compile.h :100644 100644 cece50e0... 9872e09c... M h/fmt_scan.h :100644 100644 6ca63993... e49ef4e0... M h/md5.h :100644 100644 1f609194... 6063e60f... M h/mf.h :100644 100644 6513f246... abcf4451... M h/mh.h :100644 100644 a1977384... 9c1db6a4... M h/mhcachesbr.h :100644 100644 eb7cb18e... 48f221fc... M h/mhparse.h :100644 100644 1a85b427... 3e50ce2c... M h/mime.h :100644 100644 c6b0fa59... 201c7ecb... M h/msh.h :100644 100644 ce063d98... f782d676... M h/mts.h :100644 100644 f00a3ad3... f1711d5c... M h/nmh.h :100644 100644 b2329495... 54647157... M h/nntp.h :100644 100644 811836d7... 27c2e66c... M h/picksbr.h :100644 100644 5d0ed31c... 168b8c61... M h/popsbr.h :100644 100644 b0443907... 1bc19d43... M h/prototypes.h :100644 100644 97179199... 37fba4db... M h/rcvmail.h :100644 100644 b050d978... f6cd35ca... M h/scansbr.h :100644 100644 9648e04f... 4ad2b57d... M h/signals.h :100644 100644 47a31b9e... 5d99cf5a... M h/tws.h :100644 100644 8f327549... b9660a53... M h/utils.h :100644 100644 452f2e3f... 0b5a9a3e... M h/vmhsbr.h :100644 100644 ab93318d... c94ab008... M man/Makefile.in :100644 100644 f9b07c2c... f2fb5801... M man/ali.man :100644 100644 e2a77c1f... f97efa5e... M man/anno.man :100644 100644 35241e54... c77b39ed... M man/ap.man :100644 100644 5bca99d1... cb1e6f4e... M man/burst.man :100644 100644 17180ac7... bfb78b3c... M man/comp.man :100644 100644 6cc69442... f6905960... M man/conflict.man :100644 100644 6359b772... ae7be11c... M man/dist.man :100644 100644 1b214198... 363f44a5... M man/dp.man :100644 100644 8fc7b8d1... 66f2f854... M man/flist.man :100644 100644 aaca927f... 0524f01f... M man/fmtdump.man :100644 100644 deded862... 9b145275... M man/folder.man :100644 100644 0f05b68f... 877b49bb... M man/forw.man :100644 100644 86280b97... 7e7a787a... M man/inc.man :100644 100644 ce1f61da... 094ec4cd... M man/install-mh.man :100644 100644 6915792d... eff4bf00... M man/mark.man :100644 100644 6c3eb6b5... ad47699a... M man/mh-alias.man :100644 100644 b31cb0bc... c451f62e... M man/mh-chart.man :100644 100644 7f866358... 63b7b0df... M man/mh-draft.man :100644 100644 d7ceccc4... 8925b8cb... M man/mh-format.man :100644 100644 1874d9b6... 2f296402... M man/mh-mail.man :100644 100644 62db35f3... cd475246... M man/mh-profile.man :100644 100644 a97af0ea... 12fdb1ca... M man/mh-sequence.man :100644 100644 6a3fda5d... 31e5b902... M man/mh-tailor.man :100644 100644 72ce2810... b0af8810... M man/mhbuild.man :100644 100644 10f4b13f... f8546c31... M man/mhl.man :100644 100644 42cb9182... f0ef31a8... M man/mhlist.man :100644 100644 75f49189... 6e3cf13c... M man/mhmail.man :100644 100644 d867251b... fc682ef1... M man/mhn.man :100644 100644 b1903518... eb8caeca... M man/mhparam.man :100644 100644 c7448689... ab4d42f3... M man/mhpath.man :100644 100644 78d8ed95... 27ebd95e... M man/mhshow.man :100644 100644 49072735... af05bf2b... M man/mhstore.man :100644 100644 6decb1e5... 219bfe60... M man/msgchk.man :100644 100644 89e52e70... 93d02828... M man/msh.man :100644 100644 c724d3e5... 5be7983f... M man/new.man :100644 100644 89abd9aa... eecc0441... M man/next.man :100644 100644 18b60310... 46fd8fb0... M man/nmh.man :100644 100644 a351578b... fd32b3ab... M man/packf.man :100644 100644 a9171f49... 1a1b0ff3... M man/pick.man :100644 100644 772bbfb9... b6e395e3... M man/post.man :100644 100644 ce861ab5... 6ef0b8e8... M man/prev.man :100644 100644 10a98730... 623abba6... M man/prompter.man :100644 100644 19041344... f24ea8e5... M man/rcvdist.man :100644 100644 c8030c48... 26ba263c... M man/rcvpack.man :100644 100644 76505ebd... 010e2381... M man/rcvstore.man :100644 100644 badb4b07... f098b218... M man/rcvtty.man :100644 100644 c83da66e... 4b55fe1f... M man/refile.man :100644 100644 41f58709... 9f2f4893... M man/repl.man :100644 100644 ff2740ef... 047db5a8... M man/rmf.man :100644 100644 614b97ad... 0f8b5cee... M man/rmm.man :100644 100644 7da788e9... fb72ac3d... M man/scan.man :100644 100644 a20296e5... 0ac8c3ae... M man/send.man :100644 100644 442c7f68... 76b793a7... M man/sendfiles.man :100644 100644 64a1a671... bdca14fc... M man/show.man :100644 100644 f32b4894... cc822f0e... M man/slocal.man :100644 100644 c9d99c5f... 283cf124... M man/sortm.man :100644 100644 73759911... 9fe9220a... M man/vmh.man :100644 100644 cc2e989c... 4fca2cd2... M man/whatnow.man :100644 100644 19881213... c054dcf2... M man/whom.man :100644 100644 fcec8133... 821caa8f... M mts/Makefile.in :100644 100644 e837ddc3... b2a4059e... M mts/smtp/Makefile.in :100644 100644 908e6194... a10509cf... M mts/smtp/hosts.c :100644 100644 20fdce52... 470d72de... M mts/smtp/smtp.c :100644 100644 12fdedba... c88620ea... M mts/smtp/smtp.h :100644 100644 0f84568b... 95c220d3... M sbr/Makefile.in :100644 100644 09e4c6c5... 484ec5ef... M sbr/addrsbr.c :100644 100644 42796b34... c11b9e75... M sbr/ambigsw.c :100644 100644 353a5c15... d62de170... M sbr/atooi.c :100644 100644 d2f71aa3... 5375596d... M sbr/brkstring.c :100644 100644 9d0d6253... 8ee93b1e... M sbr/check_charset.c :100644 100644 d3374ad4... c558536c... M sbr/client.c :100644 100644 191bd311... d292112a... M sbr/closefds.c :100644 100644 4d4e15c1... 82979f5a... M sbr/concat.c :100644 100644 859c8516... 474e51c8... M sbr/context_del.c :100644 100644 f96d0b3a... 8c0675f7... M sbr/context_find.c :100644 100644 7eccd79f... 12dab45f... M sbr/context_foil.c :100644 100644 1a584e4c... a655effc... M sbr/context_read.c :100644 100644 4416eee4... a0c50328... M sbr/context_replace.c :100644 100644 36b1634e... 4ee40ca8... M sbr/context_save.c :100644 100644 52989aab... cc35e95b... M sbr/copy.c :100644 100644 93ff5e84... 84f724cf... M sbr/copyip.c :100644 100644 c3ca3ed6... d322ba9b... M sbr/cpydata.c :100644 100644 a1a887af... 12829f13... M sbr/cpydgst.c :100644 100644 4889bf1c... d8bcdba3... M sbr/crawl_folders.c :100644 100644 55c160bf... dbc865c4... M sbr/discard.c :100644 100644 65ec1cb7... 05bcf524... M sbr/done.c :100644 100644 14359557... 2e978d79... M sbr/dtime.c :100644 100644 299e3a62... 6dc69957... M sbr/error.c :100644 100644 d2288487... e94083b3... M sbr/ext_hook.c :100644 100644 6a45da67... 38174e02... M sbr/fdcompare.c :100644 100644 d71d956c... be9b4839... M sbr/fmt_addr.c :100644 100644 89c25def... a180c561... M sbr/fmt_compile.c :100644 100644 478a466a... 1edb7875... M sbr/fmt_def.c :100644 100644 c1bc7c73... 44a18b37... M sbr/fmt_new.c :100644 100644 87fddb90... 6f208a12... M sbr/fmt_rfc2047.c :100644 100644 9054963e... 97a0b4a3... M sbr/fmt_scan.c :100644 100644 f90cedfb... 52baa7ae... M sbr/folder_addmsg.c :100644 100644 20ac1a57... 6bde76f9... M sbr/folder_delmsgs.c :100644 100644 f06bbf5c... ebb58ab4... M sbr/folder_free.c :100644 100644 2bddb0dd... b0bc67b3... M sbr/folder_pack.c :100644 100644 0dec537e... bb886598... M sbr/folder_read.c :100644 100644 e7c4bc44... 6a94a007... M sbr/folder_realloc.c :100644 100644 c0804cde... 6b76b7ba... M sbr/gans.c :100644 100644 deb884e1... 3229eb57... M sbr/getans.c :100644 100644 55fd06e5... 0f8834b7... M sbr/getarguments.c :100644 100644 1186831a... 66332480... M sbr/getcpy.c :100644 100644 544a144e... 6c6d2672... M sbr/getfolder.c :100644 100644 6bc2cb8a... f3ae8291... M sbr/getpass.c :100644 100644 866d0477... 7eaa0de3... M sbr/lock_file.c :100644 100644 dffc799b... 174c4077... M sbr/m_atoi.c :100644 100644 9dcfdf60... c34c4097... M sbr/m_backup.c :100644 100644 15c29066... 1696190c... M sbr/m_convert.c :100644 100644 d3e988ed... e4791869... M sbr/m_draft.c :100644 100644 ecbbd3c5... be871c4e... M sbr/m_getfld.c :100644 100644 d7aec6f3... 92ead2d9... M sbr/m_gmprot.c :100644 100644 441ca502... 6c8c5841... M sbr/m_maildir.c :100644 100644 59ee37d1... aa25636a... M sbr/m_mktemp.c :100644 100644 96f54f0e... d6029736... M sbr/m_msgdef.c :100644 100644 2c403d0c... 18ee081c... M sbr/m_name.c :100644 100644 353da562... 3c63d092... M sbr/m_scratch.c :100644 100644 4382061f... 291d9966... M sbr/m_tmpfil.c :100644 100644 c5332ca6... 4337b7ce... M sbr/makedir.c :100644 100644 ac04c296... fd92e369... M sbr/mf.c :100644 100644 7610cdaf... 6a9d84f4... M sbr/mts.c :100644 100644 7ef83eab... 5a9529de... M sbr/path.c :100644 100644 a687e694... 5ed8c3f1... M sbr/peekc.c :100644 100644 7991d592... f16f7e0b... M sbr/pidstatus.c :100644 100644 607538f5... ef42e1aa... M sbr/pidwait.c :100644 100644 a7bc7e53... e045788c... M sbr/print_help.c :100644 100644 bd7b5aa2... 6d475aba... M sbr/print_sw.c :100644 100644 b3300a98... b828b3cc... M sbr/print_version.c :100644 100644 82b85b08... ce00f68d... M sbr/push.c :100644 100644 fb4a77ce... dd665141... M sbr/putenv.c :100644 100644 92e152db... 92818f9a... M sbr/r1bindex.c :100644 100644 eba6eece... 2a680192... M sbr/readconfig.c :100644 100644 dc068fe0... fc2793c6... M sbr/refile.c :100644 100644 627ff3f2... 4ce0b145... M sbr/remdir.c :100644 100644 5ed6fde2... 882889c3... M sbr/ruserpass.c :100644 100644 ff3e23a4... 68fa7249... M sbr/seq_add.c :100644 100644 56bd2ec1... 30dd3f53... M sbr/seq_bits.c :100644 100644 67a93bb5... eb41ec40... M sbr/seq_del.c :100644 100644 aa9d57dd... 251b6091... M sbr/seq_getnum.c :100644 100644 f5dbb658... b64e8cd8... M sbr/seq_list.c :100644 100644 678ab5b5... 6887ac6a... M sbr/seq_nameok.c :100644 100644 81a1f5ca... 3d970380... M sbr/seq_print.c :100644 100644 c18d1dae... e3491218... M sbr/seq_read.c :100644 100644 84775b97... 94b75432... M sbr/seq_save.c :100644 100644 42195726... f18a3887... M sbr/seq_setcur.c :100644 100644 fdffa952... 11de1439... M sbr/seq_setprev.c :100644 100644 022982ea... ea18d176... M sbr/seq_setunseen.c :100644 100644 c099c1cd... 59ae7952... M sbr/showfile.c :100755 100755 d4f6e52e... 88beac1e... M sbr/sigmsg.awk :100644 100644 9f5f3792... 919b8e0e... M sbr/signals.c :100644 100644 1a104ada... 88a098b3... M sbr/smatch.c :100644 100644 558c2cf8... 5f3f1243... M sbr/snprintb.c :100644 100644 32edca9c... 5ccf28fd... M sbr/ssequal.c :100644 100644 4a026a3f... 04aad7d3... M sbr/strcasecmp.c :100644 100644 ebc29f59... 251145a2... M sbr/strdup.c :100644 100644 d7809550... 476a5741... M sbr/strerror.c :100644 100644 51cbe7c6... 9a1e4fe7... M sbr/strindex.c :100644 100644 8b57ad68... b640ea6f... M sbr/trimcpy.c :100644 100644 dedb0e5b... b3c81ff0... M sbr/uprf.c :100644 100644 7c4ddcf2... 48969abc... M sbr/utils.c :100644 100644 c6a39ea6... 3a376e10... M sbr/vfgets.c :100644 100644 6f271770... 31515ba8... M uip/Makefile.in :100644 100644 8513092c... 41f92a6e... M uip/ali.c :100644 100644 ec7be942... b1a7e619... M uip/aliasbr.c :100644 100644 ee9dcd71... 41716f7c... M uip/anno.c :100644 100644 7f1bdde7... 87e9580b... M uip/annosbr.c :100644 100644 ea2d36d7... a0f7f778... M uip/ap.c :100644 100644 f9dd9510... fa3ac73c... M uip/burst.c :100644 100644 9c915bf3... 5ebce6ed... M uip/comp.c :100644 100644 8247ff0c... 07e77fc9... M uip/conflict.c :100644 100644 1effbb05... 4bad51ac... M uip/dist.c :100644 100644 e5f7bc55... afd4e419... M uip/distsbr.c :100644 100644 6b41bb62... c94c8eac... M uip/dp.c :100644 100644 84435a2e... 3bd5c9be... M uip/dropsbr.c :100644 100644 b5226cea... e3da709b... M uip/flist.c :100644 100644 a590a006... fff45022... M uip/fmtdump.c :100644 100644 f83bedca... 3e7c85d8... M uip/folder.c :100644 100644 7892d7f5... ac0c4c53... M uip/forw.c :100644 100644 1d6727fa... 57f25ba6... M uip/ftpsbr.c :100644 100644 d31cdf76... f23a565f... M uip/inc.c :100644 100644 d3890938... c4847711... M uip/install-mh.c :100644 100644 372568a0... dd09b488... M uip/mark.c :100644 100644 2cb6cb57... 5e0ab3be... M uip/md5.c :100644 100644 fbe2b2c6... 1e862909... M uip/mhbuild.c :100644 100644 d95eee58... f01abd53... M uip/mhbuildsbr.c :100644 100644 ba66f6eb... 2223e80e... M uip/mhcachesbr.c :100644 100644 df0ee465... 38b830ec... M uip/mhfree.c :100644 100644 e37c3ba9... de12dde8... M uip/mhl.c :100644 100644 4cca8d2a... cb6a3cf6... M uip/mhlist.c :100644 100644 1a026293... 1aac74a8... M uip/mhlistsbr.c :100644 100644 a386771b... 58b29783... M uip/mhlsbr.c :100644 100644 e906b1d3... e5868609... M uip/mhmail.c :100644 100644 fddd5522... 7a231392... M uip/mhmisc.c :100644 100644 45358e7e... a7644a39... M uip/mhn.c :100644 100644 92352539... 7e12c46a... M uip/mhoutsbr.c :100644 100644 f9f78c34... 19f418e9... M uip/mhparam.c :100644 100644 bca79422... d40d78ce... M uip/mhparse.c :100644 100644 c4fd935b... 23ca5428... M uip/mhpath.c :100644 100644 2b406d44... 191eeff8... M uip/mhshow.c :100644 100644 9317defd... a63b8ed4... M uip/mhshowsbr.c :100644 100644 bef91224... 7b44a965... M uip/mhstore.c :100644 100644 151b2e64... a1b5e2a8... M uip/mhstoresbr.c :100644 100644 9590fd3c... 5c10b8bc... M uip/mhtest.c :100644 100644 1a59a3bd... e052b42e... M uip/msgchk.c :100644 100644 f492a370... aed4bc7d... M uip/msh.c :100644 100644 0201cbc8... 0190beec... M uip/mshcmds.c :100644 100644 82d6db55... 41d2ebf8... M uip/new.c :100644 100644 a696e727... c3654409... M uip/packf.c :100644 100644 e0d61368... 24e6862c... M uip/pick.c :100644 100644 61d5afb8... bd4c263e... M uip/picksbr.c :100644 100644 30e4c278... 3ac88be4... M uip/popsbr.c :100644 100644 87e31e8f... d5760a29... M uip/post.c :100644 100644 6f97a880... 7c28aece... M uip/prompter.c :100644 100644 7d669109... 9038d5ff... M uip/rcvdist.c :100644 100644 f03fc995... 0b4dc9fc... M uip/rcvpack.c :100644 100644 668eb86e... 3131076f... M uip/rcvstore.c :100644 100644 333a3b2f... 8b04d61d... M uip/rcvtty.c :100644 100644 7bc6d0b9... 25f76299... M uip/refile.c :100644 100644 4584b674... d2b75df9... M uip/repl.c :100644 100644 a415346e... 3dda4708... M uip/replsbr.c :100644 100644 c3dcc919... a49ba4cf... M uip/rmf.c :100644 100644 15302896... 7680008d... M uip/rmm.c :100644 100644 31aa245f... 077f824a... M uip/scan.c :100644 100644 c5f03292... 04dc2152... M uip/scansbr.c :100644 100644 7eb75bdf... d06b6c4a... M uip/send.c :100644 100644 65b5ba1b... 57ef0073... M uip/sendsbr.c :100644 100644 604f2ead... a59e10c3... M uip/show.c :100644 100644 f24228af... 37173f65... M uip/slocal.c :100644 100644 212b4416... cfad3d3c... M uip/sortm.c :100644 100644 1c1a8bc9... c7582ba0... M uip/spost.c :100644 100644 a1b8ebf1... 740d0210... M uip/termsbr.c :100644 100644 5b67ba15... aea746d3... M uip/viamail.c :100644 100644 327f4516... 908df854... M uip/vmh.c :100644 100644 a504220a... eb6e0378... M uip/vmhsbr.c :100644 100644 4093c38c... 572bad54... M uip/vmhtest.c :100644 100644 d9954264... d3fccfd6... M uip/whatnow.c :100644 100644 cd215020... 6bf4b369... M uip/whatnowproc.c :100644 100644 58ac8bd4... 723d4087... M uip/whatnowsbr.c :100644 100644 fe01326f... ddf99efb... M uip/whom.c :100644 100644 af06698d... e5ff4903... M uip/wmh.c commit bd7d13ad3cdf433d73849b3bb847eaec2f1396ba Author: Ken Hornstein AuthorDate: Thu Dec 2 21:04:30 2010 -0500 Commit: Ken Hornstein CommitDate: Thu Dec 2 21:04:30 2010 -0500 Whoops, forgot to bracket the calls for TLS shutdown with a #ifdef TLS_SUPPORT :100644 100644 e6bca9a9... 20fdce52... M mts/smtp/smtp.c commit 03bf20a885b3953a0385e814ba4e0196b46f6159 Author: Ken Hornstein AuthorDate: Thu Dec 2 20:37:54 2010 -0500 Commit: Ken Hornstein CommitDate: Thu Dec 2 20:37:54 2010 -0500 Update for git conversions (and cleanup of autogen.sh to use autoreconf) :100644 000000 5f5cca9b... 00000000... D .cvsignore :000000 100644 00000000... 70f75d98... A .gitignore :100755 100755 29a02b95... 71a29127... M autogen.sh :100644 000000 625becce... 00000000... D config/.cvsignore :100644 000000 f3c7a7c5... 00000000... D docs/.cvsignore :100644 000000 e234ebf7... 00000000... D etc/.cvsignore :100644 000000 f3c7a7c5... 00000000... D h/.cvsignore :100644 000000 cacddcd5... 00000000... D man/.cvsignore :100644 000000 f3c7a7c5... 00000000... D mts/.cvsignore :100644 000000 f3c7a7c5... 00000000... D mts/smtp/.cvsignore :100644 000000 38a6b43b... 00000000... D sbr/.cvsignore :100644 000000 6adffa00... 00000000... D test/.cvsignore :100644 000000 ec00fcba... 00000000... D uip/.cvsignore commit 676aafb5cca9531170843b28fe4e3ba12c322c50 Author: Ken Hornstein AuthorDate: Thu Dec 2 18:03:22 2010 -0500 Commit: Ken Hornstein CommitDate: Thu Dec 2 18:03:22 2010 -0500 Change configure.in to emit a warning when an argument is given to --with-cyrus-sasl. :100644 100644 8e8fb1c9... 2c47c90a... M configure.in commit e056446589e2fee53f823e0da1fb34076018c3dd Author: Ken Hornstein AuthorDate: Sun Nov 21 22:19:51 2010 +0000 Commit: Ken Hornstein CommitDate: Sun Nov 21 22:19:51 2010 +0000 Fix the test for sasl.h to look in the correct place. :100644 100644 77307173... 8e8fb1c9... M configure.in commit da304a48a24d7cc7fafae13c994d94ad3d6483f2 Author: Ken Hornstein AuthorDate: Fri Nov 19 20:13:39 2010 +0000 Commit: Ken Hornstein CommitDate: Fri Nov 19 20:13:39 2010 +0000 (Minor) cleanup of some of the autoconf code with respect to the handling of compiler flags for SASL, and also rototill (and simplify) the autoconf handling for the same. Add TLS support for the SMTP MTA. :100644 100644 7941c076... 20d123fe... M aclocal.m4 :100644 100644 aba161b8... 6c4613d3... M config/Makefile.in :100644 100644 e43fca10... 77307173... M configure.in :100644 100644 5e097e43... b31cb0bc... M man/mh-chart.man :100644 100644 892215a2... 772bbfb9... M man/post.man :100644 100644 25fa3579... a20296e5... M man/send.man :100644 100644 f8b0ed31... e837ddc3... M mts/smtp/Makefile.in :100644 100644 7413639c... e6bca9a9... M mts/smtp/smtp.c :100644 100644 4fdcdfe5... 12fdedba... M mts/smtp/smtp.h :100644 100644 69a280cd... 0f84568b... M sbr/Makefile.in :100644 100644 1e1ae9b9... 6f271770... M uip/Makefile.in :100644 100644 ba898a4c... 87e31e8f... M uip/post.c :100644 100644 8409654d... 7eb75bdf... M uip/send.c :100644 100644 da2debde... 58ac8bd4... M uip/whatnowsbr.c :100644 100644 51ce5fef... fe01326f... M uip/whom.c commit 8b0b9f913c2f0987ba8337178d3a6b3dcae906e6 Author: Peter Maydell AuthorDate: Fri Nov 12 23:28:26 2010 +0000 Commit: Peter Maydell CommitDate: Fri Nov 12 23:28:26 2010 +0000 man/slocal.man: fix formatting error that meant a subsection heading wasn't displayed as such. Followon cleanup: since the new heading is too wide to fit in the margin, tidy the margin to 4 characters wide so we are consistent with how all the headings are displayed. :100644 100644 556418a3... 7fdb84b2... M ChangeLog :100644 100644 eeb07655... f32b4894... M man/slocal.man commit 682769680c6e77bf8cf797c23eccd1d4e2753066 Author: Peter Maydell AuthorDate: Wed Nov 10 22:26:07 2010 +0000 Commit: Peter Maydell CommitDate: Wed Nov 10 22:26:07 2010 +0000 configure.in: add a level of expansion for mandir when printing the end-of-configure install path summary. :100644 100644 5d0f2304... 556418a3... M ChangeLog :100644 100644 6d4a9d40... e43fca10... M configure.in commit ca2c0f532cb7ca04e38272385f08bde8b3f56166 Author: Peter Maydell AuthorDate: Tue Nov 9 21:33:22 2010 +0000 Commit: Peter Maydell CommitDate: Tue Nov 9 21:33:22 2010 +0000 man/rmm.man: fix error in synopsis: the option is [no]unlink, not [no]link. :100644 100644 6847b8f7... 5d0f2304... M ChangeLog :100644 100644 d8cdf8bc... 614b97ad... M man/rmm.man commit a1e2c63df5871a156c2735b679b58716a0af2b29 Author: Peter Maydell AuthorDate: Fri Nov 5 22:06:10 2010 +0000 Commit: Peter Maydell CommitDate: Fri Nov 5 22:06:10 2010 +0000 Silence a (harmless) uninitialized variable warning. :100644 100644 ab70c246... 7413639c... M mts/smtp/smtp.c commit 3bf07d227725f798f654ac09f015f35d27ab83cb Author: David Levine AuthorDate: Tue Aug 31 15:00:53 2010 +0000 Commit: David Levine CommitDate: Tue Aug 31 15:00:53 2010 +0000 * uip/.cvsignore: added "new". :100644 100644 2a9c1456... 6847b8f7... M ChangeLog :100644 100644 400537d8... ec00fcba... M uip/.cvsignore commit 8cf1d92e52d3feac4ed32ec733e2c0ed7f384e86 Author: Earl Hood AuthorDate: Sat Feb 6 07:47:38 2010 +0000 Commit: Earl Hood CommitDate: Sat Feb 6 07:47:38 2010 +0000 #ifdef AI_ADDRCONFIG since older IPv4-only systems may not define this flag, causing files that use to not compile. :100644 100644 a03809e1... d3374ad4... M sbr/client.c :100644 100644 2fc3fb7d... 1d6727fa... M uip/ftpsbr.c :100644 100644 a3ef6ba6... a386771b... M uip/mhlsbr.c commit b7c348e99fa223f370ebdb4fd9b6627596c66a08 Author: Earl Hood AuthorDate: Sat Feb 6 07:45:47 2010 +0000 Commit: Earl Hood CommitDate: Sat Feb 6 07:45:47 2010 +0000 Fixed variable declaration so older compilers will not complain. I.e. Older compilers may not support C99, so variables must be declared at the beginning of a block. :100644 100644 22290363... 59ee37d1... M sbr/m_mktemp.c commit 2f689a1cb907a5de04e6d39ffd217a69af3216c7 Author: Earl Hood AuthorDate: Thu Feb 4 01:39:21 2010 +0000 Commit: Earl Hood CommitDate: Thu Feb 4 01:39:21 2010 +0000 * Bug #15213, #18635: The use of the insecure m_scratch() and m_tmpfil() functions have been replaced by m_mktemp() or m_mktemp2() functions (defined in sbr/m_mktemp.c). The new functions use mkstemp() to securely create temporary files to avoid the numerous race conditions that exist with the old functions. This does assume that mkstemp() is available. Unsure if we need to create an alternative implementation if mkstemp() is not available. More information about new temp file functions in m_mktemp.c, including the support for MHTMPDIR, TMPDIR, and TMP envvars. NOTE: The files sbr/m_scratch.c and sbr/m_tmpfil.c should be removed. Until more testing verifies changes to support new functions have not broken functionality, the files are be left in the tree, but comments have been added stating the functions in them should not be called. :100644 100644 992f51ce... 2a9c1456... M ChangeLog :100644 100644 66e42ada... cffd9399... M etc/Makefile.in :100644 100644 32f6a3d3... b0443907... M h/prototypes.h :100644 100644 b8787d17... 69a280cd... M sbr/Makefile.in :100644 100644 9d5b6d3c... 87fddb90... M sbr/fmt_rfc2047.c :100644 100644 ca4020b0... 9054963e... M sbr/fmt_scan.c :100644 100644 fc3d2c05... 55fd06e5... M sbr/getarguments.c :000000 100644 00000000... 22290363... A sbr/m_mktemp.c :100644 100644 df635316... 353da562... M sbr/m_scratch.c :100644 100644 907c6244... 4382061f... M sbr/m_tmpfil.c :100644 100644 6043bee1... 607538f5... M sbr/pidwait.c :100644 100644 e8ef50ae... 7f1bdde7... M uip/annosbr.c :100644 100644 15756d30... f9dd9510... M uip/burst.c :100644 100644 1b5f5e13... e5f7bc55... M uip/distsbr.c :100644 100644 2d4f2d53... 7892d7f5... M uip/forw.c :100644 100644 fce9cec2... d31cdf76... M uip/inc.c :100644 100644 9d9f553a... fbe2b2c6... M uip/mhbuild.c :100644 100644 b75034ab... d95eee58... M uip/mhbuildsbr.c :100644 100644 420dbb63... a3ef6ba6... M uip/mhlsbr.c :100644 100644 f08a583a... e906b1d3... M uip/mhmail.c :100644 100644 2ebdc1ff... 92352539... M uip/mhoutsbr.c :100644 100644 7c100006... bca79422... M uip/mhparse.c :100644 100644 1c05a42d... 151b2e64... M uip/mhstoresbr.c :100644 100644 d87f92ea... f492a370... M uip/msh.c :100644 100644 147a261b... 0201cbc8... M uip/mshcmds.c :100644 100644 81a1afb0... 82d6db55... M uip/new.c :100644 100644 839e3d33... 30e4c278... M uip/popsbr.c :100644 100644 75468185... ba898a4c... M uip/post.c :100644 100644 35f6860a... 6f97a880... M uip/prompter.c :100644 100644 7ee47fd9... 7d669109... M uip/rcvdist.c :100644 100644 21f6c776... 668eb86e... M uip/rcvstore.c :100644 100644 97c32284... 333a3b2f... M uip/rcvtty.c :100644 100644 df182584... c5f03292... M uip/scansbr.c :100644 100644 43f4c022... 8409654d... M uip/send.c :100644 100644 fd21acd3... 65b5ba1b... M uip/sendsbr.c :100644 100644 e783a797... 604f2ead... M uip/show.c :100644 100644 4a8875e7... f24228af... M uip/slocal.c :100644 100644 04a76d2f... 5b67ba15... M uip/viamail.c :100644 100644 5fcba33c... da2debde... M uip/whatnowsbr.c commit 352fe458a57061db81240c19fa4b356c7448463b Author: Earl Hood AuthorDate: Wed Feb 3 05:56:56 2010 +0000 Commit: Earl Hood CommitDate: Wed Feb 3 05:56:56 2010 +0000 * mts/smtp/smtp.c: added SASL support if mts configuration setting is set to "sendmail". This is useful if sendmail conf option is to a custom script that creates a proxy connection to an smtp server. * sbr/mts.c: added support for MHMTSCONF and MHMTSUSERCONF envvars. The former specifies an alternative system mts.conf to use. The later specifies a user-specific mts.conf to use. This one will be read after the system conf, so the user's conf only needs to set options they want to override. The MHMTSUSERCONF allows a user to set personal alternative mail submission methods w/o affecting other users on the system. * uip/whom.c: added SASL-based options so address checking can work against a server that requires SASL. :100644 100644 38ba7e4e... 992f51ce... M ChangeLog :100644 100644 05e292ff... ab70c246... M mts/smtp/smtp.c :100644 100644 de7518c0... 7610cdaf... M sbr/mts.c :100644 100644 d04ef27e... 51ce5fef... M uip/whom.c commit d8916ff5d389de5ab225cd6f40aeda1b285d0f28 Author: David Levine AuthorDate: Wed Dec 30 01:42:45 2009 +0000 Commit: David Levine CommitDate: Wed Dec 30 01:42:45 2009 +0000 * uip/mhlistsbr.c, uip/mhlsbr.c, uip/picksbr.c: cast pointers to unsigned long before casting to unsigned int to avoid warnings on 64-bit about casting from pointer to int of different size. :100644 100644 a0528ebc... 38ba7e4e... M ChangeLog :100644 100644 10ec55d6... 1a026293... M uip/mhlistsbr.c :100644 100644 9f1ebdde... 420dbb63... M uip/mhlsbr.c :100644 100644 1e16795f... 61d5afb8... M uip/picksbr.c commit 7e3a3c499d1637d633d385c1058947c02676e3c5 Author: David Levine AuthorDate: Wed Dec 30 01:41:47 2009 +0000 Commit: David Levine CommitDate: Wed Dec 30 01:41:47 2009 +0000 * uip/new.c: cast folder_len to int to avoid warning on 64-bit about passing a size_t to an int conversion specifier. :100644 100644 f5c605c7... a0528ebc... M ChangeLog :100644 100644 4ff8c049... 81a1afb0... M uip/new.c commit cd665517f488ca62e71b7fd1db6df0813dee052a Author: David Levine AuthorDate: Fri Dec 25 14:47:39 2009 +0000 Commit: David Levine CommitDate: Fri Dec 25 14:47:39 2009 +0000 * uip/inc.c: gcc 4.4.1 noticed that maildir could have been used before initialization. In fact, if that code was ever reached, maildir would never have been initialized. It's in an adios call, so replaced with NULL. :100644 100644 f72df8e1... f5c605c7... M ChangeLog :100644 100644 0fcff840... fce9cec2... M uip/inc.c commit 5658c6c561ca13aae18a68f178457245176526fc Author: David Levine AuthorDate: Mon Dec 21 17:18:04 2009 +0000 Commit: David Levine CommitDate: Mon Dec 21 17:18:04 2009 +0000 * mts/smtp/smtp.c: In sm_auth_sasl (), removed zeroing of sasl_inbuffer because it could be used in sm_fget (). Also, removed allocation of sasl_inbuffer because that was done in either smtp_init () or sendmail_init (). :100644 100644 52e56ed5... f72df8e1... M ChangeLog :100644 100644 e93a7c24... 05e292ff... M mts/smtp/smtp.c commit 3c92470c2b683842612ea670fac3e04330f9ca84 Author: Josh Bressers AuthorDate: Mon Jan 26 13:38:13 2009 +0000 Commit: Josh Bressers CommitDate: Mon Jan 26 13:38:13 2009 +0000 Remove duplicate sm_fgetc() declaration :100644 100644 7af8d309... e93a7c24... M mts/smtp/smtp.c commit 86048c14a070e3382577dd22519319bce77c70b9 Author: Ken Hornstein AuthorDate: Wed Jan 21 19:38:36 2009 +0000 Commit: Ken Hornstein CommitDate: Wed Jan 21 19:38:36 2009 +0000 Fix warning in getaddrinfo() call. Add missing support for -port in whatnow. Make sure the SASL input buffer is allocated when using the sendmail mts. :100644 100644 37a7b07c... 7af8d309... M mts/smtp/smtp.c :100644 100644 732fb47f... a03809e1... M sbr/client.c :100644 100644 42e0d61a... 5fcba33c... M uip/whatnowsbr.c commit 21ddd311ae7c2d5798c8fdd6add1ef229f82950b Author: Eric Gillespie AuthorDate: Sun Jan 18 04:48:42 2009 +0000 Commit: Eric Gillespie CommitDate: Sun Jan 18 04:48:42 2009 +0000 * etc/mhn.defaults.sh: Never try to make mhshow start xterm. :100644 100644 b2ea1aa7... 52e56ed5... M ChangeLog :100644 100644 7fd6b15f... 47b01061... M docs/pending-release-notes :100755 100755 e25cac42... fc5a6682... M etc/mhn.defaults.sh commit 55669aa463e2ce09a1873831bba729d2a29d2188 Author: Eric Gillespie AuthorDate: Sat Jan 17 16:53:07 2009 +0000 Commit: Eric Gillespie CommitDate: Sat Jan 17 16:53:07 2009 +0000 Note 'new' commands. :100644 100644 7c05abee... 7fd6b15f... M docs/pending-release-notes commit 788c353a8bee07520ae1a1de6fb7bdcdf1f4f1c7 Author: Eric Gillespie AuthorDate: Sat Jan 17 16:47:29 2009 +0000 Commit: Eric Gillespie CommitDate: Sat Jan 17 16:47:29 2009 +0000 * test/runtest, test/tests/inc/test-deb359167, test/tests/inc/test-eom-align, test/tests/manpages/test-manpages: Load common.sh via absolute path, otherwise some /bin/sh (e.g. dash) can't load it. * uip/Makefile.in, uip/new.c, test/tests/new/test-basic: Add new program, and fn/fp/unseen symlinks. * test/{runtest,setup-test}: Move MH profile under Mail directory so each test script will have its own to muck with, if needed. * h/Makefile.in, h/crawl_folders.h, sbr/Makefile.in, sbr/crawl_folders.c, uip/folder.c: Extract the folder crawling code from folder.c into new crawl_folders function, using a callback to assemble the folder info in folder.c. Drop compare function and use strcmp instead. Rename addfold and addir to add_folder and add_children (add dir vs. add folder? confusing names). :100644 100644 5817d9a6... b2ea1aa7... M ChangeLog :100644 100644 492d3643... 7b4a2769... M h/Makefile.in :000000 100644 00000000... d04287a6... A h/crawl_folders.h :100644 100644 1cd0b609... cacddcd5... M man/.cvsignore :100644 100644 fe70265d... ab93318d... M man/Makefile.in :000000 100644 00000000... 7529017e... A man/fnext.man :000000 100644 00000000... 7529017e... A man/fprev.man :000000 100644 00000000... c724d3e5... A man/new.man :000000 100644 00000000... 7529017e... A man/unseen.man :100644 100644 a920958c... b8787d17... M sbr/Makefile.in :000000 100644 00000000... 4889bf1c... A sbr/crawl_folders.c :100755 100755 4ec4a03e... 0b186530... M test/runtest :100755 100755 a99c6c7e... fab26a0e... M test/setup-test :100644 100644 61d3283f... 36cd1c24... M test/tests/inc/test-deb359167 :100644 100644 5d197fff... 3b6c6779... M test/tests/inc/test-eom-align :100644 100644 2ad77d8d... f7acc69c... M test/tests/manpages/test-manpages :000000 100644 00000000... 772b72f4... A test/tests/new/test-basic :100644 100644 f101a28f... 1e1ae9b9... M uip/Makefile.in :100644 100644 a94f1315... f83bedca... M uip/folder.c :000000 100644 00000000... 4ff8c049... A uip/new.c commit d6ed7408ae67cf31b31a8c42515a160f7dc6330a Author: Ken Hornstein AuthorDate: Fri Jan 16 15:48:09 2009 +0000 Commit: Ken Hornstein CommitDate: Fri Jan 16 15:48:09 2009 +0000 Move freeaddrinfo() to inside of our loop; this prevents a memory leak and also prevents it from being called with a NULL pointer. :100644 100644 ae6968f7... 732fb47f... M sbr/client.c commit 7b98850d3b8b2453b473fdfb6db52f4aa3fe39b6 Author: Ken Hornstein AuthorDate: Fri Jan 16 02:28:54 2009 +0000 Commit: Ken Hornstein CommitDate: Fri Jan 16 02:28:54 2009 +0000 Massive overhaul of networking code. Changes: - All networking interfaces now converted to new APIs (getaddrinfo() and the like). All networking now supports IPv6 (with the exception of the built-in FTP client). - SASL security layers are now supported for SMTP. - Command-line and profile-based selection of the SMTP server and port. :100644 100644 6091daad... 7941c076... M aclocal.m4 :100644 100644 ce9c4ba7... 6d4a9d40... M configure.in :100644 100644 3dd76230... 224600dc... M docs/README.SASL :000000 100644 00000000... 7c05abee... A docs/pending-release-notes :100644 000000 41b0226f... 00000000... D h/netdb.h :100644 100644 1de40677... 32f6a3d3... M h/prototypes.h :100644 100644 4fc80b14... 6a3fda5d... M man/mh-tailor.man :100644 100644 f437f621... 892215a2... M man/post.man :100644 100644 0c65f5ac... 25fa3579... M man/send.man :100644 100644 33eb9e66... 908e6194... M mts/smtp/hosts.c :100644 100644 35eefb48... 37a7b07c... M mts/smtp/smtp.c :100644 100644 73eb5de7... 4fdcdfe5... M mts/smtp/smtp.h :100644 100644 0d0454cd... ae6968f7... M sbr/client.c :100644 100644 cc5ff8e3... de7518c0... M sbr/mts.c :100644 100644 5b079ba2... 2fc3fb7d... M uip/ftpsbr.c :100644 100644 acf21de9... 9f1ebdde... M uip/mhlsbr.c :100644 100644 8e14d524... 839e3d33... M uip/popsbr.c :100644 100644 e3b6229d... 75468185... M uip/post.c :100644 100644 196af625... 43f4c022... M uip/send.c :100644 100644 a7194319... 42e0d61a... M uip/whatnowsbr.c commit 439d79535278cca4149434a457874addd94fee0f Author: Peter Maydell AuthorDate: Fri Dec 26 21:54:19 2008 +0000 Commit: Peter Maydell CommitDate: Fri Dec 26 21:54:19 2008 +0000 * sbr/m_getfld.c: fix two bugs which could cause us to walk off the beginning of the stdio or prefix-string buffer when checking for presence of the end-of-message delimiter in some situations. This might cause inc to dump core if you were unlucky. (This was Debian bug 359167.) * test/tests/inc/{md5sums,msgheader.txt,test-deb359167, test-eom-align,fromline.txt,filler.txt,deb359167.mbox}: new tests both for the specific problem and to try to check various alignments of the eom string with the stdio buffer ending. * test/common.sh: Added some functions for doing progress indicators. :100644 100644 d1082ce6... 5817d9a6... M ChangeLog :100644 100644 9424188f... ecbbd3c5... M sbr/m_getfld.c :100644 100644 1c675e20... 5d46c8c2... M test/common.sh :000000 100644 00000000... 5e861161... A test/tests/inc/deb359167.mbox :000000 100644 00000000... 7be957f3... A test/tests/inc/filler.txt :000000 100644 00000000... 8bc47909... A test/tests/inc/fromline.txt :000000 100644 00000000... 7f68baa3... A test/tests/inc/md5sums :000000 100644 00000000... f6faad4f... A test/tests/inc/msgheader.txt :000000 100644 00000000... 61d3283f... A test/tests/inc/test-deb359167 :000000 100644 00000000... 5d197fff... A test/tests/inc/test-eom-align commit dba2e3c8f09a64ebf3c07323f1cb5fb2fa611d12 Author: Peter Maydell AuthorDate: Fri Dec 26 16:32:07 2008 +0000 Commit: Peter Maydell CommitDate: Fri Dec 26 16:32:07 2008 +0000 test/common.sh: new file for common utility functions for the test scripts. Moved findprog out of manpage test script into this new file. :100644 100644 e561c512... d1082ce6... M ChangeLog :000000 100644 00000000... 1c675e20... A test/common.sh :100644 100644 ab06831c... 2ad77d8d... M test/tests/manpages/test-manpages commit 5b32b30305e864c22241dc1740a79fda9c269db7 Author: Peter Maydell AuthorDate: Thu Dec 25 23:30:33 2008 +0000 Commit: Peter Maydell CommitDate: Thu Dec 25 23:30:33 2008 +0000 test/runtest: automatically run setup-test if it hasn't already been done. Improve error handling in test script with 'set -e'. :100644 100644 d69cbcac... e561c512... M ChangeLog :100755 100755 21feb73f... 4ec4a03e... M test/runtest commit 2d4bd0ad2d574ffff2359a88bfcf53e792c3c830 Author: David Levine AuthorDate: Thu Oct 23 18:38:22 2008 +0000 Commit: David Levine CommitDate: Thu Oct 23 18:38:22 2008 +0000 * h/mh.h: raised NAMESZ from 128 to 999. RFC 2822 limits line lengths to 998 characters, so a header name can be at most that long. m_getfld limits header names to 2 less than NAMESZ, which is fine, because header names must be followed by a colon. Add one for terminating NULL. :100644 100644 2ce209a4... d69cbcac... M ChangeLog :100644 100644 97c7769b... 6513f246... M h/mh.h commit 3fcd202c63415345fbafe735a02cb040e3879aa9 Author: David Levine AuthorDate: Thu Oct 23 18:14:52 2008 +0000 Commit: David Levine CommitDate: Thu Oct 23 18:14:52 2008 +0000 * sbr/m_getfld.c: in warning message, use NAMESZ-2 instead of NAMESZ-1 bytes because the message says "exceeds", not "is greater than or equal to". :100644 100644 b486c5ec... 2ce209a4... M ChangeLog :100644 100644 bbf11fed... 9424188f... M sbr/m_getfld.c commit 0aef47ae5c03e1d9e3f225efe5ae362e7cf5ee35 Author: David Levine AuthorDate: Thu Oct 23 16:45:36 2008 +0000 Commit: David Levine CommitDate: Thu Oct 23 16:45:36 2008 +0000 * docs/MAIL.FILTERING: added note on removing procmail -f or -r options to try to suppress generation of a "From " line on incoming messages. :100644 100644 d7a94330... b486c5ec... M ChangeLog :100644 100644 becf31a0... b0b5e8d0... M docs/MAIL.FILTERING commit a54f2c5282e07ef6cd89d1fcdcb6ce4e15b07da9 Author: Eric Gillespie AuthorDate: Tue Aug 19 04:36:42 2008 +0000 Commit: Eric Gillespie CommitDate: Tue Aug 19 04:36:42 2008 +0000 +mhn.defaults.sh.cfg :100644 100644 ede4efeb... e234ebf7... M etc/.cvsignore commit 745184ce4dfd76dfe3edd5289bd638e599e0892e Author: Eric Gillespie AuthorDate: Thu Aug 14 19:47:29 2008 +0000 Commit: Eric Gillespie CommitDate: Thu Aug 14 19:47:29 2008 +0000 * test/setup-test: Don't run autogen.sh unless needed. Build in a blddir under the temporary directory so as not to interfere with whatever the developer may be doing in the source directory. If the temporary directory already exists, rebuild and install it. :100644 100644 60587481... d7a94330... M ChangeLog :100755 100755 00ad57a0... a99c6c7e... M test/setup-test commit d852091446f41b56c10a4163c9d00dd90eb2bc1b Author: Eric Gillespie AuthorDate: Thu Aug 14 06:19:08 2008 +0000 Commit: Eric Gillespie CommitDate: Thu Aug 14 06:19:08 2008 +0000 This is what happens with last-minute "safe" improvements: actually point chset to something in the new merged InitText! :100644 100644 f5ff85c2... 7c100006... M uip/mhparse.c commit 6b7218e1ae606329bf2e45b08e2e46cb9f0fc998 Author: Eric Gillespie AuthorDate: Thu Aug 14 01:50:45 2008 +0000 Commit: Eric Gillespie CommitDate: Thu Aug 14 01:50:45 2008 +0000 * sbr/ambigsw.c: Send print_sw output to stderr. This avoids strange problems with scan `pick -bogus`, not to mention being nicer anyway. * sbr/getans.c, sbr/print_help.c, uip/msh.c: Send print_sw output to stdout. * h/prototypes.h, sbr/print_sw.c (print_sw): Add FILE * argument and send output there rather than to stdout. * test/tests/pick/test-stderr: Add test that error messages don't end up going to stdout. :100644 100644 f3eb541b... 60587481... M ChangeLog :100644 100644 d10346f3... 1de40677... M h/prototypes.h :100644 100644 53c8da1a... 42796b34... M sbr/ambigsw.c :100644 100644 4feb3b90... deb884e1... M sbr/getans.c :100644 100644 17744559... a7bc7e53... M sbr/print_help.c :100644 100644 426724b4... bd7b5aa2... M sbr/print_sw.c :000000 100644 00000000... 35a64efb... A test/tests/pick/test-stderr :100644 100644 6d6fbca2... d87f92ea... M uip/msh.c commit 528f017cdebf19e2868bb77891e28e628defd13c Author: Eric Gillespie AuthorDate: Thu Aug 14 01:31:11 2008 +0000 Commit: Eric Gillespie CommitDate: Thu Aug 14 01:31:11 2008 +0000 * uip/pick.c: Ensure valid sequence name as soon as we parse it from command, instead of searching the messages first. :100644 100644 969241f7... f3eb541b... M ChangeLog :100644 100644 7aa48700... e0d61368... M uip/pick.c commit 1ae9fa8a84998e44e0234543162e257815d7e972 Author: Eric Gillespie AuthorDate: Thu Aug 14 01:28:56 2008 +0000 Commit: Eric Gillespie CommitDate: Thu Aug 14 01:28:56 2008 +0000 * uip/pick.c: Print matching messages immediately, instead of waiting until the very end to print anything. :100644 100644 280061b4... 969241f7... M ChangeLog :100644 100644 2d9b76eb... 7aa48700... M uip/pick.c commit 1a211d317de75928b79ff5336dbaeeed14bd74ec Author: Eric Gillespie AuthorDate: Thu Aug 14 01:11:12 2008 +0000 Commit: Eric Gillespie CommitDate: Thu Aug 14 01:11:12 2008 +0000 * uip/Makefile.in, uip/popi.c: Remove popi.c, which has been dead since PatchSet 257 (2000/06/12 11:07:34 UTC). :100644 100644 2cc1ba72... 280061b4... M ChangeLog :100644 100644 abd7cf4e... f101a28f... M uip/Makefile.in :100644 000000 f522042e... 00000000... D uip/popi.c commit 636b3bab53e3fc2154bb86fb02aeecf433cc977a Author: Eric Gillespie AuthorDate: Thu Aug 14 00:56:38 2008 +0000 Commit: Eric Gillespie CommitDate: Thu Aug 14 00:56:38 2008 +0000 * h/mhparse.h: Move interfaces also used by mhbuildsbr.c here from mhparse.c. * uip/Makefile.in (mhbuild): Build with mhparse.o. * uip/mhbuildsbr.c: Drop the duplication of mhparse.c. * uip/mhbuild.c, uip/mhlist.c, uip/mhn.c, uip/mhshow.c, uip/mhstore.c, uip/mhtest.c: Drop check swdeclaration, which is now in mhparse.h. * uip/mhparse.c: Move some declarations to mhparse.h, and remove 'static' from the definitions here. (get_ctinfo): Take magic mhbuild support from mhbuildsbr.c's copy, and adapt callers. (incl_name_value, extract_name_value): Move from mhbuildsbr.c to support get_ctinfo change). (get_content, open7Bit): Add Content-Disposition support, added to mhbuildsbr.c's copy in mhbuildsbr.c r1.12 (PatchSet 549). (InitText): Default to CHARSET_UNSPECIFIED instead of "US-ASCII", as mhbuildsbr.c's copy did. Explain termproc. (openBase64, openQuoted, open7Bit): Fix comment from r1.5: suffixes, not prefixes. (openMail): Explain showproc. * test/tests/mhshow/test-cte-binary: Add test for Content-Transfer-Encoding: binary (Debian #136976). * test/tests/mhbuild/test-forw: Add an mhbuild test, testing forw with and without RFC-934 mode. More mhbuild tests would be nice. :100644 100644 2e03ab67... 2cc1ba72... M ChangeLog :100644 100644 812b78f5... eb7cb18e... M h/mhparse.h :000000 100644 00000000... 1dece262... A test/tests/mhbuild/test-forw :000000 100644 00000000... 359d42e6... A test/tests/mhshow/test-cte-binary :100644 100644 e58ac4f7... abd7cf4e... M uip/Makefile.in :100644 100644 a47022ee... 9d9f553a... M uip/mhbuild.c :100644 100644 76866fe2... b75034ab... M uip/mhbuildsbr.c :100644 100644 4bb21bb5... 4cca8d2a... M uip/mhlist.c :100644 100644 376fc583... 45358e7e... M uip/mhn.c :100644 100644 67717890... f5ff85c2... M uip/mhparse.c :100644 100644 179173ef... 2b406d44... M uip/mhshow.c :100644 100644 91c57a22... bef91224... M uip/mhstore.c :100644 100644 d8c025fa... 9590fd3c... M uip/mhtest.c commit 4fd21e0553ce66d17b11c815dee3e88f34c992ad Author: Eric Gillespie AuthorDate: Wed Aug 13 23:59:56 2008 +0000 Commit: Eric Gillespie CommitDate: Wed Aug 13 23:59:56 2008 +0000 Oops, meant to use $failed (number of failed checks) as the exit code. :100644 100644 947dc305... b9e76a11... M test/tests/bad-input/test-header commit 9ca9891af4db7cbe46a9fdd8a7248bae3454a533 Author: Eric Gillespie AuthorDate: Wed Aug 13 23:32:03 2008 +0000 Commit: Eric Gillespie CommitDate: Wed Aug 13 23:32:03 2008 +0000 Add descriptive headers, as other tests have. :100644 100644 4832106c... 947dc305... M test/tests/bad-input/test-header :100644 100644 25dde498... ae6ec056... M test/tests/mhshow/test-qp :100644 100644 597bb96f... 780a69dc... M test/tests/scan/test-scan commit 8b4410a1f3cb75e3d92b61176397655d509f81ee Author: Eric Gillespie AuthorDate: Wed Aug 13 18:27:36 2008 +0000 Commit: Eric Gillespie CommitDate: Wed Aug 13 18:27:36 2008 +0000 * test/tests/bad-input/test-header: Add test for it. * sbr/m_getfld.c: If we reach the end of the line without finding a ':' when parsing a header field, treat that line as the beginning of the body rather than blowing up. These messages are usually spam, but it's nice to be able to at least scan them. :100644 100644 e33aec2a... 2e03ab67... M ChangeLog :100644 100644 c542d52f... bbf11fed... M sbr/m_getfld.c :000000 100644 00000000... 4832106c... A test/tests/bad-input/test-header commit a139e1ddbbe5e7fe89d7eb4a5dc16d4b9698960a Author: Eric Gillespie AuthorDate: Wed Aug 13 01:01:12 2008 +0000 Commit: Eric Gillespie CommitDate: Wed Aug 13 01:01:12 2008 +0000 * test/tests/mhshow/test-qp: Test various valid and invalid escape sequences. * uip/mhparse.c (openQuoted): Simplify the decode-or-show for loop by peeking ahead to the next byte(s) when encountering '=', and just let invalid escape sequences through as literals (fixes bug #15245). :100644 100644 1016132d... e33aec2a... M ChangeLog :000000 100644 00000000... 25dde498... A test/tests/mhshow/test-qp :100644 100644 4887d9a1... 67717890... M uip/mhparse.c commit d07df38d26ffdd37545d6eb81c9874ba7bea44f3 Author: Eric Gillespie AuthorDate: Wed Aug 13 01:00:20 2008 +0000 Commit: Eric Gillespie CommitDate: Wed Aug 13 01:00:20 2008 +0000 Ignore test-temp-dir. :000000 100644 00000000... 6adffa00... A test/.cvsignore commit 5cd118faad19dea7a13c2f11f1d078a2fd3cfce4 Author: Paul Fox AuthorDate: Tue Aug 12 21:01:30 2008 +0000 Commit: Paul Fox CommitDate: Tue Aug 12 21:01:30 2008 +0000 add one more hint for developers, to explicitly point at docs/README.developers :100644 100644 e93a1b42... e7a779b8... M INSTALL commit 4a6d6b0b6d7c306c3d73e39a6a76f016ff60a6b1 Author: Peter Maydell AuthorDate: Tue Aug 12 18:04:29 2008 +0000 Commit: Peter Maydell CommitDate: Tue Aug 12 18:04:29 2008 +0000 autogen.sh (new file): add script for running the GNU autotools in the right order. Mention and use new script in the appropriate places. :100644 100644 0b0c883c... 1016132d... M ChangeLog :100644 100644 a3313873... e93a1b42... M INSTALL :000000 100755 00000000... 29a02b95... A autogen.sh :100644 100644 a85f37d5... 23a1d2df... M docs/README.developers :100755 100755 2636a5df... 00ad57a0... M test/setup-test commit a33d9f4d7a1bf4bd4ab286f69af322b5b8d7c946 Author: Eric Gillespie AuthorDate: Fri Aug 8 23:45:24 2008 +0000 Commit: Eric Gillespie CommitDate: Fri Aug 8 23:45:24 2008 +0000 * sbr/discard.c, sbr/m_getfld.c, uip/scansbr.c: Add support for DragonFlyBSD stdio (from NetBSD pkgsrc). :100644 100644 7dc54913... 0b0c883c... M ChangeLog :100644 100644 7c132ceb... 55c160bf... M sbr/discard.c :100644 100644 59b8682f... c542d52f... M sbr/m_getfld.c :100644 100644 6a9278bb... df182584... M uip/scansbr.c commit fd36f8c46bb76abaadc52321a03ee5f196676a0b Author: Eric Gillespie AuthorDate: Fri Aug 8 04:45:05 2008 +0000 Commit: Eric Gillespie CommitDate: Fri Aug 8 04:45:05 2008 +0000 s/ls/cd/ in comment (probably pasted from test-ls) :100644 100644 6bc20400... 3e0ddc43... M test/tests/whatnow/test-cd commit 9be69008c0dd066816b4a9b04d47fade2282664a Author: Peter Maydell AuthorDate: Tue Aug 5 21:06:00 2008 +0000 Commit: Peter Maydell CommitDate: Tue Aug 5 21:06:00 2008 +0000 uip/folder.c: chdir(nmhdir) in main rather than in dodir, which is called many times. Drop the chdir in get_folder_info, which served no purpose at all. If struct stat has d_type (BSD), use that to skip processing (strcmp, stat, and so on) of message files, mostly undoing the slow-down from the last change. Plus autoconf machinery to detect d_type field. Patch from Eric Gillespie. :100644 100644 5f02b175... 7dc54913... M ChangeLog :100644 100644 c0d4fb8a... 6091daad... M aclocal.m4 :100644 100644 0b2a73c4... ce9c4ba7... M configure.in :100644 100644 d4d98686... a94f1315... M uip/folder.c commit f7c1a8a53c452b75aa84ff4bf9de7f47af7b881c Author: Peter Maydell AuthorDate: Tue Aug 5 19:09:03 2008 +0000 Commit: Peter Maydell CommitDate: Tue Aug 5 19:09:03 2008 +0000 Dump hacky overoptimisation in addir -- it doesn't actually get the case of symlinks to directories right. Patch from Eric Gillespie. :100644 100644 ce6939ba... 5f02b175... M ChangeLog :100644 100644 a0821c27... d4d98686... M uip/folder.c commit ef8679ef6af0ba01d8dc43df577c5962037f13bd Author: Peter Maydell AuthorDate: Tue Aug 5 19:05:23 2008 +0000 Commit: Peter Maydell CommitDate: Tue Aug 5 19:05:23 2008 +0000 Simplify dodir/addir/addfold (patch from Eric Gillespie) :100644 100644 6afe9adf... ce6939ba... M ChangeLog :100644 100644 f50d3f51... a0821c27... M uip/folder.c commit e98f7f60095bceba1f32e448c421b3e862b728aa Author: Peter Maydell AuthorDate: Sun Aug 3 18:47:56 2008 +0000 Commit: Peter Maydell CommitDate: Sun Aug 3 18:47:56 2008 +0000 bug #23319: rework the way we handle the working directory when invoking the user's shell, so that we don't have issues when the cwd contains a space or shell special character. :100644 100644 1e9e31e3... 6afe9adf... M ChangeLog :000000 100644 00000000... 1a36d8d6... A test/tests/whatnow/test-attach-detach :000000 100644 00000000... 6bc20400... A test/tests/whatnow/test-cd :000000 100644 00000000... e0dc9696... A test/tests/whatnow/test-ls :100644 100644 72e9d1ff... a7194319... M uip/whatnowsbr.c commit a9d65cd81e8ca93af31086a136d1e3ade86ad8d2 Author: Peter Maydell AuthorDate: Sun Aug 3 18:45:34 2008 +0000 Commit: Peter Maydell CommitDate: Sun Aug 3 18:45:34 2008 +0000 test/setup-test: use 'set -e' so we stop on compile failure. Configure --enable-debug for convenience in debugging. :100755 100755 46b83b0e... 2636a5df... M test/setup-test commit b47dac6540ed952b95dbdce78d2a5f48ff0db86b Author: Peter Maydell AuthorDate: Sun Aug 3 15:19:53 2008 +0000 Commit: Peter Maydell CommitDate: Sun Aug 3 15:19:53 2008 +0000 Add protective 'do { ... } while (0)' wrappers to multistatement macros :100644 100644 cbd4ef22... 1e9e31e3... M ChangeLog :100644 100644 c42f1e38... 89c25def... M sbr/fmt_compile.c commit a3ef57491a1bc4d2e227b14a8e838ffb6c5b5f63 Author: Peter Maydell AuthorDate: Sun Aug 3 15:14:23 2008 +0000 Commit: Peter Maydell CommitDate: Sun Aug 3 15:14:23 2008 +0000 Bug #23436: fix some minor manpage syntax errors and add a test which runs groff over them and checks that no warnings are emitted. :100644 100644 c59f4a6c... 0f05b68f... M man/forw.man :100644 100644 baaead8e... 86280b97... M man/inc.man :100644 100644 707e2be3... 5e097e43... M man/mh-chart.man :100644 100644 7e46677c... 75f49189... M man/mhmail.man :100644 100644 37172025... 78d8ed95... M man/mhshow.man :100644 100644 ae15292a... 49072735... M man/mhstore.man :100644 100644 49a841d2... 6decb1e5... M man/msgchk.man :100644 100644 d220a76a... a351578b... M man/packf.man :100644 100644 3655a100... 7da788e9... M man/scan.man :000000 100644 00000000... ab06831c... A test/tests/manpages/test-manpages commit 96e5489117df5aefa72de229ab08eda82c8b8913 Author: Peter Maydell AuthorDate: Sun Aug 3 15:13:34 2008 +0000 Commit: Peter Maydell CommitDate: Sun Aug 3 15:13:34 2008 +0000 Allow tests to indicate that they have been skipped by printing their own message and returning with exit status 120. :100644 100644 ddfa381c... c61647eb... M test/README :100755 100755 3d7a92b9... 21feb73f... M test/runtest commit 90950f1aa3d8d01e4b1a4a4b389f1bff7da94f45 Author: Peter Maydell AuthorDate: Sun Aug 3 13:59:19 2008 +0000 Commit: Peter Maydell CommitDate: Sun Aug 3 13:59:19 2008 +0000 Ignore editor backup files :100644 100644 39aab9a8... cbd4ef22... M ChangeLog :100755 100755 b43d42ce... 0497c52b... M test/runalltests commit e429820bc15ffd06239ae9e4f4100ee47738deba Author: Peter Maydell AuthorDate: Sun Aug 3 13:54:37 2008 +0000 Commit: Peter Maydell CommitDate: Sun Aug 3 13:54:37 2008 +0000 etc/replcomps, etc/replgroupcomps: Trim trailing whitespace from Subject field (patch from Eric Gillespie) :100644 100644 d76efca9... 39aab9a8... M ChangeLog :100644 100644 6ec3ce72... 91664113... M etc/replcomps :100644 100644 7920544b... 210a3e00... M etc/replgroupcomps commit 4f653e8f897068fc803607a5975fa18ab1519bcf Author: Peter Maydell AuthorDate: Sun Aug 3 13:32:17 2008 +0000 Commit: Peter Maydell CommitDate: Sun Aug 3 13:32:17 2008 +0000 When doing an if-test on the result of a function which returns a string result, check whether the string is non-empty (as the documentation says we do). Previously we were always testing the integer 'value'. :100644 100644 7e6b2eb0... d76efca9... M ChangeLog :100644 100644 d699916a... c42f1e38... M sbr/fmt_compile.c :000000 100644 00000000... 7582a7d3... A test/tests/repl/test-if-str commit a107dc40d92e7a37be148816db160325326318e3 Author: Josh Bressers AuthorDate: Fri Jul 25 01:07:39 2008 +0000 Commit: Josh Bressers CommitDate: Fri Jul 25 01:07:39 2008 +0000 * test/setup-test: Run 'make clean' before building :100644 100644 0d476021... 7e6b2eb0... M ChangeLog :100755 100755 a05b1392... 46b83b0e... M test/setup-test commit 7afe9b7d7142e48c76dfac3992fdf91d3e5518ff Author: Josh Bressers AuthorDate: Fri Jul 25 00:11:53 2008 +0000 Commit: Josh Bressers CommitDate: Fri Jul 25 00:11:53 2008 +0000 * test/runtest: cat test-temp-dir only once. Destroy and create test Mail hierarchy here, so each test has its own independent test data. * test/setup-test: Drop needless pushd/popd, which don't exist in sh anyway. Don't use aclocal, which is part of automake. Don't create Mail hierarchy here (see test/runtest). * test/tests/folder/test-create, tests/folder/test-total: Drop unused BINDIR. * tests/pick/test-pick: Remove failing no-op test. * test/tests/scan/test-scan: Write expected and actual output to files and diff them. This way, if the output differs, diff provides the FAILing exit code and shows the differences. :100644 100644 d08bcdd2... 0d476021... M ChangeLog :100755 100755 d970b183... 3d7a92b9... M test/runtest :100755 100755 d1972952... a05b1392... M test/setup-test :100644 100644 a5b71baa... 5b74b237... M test/tests/folder/test-create :100644 100644 6da31741... ff293108... M test/tests/folder/test-total :100644 000000 2bb8d868... 00000000... D test/tests/pick/test-pick :100644 100644 4aca55f7... 597bb96f... M test/tests/scan/test-scan commit 3bade3916feaf3cb52e1dd8a12004eda26f6980b Author: Josh Bressers AuthorDate: Fri Jun 13 00:11:49 2008 +0000 Commit: Josh Bressers CommitDate: Fri Jun 13 00:11:49 2008 +0000 * man/repl.man, etc/mhl.reply: Add an attribution line when replying to messages. :100644 100644 785aeca1... d08bcdd2... M ChangeLog :100644 100644 0caf5db2... 3498263b... M etc/mhl.reply :100644 100644 89ab11e7... 41f58709... M man/repl.man commit 716349e83109bed140c59beb70b546d968c7da67 Author: Josh Bressers AuthorDate: Thu Jun 12 23:29:16 2008 +0000 Commit: Josh Bressers CommitDate: Thu Jun 12 23:29:16 2008 +0000 Remove an accidentally committed file :100644 000000 5ca70d05... 00000000... D test/test-temp-dir commit 25c0bc3f1c034964421f8007e5802c647c5dc908 Author: Peter Maydell AuthorDate: Mon Jun 2 22:37:01 2008 +0000 Commit: Peter Maydell CommitDate: Mon Jun 2 22:37:01 2008 +0000 When building on gcc, use noreturn attribute on adios and the various done functions. :100644 100644 e08e6783... 785aeca1... M ChangeLog :100644 100644 7cdbead2... 97c7769b... M h/mh.h :100644 100644 52fab3aa... d10346f3... M h/prototypes.h :100644 100644 938fdb2d... 65ec1cb7... M sbr/done.c :100644 100644 ef1b08fe... 0fcff840... M uip/inc.c :100644 100644 2776f7c8... a47022ee... M uip/mhbuild.c :100644 100644 e8f8163b... 4bb21bb5... M uip/mhlist.c :100644 100644 69554768... 376fc583... M uip/mhn.c :100644 100644 1383388d... 179173ef... M uip/mhshow.c :100644 100644 bcebb7f2... 91c57a22... M uip/mhstore.c :100644 100644 fa42cd27... d8c025fa... M uip/mhtest.c :100644 100644 fb8871d9... a696e727... M uip/packf.c :100644 100644 ad356e39... 2d9b76eb... M uip/pick.c :100644 100644 b0a36097... 7ee47fd9... M uip/rcvdist.c :100644 100644 493badeb... 21f6c776... M uip/rcvstore.c :100644 100644 877538bf... fd21acd3... M uip/sendsbr.c commit 871bd3b965321122be0db49961369b111e4ea4db Author: Peter Maydell AuthorDate: Mon Jun 2 22:05:11 2008 +0000 Commit: Peter Maydell CommitDate: Mon Jun 2 22:05:11 2008 +0000 Back out previous, completely broken, change (due to a foulup I was compiling a different tree to the one I was committing to CVS). :100644 100644 2e7678ec... e08e6783... M ChangeLog :100644 100644 d559baa1... 52fab3aa... M h/prototypes.h commit 8d3e26681c4341c76fe9a28371a75061678e7df2 Author: Peter Maydell AuthorDate: Mon Jun 2 21:49:07 2008 +0000 Commit: Peter Maydell CommitDate: Mon Jun 2 21:49:07 2008 +0000 If we're compiling with gcc, mark adios() as never returning (better code and fewer spurious 'uninitialized variable) warnings) :100644 100644 e08e6783... 2e7678ec... M ChangeLog :100644 100644 52fab3aa... d559baa1... M h/prototypes.h commit 4eaed47f91c9de0b520ea41188be3fedae4b99ca Author: Peter Maydell AuthorDate: Sun Jun 1 16:50:22 2008 +0000 Commit: Peter Maydell CommitDate: Sun Jun 1 16:50:22 2008 +0000 Update bit of docs about release announcements. :100644 100644 ed475917... e08e6783... M ChangeLog :100644 100644 f941e38f... a85f37d5... M docs/README.developers commit d9c0d17aa110ec0e5db5f0928fead5a1ff60a9e2 Author: Peter Maydell AuthorDate: Thu May 22 10:37:55 2008 +0000 Commit: Peter Maydell CommitDate: Thu May 22 10:37:55 2008 +0000 Don't use MB_CUR_MAX if we aren't compiled with multibyte support. :100644 100644 33485f84... ed475917... M ChangeLog :100644 100644 1b6a0ed9... 6a9278bb... M uip/scansbr.c commit 51c505fd1a7488d62088d5268ae1f8a5bc885b19 Author: Peter Maydell AuthorDate: Thu May 22 10:21:48 2008 +0000 Commit: Peter Maydell CommitDate: Thu May 22 10:21:48 2008 +0000 Factor out common code for writing ls shell command. Rework its length checking so it doesn't rely on the return value of sprintf(), for the benefit of SunOS 4. :100644 100644 a3eff81d... 33485f84... M ChangeLog :100644 100644 0a959db2... 72e9d1ff... M uip/whatnowsbr.c commit b84d8f3a2a435ecad9b75900a9f31445fb71e187 Author: Peter Maydell AuthorDate: Wed May 21 18:05:49 2008 +0000 Commit: Peter Maydell CommitDate: Wed May 21 18:05:49 2008 +0000 Don't rely on realloc() to follow POSIX in handling a NULL pointer :100644 100644 8da51112... a3eff81d... M ChangeLog :100644 100644 d822995b... 7c4ddcf2... M sbr/utils.c commit f6d142edd29a2d1d726efceb3121f9f9b6dd5b9a Author: Peter Maydell AuthorDate: Wed May 21 17:16:44 2008 +0000 Commit: Peter Maydell CommitDate: Wed May 21 17:16:44 2008 +0000 Add some table size declarations for the benefit of elderly lexes with small defaults (eg SunOS 4) :100644 100644 8d6c1f19... 8da51112... M ChangeLog :100644 100644 113f2ea2... c35c9bef... M sbr/dtimep.lex commit b3a909747d6166f820d2ac3c78cc5ad834d3b9b7 Author: Peter Maydell AuthorDate: Tue May 20 19:04:57 2008 +0000 Commit: Peter Maydell CommitDate: Tue May 20 19:04:57 2008 +0000 Update comment now we don't use lex -o. :100644 100644 608faa7b... a920958c... M sbr/Makefile.in commit 3adc6332ad97bf689bcfb8ab5fd45c86a6051a77 Author: David Levine AuthorDate: Sun May 18 13:56:58 2008 +0000 Commit: David Levine CommitDate: Sun May 18 13:56:58 2008 +0000 * sbr/addrsbr.c: removed "err" from conditional, because gcc correctly warned that it would always evaluate as true. It's the address of a static array. :100644 100644 999e7437... 8d6c1f19... M ChangeLog :100644 100644 fa45e31a... 09e4c6c5... M sbr/addrsbr.c commit 07f336c16bdb2316c0e32debb3c7ed2e5a89e49a Author: Oliver Kiddle AuthorDate: Fri May 16 15:31:26 2008 +0000 Commit: Oliver Kiddle CommitDate: Fri May 16 15:31:26 2008 +0000 don't use $< in target rules in makefiles, as POSIX says it's only defined in inference rules :100644 100644 01ba7048... 999e7437... M ChangeLog :100644 100644 482bca25... aba161b8... M config/Makefile.in :100644 100644 2927e3c1... 608faa7b... M sbr/Makefile.in commit 27844443b4759689ecbc2eb4519c0fe83ebda473 Author: David Levine AuthorDate: Tue May 13 02:39:04 2008 +0000 Commit: David Levine CommitDate: Tue May 13 02:39:04 2008 +0000 * configure.in, INSTALL: if --enable-masquerade is not specified to configure, enable all supported masquerade forms. This allows users to masquerade with the default configuration. That seems to be more worthwhile now than trying to prevent users from using it, especially with single-user installations or those where a user can edit etc/mts.conf. :100644 100644 1a62efb9... 01ba7048... M ChangeLog :100644 100644 37a38e57... a3313873... M INSTALL :100644 100644 c5a90506... 0b2a73c4... M configure.in commit ae31d21710465851fdecc8e5fb447e690b83a9f4 Author: Peter Maydell AuthorDate: Sun May 4 20:58:35 2008 +0000 Commit: Peter Maydell CommitDate: Sun May 4 20:58:35 2008 +0000 bug #23167: sbr/ruserpass.c (ruserpass): make bad permissions on .netrc be an instantly fatal error. Previously we returned an error value; however, no caller was checking it. So now ruserpass() has a void return type. :100644 100644 d4efbc62... 1a62efb9... M ChangeLog :100644 100644 2f4f6511... 52fab3aa... M h/prototypes.h :100644 100644 36605bea... 5ed6fde2... M sbr/ruserpass.c commit faa066cb24d3308ab5d2c40ed145ecb3940461bf Author: Peter Maydell AuthorDate: Sun May 4 16:09:08 2008 +0000 Commit: Peter Maydell CommitDate: Sun May 4 16:09:08 2008 +0000 * bug #23163: various minor fixes for the benefit of older Unixes (specifically SunOS 4): reintroduce strerror() substitute implementation; provide memmove() substitute implementation * bug #23163: fix broken 'build outside source directory' feature * bug #23162: sbr/dtime.c: fix stray HAVE_TM_GMTOFF that wasn't updated to the new macro name. :100644 100644 620f47eb... d4efbc62... M ChangeLog :100644 100644 6ca83082... 482bca25... M config/Makefile.in :100644 100644 6b21a320... c5a90506... M configure.in :100644 100644 37434d95... 2927e3c1... M sbr/Makefile.in :100644 100644 8cb4c799... 14359557... M sbr/dtime.c :000000 100644 00000000... 62a303f2... A sbr/memmove.c :000000 100644 00000000... d7809550... A sbr/strerror.c commit 11cf7b43a23ad3e3b7d80e485c90c4e0ab9b6066 Author: Peter Maydell AuthorDate: Wed Apr 30 18:47:02 2008 +0000 Commit: Peter Maydell CommitDate: Wed Apr 30 18:47:02 2008 +0000 Provide SASL_CB_AUTHNAME callback (avoids problem with wrong username being sent in some situations) :100644 100644 7649ae01... 620f47eb... M ChangeLog :100644 100644 850693dd... 35eefb48... M mts/smtp/smtp.c commit d4178eb3eebbf5c51c51cc713df58a2bdaa6bede Author: Peter Maydell AuthorDate: Tue Apr 29 21:05:30 2008 +0000 Commit: Peter Maydell CommitDate: Tue Apr 29 21:05:30 2008 +0000 Correct various places in smtp.c where the reply string might not have been correctly NUL-terminated. Includes a fix for a particularly nasty and long standing screwup where the buffer length counting in smhear() was totally broken for continued lines from the server. :100644 100644 da5ac1d3... 7649ae01... M ChangeLog :100644 100644 13e8eff9... 850693dd... M mts/smtp/smtp.c :100644 100644 1d7d2c98... 73eb5de7... M mts/smtp/smtp.h commit 757fa32156f812a166631942816e46e2138ebae3 Author: Peter Maydell AuthorDate: Tue Apr 29 20:59:04 2008 +0000 Commit: Peter Maydell CommitDate: Tue Apr 29 20:59:04 2008 +0000 Fix SASL issue properly, by making sm_rrecord() and thus sm_hear() set the length of the reply string correctly (the SASL libraries now care if you pass in the wrong length). :100644 100644 9a7b3108... da5ac1d3... M ChangeLog :100644 100644 1ab027f3... 13e8eff9... M mts/smtp/smtp.c commit 7995fb587acf227b08102c75e15c20418d06ad7d Author: Peter Maydell AuthorDate: Tue Apr 29 20:53:33 2008 +0000 Commit: Peter Maydell CommitDate: Tue Apr 29 20:53:33 2008 +0000 Revert previous SASL fix (wrong approach) :100644 100644 046a1188... 9a7b3108... M ChangeLog :100644 100644 9527a5e1... 1ab027f3... M mts/smtp/smtp.c commit 386656ec3d9a80184f380a77169dc0a16bad89d5 Author: Peter Maydell AuthorDate: Tue Apr 29 17:04:38 2008 +0000 Commit: Peter Maydell CommitDate: Tue Apr 29 17:04:38 2008 +0000 Cope with sasl_decode64() returning SASL_CONTINUE as well as SASL_OK. :100644 100644 42144d50... 046a1188... M ChangeLog :100644 100644 1ab027f3... 9527a5e1... M mts/smtp/smtp.c commit acbaad14892c83d03d91a36c3a1d95526aea26ba Author: Peter Maydell AuthorDate: Mon Apr 28 21:13:53 2008 +0000 Commit: Peter Maydell CommitDate: Mon Apr 28 21:13:53 2008 +0000 Add remark about how to update the homepage. :100644 100644 351a27de... f941e38f... M docs/README.developers commit 814636fe9919b8c365bfa19479f6f9a79ad87ed5 Author: Peter Maydell AuthorDate: Sun Apr 27 20:58:50 2008 +0000 Commit: Peter Maydell CommitDate: Sun Apr 27 20:58:50 2008 +0000 Update some of the 'how to do a release' documentation :100644 100644 71ee5ebd... 42144d50... M ChangeLog :100644 100644 20b64527... 351a27de... M docs/README.developers commit 419ccf0da01ec9f0b0700a6bea7ac5f216cd28d8 Author: Peter Maydell AuthorDate: Sun Apr 27 20:55:28 2008 +0000 Commit: Peter Maydell CommitDate: Sun Apr 27 20:55:28 2008 +0000 Up version string to 1.3-dev for the CVS trunk. :100644 100644 c0f38c2a... 71ee5ebd... M ChangeLog :100644 100644 66270539... cd438c95... M VERSION commit d58a56024e4103acaf855e159a85daa212c58e57 Author: Peter Maydell AuthorDate: Sun Apr 27 19:54:37 2008 +0000 Commit: Peter Maydell CommitDate: Sun Apr 27 19:54:37 2008 +0000 Use hyphen, not plus (corresponding to previous RCx naming convention) :100644 100644 98d978a0... 66270539... M VERSION commit 4afcf54c989a28d07a258afb9f23db29f7f628a9 Author: Peter Maydell AuthorDate: Sun Apr 27 19:44:58 2008 +0000 Commit: Peter Maydell CommitDate: Sun Apr 27 19:44:58 2008 +0000 Bump version number, date for release of 1.3 RC1 :100644 100644 054cf360... c0f38c2a... M ChangeLog :100644 100644 beb1a1c6... 4a3bde85... M DATE :100644 100644 5625e59d... 98d978a0... M VERSION commit c79c37f2b6e647212c36b63841a4628af01c774a Author: Oliver Kiddle AuthorDate: Fri Apr 11 14:12:54 2008 +0000 Commit: Oliver Kiddle CommitDate: Fri Apr 11 14:12:54 2008 +0000 move most remaining macros out of acconfig.h which is an obsolete feature of autoconf :100644 100644 7da2dbc0... 054cf360... M ChangeLog :100644 100644 ba744a4c... 3649bf33... M acconfig.h :100644 100644 e113860e... 6b21a320... M configure.in :100644 100644 e485dfd8... 8cb4c799... M sbr/dtime.c :100644 100644 1572bfe4... 6043bee1... M sbr/pidwait.c :100644 100644 e28c73ea... 9317defd... M uip/mhshowsbr.c :100644 100644 9b272d29... 97c32284... M uip/rcvtty.c :100644 100644 f500f6ea... 4a8875e7... M uip/slocal.c :100644 100644 421c3670... a1b8ebf1... M uip/termsbr.c commit 86d7837287c4ca1204cca84f55871d862fada47a Author: Peter Maydell AuthorDate: Sat Apr 5 19:04:41 2008 +0000 Commit: Peter Maydell CommitDate: Sat Apr 5 19:04:41 2008 +0000 * bug #18655: fix use of admonish() for a fatal error (should be adios(); only actual effect would be wrong exit code). Thanks to Craig Leres for spotting this. :100644 100644 4023e456... 7da2dbc0... M ChangeLog :100644 100644 b5da86c6... f08a583a... M uip/mhmail.c commit 322f6f0518f2fca892733dea85d87c33fcb65e83 Author: Peter Maydell AuthorDate: Sat Apr 5 18:41:37 2008 +0000 Commit: Peter Maydell CommitDate: Sat Apr 5 18:41:37 2008 +0000 Bug #20028 (Debian bug 399271): fix code assuming that pointer differences were 32 bits -- thanks to Dean Gaudet for the patch. :100644 100644 ffa4e93d... 4023e456... M ChangeLog :100644 100644 c3d265a1... ca4020b0... M sbr/fmt_scan.c :100644 100644 65b89079... 866d0477... M sbr/lock_file.c :100644 100644 86696db3... 9dcfdf60... M sbr/m_backup.c :100644 100644 6c158869... 59b8682f... M sbr/m_getfld.c :100644 100644 30601f14... df635316... M sbr/m_scratch.c :100644 100644 2559b678... ac04c296... M sbr/mf.c :100644 100644 7475fa08... 7ef83eab... M sbr/path.c :100644 100644 2ad873eb... e8ef50ae... M uip/annosbr.c :100644 100644 2b3d0208... 84435a2e... M uip/dropsbr.c :100644 100644 041a1429... 76866fe2... M uip/mhbuildsbr.c :100644 100644 a3481441... 4887d9a1... M uip/mhparse.c :100644 100644 1396cc29... f500f6ea... M uip/slocal.c commit 55b8f7b6a738adb4dc9833233fc6111f3cd56969 Author: Josh Bressers AuthorDate: Fri Jan 25 21:00:42 2008 +0000 Commit: Josh Bressers CommitDate: Fri Jan 25 21:00:42 2008 +0000 * uip/mhshowsbr.c (show_all_messages): Be more generous when parsing multipart messages. :100644 100644 2b2254c8... ffa4e93d... M ChangeLog :100644 100644 08d676e0... e28c73ea... M uip/mhshowsbr.c commit da831514de01e2407cef37c118ffff0526a486d0 Author: Joel Reicher AuthorDate: Thu Nov 8 02:28:38 2007 +0000 Commit: Joel Reicher CommitDate: Thu Nov 8 02:28:38 2007 +0000 Insert types for args of some function pointers to improve type checking. :100644 100644 e3e97b46... 5d0ed31c... M h/popsbr.h :100644 100644 0f050252... 2f4f6511... M h/prototypes.h :100644 100644 9c19e924... 8f327549... M h/utils.h :100644 100644 c085bf5f... 6c158869... M sbr/m_getfld.c :100644 100644 87d368dd... d822995b... M sbr/utils.c :100644 100644 1df74d93... 8e14d524... M uip/popsbr.c commit 38615191e71744b066425e0c44412b62dbe49cc2 Author: Joel Reicher AuthorDate: Sun Nov 4 11:54:32 2007 +0000 Commit: Joel Reicher CommitDate: Sun Nov 4 11:54:32 2007 +0000 Return type of (*done)() changed to void. default_done() replaced by exit(). All dead code "return 1" lines removed from *_done()s and replaced by explicit "return 1" following done() calls in main()s (they should never be reached). This should make cleaning up program termination structures easier. :100644 100644 1412bf30... 2b2254c8... M ChangeLog :100644 100644 bcfe6ae9... 7cdbead2... M h/mh.h :100644 100644 bcc258cc... 938fdb2d... M sbr/done.c :100644 100644 a8812c22... 8513092c... M uip/ali.c :100644 100644 86fe3c3a... ee9dcd71... M uip/anno.c :100644 100644 85683f93... ea2d36d7... M uip/ap.c :100644 100644 319918bb... 15756d30... M uip/burst.c :100644 100644 67cf83bb... 9c915bf3... M uip/comp.c :100644 100644 1713b15b... 8247ff0c... M uip/conflict.c :100644 100644 d8c261da... 1effbb05... M uip/dist.c :100644 100644 c20e1ac8... 6b41bb62... M uip/dp.c :100644 100644 97488bbb... b5226cea... M uip/flist.c :100644 100644 cc9a589a... a590a006... M uip/fmtdump.c :100644 100644 f04ae2fa... f50d3f51... M uip/folder.c :100644 100644 17e78e98... 2d4f2d53... M uip/forw.c :100644 100644 f2d2e779... ef1b08fe... M uip/inc.c :100644 100644 ec847fb4... d3890938... M uip/install-mh.c :100644 100644 4799b238... 372568a0... M uip/mark.c :100644 100644 15132eec... 2776f7c8... M uip/mhbuild.c :100644 100644 2c101b94... 041a1429... M uip/mhbuildsbr.c :100644 100644 418e5c92... df0ee465... M uip/mhfree.c :100644 100644 03eb49e8... e37c3ba9... M uip/mhl.c :100644 100644 112c0984... e8f8163b... M uip/mhlist.c :100644 100644 41eb33ab... 69554768... M uip/mhn.c :100644 100644 0b60b032... f9f78c34... M uip/mhparam.c :100644 100644 733048d8... a3481441... M uip/mhparse.c :100644 100644 3974515d... c4fd935b... M uip/mhpath.c :100644 100644 b7a097c1... 1383388d... M uip/mhshow.c :100644 100644 4d1ebe09... bcebb7f2... M uip/mhstore.c :100644 100644 6771bdb8... fa42cd27... M uip/mhtest.c :100644 100644 872dc2e1... 1a59a3bd... M uip/msgchk.c :100644 100644 3f8a7ab0... 6d6fbca2... M uip/msh.c :100644 100644 0183da65... fb8871d9... M uip/packf.c :100644 100644 afbcf88c... ad356e39... M uip/pick.c :100644 100644 d99da1fd... e3b6229d... M uip/post.c :100644 100644 fd10aca2... 35f6860a... M uip/prompter.c :100644 100644 1667232c... b0a36097... M uip/rcvdist.c :100644 100644 410267b6... f03fc995... M uip/rcvpack.c :100644 100644 3e0961e5... 493badeb... M uip/rcvstore.c :100644 100644 0b3afe12... 7bc6d0b9... M uip/refile.c :100644 100644 7a1aca18... 4584b674... M uip/repl.c :100644 100644 1cacbc47... c3dcc919... M uip/rmf.c :100644 100644 b1e887e7... 15302896... M uip/rmm.c :100644 100644 05f8bf88... 31aa245f... M uip/scan.c :100644 100644 78494721... 196af625... M uip/send.c :100644 100644 cb6bb3f7... 877538bf... M uip/sendsbr.c :100644 100644 08a3e28b... 1396cc29... M uip/slocal.c :100644 100644 65291ce8... 212b4416... M uip/sortm.c :100644 100644 859dfafa... 04a76d2f... M uip/viamail.c commit 045101c0a79f43fe566422622f154d5cc0141d8a Author: Joel Reicher AuthorDate: Sun Nov 4 08:52:17 2007 +0000 Commit: Joel Reicher CommitDate: Sun Nov 4 08:52:17 2007 +0000 Refactor cts pointer and free()ing on abnormal exit of associated list into mhfree.c, eliminating duplication. :100644 100644 abaeb2bd... 418e5c92... M uip/mhfree.c :100644 100644 bcc4dd2b... 112c0984... M uip/mhlist.c :100644 100644 3f2d2623... 41eb33ab... M uip/mhn.c :100644 100644 47551717... b7a097c1... M uip/mhshow.c :100644 100644 b1f57fe9... 4d1ebe09... M uip/mhstore.c :100644 100644 985147c7... 6771bdb8... M uip/mhtest.c commit 56a805299de35d8924969138aef4d0f1580daa6d Author: Joel Reicher AuthorDate: Sun Nov 4 04:47:17 2007 +0000 Commit: Joel Reicher CommitDate: Sun Nov 4 04:47:17 2007 +0000 Change link-time overriding of done() to run-time reassigning of equivalent (*done)(). This should make changing the return type of done and the rationalisation of exit code easier. :100644 100644 130bfde5... bcfe6ae9... M h/mh.h :100644 100644 a91418e2... 0f050252... M h/prototypes.h :100644 100644 cf2e3080... bcc258cc... M sbr/done.c :100644 100644 45036f5b... f2d2e779... M uip/inc.c :100644 100644 cfe776fe... 15132eec... M uip/mhbuild.c :100644 100644 1de53e33... bcc4dd2b... M uip/mhlist.c :100644 100644 809568c5... 3f2d2623... M uip/mhn.c :100644 100644 3e7e3a5f... 47551717... M uip/mhshow.c :100644 100644 dc627247... b1f57fe9... M uip/mhstore.c :100644 100644 5e6494a2... 985147c7... M uip/mhtest.c :100644 100644 9f954667... 0183da65... M uip/packf.c :100644 100644 dff628ae... afbcf88c... M uip/pick.c :100644 100644 e8815653... 1667232c... M uip/rcvdist.c :100644 100644 4e14afbb... 3e0961e5... M uip/rcvstore.c :100644 100644 aeba011e... cb6bb3f7... M uip/sendsbr.c commit 5c5dd3edc1081fa4bedec764e5e8cc44bc4fa5fd Author: Bill Wohler AuthorDate: Mon Sep 24 07:02:03 2007 +0000 Commit: Bill Wohler CommitDate: Mon Sep 24 07:02:03 2007 +0000 The MH web site is now http://rand-mh.sourceforge.net/ and the MH book is now at http://rand-mh.sourceforge.net/book/. Changed Questions 1.02 ...current version? mailutils 1.2 1.03 Where can I get MH? Debian 4.0 nmh 1.1-RC4, update links, mu 1.2 1.04 ...references for MH? Refer to SourceForge 1.06 How...print a MH manual? Refer to SourceForge 2.17 How...build MH on a Mac? Use fink 4.05 ...tools to archive MH? Mention swish++, mairix, and namazu :100644 100644 134ace47... f086862b... M docs/FAQ commit 7edb0cbc236244d996d1e2ae1d58d0e9f7d98062 Author: Josh Bressers AuthorDate: Tue Aug 21 21:19:39 2007 +0000 Commit: Josh Bressers CommitDate: Tue Aug 21 21:19:39 2007 +0000 * Red Hat Bug #253342: inc.c, utils.c, utils.h: When inc is run with the -silent flag, don't exit(1) for no apparent reason. :100644 100644 89de2f8d... 1412bf30... M ChangeLog :100644 100644 92fdabac... 9c19e924... M h/utils.h :100644 100644 64df443b... 87d368dd... M sbr/utils.c :100644 100644 a2ecb440... 45036f5b... M uip/inc.c commit ea7c3f6a1f777578447040c553ebc80dbc252f7d Author: Peter Maydell AuthorDate: Sun Apr 29 22:57:36 2007 +0000 Commit: Peter Maydell CommitDate: Sun Apr 29 22:57:36 2007 +0000 Rename functions to avoid clash with C library exp2(). :100644 100644 a00f335e... 1e16795f... M uip/picksbr.c commit 8f7c0596b0ad1adf74384f7a2b584835ede3aacc Author: Peter Maydell AuthorDate: Sun Apr 29 22:34:04 2007 +0000 Commit: Peter Maydell CommitDate: Sun Apr 29 22:34:04 2007 +0000 Suppress 'uninitialised variable' warning. :100644 100644 80eeb710... 4feb3b90... M sbr/getans.c commit ff636cd27782f33f11ff8477b0dad4535d1ab9ab Author: Peter Maydell AuthorDate: Sun Apr 29 22:05:02 2007 +0000 Commit: Peter Maydell CommitDate: Sun Apr 29 22:05:02 2007 +0000 On Linux, define _GNU_SOURCE so that GNU libc exposes the wcwidth() prototype in wchar.h. :100644 100644 2fa252c7... eecef1b6... M Makefile.in :100644 100644 3b9f44c4... e113860e... M configure.in commit 76d105d8136c53f1445849e84d49b100b29fbb78 Author: Peter Maydell AuthorDate: Sun Apr 29 22:01:04 2007 +0000 Commit: Peter Maydell CommitDate: Sun Apr 29 22:01:04 2007 +0000 Change name of internal function to avoid potential conflicts with GNU libc's getline() function. :100644 100644 6a7eeeeb... 1df74d93... M uip/popsbr.c commit c9492787464d45334fccd8dce432744fc9321ba6 Author: Peter Maydell AuthorDate: Sun Apr 29 20:49:32 2007 +0000 Commit: Peter Maydell CommitDate: Sun Apr 29 20:49:32 2007 +0000 Minor rearrangement so variables/functions used only if !HAVE_LIBLOCKFILE are also declared only in that case. :100644 100644 66eab72c... 65b89079... M sbr/lock_file.c commit 6e4254784c387c1e0c966e1977561d4bd05dfbd3 Author: Peter Maydell AuthorDate: Sun Apr 29 19:36:14 2007 +0000 Commit: Peter Maydell CommitDate: Sun Apr 29 19:36:14 2007 +0000 For gcc, make the default CFLAGS include -Wno-pointer-sign if the compiler recognises it. gcc 4 now by default produces a large volume of these warnings, which I believe are probably spurious and definitely a lot of work to go through and fix. So we suppress them for now so that the other warnings are more easily visible. :100644 100644 b64c4894... 3b9f44c4... M configure.in commit 76b51b746c95647aceff29ab178eff496843f528 Author: Joel Reicher AuthorDate: Tue Apr 17 04:53:54 2007 +0000 Commit: Joel Reicher CommitDate: Tue Apr 17 04:53:54 2007 +0000 buffer is compared with cp, and so needs to be changed to unsigned too. :100644 100644 1f706fe5... d99da1fd... M uip/post.c commit 031871c2ede845956070da603e8494690f7beb70 Author: Josh Bressers AuthorDate: Tue Apr 17 01:02:08 2007 +0000 Commit: Josh Bressers CommitDate: Tue Apr 17 01:02:08 2007 +0000 Initial checkin of a testsuite :000000 100644 00000000... ddfa381c... A test/README :000000 100755 00000000... b43d42ce... A test/runalltests :000000 100755 00000000... d970b183... A test/runtest :000000 100755 00000000... d1972952... A test/setup-test :000000 100755 00000000... 7e169e41... A test/teardown-test :000000 100644 00000000... 5ca70d05... A test/test-temp-dir :000000 100644 00000000... a5b71baa... A test/tests/folder/test-create :000000 100644 00000000... 6da31741... A test/tests/folder/test-total :000000 100644 00000000... 2bb8d868... A test/tests/pick/test-pick :000000 100644 00000000... 4aca55f7... A test/tests/scan/test-scan commit 13f84dd50ca5754391dbd3296a5c7425f9363600 Author: Joel Reicher AuthorDate: Fri Apr 13 11:53:08 2007 +0000 Commit: Joel Reicher CommitDate: Fri Apr 13 11:53:08 2007 +0000 Change all chars being passed to the ctype macros (isalph(), etc.) to be unsigned chars, following through to change any other types as necessary (e.g. comparison between two pointers). Not all chars have been changed to unsigned chars; just those that were in danger of being sign extended when passed to the int-taking ctype macros. :100644 100644 a4c81e89... 1f609194... M h/mf.h :100644 100644 7e8948ed... a91418e2... M h/prototypes.h :100644 100644 607f4ecc... 33eb9e66... M mts/smtp/hosts.c :100644 100644 da02701f... 1ab027f3... M mts/smtp/smtp.c :100644 100644 a2286949... 113f2ea2... M sbr/dtimep.lex :100644 100644 798f1f68... d699916a... M sbr/fmt_compile.c :100644 100644 b212b126... c3d265a1... M sbr/fmt_scan.c :100644 100644 221ff0ca... dffc799b... M sbr/m_atoi.c :100644 100644 bbefc99a... 15c29066... M sbr/m_convert.c :100644 100644 44dab8a2... 2559b678... M sbr/mf.c :100644 100644 7941e090... cc5ff8e3... M sbr/mts.c :100644 100644 0eeddb38... 678ab5b5... M sbr/seq_nameok.c :100644 100644 c341f00c... 8b57ad68... M sbr/trimcpy.c :100644 100644 af3827ba... ec7be942... M uip/aliasbr.c :100644 100644 ca3497a4... 86fe3c3a... M uip/anno.c :100644 100644 01910376... 1b5f5e13... M uip/distsbr.c :100644 100644 cb80978e... 97488bbb... M uip/flist.c :100644 100644 9c118a5c... 5b079ba2... M uip/ftpsbr.c :100644 100644 8906d7fe... 2c101b94... M uip/mhbuildsbr.c :100644 100644 ce8b33d4... acf21de9... M uip/mhlsbr.c :100644 100644 fea9904a... 733048d8... M uip/mhparse.c :100644 100644 4b917905... 3f8a7ab0... M uip/msh.c :100644 100644 60f34130... 147a261b... M uip/mshcmds.c :100644 100644 363f925b... 6a7eeeeb... M uip/popsbr.c :100644 100644 96120c1e... 1f706fe5... M uip/post.c :100644 100644 0d375ae8... a415346e... M uip/replsbr.c :100644 100644 d9d6beef... 1b6a0ed9... M uip/scansbr.c :100644 100644 2db32d7e... e783a797... M uip/show.c :100644 100644 817a4114... 08a3e28b... M uip/slocal.c :100644 100644 d483d868... 65291ce8... M uip/sortm.c :100644 100644 bef70be8... 1c1a8bc9... M uip/spost.c commit 1524cb8c0b86a854149d7859d6a2503d61dbaa36 Author: Joel Reicher AuthorDate: Tue Apr 10 22:12:26 2007 +0000 Commit: Joel Reicher CommitDate: Tue Apr 10 22:12:26 2007 +0000 We're not using the .Bu macro anymore. :100644 100644 24a74bc4... f437f621... M man/post.man commit dd9275a85bb5e0e4bf3c0a722eb5945f1d421d74 Author: Joel Reicher AuthorDate: Tue Apr 10 06:13:27 2007 +0000 Commit: Joel Reicher CommitDate: Tue Apr 10 06:13:27 2007 +0000 Fix for bug #11139: mhl -form mhl.reply omits '> ' on some lines. putcomp() was assuming only the first call on the body had the buffer beginning at the start of a line. :100644 100644 04da52bb... ce8b33d4... M uip/mhlsbr.c commit 10c91f6e846d9ec279218280b4258badffd984e8 Author: Joel Reicher AuthorDate: Tue Apr 10 03:32:48 2007 +0000 Commit: Joel Reicher CommitDate: Tue Apr 10 03:32:48 2007 +0000 Application of patch #5218: patch for bug #9742. Fixes a typo in the size arg of snprintf(). mhlist output which used to have incorrect lines such as 1.2 multipart/mixed 772 1.21 text/plain 9 1.22 multipart/mixed 162 now have the correct 1.2 multipart/mixed 772 1.2.1 text/plain 9 1.2.2 multipart/mixed 162 :100644 100644 8d3397ef... fea9904a... M uip/mhparse.c commit 30fd2ad6d3eff3749b2ae99ec90d2215bf1b1aca Author: Peter Maydell AuthorDate: Wed Mar 21 00:21:10 2007 +0000 Commit: Peter Maydell CommitDate: Wed Mar 21 00:21:10 2007 +0000 bug #18630, #18631, #18632, #18634: various patches from Craig Leres fixing error message argument problems. :100644 100644 d630a7c6... 89de2f8d... M ChangeLog :100644 100644 32051c52... 1a584e4c... M sbr/context_read.c :100644 100644 1af116cb... f90cedfb... M sbr/folder_addmsg.c :100644 100644 7645e382... 17e78e98... M uip/forw.c :100644 100644 2d9a7d42... aeba011e... M uip/sendsbr.c commit 853814d952958385f5d212d167dff4edd3802f3f Author: Peter Maydell AuthorDate: Wed Mar 21 00:18:19 2007 +0000 Commit: Peter Maydell CommitDate: Wed Mar 21 00:18:19 2007 +0000 bug #15212: remove configure test for broken AT&T vi. This test was broken and unfixable. Support for manually defining ATTVIBUG remains. :100644 100644 9e33cb8c... d630a7c6... M ChangeLog :100644 100644 551b2531... ba744a4c... M acconfig.h :100644 100644 b66a6e55... b64c4894... M configure.in commit 488d971779618f547305289a8554ee2578f45eaf Author: Josh Bressers AuthorDate: Tue Jan 16 02:08:10 2007 +0000 Commit: Josh Bressers CommitDate: Tue Jan 16 02:08:10 2007 +0000 Add a missing header file :100644 100644 b859266b... 492d3643... M h/Makefile.in commit 382d32482baa6f675cd1aa50179d10df4fb3e623 Author: Joel Reicher AuthorDate: Sun Nov 5 13:20:46 2006 +0000 Commit: Joel Reicher CommitDate: Sun Nov 5 13:20:46 2006 +0000 Changed bold "-all" to unbolded "all". It's a reserved msgs word, not a flag. :100644 100644 0cebca09... 6915792d... M man/mark.man commit 8a1006b457cdc27c40b9c928dc9fb5086444f04b Author: David Levine AuthorDate: Tue Oct 24 14:31:40 2006 +0000 Commit: David Levine CommitDate: Tue Oct 24 14:31:40 2006 +0000 * uip/sendsbr.c: with attachformat values of 1 or 2, add name= portion to Content-Type header. This makes them consistent with attachformat value 0. And it allows mhstore to use that (file)name when extracting attachments. :100644 100644 a0839ee4... 9e33cb8c... M ChangeLog :100644 100644 f8384f7c... 2d9a7d42... M uip/sendsbr.c commit 3f5557dc09fc17ede9a35059f36920abb2eb4d08 Author: Josh Bressers AuthorDate: Sun Aug 27 01:19:39 2006 +0000 Commit: Josh Bressers CommitDate: Sun Aug 27 01:19:39 2006 +0000 * configure.in: If we're not using dotlocking, there is no need to set inc sgid. :100644 100644 b2ebfe6d... a0839ee4... M ChangeLog :100644 100644 59d9207f... b66a6e55... M configure.in commit 63298d0f1870b5df16ac8664494e5a24b224dfc5 Author: Joel Reicher AuthorDate: Sun Jun 4 08:37:24 2006 +0000 Commit: Joel Reicher CommitDate: Sun Jun 4 08:37:24 2006 +0000 Fixed bug introduced when changing from check_folder() to new create_folder() function. The folder name needed to be expanded to an absolute path first. Similar things may have happened with other conversions. :100644 100644 23b4ef2e... 1c05a42d... M uip/mhstoresbr.c commit 0569d6d1631dc90d4f2f2df6bdd0599c7ecc7814 Author: Joel Reicher AuthorDate: Thu Apr 27 12:00:28 2006 +0000 Commit: Joel Reicher CommitDate: Thu Apr 27 12:00:28 2006 +0000 Created pluspath function to check for '+' prefix and change flag for path() appropriately. This eliminates some duplicate prefix processing, but not all. The path functions need to be restructed; this is the first step. :100644 100644 7e772e02... 7e8948ed... M h/prototypes.h :100644 100644 0ae27d39... 7475fa08... M sbr/path.c :100644 100644 0d441349... ca3497a4... M uip/anno.c :100644 100644 908de0df... 319918bb... M uip/burst.c :100644 100644 8fced484... 67cf83bb... M uip/comp.c :100644 100644 70e515eb... d8c261da... M uip/dist.c :100644 100644 36be1ed2... cb80978e... M uip/flist.c :100644 100644 98c66ed6... f04ae2fa... M uip/folder.c :100644 100644 93870b1a... 7645e382... M uip/forw.c :100644 100644 aee194aa... a2ecb440... M uip/inc.c :100644 100644 e26ca6a5... 4799b238... M uip/mark.c :100644 100644 4882ecb2... 8906d7fe... M uip/mhbuildsbr.c :100644 100644 b130cf1a... 1de53e33... M uip/mhlist.c :100644 100644 cfeac947... 809568c5... M uip/mhn.c :100644 100644 00983d52... 3974515d... M uip/mhpath.c :100644 100644 df4cf512... 3e7e3a5f... M uip/mhshow.c :100644 100644 08891f53... dc627247... M uip/mhstore.c :100644 100644 bf5088e7... 23b4ef2e... M uip/mhstoresbr.c :100644 100644 140c7d90... 5e6494a2... M uip/mhtest.c :100644 100644 257fc421... 4b917905... M uip/msh.c :100644 100644 f2c913cd... 60f34130... M uip/mshcmds.c :100644 100644 e0745057... 9f954667... M uip/packf.c :100644 100644 8fd294ee... dff628ae... M uip/pick.c :100644 100644 3a03c0a5... f522042e... M uip/popi.c :100644 100644 7b15491f... 4e14afbb... M uip/rcvstore.c :100644 100644 e77fe0b1... 0b3afe12... M uip/refile.c :100644 100644 e5fa527d... 7a1aca18... M uip/repl.c :100644 100644 fb951ed0... 1cacbc47... M uip/rmf.c :100644 100644 75b1c70e... b1e887e7... M uip/rmm.c :100644 100644 4334efe5... 05f8bf88... M uip/scan.c :100644 100644 31a05e93... 2db32d7e... M uip/show.c :100644 100644 5faec79a... d483d868... M uip/sortm.c commit b577e47e7c6c40e0968af4472ed9dc52e9b64f58 Author: Joel Reicher AuthorDate: Mon Apr 24 07:10:03 2006 +0000 Commit: Joel Reicher CommitDate: Mon Apr 24 07:10:03 2006 +0000 ssequal() does not check for a substring, but for a prefix, so added a comment to this effect. If this is sufficient, the function body should remain unchanged but the name and comments should be modified. If not, then the function needs to be corrected. :100644 100644 615404a7... 32edca9c... M sbr/ssequal.c commit 43d85eaa38c25385082958d831fc926c5e619eac Author: Paul Fox AuthorDate: Sat Apr 22 16:33:48 2006 +0000 Commit: Paul Fox CommitDate: Sat Apr 22 16:33:48 2006 +0000 fixes case where a very long character-class range (128 or more characters) causes negative indexing into pattern string. :100644 100644 001bf08c... a00f335e... M uip/picksbr.c commit d261673d3ca54ac161c9019e52693e2fe4dcb3cc Author: Joel Reicher AuthorDate: Sun Apr 16 06:47:59 2006 +0000 Commit: Joel Reicher CommitDate: Sun Apr 16 06:47:59 2006 +0000 Fixed a typo. :100644 100644 ef004ec5... 442c7f68... M man/sendfiles.man commit b439ec143c4d2e2daf4b0a9c332123f24500cd9a Author: Joel Reicher AuthorDate: Fri Apr 14 14:10:15 2006 +0000 Commit: Joel Reicher CommitDate: Fri Apr 14 14:10:15 2006 +0000 Created function open_form() to open form file or fallback to default components file, with error handling. Replaced duplicated code with call to this function. :100644 100644 3eda9d3f... 92fdabac... M h/utils.h :100644 100644 8aba5b6a... 64df443b... M sbr/utils.c :100644 100644 1aca23a7... 8fced484... M uip/comp.c :100644 100644 4b6ce697... 70e515eb... M uip/dist.c :100644 100644 319cc398... 93870b1a... M uip/forw.c commit 0364511845929f2b946b7a216289e9954f4a13d6 Author: Joel Reicher AuthorDate: Fri Apr 14 08:42:04 2006 +0000 Commit: Joel Reicher CommitDate: Fri Apr 14 08:42:04 2006 +0000 Fixed a couple of typos. :100644 100644 8eb7939f... 6c3eb6b5... M man/mh-alias.man commit 9792341d7318d2e9f52557cad5f0b8a9c5c252ad Author: Joel Reicher AuthorDate: Fri Apr 14 08:21:35 2006 +0000 Commit: Joel Reicher CommitDate: Fri Apr 14 08:21:35 2006 +0000 Sanitised some dodgy homedir finding code, but it still might not make sense. :100644 100644 69999f6d... 872dc2e1... M uip/msgchk.c commit 8c1b8e55ba6269af3f6be282eeb7b5a19516315f Author: Joel Reicher AuthorDate: Fri Apr 14 07:54:26 2006 +0000 Commit: Joel Reicher CommitDate: Fri Apr 14 07:54:26 2006 +0000 Get rid of some trivial warnings; unused variables, ambiguous if-else, missing headers. :100644 100644 8475d50e... b212b126... M sbr/fmt_scan.c :100644 100644 b0168e2e... d3e988ed... M sbr/m_draft.c :100644 100644 b332af06... 98c66ed6... M uip/folder.c :100644 100644 0731a157... aee194aa... M uip/inc.c :100644 100644 acafbf43... e77fe0b1... M uip/refile.c commit b8ff4daea27b5b2ae336c28737d469e75a45c449 Author: Joel Reicher AuthorDate: Thu Apr 13 14:24:41 2006 +0000 Commit: Joel Reicher CommitDate: Thu Apr 13 14:24:41 2006 +0000 Make print_aka() and print_usr() static. They're not used outside ali.c. :100644 100644 bbc6f6dd... a8812c22... M uip/ali.c commit 174d375bb4b9bcaa0c3f28c422216f68703494a8 Author: Joel Reicher AuthorDate: Tue Apr 11 14:09:11 2006 +0000 Commit: Joel Reicher CommitDate: Tue Apr 11 14:09:11 2006 +0000 Created app_msgarg() (append message arg) and a simple resizable array struct to go with it that do almost exactly what the code they've replaced was doing. Replaced this (duplicated) code in many files with a call to app_msgarg(). :100644 100644 8246a5d6... 3eda9d3f... M h/utils.h :100644 100644 c433e8f0... 8aba5b6a... M sbr/utils.c :100644 100644 9fbb37f5... 0d441349... M uip/anno.c :100644 100644 03337229... e26ca6a5... M uip/mark.c :100644 100644 03480b3c... b130cf1a... M uip/mhlist.c :100644 100644 685a74e7... cfeac947... M uip/mhn.c :100644 100644 4a88605b... 00983d52... M uip/mhpath.c :100644 100644 909c440b... df4cf512... M uip/mhshow.c :100644 100644 b756956a... 08891f53... M uip/mhstore.c :100644 100644 298ef039... 140c7d90... M uip/mhtest.c :100644 100644 6f3638cc... e0745057... M uip/packf.c :100644 100644 8cdfa580... 8fd294ee... M uip/pick.c :100644 100644 bb7f00a1... acafbf43... M uip/refile.c :100644 100644 b9fd80dc... 75b1c70e... M uip/rmm.c :100644 100644 705ff69b... 4334efe5... M uip/scan.c :100644 100644 9263c799... 5faec79a... M uip/sortm.c commit 0be3869967792be6b129fc34e8f72a88fc3352bb Author: Joel Reicher AuthorDate: Tue Apr 11 05:48:43 2006 +0000 Commit: Joel Reicher CommitDate: Tue Apr 11 05:48:43 2006 +0000 Completing the .cvsignore list(s). :100644 100644 9d5e65d7... 5f5cca9b... M .cvsignore :000000 100644 00000000... 625becce... A config/.cvsignore :000000 100644 00000000... f3c7a7c5... A docs/.cvsignore :000000 100644 00000000... ede4efeb... A etc/.cvsignore :000000 100644 00000000... f3c7a7c5... A h/.cvsignore :000000 100644 00000000... 1cd0b609... A man/.cvsignore :000000 100644 00000000... f3c7a7c5... A mts/.cvsignore :000000 100644 00000000... f3c7a7c5... A mts/smtp/.cvsignore :000000 100644 00000000... 38a6b43b... A sbr/.cvsignore :000000 100644 00000000... 400537d8... A uip/.cvsignore commit 37da2ed2b9d461967bde48cfc506f7ffd4a0cd78 Author: Joel Reicher AuthorDate: Sun Apr 9 14:06:31 2006 +0000 Commit: Joel Reicher CommitDate: Sun Apr 9 14:06:31 2006 +0000 Fixed a small typo. :100644 100644 2eb8c2ec... 72ce2810... M man/mhbuild.man commit dc0b0be755b41f3c195913631fedf023ad69192e Author: Paul Fox AuthorDate: Fri Mar 31 15:14:49 2006 +0000 Commit: Paul Fox CommitDate: Fri Mar 31 15:14:49 2006 +0000 this commit: - adds range support to character classes - fixes out-of-bounds references to the case-folding array when doing case comparisons for 8-bit message text - makes character classes as case tolerant as the rest of the pick regexp machine. (where lowercase chars in patterns should match uppercase in the text.) - fixes an uninitialized pointer warning, which might actually have been a real bug :100644 100644 a7276d78... 001bf08c... M uip/picksbr.c commit b8ca332a9752c9de52613a229d95eb7c4c15ac20 Author: David Levine AuthorDate: Thu Mar 30 22:19:50 2006 +0000 Commit: David Levine CommitDate: Thu Mar 30 22:19:50 2006 +0000 * uip/sendsbr.c: with attachformat values of 1 or 2, only generate Content-Disposition headers for MIME attachments, not for the message contents themselves. Microsoft Outlook Build 10.0.6626, at least, doesn't show the message contents if they have Content-Disposition. :100644 100644 0eaa6514... b2ebfe6d... M ChangeLog :100644 100644 89308575... f8384f7c... M uip/sendsbr.c commit 2f9092c19632024cc7c868612b82c603b7db534f Author: Bill Wohler AuthorDate: Fri Mar 10 09:00:20 2006 +0000 Commit: Bill Wohler CommitDate: Fri Mar 10 09:00:20 2006 +0000 Changed Questions 1.03 Where can I get MH? nmh 1.2 :100644 100644 9f964442... 134ace47... M docs/FAQ commit f648520705ef32e5511a4da7cfcba45045afa3ac Author: Bill Wohler AuthorDate: Fri Mar 10 06:58:28 2006 +0000 Commit: Bill Wohler CommitDate: Fri Mar 10 06:58:28 2006 +0000 Since faqs.org appears to be moribund, I'm now using my site as the official location of the MH FAQ. I added some missing quotes in various places, so now Emacs highlighting works better. New Questions 5.26 How do I fix a bogus In-Reply-To or missing References field? Changed Questions 1.02 current version? nmh 1.2 1.04 references for MH? New FAQ official site. MH-E manual URL 5.15 make sense of replcomps? Use 1.1 version :100644 100644 13b64f18... 9f964442... M docs/FAQ commit 1388183fc96a86e5fbbb9d43cebdedd9f44ab64f Author: Josh Bressers AuthorDate: Thu Mar 9 19:51:13 2006 +0000 Commit: Josh Bressers CommitDate: Thu Mar 9 19:51:13 2006 +0000 * sbr/fmt_rfc2047.c (decode_rfc2047): Don't close the iconv descriptor if it isn't valid. :100644 100644 f593db93... 0eaa6514... M ChangeLog :100644 100644 ef1bdfac... 9d5b6d3c... M sbr/fmt_rfc2047.c commit d2f12554a254e814dcdafb3828fc0d9936154eef Author: Josh Bressers AuthorDate: Wed Mar 8 12:14:15 2006 +0000 Commit: Josh Bressers CommitDate: Wed Mar 8 12:14:15 2006 +0000 * (mh_strcasecmp): Rename the private strcasecmp function to mh_strcasecmp. :100644 100644 c6ea9069... f593db93... M ChangeLog :100644 100644 1d1d4560... 7e772e02... M h/prototypes.h :100644 100644 263bcef3... 607f4ecc... M mts/smtp/hosts.c :100644 100644 cf941dc5... fa45e31a... M sbr/addrsbr.c :100644 100644 d6b8ca34... 9d0d6253... M sbr/check_charset.c :100644 100644 b38d8222... 859c8516... M sbr/context_del.c :100644 100644 efac368f... f96d0b3a... M sbr/context_find.c :100644 100644 2cdadf0b... 4416eee4... M sbr/context_replace.c :100644 100644 7013ceab... ef1bdfac... M sbr/fmt_rfc2047.c :100644 100644 3097ee7f... 36605bea... M sbr/ruserpass.c :100644 100644 f0358bdd... 4a026a3f... M sbr/strcasecmp.c :100644 100644 737f68c7... bbc6f6dd... M uip/ali.c :100644 100644 aadd6767... af3827ba... M uip/aliasbr.c :100644 100644 c6f50981... 4882ecb2... M uip/mhbuildsbr.c :100644 100644 31c24bb1... 04da52bb... M uip/mhlsbr.c :100644 100644 9f0044ac... fddd5522... M uip/mhmisc.c :100644 100644 fff4ccc4... 2ebdc1ff... M uip/mhoutsbr.c :100644 100644 5e5e006b... 0b60b032... M uip/mhparam.c :100644 100644 fc24f5e1... 8d3397ef... M uip/mhparse.c :100644 100644 5776ef35... bf5088e7... M uip/mhstoresbr.c :100644 100644 df64de52... 257fc421... M uip/msh.c :100644 100644 63ee99c8... f2c913cd... M uip/mshcmds.c :100644 100644 1154f46c... a7276d78... M uip/picksbr.c :100644 100644 9d5f3126... 363f925b... M uip/popsbr.c :100644 100644 f880152a... 96120c1e... M uip/post.c :100644 100644 c4be1b2b... e8815653... M uip/rcvdist.c :100644 100644 b8e8e926... 0d375ae8... M uip/replsbr.c :100644 100644 3bede5ae... d9d6beef... M uip/scansbr.c :100644 100644 cc15a0f1... 89308575... M uip/sendsbr.c :100644 100644 b068d495... 31a05e93... M uip/show.c :100644 100644 275eedd4... 817a4114... M uip/slocal.c :100644 100644 5888d78b... 9263c799... M uip/sortm.c :100644 100644 c86ea18c... bef70be8... M uip/spost.c commit 8e0d377cb731b0fbc39a9b2874ec6b772e53620b Author: Oliver Kiddle AuthorDate: Sun Mar 5 14:48:05 2006 +0000 Commit: Oliver Kiddle CommitDate: Sun Mar 5 14:48:05 2006 +0000 and close iconv handle if encoded block empty :100644 100644 83ef21eb... 7013ceab... M sbr/fmt_rfc2047.c commit 7e669f1b5d51b1d562efd79ef04b8441574c0334 Author: Oliver Kiddle AuthorDate: Sun Mar 5 14:38:23 2006 +0000 Commit: Oliver Kiddle CommitDate: Sun Mar 5 14:38:23 2006 +0000 don't try to malloc 0 bytes if an RFC2047 encoded block is empty :100644 100644 84394783... c6ea9069... M ChangeLog :100644 100644 0eb71bd6... 83ef21eb... M sbr/fmt_rfc2047.c commit 206776d8154cbf7793282c984afab547bf05cbbc Author: Peter Maydell AuthorDate: Sat Mar 4 22:14:18 2006 +0000 Commit: Peter Maydell CommitDate: Sat Mar 4 22:14:18 2006 +0000 Install scripts with INSTALL_SCRIPT so INSTALL_PROGRAM can be set to 'install -s' without it causing the installation of the scripts to fail. :100644 100644 7dfd16ad... 84394783... M ChangeLog :100644 100644 8fb3ea2f... 66e42ada... M etc/Makefile.in commit d2da15ecabb03fb2de72863abdf5f21e52fdf329 Author: David Levine AuthorDate: Sat Feb 25 14:14:06 2006 +0000 Commit: David Levine CommitDate: Sat Feb 25 14:14:06 2006 +0000 * uip/sendsbr.c: replaced st_mtim with st_mtime, that's what it should have been. Added #include of h/tws.h to pick up dtime() prototype. :100644 100644 2e6103ce... 7dfd16ad... M ChangeLog :100644 100644 a43627f1... cc15a0f1... M uip/sendsbr.c commit ac33b2e9c3632537b93fc4755a925c682d1eb82e Author: David Levine AuthorDate: Tue Feb 21 04:13:06 2006 +0000 Commit: David Levine CommitDate: Tue Feb 21 04:13:06 2006 +0000 Replaced second line of Content-Tyhpe of -attachformat 0 example. :100644 100644 57f37b7c... 0c65f5ac... M man/send.man commit 5ff96d61ee5af34956ae958a0bc72ee78734a4d7 Author: David Levine AuthorDate: Tue Feb 21 03:58:31 2006 +0000 Commit: David Levine CommitDate: Tue Feb 21 03:58:31 2006 +0000 * h/mh.h, h/prototypes.h, uip/mhbuildsbr.c, uip/send.c, uip/sendsbr.c, uip/viamail.c, uip/whatnowsbr.c, man/send.man: added -attachformat switch to send, to support alternate MIME header contents when using -attach. See send man page for description. :100644 100644 79d64285... 2e6103ce... M ChangeLog :100644 100644 81a6021c... 130bfde5... M h/mh.h :100644 100644 de57cb8e... 1d1d4560... M h/prototypes.h :100644 100644 65a5d1e3... 57f37b7c... M man/send.man :100644 100644 25924e96... c6f50981... M uip/mhbuildsbr.c :100644 100644 514f0731... 78494721... M uip/send.c :100644 100644 f793b1c8... a43627f1... M uip/sendsbr.c :100644 100644 3dbd27ce... 859dfafa... M uip/viamail.c :100644 100644 d863b5bb... 0a959db2... M uip/whatnowsbr.c commit fb49dd82ec42997b9df97f221c920f6596102c0a Author: David Levine AuthorDate: Tue Feb 21 03:51:53 2006 +0000 Commit: David Levine CommitDate: Tue Feb 21 03:51:53 2006 +0000 * man/mhbuild.man: wrapped one appearance of "Content-Disposition" with quotes, to be consistent with others. :100644 100644 0708ca22... 79d64285... M ChangeLog :100644 100644 8dd7458d... 2eb8c2ec... M man/mhbuild.man commit 0cebd8284370988c8b1807ef2544bd80804d074e Author: Josh Bressers AuthorDate: Tue Feb 21 01:11:51 2006 +0000 Commit: Josh Bressers CommitDate: Tue Feb 21 01:11:51 2006 +0000 * h/utils.h, sbr/utils.c, uip/flist.c, uip/folder.c: Move duplicate function num_digits into utils.c :100644 100644 d4efdf49... 0708ca22... M ChangeLog :100644 100644 950e8a95... 8246a5d6... M h/utils.h :100644 100644 2a7a1ccf... c433e8f0... M sbr/utils.c :100644 100644 758d3081... 36be1ed2... M uip/flist.c :100644 100644 9d85e891... b332af06... M uip/folder.c commit ac9b744ede346c3929794a14ae5c8d3580b7fdb6 Author: Josh Bressers AuthorDate: Tue Feb 21 01:05:24 2006 +0000 Commit: Josh Bressers CommitDate: Tue Feb 21 01:05:24 2006 +0000 Add missing create_folder prototype. :100644 100644 542baeca... 950e8a95... M h/utils.h commit 08aa8c17c3241bb5c6a997ed2e01e25a4d0089ce Author: Josh Bressers AuthorDate: Mon Feb 20 03:09:07 2006 +0000 Commit: Josh Bressers CommitDate: Mon Feb 20 03:09:07 2006 +0000 * sbr/m_draft.c, sbr/utils.c, uip/folder.c, uip/inc.c, uip/mhstoresbr.c, uip/popi.c, uip/refile.c: Add create_folder() function, replacing duplicate code during folder creation. :100644 100644 82451549... d4efdf49... M ChangeLog :100644 100644 7aea6f01... b0168e2e... M sbr/m_draft.c :100644 100644 8741b208... 2a7a1ccf... M sbr/utils.c :100644 100644 d6cb5b5c... 9d85e891... M uip/folder.c :100644 100644 4903e218... 0731a157... M uip/inc.c :100644 100644 519e4810... 5776ef35... M uip/mhstoresbr.c :100644 100644 ef11a4a4... 3a03c0a5... M uip/popi.c :100644 100644 e50253af... bb7f00a1... M uip/refile.c commit 1513f7668c494c4583141d6115669b7198c14556 Author: David Levine AuthorDate: Sat Feb 18 16:26:37 2006 +0000 Commit: David Levine CommitDate: Sat Feb 18 16:26:37 2006 +0000 Added support for optional Content_Disposition header in mhbuild directive.s :100644 100644 48c98069... 82451549... M ChangeLog :100644 100644 c4b84098... 97d4ef69... M docs/TODO :100644 100644 f99a1c7a... 812b78f5... M h/mhparse.h :100644 100644 b741b2f2... 1a85b427... M h/mime.h :100644 100644 bd1484ca... 8dd7458d... M man/mhbuild.man :100644 100644 83a18b5f... 25924e96... M uip/mhbuildsbr.c :100644 100644 9d064ba1... abaeb2bd... M uip/mhfree.c commit 4586e3f4cffbf0f1c3cdd5804d01da16ae714cfe Author: David Levine AuthorDate: Sun Feb 12 18:06:44 2006 +0000 Commit: David Levine CommitDate: Sun Feb 12 18:06:44 2006 +0000 Added RFC2183 to reference of RFC1806 for Content-Disposition header. :100644 100644 5e09baa2... 48c98069... M ChangeLog :100644 100644 7b5beee5... c4b84098... M docs/TODO commit 1bb1f6c3f38b05060bf699ea2743f7386889bf63 Author: David Levine AuthorDate: Tue Jan 31 02:50:57 2006 +0000 Commit: David Levine CommitDate: Tue Jan 31 02:50:57 2006 +0000 Added -nocontentid (and -contentid, for symmetry) switch to mhbuild. This allows users to disable generation of the Content-ID: header in MIME messages, in order to placate broken version(s) of Outlook. :100644 100644 33be3078... 5e09baa2... M ChangeLog :100644 100644 674b606f... bd1484ca... M man/mhbuild.man :100644 100644 1c5abdc3... cfe776fe... M uip/mhbuild.c :100644 100644 64ec8a68... 83a18b5f... M uip/mhbuildsbr.c commit 255d4c646c0d7aa6b049052fef47fa083b1b1506 Author: Oliver Kiddle AuthorDate: Sun Jan 29 19:34:42 2006 +0000 Commit: Oliver Kiddle CommitDate: Sun Jan 29 19:34:42 2006 +0000 remove trailing newlines from components to fix bug with spaces at the end of Subject/References in replies :100644 100644 7f5be118... 33be3078... M ChangeLog :100644 100644 244fdc93... b8e8e926... M uip/replsbr.c commit ff610b72f05b849f45730692195932852810541c Author: Oliver Kiddle AuthorDate: Wed Jan 18 18:08:16 2006 +0000 Commit: Oliver Kiddle CommitDate: Wed Jan 18 18:08:16 2006 +0000 use AS_HELP_STRING for formatting help messages :100644 100644 56fb2f51... 7f5be118... M ChangeLog :100644 100644 525ba8c7... 59d9207f... M configure.in commit c0591ef34ea123aa8c709bda122308256d2c84cd Author: Oliver Kiddle AuthorDate: Wed Jan 18 17:07:28 2006 +0000 Commit: Oliver Kiddle CommitDate: Wed Jan 18 17:07:28 2006 +0000 add autoconf magic to support old systems that don't support multibyte charsets :100644 100644 f634ba20... 56fb2f51... M ChangeLog :100644 100644 e52c5e60... 525ba8c7... M configure.in :100644 100644 b27f7c6c... 8475d50e... M sbr/fmt_scan.c commit 6af0c8bb08f8c36e7106ba87f00164b1df3d2774 Author: Oliver Kiddle AuthorDate: Wed Jan 18 16:43:27 2006 +0000 Commit: Oliver Kiddle CommitDate: Wed Jan 18 16:43:27 2006 +0000 fix bug with insertion of newline being wrong if the num function was used at the end of the format buffer :100644 100644 e7f3e1c8... f634ba20... M ChangeLog :100644 100644 c049ad43... b27f7c6c... M sbr/fmt_scan.c commit 389877bae1fe1a9f7259b8979f6a930744d90fab Author: David Levine AuthorDate: Wed Jan 18 00:09:00 2006 +0000 Commit: David Levine CommitDate: Wed Jan 18 00:09:00 2006 +0000 Fixed make_bcc_file () to use contents of From: in draft, if draft_from masquerade flag is enabled. :100644 100644 cc54aebf... e7f3e1c8... M ChangeLog :100644 100644 4ca59553... f880152a... M uip/post.c :100644 100644 7a880e97... c86ea18c... M uip/spost.c commit 84591551ae36c592f59bd369027397ef9f934602 Author: Oliver Kiddle AuthorDate: Tue Jan 17 18:06:58 2006 +0000 Commit: Oliver Kiddle CommitDate: Tue Jan 17 18:06:58 2006 +0000 more robust multi-byte/column support for field widths restore right justification feature :100644 100644 bb60d079... cc54aebf... M ChangeLog :100644 100644 4b7abf26... c049ad43... M sbr/fmt_scan.c commit 3465392f2ac1ac472d44c10c3c989389421c82b2 Author: Josh Bressers AuthorDate: Mon Jan 16 17:07:14 2006 +0000 Commit: Josh Bressers CommitDate: Mon Jan 16 17:07:14 2006 +0000 * uip/post.c, uip/spost.c: Move the uptolow macro from spost.c to post.c where it is needed. :100644 100644 e1616744... 4ca59553... M uip/post.c :100644 100644 e2b43bd6... 7a880e97... M uip/spost.c commit 3ad9295b08bbe02a363413feb493507083f4bd59 Author: Josh Bressers AuthorDate: Mon Jan 16 12:42:11 2006 +0000 Commit: Josh Bressers CommitDate: Mon Jan 16 12:42:11 2006 +0000 * sbr/fmt_scan.c: Add the missing wchar.h include :100644 100644 59e1c941... 4b7abf26... M sbr/fmt_scan.c commit f38ce2484d327ca8062117a2643500bd0d01d830 Author: Oliver Kiddle AuthorDate: Mon Jan 16 10:40:32 2006 +0000 Commit: Oliver Kiddle CommitDate: Mon Jan 16 10:40:32 2006 +0000 *** empty log message *** :100644 100644 33033757... 3bede5ae... M uip/scansbr.c commit 59a210325d70e6a38c0ef9e5dcb105cec8bd38d2 Author: Oliver Kiddle AuthorDate: Mon Jan 16 10:00:46 2006 +0000 Commit: Oliver Kiddle CommitDate: Mon Jan 16 10:00:46 2006 +0000 remove remnants of code for MMDF :100644 100644 3a82aa4a... bb60d079... M ChangeLog :100644 100644 de50e972... d379cfc5... M h/aliasbr.h :100644 100644 c3a468ce... 97179199... M h/rcvmail.h :100644 100644 1730ae9c... fe70265d... M man/Makefile.in :100644 000000 731c5976... 00000000... D man/mh-mts.man :100644 100644 2a94abb2... eeb07655... M man/slocal.man :100644 100644 a98d5b1a... 66eab72c... M sbr/lock_file.c :100644 100644 d0c193d7... aadd6767... M uip/aliasbr.c :100644 100644 dae1c3be... 2b3d0208... M uip/dropsbr.c :100644 100644 2fe45a10... e1616744... M uip/post.c :100644 100644 e51f869c... 275eedd4... M uip/slocal.c commit da67f77e5a66799deac35ae8d9c538f9222bc8af Author: Oliver Kiddle AuthorDate: Mon Jan 16 09:55:24 2006 +0000 Commit: Oliver Kiddle CommitDate: Mon Jan 16 09:55:24 2006 +0000 multiply buffer size by MB_CUR_MAX so multi-byte chars fit :100644 100644 c7787ee4... 3a82aa4a... M ChangeLog :100644 100644 b178e759... 33033757... M uip/scansbr.c commit e25b4ce52c29f7458cd203cc70f73e1a6a241ede Author: Josh Bressers AuthorDate: Sun Jan 15 02:52:12 2006 +0000 Commit: Josh Bressers CommitDate: Sun Jan 15 02:52:12 2006 +0000 * sbr/fmt_scan.c:PUTSF() Fix an off by one formatting issue. :100644 100644 49218546... 59e1c941... M sbr/fmt_scan.c commit ebff0feca0d651c3d0c535a8147963f97807c17a Author: Josh Bressers AuthorDate: Sun Jan 15 02:29:38 2006 +0000 Commit: Josh Bressers CommitDate: Sun Jan 15 02:29:38 2006 +0000 * sbr/fmt_scan.c: Turn the PUTSF macro into a function capable of handling multi column characters. :100644 100644 4adb8806... c7787ee4... M ChangeLog :100644 100644 8f81e77a... 49218546... M sbr/fmt_scan.c commit aa2501ef873e96a8500c53b05280dcc0ade952c2 Author: Josh Bressers AuthorDate: Sat Jan 7 15:22:19 2006 +0000 Commit: Josh Bressers CommitDate: Sat Jan 7 15:22:19 2006 +0000 * Remove sbr/strerror.c -- strerror(3) is defined in C89. :100644 100644 46d2bdbf... 4adb8806... M ChangeLog :100644 100644 2485a5fe... e52c5e60... M configure.in :100644 100644 d53d6630... de57cb8e... M h/prototypes.h :100644 100644 d6c27962... 37434d95... M sbr/Makefile.in :100644 000000 ce78ada8... 00000000... D sbr/strerror.c commit 9a33ff618b5901a3af815650d4b84d39ee96e529 Author: Josh Bressers AuthorDate: Fri Jan 6 21:51:43 2006 +0000 Commit: Josh Bressers CommitDate: Fri Jan 6 21:51:43 2006 +0000 * patch #3968: Move the add() function from its own file (add.c) and into utils.c. There was also a duplicate add() function in mf.c which has been removed. :100644 100644 1c2fc9dd... 46d2bdbf... M ChangeLog :100644 100644 fe41962a... d53d6630... M h/prototypes.h :100644 100644 60e26e5d... 542baeca... M h/utils.h :100644 100644 5f73e0f4... d6c27962... M sbr/Makefile.in :100644 000000 40201c12... 00000000... D sbr/add.c :100644 100644 518a184d... 44dab8a2... M sbr/mf.c :100644 100644 f36edb56... c18d1dae... M sbr/seq_read.c :100644 100644 2120b845... 8741b208... M sbr/utils.c :100644 100644 c6003879... 737f68c7... M uip/ali.c :100644 100644 bda98c8f... 01910376... M uip/distsbr.c :100644 100644 b16e8c96... 1c5abdc3... M uip/mhbuild.c :100644 100644 56d3dcc4... ba66f6eb... M uip/mhcachesbr.c :100644 100644 bce44d07... 10ec55d6... M uip/mhlistsbr.c :100644 100644 d74a7f1d... b5da86c6... M uip/mhmail.c :100644 100644 a3da759f... 9f0044ac... M uip/mhmisc.c :100644 100644 1c786cc6... 08d676e0... M uip/mhshowsbr.c :100644 100644 72694b67... 519e4810... M uip/mhstoresbr.c :100644 100644 71ae644f... 1154f46c... M uip/picksbr.c :100644 100644 aff49a09... 2fe45a10... M uip/post.c :100644 100644 b1c0782f... e5fa527d... M uip/repl.c :100644 100644 5773b56e... b068d495... M uip/show.c :100644 100644 993a141a... e51f869c... M uip/slocal.c :100644 100644 5a7d9435... e2b43bd6... M uip/spost.c commit 8f0c973e6cfebb193010714453f70f55ceae5dd7 Author: Josh Bressers AuthorDate: Wed Jan 4 02:10:25 2006 +0000 Commit: Josh Bressers CommitDate: Wed Jan 4 02:10:25 2006 +0000 * mh_xmalloc(), mh_xrealloc(), pwd(): Add comments describing the purpose of the function. :100644 100644 c25e02d4... 2120b845... M sbr/utils.c commit 23f854c962a161cc8ed982b23183600df376e818 Author: Josh Bressers AuthorDate: Tue Jan 3 01:08:33 2006 +0000 Commit: Josh Bressers CommitDate: Tue Jan 3 01:08:33 2006 +0000 Remove sbr/pwd.c file, moving the pwd() function into sbr/utils.c. :100644 100644 757d2eb3... 1c2fc9dd... M ChangeLog :100644 100644 8648b3f0... 60e26e5d... M h/utils.h :100644 100644 17d82e89... 5f73e0f4... M sbr/Makefile.in :100644 000000 6a8b77fc... 00000000... D sbr/pwd.c :100644 100644 7dfe900b... c25e02d4... M sbr/utils.c commit 008837e090c008e3afe7a9c8667070bafa091e62 Author: Josh Bressers AuthorDate: Mon Jan 2 03:25:18 2006 +0000 Commit: Josh Bressers CommitDate: Mon Jan 2 03:25:18 2006 +0000 * patch #3967: Create a mh_xrealloc function to prevent mistakes when calling realloc. :100644 100644 f8d1c8de... 757d2eb3... M ChangeLog :100644 100644 aba8fc44... 8648b3f0... M h/utils.h :100644 100644 255abf74... d2f71aa3... M sbr/brkstring.c :100644 100644 97f4271e... d71d956c... M sbr/fmt_addr.c :100644 100644 8e3a3ffa... 0dec537e... M sbr/folder_read.c :100644 100644 753da2ec... e7c4bc44... M sbr/folder_realloc.c :100644 100644 9a2c6470... 518a184d... M sbr/mf.c :100644 100644 ecc03bfd... f5dbb658... M sbr/seq_list.c :100644 100644 bc171772... 7dfe900b... M sbr/utils.c :100644 100644 beb0afd0... c6a39ea6... M sbr/vfgets.c :100644 100644 d90e0f60... 9fbb37f5... M uip/anno.c :100644 100644 337a01bc... 2ad873eb... M uip/annosbr.c :100644 100644 50971199... 1713b15b... M uip/conflict.c :100644 100644 7f432eaf... dae1c3be... M uip/dropsbr.c :100644 100644 1e850cbc... 758d3081... M uip/flist.c :100644 100644 3348ae56... d6cb5b5c... M uip/folder.c :100644 100644 27652e08... 03337229... M uip/mark.c :100644 100644 56d9398f... 03480b3c... M uip/mhlist.c :100644 100644 af3fa554... 31c24bb1... M uip/mhlsbr.c :100644 100644 27ee05b4... 685a74e7... M uip/mhn.c :100644 100644 5084b030... 4a88605b... M uip/mhpath.c :100644 100644 c61e9170... 909c440b... M uip/mhshow.c :100644 100644 518a3048... b756956a... M uip/mhstore.c :100644 100644 92198396... 298ef039... M uip/mhtest.c :100644 100644 0c9c8e01... df64de52... M uip/msh.c :100644 100644 9f71b927... 6f3638cc... M uip/packf.c :100644 100644 4f26bb2e... 8cdfa580... M uip/pick.c :100644 100644 d1bbafcf... 9d5f3126... M uip/popsbr.c :100644 100644 4d912915... e50253af... M uip/refile.c :100644 100644 d92fade2... 244fdc93... M uip/replsbr.c :100644 100644 b25f083f... b9fd80dc... M uip/rmm.c :100644 100644 3b568302... 705ff69b... M uip/scan.c :100644 100644 81ddaf76... f793b1c8... M uip/sendsbr.c :100644 100644 92304dcd... 5888d78b... M uip/sortm.c commit 81a21a9a97d8633f6d6231e31fdb6e328d0d3ff2 Author: Josh Bressers AuthorDate: Mon Jan 2 03:17:41 2006 +0000 Commit: Josh Bressers CommitDate: Mon Jan 2 03:17:41 2006 +0000 * patch #3966: Create a mh_xmalloc function to prevent mistakes when calling malloc. :100644 100644 4bfa7863... f8d1c8de... M ChangeLog :000000 100644 00000000... aba8fc44... A h/utils.h :100644 100644 08845c34... 17d82e89... M sbr/Makefile.in :100644 100644 f977c271... 40201c12... M sbr/add.c :100644 100644 27f187e2... 255abf74... M sbr/brkstring.c :100644 100644 a7ab7643... 0d0454cd... M sbr/client.c :100644 100644 a338835b... 4d4e15c1... M sbr/concat.c :100644 100644 d6c90c48... 7eccd79f... M sbr/context_foil.c :100644 100644 b723cb43... 2cdadf0b... M sbr/context_replace.c :100644 100644 2e4bff61... 97f4271e... M sbr/fmt_addr.c :100644 100644 effd06f1... c1bc7c73... M sbr/fmt_new.c :100644 100644 9f5b26d0... 0eb71bd6... M sbr/fmt_rfc2047.c :100644 100644 6cd0d109... 8e3a3ffa... M sbr/folder_read.c :100644 100644 f3d99ba7... 753da2ec... M sbr/folder_realloc.c :100644 100644 89b57c19... fc3d2c05... M sbr/getarguments.c :100644 100644 f23641dd... 1186831a... M sbr/getcpy.c :100644 100644 cda66ab6... a98d5b1a... M sbr/lock_file.c :100644 100644 1332405b... c085bf5f... M sbr/m_getfld.c :100644 100644 27c06bb1... 9a2c6470... M sbr/mf.c :100644 100644 169894fe... 7941e090... M sbr/mts.c :100644 100644 649b0152... fb4a77ce... M sbr/putenv.c :100644 100644 9e0382ef... eba6eece... M sbr/readconfig.c :100644 100644 4c12b712... 3097ee7f... M sbr/ruserpass.c :100644 100644 8a440691... ecc03bfd... M sbr/seq_list.c :100644 100644 486b36a8... ebc29f59... M sbr/strdup.c :000000 100644 00000000... bc171772... A sbr/utils.c :100644 100644 39cfaa27... beb0afd0... M sbr/vfgets.c :100644 100644 19f204fa... d0c193d7... M uip/aliasbr.c :100644 100644 dca93eb5... d90e0f60... M uip/anno.c :100644 100644 6677d214... 337a01bc... M uip/annosbr.c :100644 100644 32b1613e... 50971199... M uip/conflict.c :100644 100644 408f6082... 1e850cbc... M uip/flist.c :100644 100644 e4779dc5... 3348ae56... M uip/folder.c :100644 100644 e842d269... 319cc398... M uip/forw.c :100644 100644 34aed950... ec847fb4... M uip/install-mh.c :100644 100644 aeed8667... 27652e08... M uip/mark.c :100644 100644 fb2d451b... 64ec8a68... M uip/mhbuildsbr.c :100644 100644 4fc17dca... 56d9398f... M uip/mhlist.c :100644 100644 c310e2a0... af3fa554... M uip/mhlsbr.c :100644 100644 55f06c4c... 27ee05b4... M uip/mhn.c :100644 100644 c57e7458... fc24f5e1... M uip/mhparse.c :100644 100644 d3dcc675... 5084b030... M uip/mhpath.c :100644 100644 65f66f4a... c61e9170... M uip/mhshow.c :100644 100644 1529de96... 518a3048... M uip/mhstore.c :100644 100644 46c86ac2... 92198396... M uip/mhtest.c :100644 100644 4566029c... 63ee99c8... M uip/mshcmds.c :100644 100644 405a005d... 9f71b927... M uip/packf.c :100644 100644 9f4bf0f5... 4f26bb2e... M uip/pick.c :100644 100644 e26e346e... ef11a4a4... M uip/popi.c :100644 100644 e7ea911e... d1bbafcf... M uip/popsbr.c :100644 100644 fd6f81c2... c4be1b2b... M uip/rcvdist.c :100644 100644 f3c6d1f0... 4d912915... M uip/refile.c :100644 100644 0b0ba6e6... d92fade2... M uip/replsbr.c :100644 100644 072097a7... b25f083f... M uip/rmm.c :100644 100644 02621dc5... 3b568302... M uip/scan.c :100644 100644 be68bf89... b178e759... M uip/scansbr.c :100644 100644 fae91b3d... 81ddaf76... M uip/sendsbr.c :100644 100644 4b8048f8... 92304dcd... M uip/sortm.c :100644 100644 8ee1e49d... a504220a... M uip/vmhsbr.c :100644 100644 19353842... d863b5bb... M uip/whatnowsbr.c commit 582d618b69077087961c367bd1631495906c92a8 Author: Peter Maydell AuthorDate: Sat Dec 24 17:53:26 2005 +0000 Commit: Peter Maydell CommitDate: Sat Dec 24 17:53:26 2005 +0000 Avoid non-portable use of $< outside an inference rule. :100644 100644 f81e98ed... 4bfa7863... M ChangeLog :100644 100644 482bca25... 6ca83082... M config/Makefile.in :100644 100644 142c7212... 08845c34... M sbr/Makefile.in commit 0cd75fec1902ab5540539fe8c95a071caf18f58e Author: Peter Maydell AuthorDate: Sat Dec 24 17:17:38 2005 +0000 Commit: Peter Maydell CommitDate: Sat Dec 24 17:17:38 2005 +0000 Rework detection and handling of ndbm: we now check for a working (library,header) combination, and configure defines variables for each which the makefile and C file just use, rather than a bunch of HAVE_foo switches. As a bonus, we no longer unnecessarily link every binary with the ndbm library even though only slocal uses it. Also you can now tell configure where to get the header/library so even if we guess wrong you can overrule us. :100644 100644 2a7493ff... f81e98ed... M ChangeLog :100644 100644 c1a91f0e... 37a38e57... M INSTALL :100644 100644 cedaa556... 551b2531... M acconfig.h :100644 100644 421386ee... c0d4fb8a... M aclocal.m4 :100644 100644 1ff16b27... 2485a5fe... M configure.in :100644 100644 54f96345... e58ac4f7... M uip/Makefile.in :100644 100644 0e779160... 993a141a... M uip/slocal.c commit 29d590d74c6e03f5efe9f743c40a61028ccd491d Author: Peter Maydell AuthorDate: Thu Dec 22 10:38:32 2005 +0000 Commit: Peter Maydell CommitDate: Thu Dec 22 10:38:32 2005 +0000 Fix stupid accidental dependence on a bash quirk in previous configure script change. :100644 100644 19cd706d... 2a7493ff... M ChangeLog :100644 100644 c9362ecf... 421386ee... M aclocal.m4 commit 6c3e28b7355a0bb2819da1bd790c01097a2e36b7 Author: Jon Steinhart AuthorDate: Tue Dec 20 04:39:51 2005 +0000 Commit: Jon Steinhart CommitDate: Tue Dec 20 04:39:51 2005 +0000 Rolled release. :100644 100644 29b86d6f... 5625e59d... M VERSION commit 4fbbf33311630a467654077776f088d7810c2202 Author: Peter Maydell AuthorDate: Thu Dec 15 00:45:36 2005 +0000 Commit: Peter Maydell CommitDate: Thu Dec 15 00:45:36 2005 +0000 Improve the checks for where to find ndbm (dbm_open etc); should now work on systems with new gdbm and libdb4. :100644 100644 35bf6c6e... 19cd706d... M ChangeLog :100644 100644 7dd6110e... c9362ecf... M aclocal.m4 :100644 100644 c60e80f1... 1ff16b27... M configure.in :100644 100644 ca23fd89... 0e779160... M uip/slocal.c commit 9bfe3115764af0a6e0dbbf8564ff0edd5ac28543 Author: Peter Maydell AuthorDate: Thu Dec 15 00:12:52 2005 +0000 Commit: Peter Maydell CommitDate: Thu Dec 15 00:12:52 2005 +0000 Change some non-standard formatting in a previous log entry so it matches the conventions used in other entries. :100644 100644 3ade10b8... 35bf6c6e... M ChangeLog commit 221548ea735d938b83f081a654ba93fbb0de747a Author: Josh Bressers AuthorDate: Wed Dec 14 01:48:24 2005 +0000 Commit: Josh Bressers CommitDate: Wed Dec 14 01:48:24 2005 +0000 * Fedora Bug #163760: sbr/context_read.c (context_read): Ensure that the context is only read once. :100644 100644 bcea34a3... 3ade10b8... M ChangeLog :100644 100644 6a1eea12... 32051c52... M sbr/context_read.c commit d72dc17f4164fd8a3e3c56a74a66a21138d82814 Author: Jon Steinhart AuthorDate: Mon Dec 12 22:30:44 2005 +0000 Commit: Jon Steinhart CommitDate: Mon Dec 12 22:30:44 2005 +0000 Fixed annotate call for new delete argument values. :100644 100644 53320d32... 19353842... M uip/whatnowsbr.c commit e2c71f66b925a33cceb1ea4b75a62a05333d124a Author: Josh Bressers AuthorDate: Mon Dec 12 20:26:53 2005 +0000 Commit: Josh Bressers CommitDate: Mon Dec 12 20:26:53 2005 +0000 * uip/sendsbr.c (annoaux): Fix the call to annotate() :100644 100644 21a36a12... bcea34a3... M ChangeLog :100644 100644 9d90e0fb... fae91b3d... M uip/sendsbr.c commit f08bb043683875196136ebe3b8b628f3dbdd7ab2 Author: Jon Steinhart AuthorDate: Thu Dec 8 15:57:34 2005 +0000 Commit: Jon Steinhart CommitDate: Thu Dec 8 15:57:34 2005 +0000 *** empty log message *** :100644 100644 e210a680... 21a36a12... M ChangeLog commit d9b1d57351d104d7ec1a5621f090657dcce8cb7f Author: Jon Steinhart AuthorDate: Wed Dec 7 21:25:46 2005 +0000 Commit: Jon Steinhart CommitDate: Wed Dec 7 21:25:46 2005 +0000 Fixed a bug where anno -append put the headers in the wrong place if applied to a message that didn't contain any headers. Added a special value of "all" to the -number option that causes anno -delete to delete all matching components instead of just the first one. Added new -preserve and -nopreserve options. Using -preserve retains the original last accessed and last modified times on annotated messages. :100644 100644 21c15a74... fe41962a... M h/prototypes.h :100644 100644 b626e2a4... e2a77c1f... M man/anno.man :100644 100644 b92abdc9... dca93eb5... M uip/anno.c :100644 100644 1a2c9892... 6677d214... M uip/annosbr.c commit 8a5d5abeee6212629a14bd80abe2c97a07d609fb Author: Josh Bressers AuthorDate: Mon Dec 5 13:38:41 2005 +0000 Commit: Josh Bressers CommitDate: Mon Dec 5 13:38:41 2005 +0000 Fix the AC_PATH_PROG default when vi isn't found during build. :100644 100644 3aaf759f... e210a680... M ChangeLog :100644 100644 729a7662... c60e80f1... M configure.in commit 7ac2f0a1ffd82f8a0025bcf8997aa96def68a4f2 Author: Jon Steinhart AuthorDate: Sat Dec 3 23:41:39 2005 +0000 Commit: Jon Steinhart CommitDate: Sat Dec 3 23:41:39 2005 +0000 Rolled version. Should have done it last time! :100644 100644 9459d4ba... 29b86d6f... M VERSION commit 7eb7957a7ff9b7a8cae87f1bda049d31e3a22806 Author: Peter Maydell AuthorDate: Sat Nov 19 16:32:34 2005 +0000 Commit: Peter Maydell CommitDate: Sat Nov 19 16:32:34 2005 +0000 Make it clearer that lower-case envariables aren't supposed to be set by the user. :100644 100644 e8ba4c4c... 3aaf759f... M ChangeLog :100644 100644 a07503c4... 62db35f3... M man/mh-profile.man commit b9d1fc0c85e9bd18e5e768913ba2c0a00f19876c Author: Peter Maydell AuthorDate: Sat Nov 19 16:04:25 2005 +0000 Commit: Peter Maydell CommitDate: Sat Nov 19 16:04:25 2005 +0000 Special-case an MHCONTEXT of "/dev/null" and don't try to lock it -- some user scripts may use this to suppress modification of context. :100644 100644 1ab8f4a0... e8ba4c4c... M ChangeLog :100644 100644 fcc12f99... 6a1eea12... M sbr/context_read.c commit 71932c5d0b008eb518d53f9a53978afd35a70ef5 Author: Peter Maydell AuthorDate: Mon Nov 14 00:18:24 2005 +0000 Commit: Peter Maydell CommitDate: Mon Nov 14 00:18:24 2005 +0000 [bug #9813] Don't crash after removing the folder if the context file has no Current-Folder entry. :100644 100644 8679550e... 1ab8f4a0... M ChangeLog :100644 100644 5fe47084... fb951ed0... M uip/rmf.c commit eda249e4fdf983daef578a79a959d16dc9d5936e Author: Peter Maydell AuthorDate: Sun Nov 13 23:57:49 2005 +0000 Commit: Peter Maydell CommitDate: Sun Nov 13 23:57:49 2005 +0000 Pass some globals into sm_init() so that it uses SASL if necessary. [NB that as I do not have a SASL setup I am relying on (a) the patch being obviously correct and (b) the original submitter having tested!] :100644 100644 6a7d58d5... 8679550e... M ChangeLog :100644 100644 32888e64... aff49a09... M uip/post.c commit 37d634e5152d96a37f0dae04fcffa7e709e83032 Author: Peter Maydell AuthorDate: Sun Nov 13 23:56:30 2005 +0000 Commit: Peter Maydell CommitDate: Sun Nov 13 23:56:30 2005 +0000 Forgot to quote the bug number in the changelog comment. :100644 100644 3d269665... 6a7d58d5... M ChangeLog commit 0e7106da702d97e10f3bd24d8284a2ab86044ebd Author: Peter Maydell AuthorDate: Sun Nov 13 23:51:18 2005 +0000 Commit: Peter Maydell CommitDate: Sun Nov 13 23:51:18 2005 +0000 Use context/ctxpath==NULL to indicate that no context file should be read, to avoid inadvertently trying to lock /dev/null (takes 30secs+ with some locking methods). :100644 100644 7661e8a0... 3d269665... M ChangeLog :100644 100644 9b3f7eb1... d6c90c48... M sbr/context_foil.c :100644 100644 3084ff53... fcc12f99... M sbr/context_read.c :100644 100644 4fa60ea4... 36b1634e... M sbr/context_save.c commit c6e5547c9da87292c554449e8b91d83bac70b7be Author: Peter Maydell AuthorDate: Sun Nov 13 22:36:07 2005 +0000 Commit: Peter Maydell CommitDate: Sun Nov 13 22:36:07 2005 +0000 Fix buffer overrun in address parsing code (would only show up if scan was run with -width 16536 or similar) :100644 100644 de7542e0... 7661e8a0... M ChangeLog :100644 100644 cb3e6e4e... 27c06bb1... M sbr/mf.c commit ec49799af416900f9d37e35f4d18f5e2a111668e Author: Oliver Kiddle AuthorDate: Sun Nov 13 19:38:32 2005 +0000 Commit: Oliver Kiddle CommitDate: Sun Nov 13 19:38:32 2005 +0000 remove link to install-mh that caused problems on some systems :100644 100644 fdbf688c... de7542e0... M ChangeLog :100644 100644 36bcb3db... 54f96345... M uip/Makefile.in commit 59f485ee6d6733207b77e2d5ab14823b8d69b7cd Author: Oliver Kiddle AuthorDate: Sun Nov 13 19:27:37 2005 +0000 Commit: Oliver Kiddle CommitDate: Sun Nov 13 19:27:37 2005 +0000 bug #739: install target now depends on all to avoid problem on case-insensitive file systems with the INSTALL file :100644 100644 c9964316... fdbf688c... M ChangeLog :100644 100644 fe8a221b... 2fa252c7... M Makefile.in commit 37bc2a48e0613d19e507e476b0e0de919f2b0a26 Author: Josh Bressers AuthorDate: Thu Nov 10 21:37:10 2005 +0000 Commit: Josh Bressers CommitDate: Thu Nov 10 21:37:10 2005 +0000 Fix the AC_PATH_PROG default when sendmail isn't found during build. :100644 100644 6b2512d4... c9964316... M ChangeLog :100644 100644 287875bc... 729a7662... M configure.in commit f177bf9068a1ee5f5281d4ad04dfa2d5df6f6625 Author: Peter Maydell AuthorDate: Wed Nov 9 22:56:35 2005 +0000 Commit: Peter Maydell CommitDate: Wed Nov 9 22:56:35 2005 +0000 Fix a non-ANSI prototype. :100644 100644 e4a660e3... 6b2512d4... M ChangeLog :100644 100644 2e464d92... de50e972... M h/aliasbr.h commit 56539e8eafef3e955be9d08254d61b139faf34f1 Author: Oliver Kiddle AuthorDate: Tue Nov 8 20:22:33 2005 +0000 Commit: Oliver Kiddle CommitDate: Tue Nov 8 20:22:33 2005 +0000 Simon Burge: fix to handle getutent() on NetBSD :100644 100644 c50664ad... e4a660e3... M ChangeLog :100644 100644 10866bf2... cedaa556... M acconfig.h :100644 100644 9b8c5680... 287875bc... M configure.in :100644 100644 12b73e7c... 9b272d29... M uip/rcvtty.c :100644 100644 bbf18506... ca23fd89... M uip/slocal.c commit 8979d70884315e7de858d4de2c0bb5287ad7bbbb Author: Oliver Kiddle AuthorDate: Tue Nov 8 17:18:09 2005 +0000 Commit: Oliver Kiddle CommitDate: Tue Nov 8 17:18:09 2005 +0000 update most references to the web page and mailing list locations :100644 100644 8ebd6b09... c50664ad... M ChangeLog :100644 100644 c040874a... c1a91f0e... M INSTALL :100644 100644 68cddc2d... 1f740735... M README :100644 100644 846bb88b... 1038ed34... M docs/README.about :100644 100644 a78b2431... 18b60310... M man/nmh.man commit 7d327ff038f743228a91fd53fa4c8f47c5c44e96 Author: Oliver Kiddle AuthorDate: Tue Nov 8 16:58:08 2005 +0000 Commit: Oliver Kiddle CommitDate: Tue Nov 8 16:58:08 2005 +0000 prepend DESTDIR to install locations :100644 100644 9eadf328... 8ebd6b09... M ChangeLog :100644 100644 20ea6d52... 8fb3ea2f... M etc/Makefile.in :100644 100644 ad2b4587... 1730ae9c... M man/Makefile.in :100644 100644 a711a920... 36bcb3db... M uip/Makefile.in commit 35c228531bc8e00d43be590255df9408a4fcbe19 Author: Oliver Kiddle AuthorDate: Tue Nov 8 16:51:34 2005 +0000 Commit: Oliver Kiddle CommitDate: Tue Nov 8 16:51:34 2005 +0000 replace obsolete autoconf macros :100644 100644 ca22c28c... 9eadf328... M ChangeLog :100644 100644 7cd91b04... fe8a221b... M Makefile.in :100644 100644 6776c86e... 482bca25... M config/Makefile.in :100644 100644 ea664e9c... 9b8c5680... M configure.in :100644 100644 aaf0fe45... 7421f217... M docs/Makefile.in :100644 100644 d50fcf78... 20ea6d52... M etc/Makefile.in :100644 100644 6cf88b62... b859266b... M h/Makefile.in :100644 100644 3b0fb65a... ad2b4587... M man/Makefile.in :100644 100644 c72f3508... fcec8133... M mts/Makefile.in :100644 100644 341f0b1d... f8b0ed31... M mts/smtp/Makefile.in :100644 100644 63aef407... da02701f... M mts/smtp/smtp.c :100644 100644 1e5be906... 142c7212... M sbr/Makefile.in :100644 100644 6bdd4eba... a711a920... M uip/Makefile.in commit 6630f05d0a6d631c9ed2edfef9951df892287794 Author: Peter Maydell AuthorDate: Sun Nov 6 21:54:40 2005 +0000 Commit: Peter Maydell CommitDate: Sun Nov 6 21:54:40 2005 +0000 Fix various buffer overruns in fmt_scan.c; the bulk of this is passing buffer length through to decode_rfc2047() and having that function do sufficient bookkeeping to avoid running off the end of the buffer. :100644 100644 6d2553eb... ca22c28c... M ChangeLog :100644 100644 edddc47e... 21c15a74... M h/prototypes.h :100644 100644 a87fc0e8... 9f5b26d0... M sbr/fmt_rfc2047.c :100644 100644 7558eca5... 8f81e77a... M sbr/fmt_scan.c commit d2f54bbc4ef071a92508fa26d5d4641a3f2215c1 Author: Peter Maydell AuthorDate: Sun Nov 6 00:34:56 2005 +0000 Commit: Peter Maydell CommitDate: Sun Nov 6 00:34:56 2005 +0000 Fix a compile error if building nmh with --enable-apop. :100644 100644 7d02b8a1... 6d2553eb... M ChangeLog :100644 100644 6d8d820c... e7ea911e... M uip/popsbr.c commit f1bd4ca9cee81e86095c61cebc56c0f302a675d4 Author: Peter Maydell AuthorDate: Sun Nov 6 00:32:20 2005 +0000 Commit: Peter Maydell CommitDate: Sun Nov 6 00:32:20 2005 +0000 Don't fclose() the file twice in error-exit paths from get_content() (was causing crashes on multipart mails with invalid Content-Type headers) :100644 100644 f4f94b90... 7d02b8a1... M ChangeLog :100644 100644 0bb56da1... c57e7458... M uip/mhparse.c commit e79165e0c2c80b68ece9aaf418a59c6a169a17f5 Author: Peter Maydell AuthorDate: Sun Nov 6 00:28:12 2005 +0000 Commit: Peter Maydell CommitDate: Sun Nov 6 00:28:12 2005 +0000 Remove space between -o and output filename so it works on older versions of flex as well as newer ones. :100644 100644 08950e25... f4f94b90... M ChangeLog :100644 100644 b4543b35... 1e5be906... M sbr/Makefile.in commit 10a00ac1c54a1475d341f82dc479bf1801cac92f Author: Peter Maydell AuthorDate: Sun Nov 6 00:23:48 2005 +0000 Commit: Peter Maydell CommitDate: Sun Nov 6 00:23:48 2005 +0000 Add an AC_PREREQ so we don't just fail with an obscure error message if using old 2.13 era autoconf (or an autoconf-version-guessing wrapper). :100644 100644 3b174704... 08950e25... M ChangeLog :100644 100644 1b1df6b5... ea664e9c... M configure.in commit 827cc055a78605d1cba94d245a9122c544cc9e9f Author: Josh Bressers AuthorDate: Fri Nov 4 22:07:48 2005 +0000 Commit: Josh Bressers CommitDate: Fri Nov 4 22:07:48 2005 +0000 Update the instructions for subscribing to the nmh-workers list :100644 100644 18f2557f... 68cddc2d... M README commit cb5d4a7527ee37577fc0c49eed564f237ec7c909 Author: Oliver Kiddle AuthorDate: Wed Nov 2 17:43:21 2005 +0000 Commit: Oliver Kiddle CommitDate: Wed Nov 2 17:43:21 2005 +0000 fail when kpop connection attempted without KPOP support compiled in :100644 100644 5cfb87a9... 3b174704... M ChangeLog :100644 100644 10d9cba0... 6d8d820c... M uip/popsbr.c commit 0dcc45fd5273ba3df3bcbb2e0c32b26777d665ce Author: Oliver Kiddle AuthorDate: Wed Nov 2 17:29:50 2005 +0000 Commit: Oliver Kiddle CommitDate: Wed Nov 2 17:29:50 2005 +0000 fix for newer version of flex and remove autogenerated file from cvs :100644 100644 fab11c7b... 5cfb87a9... M ChangeLog :100644 100644 317a1778... b4543b35... M sbr/Makefile.in :100644 000000 e72ec1f7... 00000000... D sbr/dtimep.c commit 0c3be1c75f481d085d0ada3e9a714051a221be80 Author: Oliver Kiddle AuthorDate: Wed Nov 2 17:22:27 2005 +0000 Commit: Oliver Kiddle CommitDate: Wed Nov 2 17:22:27 2005 +0000 speed up flist by skipping stat on files with numbers as names :100644 100644 9d3230be... fab11c7b... M ChangeLog :100644 100644 a79c8420... 408f6082... M uip/flist.c commit 81e4827df255b36011f7d017ca0aa5200883bfef Author: Oliver Kiddle AuthorDate: Wed Nov 2 17:16:39 2005 +0000 Commit: Oliver Kiddle CommitDate: Wed Nov 2 17:16:39 2005 +0000 include new files in distribution :100644 100644 7dfebbb2... 9d3230be... M ChangeLog :100644 100644 661116d8... aaf0fe45... M docs/Makefile.in commit 313c0b563539b667ee4dd618abc60afd94b9a28a Author: Bill Wohler AuthorDate: Tue Oct 11 01:52:45 2005 +0000 Commit: Bill Wohler CommitDate: Tue Oct 11 01:52:45 2005 +0000 A couple of questions from nmh's original FAQ were folded into the MH FAQ which is now a part of nmh. New Questions 1.09 What is the copyright status of nmh? 3.23 Why do folder and flist overlook some of my sub-folders? Changed Questions 1.02 current version? nmh history update, nmh 1.1-RC4, mailutils 0.6 :100644 100644 0bcd62f5... 13b64f18... M docs/FAQ commit 993b0d73a4f5a54c46b494b297895bf08fcaf197 Author: Oliver Kiddle AuthorDate: Wed Oct 5 10:05:24 2005 +0000 Commit: Oliver Kiddle CommitDate: Wed Oct 5 10:05:24 2005 +0000 Harald Geyer: back out fork/vfork workaround and handle the issue directly :100644 100644 218fcf13... 7dfebbb2... M ChangeLog :100644 100644 afe2682d... 81a6021c... M h/mh.h :100644 100644 4b2b30d5... 0b0ba6e6... M uip/replsbr.c commit 9d27405ff3562d183784a244ee44bbaf71eabda8 Author: Oliver Kiddle AuthorDate: Wed May 18 13:45:03 2005 +0000 Commit: Oliver Kiddle CommitDate: Wed May 18 13:45:03 2005 +0000 use fork instead of vfork on Linux :100644 100644 ff47800b... 218fcf13... M ChangeLog :100644 100644 81a6021c... afe2682d... M h/mh.h commit 31d4900d02d6be96308736ddc262ec4cdbd72c7c Author: Oliver Kiddle AuthorDate: Wed May 18 13:27:44 2005 +0000 Commit: Oliver Kiddle CommitDate: Wed May 18 13:27:44 2005 +0000 test/report error writing to stdout :100644 100644 e534e070... ff47800b... M ChangeLog :100644 100644 d707ed15... c310e2a0... M uip/mhlsbr.c :100644 100644 a7616d35... 4b2b30d5... M uip/replsbr.c commit 7b4f53959307e3434809f5dbc0ef5e0dbbb32005 Author: Oliver Kiddle AuthorDate: Wed May 18 13:24:14 2005 +0000 Commit: Oliver Kiddle CommitDate: Wed May 18 13:24:14 2005 +0000 correct SASL include file locations :100644 100644 23aacaa3... e534e070... M ChangeLog :100644 100644 bf0804e1... 63aef407... M mts/smtp/smtp.c :100644 100644 aa396fd2... 10d9cba0... M uip/popsbr.c commit 5dcf161b0c2cc885e4dfa23fe4b4e1ab47e139c6 Author: Oliver Kiddle AuthorDate: Wed May 18 13:16:21 2005 +0000 Commit: Oliver Kiddle CommitDate: Wed May 18 13:16:21 2005 +0000 add bash completion definitions from Debian :100644 100644 644f4293... 23aacaa3... M ChangeLog :000000 100644 00000000... b5bdfbc4... A docs/COMPLETION-BASH commit c066fcb6cd31e473e0880849a92da361b9e88d98 Author: Oliver Kiddle AuthorDate: Wed May 18 12:57:40 2005 +0000 Commit: Oliver Kiddle CommitDate: Wed May 18 12:57:40 2005 +0000 fix a bug affecting AFS where nmh was setting the READONLY flag for a folder even when you do have write access to the folder :100644 100644 0a0d4772... 644f4293... M ChangeLog :100644 100644 2e679172... 6cd0d109... M sbr/folder_read.c commit e8635a8a1c577636becd53428ff290860280238f Author: Oliver Kiddle AuthorDate: Wed May 18 12:50:45 2005 +0000 Commit: Oliver Kiddle CommitDate: Wed May 18 12:50:45 2005 +0000 Carl Mummert: add unquote() function for removing quotes from RFC-2822 headers :100644 100644 ce64ad32... 0a0d4772... M ChangeLog :100644 100644 f9115040... eb79751c... M h/fmt_compile.h :100644 100644 2fdae4b5... d7ceccc4... M man/mh-format.man :100644 100644 a478acb7... 798f1f68... M sbr/fmt_compile.c :100644 100644 357484b0... 7558eca5... M sbr/fmt_scan.c commit 5e0d718c31e05bfa80e610eb15620abeb5b1b3e9 Author: Oliver Kiddle AuthorDate: Tue May 17 16:30:15 2005 +0000 Commit: Oliver Kiddle CommitDate: Tue May 17 16:30:15 2005 +0000 fill in a few of the missing ChangeLog entries :100644 100644 d835a071... ce64ad32... M ChangeLog commit 4c24408bdff496a631709326b0d07a4e12fa9277 Author: Oliver Kiddle AuthorDate: Wed Feb 23 16:20:47 2005 +0000 Commit: Oliver Kiddle CommitDate: Wed Feb 23 16:20:47 2005 +0000 use iconv to convert RFC-2047 encoded headers to the character set used by the current locale :100644 100644 9a6c9745... d835a071... M ChangeLog :100644 100644 85e5181b... 1b1df6b5... M configure.in :100644 100644 c2a876f7... edddc47e... M h/prototypes.h :100644 100644 b4bf4eb8... a87fc0e8... M sbr/fmt_rfc2047.c :100644 100644 c9b882da... 357484b0... M sbr/fmt_scan.c commit 70c52ecdc4230a7c3a1051234f786d988997b622 Author: Oliver Kiddle AuthorDate: Wed Feb 23 14:07:52 2005 +0000 Commit: Oliver Kiddle CommitDate: Wed Feb 23 14:07:52 2005 +0000 fix Debian bug #202667: crash when a message's filename overflows an int when converted :100644 100644 a42dd837... 9a6c9745... M ChangeLog :100644 100644 b5b3f9d5... 2e679172... M sbr/folder_read.c commit 4574ff3e6743eb75f965f81f812f927d2a477618 Author: Oliver Kiddle AuthorDate: Wed Feb 23 11:55:25 2005 +0000 Commit: Oliver Kiddle CommitDate: Wed Feb 23 11:55:25 2005 +0000 Updated config.guess and config.sub to the most recent versions (from automake 1.9.5) :100644 100644 44dc2171... a42dd837... M ChangeLog :100755 100755 69b1ab94... 892833f9... M config.guess :100755 100755 d6c68210... d8fd2f8f... M config.sub commit da6af9633e4ecdc19b1ee01de023fa4dfe615c39 Author: Oliver Kiddle AuthorDate: Mon Feb 21 16:31:58 2005 +0000 Commit: Oliver Kiddle CommitDate: Mon Feb 21 16:31:58 2005 +0000 fix bug where inc crashed on failing to reopen the terminal :100644 100644 66187bff... 44dc2171... M ChangeLog :100644 100644 b33a3f8e... 6bc2cb8a... M sbr/getpass.c commit fc35d7366ed5128afd85622b1d3dc634c4733a22 Author: Oliver Kiddle AuthorDate: Thu Jan 27 16:43:03 2005 +0000 Commit: Oliver Kiddle CommitDate: Thu Jan 27 16:43:03 2005 +0000 acknowledge that my change was based on an older patch from Michael Richardson :100644 100644 30002b9e... 66187bff... M ChangeLog commit 6d281f8bdeb78dbc40dc04bf9ad714d0aefb6163 Author: Oliver Kiddle AuthorDate: Thu Jan 27 16:39:56 2005 +0000 Commit: Oliver Kiddle CommitDate: Thu Jan 27 16:39:56 2005 +0000 Added -proxy option to inc and msgchk :100644 100644 88e5bd9d... 30002b9e... M ChangeLog commit 99e5043db7ee6cf80f93708610a6e584a8068c6a Author: Oliver Kiddle AuthorDate: Thu Jan 27 16:34:20 2005 +0000 Commit: Oliver Kiddle CommitDate: Thu Jan 27 16:34:20 2005 +0000 Added -proxy option to inc and msgchk :100644 100644 bc339638... e3e97b46... M h/popsbr.h :100644 100644 db611d6f... baaead8e... M man/inc.man :100644 100644 864574b5... 4903e218... M uip/inc.c :100644 100644 3b9bc74f... 69999f6d... M uip/msgchk.c :100644 100644 953db14c... e26e346e... M uip/popi.c :100644 100644 685489a1... aa396fd2... M uip/popsbr.c commit adc954633908e3fc97dfa94c08f964e1bbb94086 Author: Oliver Kiddle AuthorDate: Thu Jan 27 16:26:24 2005 +0000 Commit: Oliver Kiddle CommitDate: Thu Jan 27 16:26:24 2005 +0000 On systems where it is available, use nl_langinfo to get the character set if MM_CHARSET is unset :100644 100644 5594bfc5... 88e5bd9d... M ChangeLog :100644 100644 a5e891c0... 85e5181b... M configure.in :100644 100644 fa9f0c2f... c2a876f7... M h/prototypes.h :100644 100644 84b003ff... 317a1778... M sbr/Makefile.in :100644 100644 f45448da... d6b8ca34... M sbr/check_charset.c :000000 100644 00000000... ae81046f... A sbr/norm_charmap.c commit e345f8fdce3a18cab73f3edf65ca60f8357efda0 Author: Oliver Kiddle AuthorDate: Fri Jan 21 19:25:44 2005 +0000 Commit: Oliver Kiddle CommitDate: Fri Jan 21 19:25:44 2005 +0000 US-ASCII is a subset of UTF-8 so can be handled directly when UTF-8 is being used :100644 100644 b29df86a... 5594bfc5... M ChangeLog :100644 100644 5d98774c... f45448da... M sbr/check_charset.c commit fd686eb9d48a14768c6cb37e92398e84e65e79a7 Author: Oliver Kiddle AuthorDate: Fri Dec 17 15:16:04 2004 +0000 Commit: Oliver Kiddle CommitDate: Fri Dec 17 15:16:04 2004 +0000 Fix -part option to mhshow/mhlist/mhstore to find sub-parts of the specified part :100644 100644 48a5ee1c... b29df86a... M ChangeLog :100644 100644 825ec873... a3da759f... M uip/mhmisc.c commit a753601a3811c10e433dbb04d8211a3df4b99012 Author: Jon Steinhart AuthorDate: Fri Nov 19 05:06:16 2004 +0000 Commit: Jon Steinhart CommitDate: Fri Nov 19 05:06:16 2004 +0000 Added mail directory argument to folder_addmsg in order to make it possible to provide a path to the ext_hook call that is mailpath-based. A problem existed when a folder was a symbolic link and the pwd call would return the path relative to the filesystem, not to mailpath. A new argument was needed because there was otherwise no reasonable way to get that path. :100644 100644 1b815bcf... fa9f0c2f... M h/prototypes.h :100644 100644 401896a8... 1af116cb... M sbr/folder_addmsg.c :100644 100644 fc78ac1a... 72694b67... M uip/mhstoresbr.c :100644 100644 dd6dc887... 7b15491f... M uip/rcvstore.c :100644 100644 c184dc1f... f3c6d1f0... M uip/refile.c commit 96a8fdb8b141aecc1732615454fdabc584c0142c Author: Jon Steinhart AuthorDate: Tue Nov 16 18:14:34 2004 +0000 Commit: Jon Steinhart CommitDate: Tue Nov 16 18:14:34 2004 +0000 Fixed problem where the refile hook was being called after a message was renamed so that it wasn't around for the hook. The hook is now called before the message file is renamed. :100644 100644 bebc145b... 2bddb0dd... M sbr/folder_pack.c commit 102679e27468bf6f8e1da24ccb9b0d93c489ec7e Author: Jon Steinhart AuthorDate: Tue Nov 16 18:08:07 2004 +0000 Commit: Jon Steinhart CommitDate: Tue Nov 16 18:08:07 2004 +0000 Fixed typo in comment. Fixed problem with refile hook when refiling across filesystems. :100644 100644 f03d386d... 401896a8... M sbr/folder_addmsg.c commit 40d8dba250400b613688f3c2824ec81a0b76b168 Author: Jon Steinhart AuthorDate: Tue Nov 16 17:37:41 2004 +0000 Commit: Jon Steinhart CommitDate: Tue Nov 16 17:37:41 2004 +0000 Removed unnecessary code. :100644 100644 db2b42f3... f03d386d... M sbr/folder_addmsg.c commit d76e9388aabc9946124c5d3347ff5c5333bcd7d3 Author: Jon Steinhart AuthorDate: Tue Nov 16 17:28:33 2004 +0000 Commit: Jon Steinhart CommitDate: Tue Nov 16 17:28:33 2004 +0000 Fixed wrong directory for hook when refiling with -src option. :100644 100644 b3bc8914... db2b42f3... M sbr/folder_addmsg.c commit 150eda989f39dde2dd6112b46c50558cd9bfd5fd Author: Jon Steinhart AuthorDate: Fri Oct 15 17:10:58 2004 +0000 Commit: Jon Steinhart CommitDate: Fri Oct 15 17:10:58 2004 +0000 Fixed calling of external hooks. :100644 100644 8f9bf813... 4b8048f8... M uip/sortm.c commit 24414198cc168516126761a3040b71087c5778bc Author: Jon Steinhart AuthorDate: Tue Oct 12 21:14:02 2004 +0000 Commit: Jon Steinhart CommitDate: Tue Oct 12 21:14:02 2004 +0000 Fixed another weird bug caused by the static mailpath being overwritten. :100644 100644 02a2cbff... 864574b5... M uip/inc.c commit ce802211fc851f4fc22bfb34da8bc3166d3b23c2 Author: Jon Steinhart AuthorDate: Tue Oct 12 20:41:34 2004 +0000 Commit: Jon Steinhart CommitDate: Tue Oct 12 20:41:34 2004 +0000 Fixed bug that caused anno to mangle headers. :100644 100644 75768893... 9d90e0fb... M uip/sendsbr.c commit 3162c1b16d85ce6590bb839fd25378a28c005afc Author: Jon Steinhart AuthorDate: Tue Oct 12 20:40:25 2004 +0000 Commit: Jon Steinhart CommitDate: Tue Oct 12 20:40:25 2004 +0000 Fixed strange bug that prevented a lock from ever being obtained if getting it failed the first time. The problem was that the string of XXXXXX that is required by mkstemp() was overwritten the first time through, and so all subsequent times failed because mkstemp() failed. The fix reinitializes the tmp file string. :100644 100644 6deddd4a... cda66ab6... M sbr/lock_file.c commit 745645022b8e7ff0c21cba33776bc890986b3361 Author: Jon Steinhart AuthorDate: Tue Oct 12 20:38:10 2004 +0000 Commit: Jon Steinhart CommitDate: Tue Oct 12 20:38:10 2004 +0000 Fixed bug in which the static maildir was overwritted if a format string was read from the profile. :100644 100644 af8180d1... 02a2cbff... M uip/inc.c commit e19a05bad44e548ad6f6d1865b5f797d5d70417c Author: Jon Steinhart AuthorDate: Tue Oct 12 20:31:14 2004 +0000 Commit: Jon Steinhart CommitDate: Tue Oct 12 20:31:14 2004 +0000 Fixed bug that was producing an incorrect path for the external hook. :100644 100644 4567f6d1... 20ac1a57... M sbr/folder_delmsgs.c commit 08baf4f8bc7623c41a9753c71aed9a4042196aac Author: Glenn Burkhardt AuthorDate: Mon Oct 6 20:11:39 2003 +0000 Commit: Glenn Burkhardt CommitDate: Mon Oct 6 20:11:39 2003 +0000 db configuration fix for Debian; yet another location for ndbm. :100644 100644 c3fb81a7... a5e891c0... M configure.in :100644 100644 6bf3e159... bbf18506... M uip/slocal.c commit 076b15369a863a489181015d3d9a39db38c6856d Author: Glenn Burkhardt AuthorDate: Tue Sep 30 19:55:12 2003 +0000 Commit: Glenn Burkhardt CommitDate: Tue Sep 30 19:55:12 2003 +0000 restored use of PUTDF() macro; was broken in versions 1.10-1.12; replacement implementation filled on right instead of on left. :100644 100644 4365e350... c9b882da... M sbr/fmt_scan.c commit 4885712264980e6cbc2039f9158027bee9213475 Author: Glenn Burkhardt AuthorDate: Tue Sep 30 16:57:26 2003 +0000 Commit: Glenn Burkhardt CommitDate: Tue Sep 30 16:57:26 2003 +0000 [bug #4302] errno is not always an extern int The errno declaration is best left to errno.h; several systems use #define errno (*(___errno())) or similar :100644 100644 c3fe5995... 3084ff53... M sbr/context_read.c :100644 100644 c088283e... 6deddd4a... M sbr/lock_file.c :100644 100644 6782c34e... 7aea6f01... M sbr/m_draft.c :100644 100644 523feb68... c5332ca6... M sbr/makedir.c :100644 100644 40d4e279... 169894fe... M sbr/mts.c :100644 100644 9e50da68... 4c12b712... M sbr/ruserpass.c :100644 100644 41b0cc29... 1a2c9892... M uip/annosbr.c :100644 100644 212d162a... 7f432eaf... M uip/dropsbr.c :100644 100644 7706f90f... e4779dc5... M uip/folder.c :100644 100644 09cfa958... af8180d1... M uip/inc.c :100644 100644 2b0ad1af... b16e8c96... M uip/mhbuild.c :100644 100644 58104a5f... fb2d451b... M uip/mhbuildsbr.c :100644 100644 ece59430... 56d3dcc4... M uip/mhcachesbr.c :100644 100644 c43c5e92... 9d064ba1... M uip/mhfree.c :100644 100644 10ba1e4c... 4fc17dca... M uip/mhlist.c :100644 100644 dd6d855f... bce44d07... M uip/mhlistsbr.c :100644 100644 2a1672e6... 825ec873... M uip/mhmisc.c :100644 100644 c6d5c777... 55f06c4c... M uip/mhn.c :100644 100644 0c4c2bec... fff4ccc4... M uip/mhoutsbr.c :100644 100644 79997fd5... 0bb56da1... M uip/mhparse.c :100644 100644 4496590f... 65f66f4a... M uip/mhshow.c :100644 100644 d7d4d141... 1c786cc6... M uip/mhshowsbr.c :100644 100644 4bfc6763... 1529de96... M uip/mhstore.c :100644 100644 2e88df23... fc78ac1a... M uip/mhstoresbr.c :100644 100644 a7d2d383... 46c86ac2... M uip/mhtest.c :100644 100644 3548b7ec... 4566029c... M uip/mshcmds.c :100644 100644 a38f7953... 405a005d... M uip/packf.c :100644 100644 afdd4fbf... 953db14c... M uip/popi.c :100644 100644 bc194ffe... fd10aca2... M uip/prompter.c :100644 100644 8f6a6f8e... dd6dc887... M uip/rcvstore.c :100644 100644 663092b9... c184dc1f... M uip/refile.c :100644 100644 a53a5bad... 02621dc5... M uip/scan.c :100644 100644 1da94401... 514f0731... M uip/send.c :100644 100644 b4cd5e2b... 3dbd27ce... M uip/viamail.c :100644 100644 8267f01a... 327f4516... M uip/vmh.c :100644 100644 c69363a4... af06698d... M uip/wmh.c commit b3f36786e62ff7b708849e05d0cac2f55f37e6a5 Author: Glenn Burkhardt AuthorDate: Tue Sep 30 16:22:54 2003 +0000 Commit: Glenn Burkhardt CommitDate: Tue Sep 30 16:22:54 2003 +0000 corrected termination condition for fill character introduced in last version :100644 100644 67815351... 4365e350... M sbr/fmt_scan.c commit c065080384e524f3afbae781492464f4661a55df Author: Glenn Burkhardt AuthorDate: Tue Sep 30 16:19:12 2003 +0000 Commit: Glenn Burkhardt CommitDate: Tue Sep 30 16:19:12 2003 +0000 [bug #4296] PUTD() macro can't hack 10 digit values Once the number exceeded 1000000000, the conversion would fail. An execution of dp -format "%(clock{text})" "Tue, 01 Jul 2003 21:38:05 +0700" would erroneously print 749660476, instead of 1057070285. The macros PUTD() and PUTDF() have been replaced by snprintf() calls; These macros should never have been written in the first place, when system functions exist to do the work. (prev version 1.10 was erroneously comitted). :100644 100644 0a2397ba... 67815351... M sbr/fmt_scan.c commit cc9d0626d137ec556f12d133cf106ac7c4c5b5a7 Author: Glenn Burkhardt AuthorDate: Tue Sep 30 16:07:49 2003 +0000 Commit: Glenn Burkhardt CommitDate: Tue Sep 30 16:07:49 2003 +0000 [bug #4296] PUTD() macro can't hack 10 digit values Once the number exceeded 1000000000, the conversion would fail. An execution of dp -format "%(clock{text})" "Tue, 01 Jul 2003 21:38:05 +0700" would erroneously print 749660476, instead of 1057070285. The macros PUTD() and PUTDF() have been replaced by snprintf() calls; These macros should never have been written in the first place, when system functions exist to do the work. :100644 100644 4f79bf6a... 0a2397ba... M sbr/fmt_scan.c commit 0e02bd46c1b4931073f3e865bbad4deb15691fd7 Author: Glenn Burkhardt AuthorDate: Tue Sep 30 14:36:04 2003 +0000 Commit: Glenn Burkhardt CommitDate: Tue Sep 30 14:36:04 2003 +0000 [bug #4297] The strlen mh-format function can crash if 'str' is null. :100644 100644 0a2397ba... 4f79bf6a... M sbr/fmt_scan.c commit 856ad5f613c3a0d67b7064a6b4a4d141cef4dae9 Author: Glenn Burkhardt AuthorDate: Tue Sep 30 14:30:36 2003 +0000 Commit: Glenn Burkhardt CommitDate: Tue Sep 30 14:30:36 2003 +0000 note recent changes :100644 100644 2ba6be3b... 48a5ee1c... M ChangeLog commit 6d51f44e7d886a9d8b6243f414603dc3e1fdd837 Author: Glenn Burkhardt AuthorDate: Tue Sep 30 14:19:20 2003 +0000 Commit: Glenn Burkhardt CommitDate: Tue Sep 30 14:19:20 2003 +0000 fix handling of "-list" and "-seq" options, so behavior is orthoganal. Previously, "pick -list -seq seqname" meant "pick -nolist -seq seqname". Now "pick -list -seq seqname" and "pick -seq seqname -list" do the same thing. Thanks to Robert Elz. :100644 100644 cb40ccbb... a9171f49... M man/pick.man :100644 100644 65a9091e... 9f4bf0f5... M uip/pick.c commit 7afa1855f4255c6c6127283e2bd3768da814e7ef Author: Glenn Burkhardt AuthorDate: Sun Sep 28 14:27:34 2003 +0000 Commit: Glenn Burkhardt CommitDate: Sun Sep 28 14:27:34 2003 +0000 update 'mp->lowmsg' from 0 to 1 during regular 'inc' from mail spool; avoids failure of 'folder_realloc()' for case of no messages in folder, and more than 100 messages to incorporate. Initially, 'folder_read()' will initialize 'mp->lowmsg' to 0, and 'mp->lowoff' to 1. So the call would be folder_realloc(mp, 1, 200), and the comparison 'if (mp->nummsg > 0 && lo > mp->lowmsg)' will fail. :100644 100644 1b49a846... 09cfa958... M uip/inc.c commit 2f54ce7c39742587c9c8b1322d80bb0520f8a108 Author: Glenn Burkhardt AuthorDate: Mon Sep 22 16:03:22 2003 +0000 Commit: Glenn Burkhardt CommitDate: Mon Sep 22 16:03:22 2003 +0000 Removed space between command name and man section number (e.g., "show (1)" --> "show(1)", so xemacs can recognize them as links to other man pages. :100644 100644 201dac52... a78b2431... M man/nmh.man commit 2d2b2581db2998febf460eb43e6e993e516a7da9 Author: Glenn Burkhardt AuthorDate: Mon Sep 22 01:04:04 2003 +0000 Commit: Glenn Burkhardt CommitDate: Mon Sep 22 01:04:04 2003 +0000 make 'spost' handling of "masquerade:" line of mts.conf containing 'draft_from' same as for 'post'. Debian bug report 144098, filed by Terran Melconian. :100644 100644 4930cbbf... 5a7d9435... M uip/spost.c commit 571c5da9d8529e029fb478ee1f47057e0ebb6762 Author: Glenn Burkhardt AuthorDate: Mon Sep 22 00:43:09 2003 +0000 Commit: Glenn Burkhardt CommitDate: Mon Sep 22 00:43:09 2003 +0000 status of action wasn't saved for use by 'N' result, so when 'N' was used slocal could perform the action even if the previous action failed. Debian bug report #149745, filed by Daniel Müller. :100644 100644 b1760081... 6bf3e159... M uip/slocal.c commit f292123e4a8ff7bf829d2954ec838f677043ebd4 Author: Glenn Burkhardt AuthorDate: Sun Sep 21 18:08:35 2003 +0000 Commit: Glenn Burkhardt CommitDate: Sun Sep 21 18:08:35 2003 +0000 Increase timeouts to comply with RFC 1123; Debian bug report #152728 by Ian Jackson :100644 100644 5760356e... bf0804e1... M mts/smtp/smtp.c commit 315caba3a2aa30a40ea962ab32413c2953e71b36 Author: Glenn Burkhardt AuthorDate: Sun Sep 21 17:34:31 2003 +0000 Commit: Glenn Burkhardt CommitDate: Sun Sep 21 17:34:31 2003 +0000 added cross references :100644 100644 e1185e2a... 707e2be3... M man/mh-chart.man :100644 100644 42155cc3... 201dac52... M man/nmh.man commit 678a7a83f08b7a3f6cf3a11ea580cd69566eaf1b Author: Glenn Burkhardt AuthorDate: Sun Sep 21 17:09:31 2003 +0000 Commit: Glenn Burkhardt CommitDate: Sun Sep 21 17:09:31 2003 +0000 fixed typo: example for scan.default didn't include proper terminating %> for "%<{date} %|*%>"; reported as Debian bug #143427 by Peter Maydell :100644 100644 58d14881... 2fdae4b5... M man/mh-format.man commit bad95d999e5f5a5cd729772f19937575075c85da Author: Glenn Burkhardt AuthorDate: Sun Sep 21 15:43:00 2003 +0000 Commit: Glenn Burkhardt CommitDate: Sun Sep 21 15:43:00 2003 +0000 Apply bug fix reported to Debian (#136976) by Peter Maydell; allows messages with "Content-Transfer-Encoding: binary" to be displayed, per RFC 2045 section 6.2 paragraph 4 :100644 100644 a31bf949... 79997fd5... M uip/mhparse.c commit c012a612b25a59029d0feb22f98aa623adb923a9 Author: Glenn Burkhardt AuthorDate: Sun Sep 21 02:39:58 2003 +0000 Commit: Glenn Burkhardt CommitDate: Sun Sep 21 02:39:58 2003 +0000 corrected typo for nroff directive :100644 100644 0f552b05... 42155cc3... M man/nmh.man commit 0e2ff4d9f255196880fb7d724b7ff8138eb3e9c3 Author: Glenn Burkhardt AuthorDate: Tue Sep 16 14:27:55 2003 +0000 Commit: Glenn Burkhardt CommitDate: Tue Sep 16 14:27:55 2003 +0000 add command to remove $(libdir)/install-mh prior to creating the link :100644 100644 80c211ce... 6bdd4eba... M uip/Makefile.in commit b8eb926caef0c1031539ccae6443e6d7f37282f5 Author: Jeffrey C Honig AuthorDate: Sun Sep 14 13:25:55 2003 +0000 Commit: Jeffrey C Honig CommitDate: Sun Sep 14 13:25:55 2003 +0000 The first ``inc'' into an empty folder would not update the unseen sequence. This is because seq_list() will return NULL if mp->nummsg is zero. Insure that mp->nummsg is incremented. :100644 100644 ec4f520d... 1b49a846... M uip/inc.c commit 3a98db03a5a9ae31af39cbd793260021e95ff104 Author: Ken Hornstein AuthorDate: Mon Sep 8 18:41:10 2003 +0000 Commit: Ken Hornstein CommitDate: Mon Sep 8 18:41:10 2003 +0000 Man page fix from Igor Sobrado :100644 100644 84bf62ef... 2a94abb2... M man/slocal.man commit f5c3067acc6c1fb336d70b9d4ab38f4b3d17c79b Author: Glenn Burkhardt AuthorDate: Sat Sep 6 17:27:55 2003 +0000 Commit: Glenn Burkhardt CommitDate: Sat Sep 6 17:27:55 2003 +0000 Added documentation of "Dcc", per recent discussion on mailing list (main contributors Jerry Peek and Robert Elz) :100644 100644 85b3164d... 65a5d1e3... M man/send.man commit 557d33aeabe46e9a0411959703f721c5b9ce2ae9 Author: Ken Hornstein AuthorDate: Fri Sep 5 21:07:49 2003 +0000 Commit: Ken Hornstein CommitDate: Fri Sep 5 21:07:49 2003 +0000 Merge in changes from the 1.1 branch. :100644 100644 23270922... 9d5e65d7... M .cvsignore :100644 100644 f029fd65... c3fb81a7... M configure.in :100644 100644 99f6d1f3... 0bcd62f5... M docs/FAQ :000000 100644 00000000... 3dd76230... A docs/README.SASL :100644 100644 fe313524... 20b64527... M docs/README.developers :100644 100644 ca56781a... 5760356e... M mts/smtp/smtp.c :100644 100644 577a4b0d... 685489a1... M uip/popsbr.c commit 9e43ae1d70f7da5d175425092395f9beb2d625d3 Author: Ken Hornstein AuthorDate: Fri Sep 5 19:10:21 2003 +0000 Commit: Ken Hornstein CommitDate: Fri Sep 5 19:10:21 2003 +0000 Fix from branch. :100644 100644 d2524c7c... c3fe5995... M sbr/context_read.c commit d3a300121b033551031ffbdaa9202fb4aa4453f3 Author: Ken Hornstein AuthorDate: Fri Sep 5 18:37:47 2003 +0000 Commit: Ken Hornstein CommitDate: Fri Sep 5 18:37:47 2003 +0000 Quiet lock warning. :100644 100644 5cd18724... c088283e... M sbr/lock_file.c commit 82a21b6f3cddf8ab048dcb02c080ea9797c73c5a Author: Ken Hornstein AuthorDate: Fri Sep 5 18:36:36 2003 +0000 Commit: Ken Hornstein CommitDate: Fri Sep 5 18:36:36 2003 +0000 Merge in locking fixes into the main line. :100644 100644 e6cdfff0... d2524c7c... M sbr/context_read.c :100644 100644 58d17451... 4fa60ea4... M sbr/context_save.c :100644 100644 7280464f... 5cd18724... M sbr/lock_file.c :100644 100644 d085d53d... f36edb56... M sbr/seq_read.c :100644 100644 f8de9ed1... 84775b97... M sbr/seq_save.c commit cafee7a804b8aa53166065e988ec0fc387862fc8 Author: Jeffrey C Honig AuthorDate: Mon Aug 11 01:20:52 2003 +0000 Commit: Jeffrey C Honig CommitDate: Mon Aug 11 01:20:52 2003 +0000 When compiling format strings, nmh attempts to avoid multiple parsing of address and date fields by only inserting calls to the parse functions (FT_PARSEADDR and FT_PARSEDATE) for a given component once. The problem with this method is that the initial invocation may actually be on a code path that is conditionally executed. This can result cached copies of data from the fields in previous messages to be used. My solution is to move this optimization from compile time to run time. Address and Date parsing calls (FT_PARSEADDR and FT_PARSEDATE) will always be included. Run time flags are used to prevent these functions from being run more than once per component per message. The c_flags field has being converted from a boolean to a bit-field to facilitate maintenance of the new CT_PARSED value. The result value that used to be in this field is now the bit CF_TRUE and the overloaded use of this field by scan() is now the CT_DATEFAB bit. Some unneeded flags (CT_ADDRPARSE, CT_MYMBOX) have also been removed. :100644 100644 b0a7242b... 2ba6be3b... M ChangeLog :100644 100644 fd4c555d... cece50e0... M h/fmt_scan.h :100644 100644 4c64b9c6... a478acb7... M sbr/fmt_compile.c :100644 100644 5dc7f22c... 0a2397ba... M sbr/fmt_scan.c :100644 100644 cc0bc704... cc9a589a... M uip/fmtdump.c :100644 100644 c04e8c70... be68bf89... M uip/scansbr.c commit f8665df65d2bc3552b68c734a7b3975d95ccdc41 Author: Glenn Burkhardt AuthorDate: Fri Jul 4 16:15:02 2003 +0000 Commit: Glenn Burkhardt CommitDate: Fri Jul 4 16:15:02 2003 +0000 more detail for bugs fixed, so reader doesn't need to go to Bugzilla :100644 100644 81b1104a... b0a7242b... M ChangeLog commit e6e81a487cd89dbf3f2dd96d140915a0026246c2 Author: Glenn Burkhardt AuthorDate: Fri Jul 4 15:55:55 2003 +0000 Commit: Glenn Burkhardt CommitDate: Fri Jul 4 15:55:55 2003 +0000 update :100644 100644 fc507d4a... 81b1104a... M ChangeLog commit e1aea389b23bc67d45838523de0726d85f7328d1 Author: Glenn Burkhardt AuthorDate: Wed Jul 2 02:24:19 2003 +0000 Commit: Glenn Burkhardt CommitDate: Wed Jul 2 02:24:19 2003 +0000 restored use of %manext5% for man section, which was lost in version 1.4 :100644 100644 b2b5818a... 58d14881... M man/mh-format.man commit b9dc6c7097b13ba6e5741110b65b47ae892a64f5 Author: Glenn Burkhardt AuthorDate: Wed Jul 2 02:03:19 2003 +0000 Commit: Glenn Burkhardt CommitDate: Wed Jul 2 02:03:19 2003 +0000 Updated description of default template to reflect current change to In-Reply-To, and Fcc: :100644 100644 382435fd... 89ab11e7... M man/repl.man commit c948e3f891a14ca70ed9f82ac05481e2a8614bb5 Author: Glenn Burkhardt AuthorDate: Wed Jul 2 02:01:50 2003 +0000 Commit: Glenn Burkhardt CommitDate: Wed Jul 2 02:01:50 2003 +0000 Default templates for 'comp', 'forw', 'dist', 'repl' now include Fcc: +outbox :100644 100644 2669f040... 7f255ea5... M etc/components :100644 100644 c6dc39a3... d30819a1... M etc/distcomps :100644 100644 2669f040... 7f255ea5... M etc/forwcomps :100644 100644 21282fcb... 6ec3ce72... M etc/replcomps :100644 100644 4a3e3a45... 7920544b... M etc/replgroupcomps commit 9665ec6f27f99bf6becbf8cce2978d962a9bf976 Author: Glenn Burkhardt AuthorDate: Mon Jun 30 19:43:26 2003 +0000 Commit: Glenn Burkhardt CommitDate: Mon Jun 30 19:43:26 2003 +0000 use symbols for date and version so values are automatically updated during build. :100644 100644 c62ebc58... b2b5818a... M man/mh-format.man commit d13fd6c0abc123c7b293b0714a8f14eb8bddbd3e Author: Glenn Burkhardt AuthorDate: Mon Jun 30 19:40:05 2003 +0000 Commit: Glenn Burkhardt CommitDate: Mon Jun 30 19:40:05 2003 +0000 bump date so everything gets a new timestamp for 1.1 :100644 100644 6d20d9c2... beb1a1c6... M DATE commit b465f05ed63a7c310182aa0a32cd29b0e02103a0 Author: Glenn Burkhardt AuthorDate: Mon Jun 30 18:58:07 2003 +0000 Commit: Glenn Burkhardt CommitDate: Mon Jun 30 18:58:07 2003 +0000 fix bug #1393, "sortm core dumps", using patch provided by Robert Elz, kre@munnari.oz.au. The core dump occurred when "Subject:" was immediately followed by an alphanumeric, and "-textfield subject" were used as arguments. :100644 100644 5cff943b... 8f9bf813... M uip/sortm.c commit 01364afac249d8fbcf7b37570a52c5f177b18975 Author: Glenn Burkhardt AuthorDate: Mon Jun 30 16:48:50 2003 +0000 Commit: Glenn Burkhardt CommitDate: Mon Jun 30 16:48:50 2003 +0000 Re-write for clarity, using major contributions from Bart Massey, and Jerry Peek. :100644 100644 869aba85... c62ebc58... M man/mh-format.man commit ec751d9bbebd843215896b299712728eed0ea76c Author: Glenn Burkhardt AuthorDate: Mon Jun 30 16:40:09 2003 +0000 Commit: Glenn Burkhardt CommitDate: Mon Jun 30 16:40:09 2003 +0000 made RFC 2822 compliant, using an "In-reply-to:" format supplied by Jerry Peek. :100644 100644 5b6f4bf3... 21282fcb... M etc/replcomps :100644 100644 3226af74... 4a3e3a45... M etc/replgroupcomps commit 028324109b0e90a18d0b38c6c45a603a6c8732b5 Author: Glenn Burkhardt AuthorDate: Fri Jun 27 17:02:13 2003 +0000 Commit: Glenn Burkhardt CommitDate: Fri Jun 27 17:02:13 2003 +0000 prevent double free of 'ce->cd_file' or later use of invalid data :100644 100644 57518015... c43c5e92... M uip/mhfree.c commit 19b47ea980a98d01112d4bda1d220c7057818ff1 Author: Glenn Burkhardt AuthorDate: Thu Jun 26 01:30:36 2003 +0000 Commit: Glenn Burkhardt CommitDate: Thu Jun 26 01:30:36 2003 +0000 fix for bug #578 repl leaks umask; there are several other places in the code where the umask value is not restored, so there might be other similar bugs :100644 100644 1ea411c2... a7616d35... M uip/replsbr.c commit 823e60ebef611a90dedab2beca8b9cab3b3644fc Author: Glenn Burkhardt AuthorDate: Mon Jun 23 00:44:28 2003 +0000 Commit: Glenn Burkhardt CommitDate: Mon Jun 23 00:44:28 2003 +0000 Changed use of GNU "simply expanded variables" for MAN1, MAN5, MAN8, so one makefile will work with SysV make (e.g., Solaris) and GNU make :100644 100644 88c8c840... 3b0fb65a... M man/Makefile.in commit e121e49643a86c4e7fb34dd75ed1542759aa16c9 Author: Glenn Burkhardt AuthorDate: Sun Jun 22 23:59:16 2003 +0000 Commit: Glenn Burkhardt CommitDate: Sun Jun 22 23:59:16 2003 +0000 allow gdbm/ndbm.h in addition to db1/ndbm.h; needs corresponding change in configure.in :100644 100644 74f1b57e... b1760081... M uip/slocal.c commit 106638417f787bf077db15294cf54e068113e5c8 Author: Glenn Burkhardt AuthorDate: Sun Jun 22 23:58:07 2003 +0000 Commit: Glenn Burkhardt CommitDate: Sun Jun 22 23:58:07 2003 +0000 Allowed gdbm as substitute for Berkeley db1/ndbm.h libdb1 (check for gdbm/ndbm.h, libgdbm now); send only stdout to /dev/null when checking for 'broken vi', this allows 'vim' on Solaris to work, since 'vim' closes stdin and uses stderr for input when running a script. :100644 100644 3d768e4d... f029fd65... M configure.in commit ee40b1147dd59da498fcfe1329eb67a0c328f536 Author: Kimmo Suominen AuthorDate: Thu Jan 2 04:07:49 2003 +0000 Commit: Kimmo Suominen CommitDate: Thu Jan 2 04:07:49 2003 +0000 Fix detection of non-mime messages when the charset is not enclosed in double quotes. (Not perfect yet, but 97% effective.) :100644 100644 1137c391... 5773b56e... M uip/show.c commit b0dd86c2ac5c1dd69a003da88b7ffcc5cec98116 Author: Jon Steinhart AuthorDate: Thu Nov 21 21:22:24 2002 +0000 Commit: Jon Steinhart CommitDate: Thu Nov 21 21:22:24 2002 +0000 Fixed a typo in the SRCS definition; had a .o where it should have been a .c :100644 100644 b27b1269... 84b003ff... M sbr/Makefile.in commit 75e2f3fddb560b88552a93ca37d8049278665b2c Author: Jon Steinhart AuthorDate: Wed Nov 20 19:57:19 2002 +0000 Commit: Jon Steinhart CommitDate: Wed Nov 20 19:57:19 2002 +0000 Fixed a bug in the waitpid version where it would return incorrectly if a child process was interrupted. :100644 100644 a1555bbe... 1572bfe4... M sbr/pidwait.c commit 830e38e1921fe065733bab9a2128390e56e35985 Author: Jon Steinhart AuthorDate: Tue Nov 19 20:39:21 2002 +0000 Commit: Jon Steinhart CommitDate: Tue Nov 19 20:39:21 2002 +0000 Removed the reference to the library directory since this now goes in bin. :100644 100644 c3c87fa4... ce1f61da... M man/install-mh.man commit 78c6358d8c8c1ee74bf65c672d958e4eae17ee37 Author: Jon Steinhart AuthorDate: Tue Nov 19 20:37:50 2002 +0000 Commit: Jon Steinhart CommitDate: Tue Nov 19 20:37:50 2002 +0000 Changed to move install-mh to the bin directory instead of the lib directory. A link is made from the lib to the bin just in case. :100644 100644 909e9193... 88c8c840... M man/Makefile.in :100644 100644 6d971d5a... 80c211ce... M uip/Makefile.in commit 5afa7072e3fe7fc42287e2149e1c23b363700795 Author: Jon Steinhart AuthorDate: Mon Nov 18 18:25:00 2002 +0000 Commit: Jon Steinhart CommitDate: Mon Nov 18 18:25:00 2002 +0000 The file README-ATTACHMENTS was removed - it has been moved to the docs subdirectory. I thought that this had already been done but I guess not. It's unrelated to the rest of these changes. The remainder of these changes affect the way that nmh is installed. Nmh has historically prompted the user for installation when any nmh command is invoked if it doesn't think that it's installed. This is a problem for programs that want to, for example, interact with nmh programs via pipes. These changes alter this behavior. Now, when an nmh program thinks that nmh isn't installed, it tells the user to run install-mh to install it. A -check option has been added to install-mh that allows the existence of an installation to be silently checked and indicated via the exit status. The bulk of this change is in sbr/read_context.c. In the process of making these changes, I noticed a fair amount of useless code that I removed. In particular: 1. The program started with a test for whether or not defpath had already been set. This could only happen if context_read() was called more than once, which it isn't. This check also existed and was removed from the following places: sbr/context_del.c sbr/context_find.c sbr/context_replace.c sbr/seq_read.c sbr/seq_save.c uip/flist.c uip/folder.c uip/rmf.c 2. A similar test for mypath was removed. No need to test it since it doesn't happen. I'm just not a believer that a = 1; if (a != 1) error(); is a good way to write code! 3. I removed the code makes a copy of the $HOME environment variable as returned by getenv(). It's never changed, so it doesn't need copying. 4. I removed code that copied the pw_dir member of the passwd structure returned by getpwuid() if $HOME isn't set. Yes, the returned structure is static, but since the function is never called again the returned values stay valid and don't need copying. 5. I removed the test for a NULL pw_dir member in the passwd structure returned by getpwuid() since that never happens. 6. I removed code that removed a trailing / from mypath if mypath is more than one character long. Unnecessary as // is interpreted as / anyway. mypath never shows up in an error message, so nobody will ever see it. Besides, this code didn't handle the case of multiple trailing slashes. 7. I removed code that replaced the MH environment variable contents with an absolute path if it was a relative one. I'm a bit nervous about this one, only testing will tell. Any nmh program that's invoked will use the same context_read() code to convert a relative path to an absolute one anyway. And there's no guarantee (or discussion) of this feature in any of the documentation. 8. Althout context_read() tested the MH environment variable, install-mh didn't. This means that the behavior was not consistent between install-mh and all other nmh programs. I changed install-mh to be consistent with context_read(). 9. install-mh has been installed in the lib directory, not bin. So a user would be unlikely to find it when prompted to run it. The installation has been changed to add a link from bin to lib. :100644 000000 ff9db2a3... 00000000... D README-ATTACHMENTS :100644 100644 97e0ff7b... c3c87fa4... M man/install-mh.man :100644 100644 17d73e2b... 0f552b05... M man/nmh.man :100644 100644 e55d683b... b38d8222... M sbr/context_del.c :100644 100644 96f28f9d... efac368f... M sbr/context_find.c :100644 100644 49b4fc36... e6cdfff0... M sbr/context_read.c :100644 100644 541253db... b723cb43... M sbr/context_replace.c :100644 100644 b1dc3a5a... d085d53d... M sbr/seq_read.c :100644 100644 6366e5eb... f8de9ed1... M sbr/seq_save.c :100644 100644 905c33dc... 6d971d5a... M uip/Makefile.in :100644 100644 dac84d50... a79c8420... M uip/flist.c :100644 100644 2cc9bde6... 7706f90f... M uip/folder.c :100644 100644 ff50d359... 34aed950... M uip/install-mh.c :100644 100644 2909196a... 5fe47084... M uip/rmf.c commit 945aa62b814966a1266a5524bd089a74e0999cd1 Author: Anders Eriksson AuthorDate: Mon Oct 21 19:32:26 2002 +0000 Commit: Anders Eriksson CommitDate: Mon Oct 21 19:32:26 2002 +0000 Changed scan to always pass the folder argument. This is in line with the man page. :100644 100644 1612717d... a53a5bad... M uip/scan.c commit d38818cda73ca94e1e62bdf30a0a024781a54cb5 Author: Jon Steinhart AuthorDate: Mon Sep 9 14:30:16 2002 +0000 Commit: Jon Steinhart CommitDate: Mon Sep 9 14:30:16 2002 +0000 New routine that provides interface to external programs. :000000 100644 00000000... d2288487... A sbr/ext_hook.c commit a259594cc41e41bfbb90562d3977b8194d1446f5 Author: Jon Steinhart AuthorDate: Fri Aug 23 20:37:01 2002 +0000 Commit: Jon Steinhart CommitDate: Fri Aug 23 20:37:01 2002 +0000 Added external program hooks. :100644 100644 ff9db2a3... a9963642... M docs/README-ATTACHMENTS :000000 100644 00000000... bb5d6ee7... A docs/README-HOOKS :100644 100644 63ea87e8... 1b815bcf... M h/prototypes.h :100644 100644 882094e6... b27b1269... M sbr/Makefile.in :100644 100644 16f4cc52... b3bc8914... M sbr/folder_addmsg.c :100644 100644 3d2e5497... 4567f6d1... M sbr/folder_delmsgs.c :100644 100644 7a661a53... bebc145b... M sbr/folder_pack.c :100644 100644 8acfb1a9... bbefc99a... M sbr/m_convert.c :100644 100644 6b9be832... 908de0df... M uip/burst.c :100644 100644 7886411c... ec4f520d... M uip/inc.c :100644 100644 d91b7b45... 2e88df23... M uip/mhstoresbr.c :100644 100644 ca8789f1... 8f6a6f8e... M uip/rcvstore.c :100644 100644 9e1ed207... 663092b9... M uip/refile.c :100644 100644 fccbb096... 2909196a... M uip/rmf.c :100644 100644 a18c278e... 072097a7... M uip/rmm.c :100644 100644 4b348cf0... 5cff943b... M uip/sortm.c commit 982194e9f1c9e4718b4857b300fc3ab8b16c8f6b Author: Jon Steinhart AuthorDate: Thu Aug 22 22:06:18 2002 +0000 Commit: Jon Steinhart CommitDate: Thu Aug 22 22:06:18 2002 +0000 Moved this file here from the root directory. :000000 100644 00000000... ff9db2a3... A docs/README-ATTACHMENTS commit 7480dbc14bc90f2d872d434205c0784704213252 Author: Jon Steinhart AuthorDate: Mon Aug 19 20:50:41 2002 +0000 Commit: Jon Steinhart CommitDate: Mon Aug 19 20:50:41 2002 +0000 Added an improved user interface for sending messages with attachments. :000000 100644 00000000... ff9db2a3... A README-ATTACHMENTS :100644 100644 d252eada... 63ea87e8... M h/prototypes.h :100644 100644 7a735bcb... b626e2a4... M man/anno.man :100644 100644 5a2f897a... 85b3164d... M man/send.man :100644 100644 5bc5da79... cc2e989c... M man/whatnow.man :100644 100644 ea60e6d9... b92abdc9... M uip/anno.c :100644 100644 e250c1a6... 41b0cc29... M uip/annosbr.c :100644 100644 ec81aaa2... 1da94401... M uip/send.c :100644 100644 b055bb01... 75768893... M uip/sendsbr.c :100644 100644 de0e950d... b4cd5e2b... M uip/viamail.c :100644 100644 ab980742... 53320d32... M uip/whatnowsbr.c commit ad3d5c36b428d68a3a2cad85168ec90bf25c8932 Author: Ken Hornstein AuthorDate: Mon Jul 8 19:29:24 2002 +0000 Commit: Ken Hornstein CommitDate: Mon Jul 8 19:29:24 2002 +0000 Remove this file on the head as well. :100644 100644 e93c9eef... 23270922... M .cvsignore :100644 000000 5e88ed04... 00000000... D stamp-h.in commit f422ef658bd5a190e08177c67361c874e679c526 Author: Ken Hornstein AuthorDate: Wed Jul 3 14:49:24 2002 +0000 Commit: Ken Hornstein CommitDate: Wed Jul 3 14:49:24 2002 +0000 Bring these changes over from the branch. :100644 100644 e8c05a6b... e93c9eef... M .cvsignore :100644 000000 85f9f96e... 00000000... D config.h.in commit ae5aae7b9c72dbff21f87bbc6e783d7cec1941a9 Author: Ken Hornstein AuthorDate: Wed Jul 3 14:08:11 2002 +0000 Commit: Ken Hornstein CommitDate: Wed Jul 3 14:08:11 2002 +0000 Remove these undefines (why were they in there?) :100644 100644 70dac65f... 3d768e4d... M configure.in commit 2d1136ddada3b7899baa0a2d9d28a96fa959813d Author: Ken Hornstein AuthorDate: Tue Jul 2 22:10:55 2002 +0000 Commit: Ken Hornstein CommitDate: Tue Jul 2 22:10:55 2002 +0000 Update for new version. :100644 100644 e76778f2... 9459d4ba... M VERSION commit 6c42153ad9362cc676ea66563bf400d7511b3b68 Author: Ken Hornstein AuthorDate: Tue Jul 2 22:09:12 2002 +0000 Commit: Ken Hornstein CommitDate: Tue Jul 2 22:09:12 2002 +0000 Add/update copyright notice in all source code files. :100644 100644 5734c15d... 07872da8... M COPYRIGHT :100644 100644 2a01c1bb... 8a613b68... M config/config.c :100644 100644 4b3d6069... 263bcef3... M mts/smtp/hosts.c :100644 100644 6de440f7... ca56781a... M mts/smtp/smtp.c :100644 100644 f38110f7... f977c271... M sbr/add.c :100644 100644 545d3972... cf941dc5... M sbr/addrsbr.c :100644 100644 48b7328e... 53c8da1a... M sbr/ambigsw.c :100644 100644 ab58cb46... 353a5c15... M sbr/atooi.c :100644 100644 715aaf5e... 27f187e2... M sbr/brkstring.c :100644 100644 e16f3603... 5d98774c... M sbr/check_charset.c :100644 100644 eb2ffd51... a7ab7643... M sbr/client.c :100644 100644 86f91a76... 191bd311... M sbr/closefds.c :100644 100644 939a484f... a338835b... M sbr/concat.c :100644 100644 702c15d0... e55d683b... M sbr/context_del.c :100644 100644 1e324013... 96f28f9d... M sbr/context_find.c :100644 100644 208c45e7... 9b3f7eb1... M sbr/context_foil.c :100644 100644 d2836ba3... 49b4fc36... M sbr/context_read.c :100644 100644 435127b2... 541253db... M sbr/context_replace.c :100644 100644 b3f8168b... 58d17451... M sbr/context_save.c :100644 100644 577e811e... 52989aab... M sbr/copy.c :100644 100644 8d7b6f54... 93ff5e84... M sbr/copyip.c :100644 100644 a8c33758... c3ca3ed6... M sbr/cpydata.c :100644 100644 068fb6e8... a1a887af... M sbr/cpydgst.c :100644 100644 fffc0fa8... 7c132ceb... M sbr/discard.c :100644 100644 b5072a69... cf2e3080... M sbr/done.c :100644 100644 3a37fe35... e485dfd8... M sbr/dtime.c :100644 100644 41f031a5... 299e3a62... M sbr/error.c :100644 100644 3956a7b9... 6a45da67... M sbr/fdcompare.c :100644 100644 150aa73d... 2e4bff61... M sbr/fmt_addr.c :100644 100644 6baabdc7... 4c64b9c6... M sbr/fmt_compile.c :100644 100644 e3384e8b... 478a466a... M sbr/fmt_def.c :100644 100644 003ec2bc... effd06f1... M sbr/fmt_new.c :100644 100644 a9c3d0bd... b4bf4eb8... M sbr/fmt_rfc2047.c :100644 100644 4f9078a4... 5dc7f22c... M sbr/fmt_scan.c :100644 100644 6858f4db... 16f4cc52... M sbr/folder_addmsg.c :100644 100644 e5374b5d... 3d2e5497... M sbr/folder_delmsgs.c :100644 100644 1c1051de... f06bbf5c... M sbr/folder_free.c :100644 100644 05365a86... 7a661a53... M sbr/folder_pack.c :100644 100644 0d012932... b5b3f9d5... M sbr/folder_read.c :100644 100644 f3130f14... f3d99ba7... M sbr/folder_realloc.c :100644 100644 dcfb316c... c0804cde... M sbr/gans.c :100644 100644 987ed3c8... 80eeb710... M sbr/getans.c :100644 100644 f38a834f... d0ec6f8e... M sbr/getanswer.c :100644 100644 1c61d9bb... 89b57c19... M sbr/getarguments.c :100644 100644 07bc3651... f23641dd... M sbr/getcpy.c :100644 100644 21db9a98... 544a144e... M sbr/getfolder.c :100644 100644 2cb6bdc1... 7280464f... M sbr/lock_file.c :100644 100644 b1b5133d... 221ff0ca... M sbr/m_atoi.c :100644 100644 aa9edc8d... 86696db3... M sbr/m_backup.c :100644 100644 e9a5d188... 8acfb1a9... M sbr/m_convert.c :100644 100644 712e173d... 6782c34e... M sbr/m_draft.c :100644 100644 8a18e783... 1332405b... M sbr/m_getfld.c :100644 100644 3f54c456... d7aec6f3... M sbr/m_gmprot.c :100644 100644 11c6ee3e... 441ca502... M sbr/m_maildir.c :100644 100644 89e0f296... 96f54f0e... M sbr/m_msgdef.c :100644 100644 dd8303e3... 2c403d0c... M sbr/m_name.c :100644 100644 70a2c920... 30601f14... M sbr/m_scratch.c :100644 100644 bac70b0a... 907c6244... M sbr/m_tmpfil.c :100644 100644 ec859cc1... 523feb68... M sbr/makedir.c :100644 100644 c7959103... cb3e6e4e... M sbr/mf.c :100644 100644 551fd1fe... 40d4e279... M sbr/mts.c :100644 100644 df5d963b... 0ae27d39... M sbr/path.c :100644 100644 d77039bc... a687e694... M sbr/peekc.c :100644 100644 aa664649... 7991d592... M sbr/pidstatus.c :100644 100644 20b1fb55... a1555bbe... M sbr/pidwait.c :100644 100644 1ceeb859... 17744559... M sbr/print_help.c :100644 100644 c9c1159c... 426724b4... M sbr/print_sw.c :100644 100644 1b37b1ea... b3300a98... M sbr/print_version.c :100644 100644 05c3942f... 82b85b08... M sbr/push.c :100644 100644 2c6af0dc... 649b0152... M sbr/putenv.c :100644 100644 0036d20e... 6a8b77fc... M sbr/pwd.c :100644 100644 087ed78d... 92e152db... M sbr/r1bindex.c :100644 100644 9cd128e3... 9e0382ef... M sbr/readconfig.c :100644 100644 17c67155... dc068fe0... M sbr/refile.c :100644 100644 4ef1649a... 627ff3f2... M sbr/remdir.c :100644 100644 b586fc37... ff3e23a4... M sbr/seq_add.c :100644 100644 b0f6e6c0... 56bd2ec1... M sbr/seq_bits.c :100644 100644 ed70c5d9... 67a93bb5... M sbr/seq_del.c :100644 100644 c44f1775... aa9d57dd... M sbr/seq_getnum.c :100644 100644 afa8671c... 8a440691... M sbr/seq_list.c :100644 100644 66319b5e... 0eeddb38... M sbr/seq_nameok.c :100644 100644 ee34fd9e... 81a1f5ca... M sbr/seq_print.c :100644 100644 649a360e... b1dc3a5a... M sbr/seq_read.c :100644 100644 e0f42aec... 6366e5eb... M sbr/seq_save.c :100644 100644 7e7acba0... 42195726... M sbr/seq_setcur.c :100644 100644 e5161c5a... fdffa952... M sbr/seq_setprev.c :100644 100644 906b0ac2... 022982ea... M sbr/seq_setunseen.c :100644 100644 7ed13cac... c099c1cd... M sbr/showfile.c :100644 100644 a8c12d62... 9f5f3792... M sbr/signals.c :100644 100644 54ff550e... 1a104ada... M sbr/smatch.c :100644 100644 06140c8f... 558c2cf8... M sbr/snprintb.c :100644 100644 dd5c0977... 615404a7... M sbr/ssequal.c :100644 100644 bbb26cba... f0358bdd... M sbr/strcasecmp.c :100644 100644 18df0105... 486b36a8... M sbr/strdup.c :100644 100644 d7809550... ce78ada8... M sbr/strerror.c :100644 100644 03910fdf... 51cbe7c6... M sbr/strindex.c :100644 100644 d1355485... c341f00c... M sbr/trimcpy.c :100644 100644 7adc3218... dedb0e5b... M sbr/uprf.c :100644 100644 52a8e74d... 39cfaa27... M sbr/vfgets.c :100644 100644 7cffc504... c6003879... M uip/ali.c :100644 100644 b3c4b228... 19f204fa... M uip/aliasbr.c :100644 100644 bf0e9cad... ea60e6d9... M uip/anno.c :100644 100644 e255a7bc... e250c1a6... M uip/annosbr.c :100644 100644 843ece4e... 85683f93... M uip/ap.c :100644 100644 4f654fba... 6b9be832... M uip/burst.c :100644 100644 7e741383... 1aca23a7... M uip/comp.c :100644 100644 dde06021... 32b1613e... M uip/conflict.c :100644 100644 58ca45e5... 4b6ce697... M uip/dist.c :100644 100644 be2716be... bda98c8f... M uip/distsbr.c :100644 100644 687d4c44... c20e1ac8... M uip/dp.c :100644 100644 45d5c286... 212d162a... M uip/dropsbr.c :100644 100644 baab4758... cc0bc704... M uip/fmtdump.c :100644 100644 c16dd96c... 2cc9bde6... M uip/folder.c :100644 100644 661a084b... e842d269... M uip/forw.c :100644 100644 525554e7... 9c118a5c... M uip/ftpsbr.c :100644 100644 7475d5e1... 7886411c... M uip/inc.c :100644 100644 7b2ef2a3... ff50d359... M uip/install-mh.c :100644 100644 e53b3d58... aeed8667... M uip/mark.c :100644 100644 08227885... 2b0ad1af... M uip/mhbuild.c :100644 100644 ed330e3e... 58104a5f... M uip/mhbuildsbr.c :100644 100644 712ec042... ece59430... M uip/mhcachesbr.c :100644 100644 aef86cd8... 57518015... M uip/mhfree.c :100644 100644 33e9f3fa... 03eb49e8... M uip/mhl.c :100644 100644 856bfc52... 10ba1e4c... M uip/mhlist.c :100644 100644 2a91eac6... dd6d855f... M uip/mhlistsbr.c :100644 100644 f22303b8... d707ed15... M uip/mhlsbr.c :100644 100644 5171f4e8... d74a7f1d... M uip/mhmail.c :100644 100644 80ebcbb6... 2a1672e6... M uip/mhmisc.c :100644 100644 601ce5f5... c6d5c777... M uip/mhn.c :100644 100644 5ed9b979... 0c4c2bec... M uip/mhoutsbr.c :100644 100644 ece8c3c1... 5e5e006b... M uip/mhparam.c :100644 100644 2511f855... a31bf949... M uip/mhparse.c :100644 100644 5c2ac313... d3dcc675... M uip/mhpath.c :100644 100644 abb399c9... 4496590f... M uip/mhshow.c :100644 100644 48999391... d7d4d141... M uip/mhshowsbr.c :100644 100644 2de12bc2... 4bfc6763... M uip/mhstore.c :100644 100644 9f840dd9... d91b7b45... M uip/mhstoresbr.c :100644 100644 f10216f6... a7d2d383... M uip/mhtest.c :100644 100644 3616ea8e... 3b9bc74f... M uip/msgchk.c :100644 100644 2eda3b23... 0c9c8e01... M uip/msh.c :100644 100644 d2d0ad77... 3548b7ec... M uip/mshcmds.c :100644 100644 42e66944... a38f7953... M uip/packf.c :100644 100644 72d97d65... 65a9091e... M uip/pick.c :100644 100644 ebebf6c3... 71ae644f... M uip/picksbr.c :100644 100644 1dc74a3b... afdd4fbf... M uip/popi.c :100644 100644 3ee198b2... 577a4b0d... M uip/popsbr.c :100644 100644 37db5f96... 32888e64... M uip/post.c :100644 100644 79e0eb79... bc194ffe... M uip/prompter.c :100644 100644 867104ad... fd6f81c2... M uip/rcvdist.c :100644 100644 1e85f803... 410267b6... M uip/rcvpack.c :100644 100644 726ff9ed... ca8789f1... M uip/rcvstore.c :100644 100644 cf54134f... 12b73e7c... M uip/rcvtty.c :100644 100644 f484ccb8... 9e1ed207... M uip/refile.c :100644 100644 f6d32d30... b1c0782f... M uip/repl.c :100644 100644 7515f116... 1ea411c2... M uip/replsbr.c :100644 100644 233a7bfe... fccbb096... M uip/rmf.c :100644 100644 35236010... a18c278e... M uip/rmm.c :100644 100644 56980e95... 1612717d... M uip/scan.c :100644 100644 6fd4bb32... c04e8c70... M uip/scansbr.c :100644 100644 bf689f0d... ec81aaa2... M uip/send.c :100644 100644 2c2e3a63... b055bb01... M uip/sendsbr.c :100644 100644 d656bf95... 1137c391... M uip/show.c :100644 100644 ce806dc6... 74f1b57e... M uip/slocal.c :100644 100644 d64f8bef... 4b348cf0... M uip/sortm.c :100644 100644 78c300c6... 4930cbbf... M uip/spost.c :100644 100644 556158d1... 421c3670... M uip/termsbr.c :100644 100644 9f79a2e1... de0e950d... M uip/viamail.c :100644 100644 2c2f6b5c... 8267f01a... M uip/vmh.c :100644 100644 cc92b49b... 8ee1e49d... M uip/vmhsbr.c :100644 100644 96676fd0... 4093c38c... M uip/vmhtest.c :100644 100644 0033f8b2... d9954264... M uip/whatnow.c :100644 100644 7f88fc48... cd215020... M uip/whatnowproc.c :100644 100644 cf577927... ab980742... M uip/whatnowsbr.c :100644 100644 5d7172e4... d04ef27e... M uip/whom.c :100644 100644 cd1ffaa9... c69363a4... M uip/wmh.c commit 25f7c51c3a44de4b88eecd7628b67b95a02b6cb0 Author: Ken Hornstein AuthorDate: Tue Jul 2 21:46:37 2002 +0000 Commit: Ken Hornstein CommitDate: Tue Jul 2 21:46:37 2002 +0000 Remove autoconf-generated files (and note such files in .cvsignore) :000000 100644 00000000... e8c05a6b... A .cvsignore :100755 000000 ee83a6cd... 00000000... D configure commit 1ff8d41acece861cf6d4d017849e4ea927ab57b1 Author: Dan Harkless AuthorDate: Sat Mar 17 11:28:27 2001 +0000 Commit: Dan Harkless CommitDate: Sat Mar 17 11:28:27 2001 +0000 Ken Hornstein's configure.in Cyrus SASL checks were doing `x"$with_cyrus_sasl" != "no"' instead of `... != x"no"'. :100644 100644 d8feed36... fc507d4a... M ChangeLog :100755 100755 30ede4b2... ee83a6cd... M configure :100644 100644 167518da... 70dac65f... M configure.in :100644 100644 2312e24c... 5e88ed04... M stamp-h.in commit 7e7070820f92e624493d958f44c2bc3787ad48f7 Author: Dan Harkless AuthorDate: Wed Mar 7 05:26:50 2001 +0000 Commit: Dan Harkless CommitDate: Wed Mar 7 05:26:50 2001 +0000 Found some historical information about MH in RFC 808. Supplemented it with info from Jerry Peek's MH book and added it to docs/README.about. :100644 100644 5649e6eb... d8feed36... M ChangeLog :100644 100644 9236b26d... 846bb88b... M docs/README.about commit 27917b536cd785e1f8cff4a4eb95fdb1ba801b84 Author: Shantonu Sen AuthorDate: Tue Feb 6 20:47:54 2001 +0000 Commit: Shantonu Sen CommitDate: Tue Feb 6 20:47:54 2001 +0000 dtimp timezone fixes :100644 100644 47a679e3... 5649e6eb... M ChangeLog commit f1f1c819cd3663a9912914d6f9df92ee2cd86a6f Author: Shantonu Sen AuthorDate: Tue Feb 6 20:35:40 2001 +0000 Commit: Shantonu Sen CommitDate: Tue Feb 6 20:35:40 2001 +0000 Be more picky about symbolic time zones, and accept either a symbolic or numeric time zone, but never both, since a DST offset might be subtracted twice. Also, be uniform about assuming that pre-1970 dates are Y2K problems. :100644 100644 57b61c88... 3a37fe35... M sbr/dtime.c :100644 100644 e5dc8120... e72ec1f7... M sbr/dtimep.c :100644 100644 8e782452... a2286949... M sbr/dtimep.lex commit 73b48d6c0c6ed51bcf0f3b3388ffc6beb372c4c5 Author: Dan Harkless AuthorDate: Tue Feb 6 04:28:04 2001 +0000 Commit: Dan Harkless CommitDate: Tue Feb 6 04:28:04 2001 +0000 Say in README.developers to use `\date' in case anyone is like me and has `date' aliased in their shell to use a nonstandard (but subjectively more readable) format. :100644 100644 d38ffc37... 47a679e3... M ChangeLog :100644 100644 14cf138e... fe313524... M docs/README.developers commit ad5121f68a2d40e9a0ee2eedcd49700085648227 Author: Dan Harkless AuthorDate: Tue Feb 6 04:22:09 2001 +0000 Commit: Dan Harkless CommitDate: Tue Feb 6 04:22:09 2001 +0000 Regenerated stamp-h.in using my tcsh alias `date', which uses a nonstandard format. Replacing it with the standard format. I'll update README.developers to say to use `\date'. :100644 100644 892e6541... 2312e24c... M stamp-h.in commit 35dc2ac6e48a15b966865ec9d69326a6b2a281dd Author: Dan Harkless AuthorDate: Tue Feb 6 03:46:27 2001 +0000 Commit: Dan Harkless CommitDate: Tue Feb 6 03:46:27 2001 +0000 * -L isn't sufficient for specifying the path of the Cyrus SASL shared library. That'll allow us to link successfully, but on many/most OSes that won't allow us to find libsasl at runtime. On Solaris, we need to specify the library path with -R as well (or else the user will have to use the $LD_LIBRARY_PATH kludge, which is considered harmful). This fix should be extended to other OSes as well. * Print whether we have SASL support in the "nmh configuration" summary configure prints out. :100644 100644 6be62abf... d38ffc37... M ChangeLog :100755 100755 8a40de6c... 30ede4b2... M configure :100644 100644 09a8f0d2... 167518da... M configure.in :100644 100644 359d8b1a... 892e6541... M stamp-h.in commit 422873787f3bdfabeba1a40981c5efeb925ca4cc Author: Shantonu Sen AuthorDate: Thu Jan 25 21:28:30 2001 +0000 Commit: Shantonu Sen CommitDate: Thu Jan 25 21:28:30 2001 +0000 man/mh-chart :100644 100644 26b3d89d... 6be62abf... M ChangeLog commit 1b5a1bd2244d3e1c12b7c9e1f48e445de5ad2ea2 Author: Shantonu Sen AuthorDate: Thu Jan 25 21:15:52 2001 +0000 Commit: Shantonu Sen CommitDate: Thu Jan 25 21:15:52 2001 +0000 use %etcdir% for spacing instead of hardcoding :100644 100644 f14f064c... f9b07c2c... M man/ali.man :100644 100644 3f839bb1... 7a735bcb... M man/anno.man :100644 100644 a7d79a74... 35241e54... M man/ap.man :100644 100644 d3a554b6... 5bca99d1... M man/burst.man :100644 100644 5ea8f929... 17180ac7... M man/comp.man :100644 100644 b01b4696... 6cc69442... M man/conflict.man :100644 100644 d7f92945... 6359b772... M man/dist.man :100644 100644 d4fa5d09... 1b214198... M man/dp.man :100644 100644 0aafe460... 8fc7b8d1... M man/flist.man :100644 100644 c66c19c1... aaca927f... M man/fmtdump.man :100644 100644 50f02907... deded862... M man/folder.man :100644 100644 6d490534... c59f4a6c... M man/forw.man :100644 100644 c784f1b3... db611d6f... M man/inc.man :100644 100644 58c7672e... 97e0ff7b... M man/install-mh.man :100644 100644 c64a66dc... 0cebca09... M man/mark.man :100644 100644 aa3c3f19... 8eb7939f... M man/mh-alias.man :100644 100644 73f2e836... 1874d9b6... M man/mh-mail.man :100644 100644 de2efad4... a07503c4... M man/mh-profile.man :100644 100644 0f3bacc8... a97af0ea... M man/mh-sequence.man :100644 100644 e687ae8f... 4fc80b14... M man/mh-tailor.man :100644 100644 36bb5c61... 674b606f... M man/mhbuild.man :100644 100644 eb013294... 10f4b13f... M man/mhl.man :100644 100644 c647e594... 42cb9182... M man/mhlist.man :100644 100644 9f92776a... 7e46677c... M man/mhmail.man :100644 100644 00f38ac0... b1903518... M man/mhparam.man :100644 100644 4b9f4e63... c7448689... M man/mhpath.man :100644 100644 644814cf... 37172025... M man/mhshow.man :100644 100644 3bfb51e2... ae15292a... M man/mhstore.man :100644 100644 a7509b04... 49a841d2... M man/msgchk.man :100644 100644 66e213a2... 89e52e70... M man/msh.man :100644 100644 b1461d7a... 89abd9aa... M man/next.man :100644 100644 03c4d8d3... 17d73e2b... M man/nmh.man :100644 100644 973f596d... d220a76a... M man/packf.man :100644 100644 e523dd40... cb40ccbb... M man/pick.man :100644 100644 d3af2ccc... 24a74bc4... M man/post.man :100644 100644 1c057992... ce861ab5... M man/prev.man :100644 100644 479e9665... 10a98730... M man/prompter.man :100644 100644 4a4f784a... 19041344... M man/rcvdist.man :100644 100644 9f11d636... c8030c48... M man/rcvpack.man :100644 100644 eefe27f1... 76505ebd... M man/rcvstore.man :100644 100644 9476a446... badb4b07... M man/rcvtty.man :100644 100644 6d104c42... c83da66e... M man/refile.man :100644 100644 bd8e8db9... 382435fd... M man/repl.man :100644 100644 e2671961... ff2740ef... M man/rmf.man :100644 100644 63046a10... d8cdf8bc... M man/rmm.man :100644 100644 ed782f19... 3655a100... M man/scan.man :100644 100644 c6a79868... 5a2f897a... M man/send.man :100644 100644 55eaa1fd... ef004ec5... M man/sendfiles.man :100644 100644 c274175a... 64a1a671... M man/show.man :100644 100644 306a08bc... 84bf62ef... M man/slocal.man :100644 100644 81622308... c9d99c5f... M man/sortm.man :100644 100644 ec340dcf... 5bc5da79... M man/whatnow.man :100644 100644 8895a646... 19881213... M man/whom.man commit bc0ff32ab2bfb7e6dbd05a930be7881785dd184a Author: Shantonu Sen AuthorDate: Thu Jan 25 21:14:32 2001 +0000 Commit: Shantonu Sen CommitDate: Thu Jan 25 21:14:32 2001 +0000 compiled mh-chart with synopses of commands :100644 100644 9815d878... e1185e2a... M man/mh-chart.man commit 66cdb2ff684670457915facb5548cc243bdca3cf Author: Shantonu Sen AuthorDate: Tue Jan 23 20:27:57 2001 +0000 Commit: Shantonu Sen CommitDate: Tue Jan 23 20:27:57 2001 +0000 digest :100644 100644 838b8117... 26b3d89d... M ChangeLog commit e589409ad5469c5caa8969826c865181f0c460cd Author: Shantonu Sen AuthorDate: Tue Jan 23 20:26:15 2001 +0000 Commit: Shantonu Sen CommitDate: Tue Jan 23 20:26:15 2001 +0000 Don't try to force year into a 19xx format :100644 100644 d527e1d1... 7f5036d6... M etc/digestcomps commit 3d7993e40a34f52e2b6394c2f64ef0111ab886f7 Author: Shantonu Sen AuthorDate: Tue Jan 23 04:14:08 2001 +0000 Commit: Shantonu Sen CommitDate: Tue Jan 23 04:14:08 2001 +0000 SYNOPSIS formating to prevent filling :100644 100644 49a0a888... f14f064c... M man/ali.man :100644 100644 50693623... 3f839bb1... M man/anno.man :100644 100644 89581351... a7d79a74... M man/ap.man :100644 100644 4d0eb96a... d3a554b6... M man/burst.man :100644 100644 ca11dfb5... 5ea8f929... M man/comp.man :100644 100644 2be7daba... b01b4696... M man/conflict.man :100644 100644 2e65aafb... d7f92945... M man/dist.man :100644 100644 15522dea... d4fa5d09... M man/dp.man :100644 100644 a263a6a4... 0aafe460... M man/flist.man :100644 100644 5a667855... c66c19c1... M man/fmtdump.man :100644 100644 8fd456df... 50f02907... M man/folder.man :100644 100644 8561d93b... 6d490534... M man/forw.man :100644 100644 4e732451... c784f1b3... M man/inc.man :100644 100644 b3b37856... 58c7672e... M man/install-mh.man :100644 100644 128e77d8... c64a66dc... M man/mark.man :100644 100644 97e38ab0... 36bb5c61... M man/mhbuild.man :100644 100644 61585648... eb013294... M man/mhl.man :100644 100644 12d09fc2... c647e594... M man/mhlist.man :100644 100644 51be22ac... 9f92776a... M man/mhmail.man :100644 100644 ac740807... d867251b... M man/mhn.man :100644 100644 debcb752... 00f38ac0... M man/mhparam.man :100644 100644 26913c80... 4b9f4e63... M man/mhpath.man :100644 100644 79a4899d... 644814cf... M man/mhshow.man :100644 100644 8c1e9294... 3bfb51e2... M man/mhstore.man :100644 100644 7c8bf719... a7509b04... M man/msgchk.man :100644 100644 2f01f6d2... 66e213a2... M man/msh.man :100644 100644 f1cf35bc... b1461d7a... M man/next.man :100644 100644 d61879e1... 973f596d... M man/packf.man :100644 100644 1ef41561... e523dd40... M man/pick.man :100644 100644 311d2f38... d3af2ccc... M man/post.man :100644 100644 f5ddc47c... 1c057992... M man/prev.man :100644 100644 cfe068fc... 479e9665... M man/prompter.man :100644 100644 0b04b279... 4a4f784a... M man/rcvdist.man :100644 100644 6716230f... 9f11d636... M man/rcvpack.man :100644 100644 1d1f3e1b... eefe27f1... M man/rcvstore.man :100644 100644 fbdfa9b7... 9476a446... M man/rcvtty.man :100644 100644 40cf94e9... 6d104c42... M man/refile.man :100644 100644 4320922b... bd8e8db9... M man/repl.man :100644 100644 8a15be67... e2671961... M man/rmf.man :100644 100644 21b3ea87... 63046a10... M man/rmm.man :100644 100644 de0a2801... ed782f19... M man/scan.man :100644 100644 917e2718... c6a79868... M man/send.man :100644 100644 9b642e04... 55eaa1fd... M man/sendfiles.man :100644 100644 cf3db806... c274175a... M man/show.man :100644 100644 77dd0543... 306a08bc... M man/slocal.man :100644 100644 64d66546... 81622308... M man/sortm.man :100644 100644 f7d7b37a... ec340dcf... M man/whatnow.man :100644 100644 2ef3e1a7... 8895a646... M man/whom.man commit 9af751035478cdd6d891342bbda914da2371b4bf Author: Shantonu Sen AuthorDate: Fri Jan 19 21:32:13 2001 +0000 Commit: Shantonu Sen CommitDate: Fri Jan 19 21:32:13 2001 +0000 manpages finished :100644 100644 49817060... 838b8117... M ChangeLog commit f20a21e79470ba332827acd155809c3a524e184e Author: Shantonu Sen AuthorDate: Fri Jan 19 21:22:08 2001 +0000 Commit: Shantonu Sen CommitDate: Fri Jan 19 21:22:08 2001 +0000 don't build vmh.1 since vmh isn't distributed, and we no longer need tmac.h :100644 100644 41d3e948... 909e9193... M man/Makefile.in :100644 100644 6c59bbc8... 731c5976... M man/mh-mts.man :100644 000000 7b49b791... 00000000... D man/tmac.h.in :100644 100644 c8145a98... 73759911... M man/vmh.man commit e1b3eb2cfcc2823fb2bb429aa54d9d6c296fc16b Author: Shantonu Sen AuthorDate: Fri Jan 19 21:10:09 2001 +0000 Commit: Shantonu Sen CommitDate: Fri Jan 19 21:10:09 2001 +0000 show-whom :100644 100644 83c73519... cf3db806... M man/show.man :100644 100644 de7cade1... 77dd0543... M man/slocal.man :100644 100644 bb43993d... 64d66546... M man/sortm.man :100644 100644 3a1ce6e1... f7d7b37a... M man/whatnow.man :100644 100644 cdec69dd... 2ef3e1a7... M man/whom.man commit 1ef7aabbbb72c3e09dfc7db384ac81ab5ac53314 Author: Shantonu Sen AuthorDate: Thu Jan 18 20:27:34 2001 +0000 Commit: Shantonu Sen CommitDate: Thu Jan 18 20:27:34 2001 +0000 prompter-sendfiles :100644 100644 a6114053... 41d3e948... M man/Makefile.in :100644 100644 4fae53be... cfe068fc... M man/prompter.man :100644 100644 1429ee1b... 0b04b279... M man/rcvdist.man :100644 100644 1dc77316... 6716230f... M man/rcvpack.man :100644 100644 b0cf2526... 1d1f3e1b... M man/rcvstore.man :100644 100644 712f1e2b... fbdfa9b7... M man/rcvtty.man :100644 100644 9eb0da5d... 40cf94e9... M man/refile.man :100644 100644 20c149d8... 4320922b... M man/repl.man :100644 100644 9c282c43... 8a15be67... M man/rmf.man :100644 100644 967f9fb5... 21b3ea87... M man/rmm.man :100644 100644 1df9882d... de0a2801... M man/scan.man :100644 100644 33f5b3d8... 917e2718... M man/send.man :100644 100644 0837d2b9... 9b642e04... M man/sendfiles.man commit 5c28bc53d583129458f4dc9dd226171d311c982b Author: Shantonu Sen AuthorDate: Tue Jan 9 06:55:21 2001 +0000 Commit: Shantonu Sen CommitDate: Tue Jan 9 06:55:21 2001 +0000 delete old files, manpage progress :100644 100644 bd1a4fbf... 49817060... M ChangeLog commit b779fc0797de650993f5f8ec15c23ca9a7b3c9e2 Author: Shantonu Sen AuthorDate: Tue Jan 9 06:45:26 2001 +0000 Commit: Shantonu Sen CommitDate: Tue Jan 9 06:45:26 2001 +0000 removed deprecated files. sendmail functionality exists in mts/smtp/ :100644 000000 eb720d8a... 00000000... D mts/mmdf/Makefile.in :100644 000000 a6d3139a... 00000000... D mts/mmdf/hosts.c :100644 000000 b025b3b9... 00000000... D mts/sendmail/Makefile.in :100644 000000 40697ce9... 00000000... D mts/sendmail/hosts.c :100644 000000 00fe825f... 00000000... D mts/sendmail/sendmail.c commit 51d3c1179979615d85205399a392fcc3ef1c4384 Author: Shantonu Sen AuthorDate: Tue Jan 9 06:41:44 2001 +0000 Commit: Shantonu Sen CommitDate: Tue Jan 9 06:41:44 2001 +0000 Add an entry for README.manpages :100644 100644 768eb851... 661116d8... M docs/Makefile.in commit c0374b7556d4b53d2032eae55395311e307d3d16 Author: Shantonu Sen AuthorDate: Tue Jan 9 06:40:12 2001 +0000 Commit: Shantonu Sen CommitDate: Tue Jan 9 06:40:12 2001 +0000 Added popi.c to SRCS, even though it's not being built currently :100644 100644 8f936990... 905c33dc... M uip/Makefile.in commit 92b681fcfe932ee9bd313059ad8acee71baab6c1 Author: Shantonu Sen AuthorDate: Tue Jan 9 06:13:55 2001 +0000 Commit: Shantonu Sen CommitDate: Tue Jan 9 06:13:55 2001 +0000 removing mts/generic :100644 000000 97dca021... 00000000... D mts/generic/Makefile.in :100644 000000 00959590... 00000000... D mts/generic/client.c :100644 000000 7d9b718d... 00000000... D mts/generic/mts.c :100644 000000 ce063d98... 00000000... D mts/generic/mts.h commit 2d3eed4014c861333bef889406ef2511dab09271 Author: Shantonu Sen AuthorDate: Tue Jan 9 06:10:03 2001 +0000 Commit: Shantonu Sen CommitDate: Tue Jan 9 06:10:03 2001 +0000 deleting zotnet/ dir -- parts moved to sbr/ :100644 000000 0a75e149... 00000000... D zotnet/Makefile.in :100644 000000 80615a37... 00000000... D zotnet/bboards/Makefile.in :100644 000000 227bee5e... 00000000... D zotnet/bboards/bboards.h :100644 000000 c820d69f... 00000000... D zotnet/bboards/getbbent.c :100644 000000 01877141... 00000000... D zotnet/mf/Makefile.in :100644 000000 ab6dfa47... 00000000... D zotnet/mf/mf.c :100644 000000 a4c81e89... 00000000... D zotnet/mf/mf.h :100644 000000 a57b2f1f... 00000000... D zotnet/mts/Makefile.in :100644 000000 00959590... 00000000... D zotnet/mts/client.c :100644 000000 7d9b718d... 00000000... D zotnet/mts/mts.c :100644 000000 ce063d98... 00000000... D zotnet/mts/mts.h :100644 000000 b14f24ef... 00000000... D zotnet/tws/Makefile.in :100644 000000 adf153b6... 00000000... D zotnet/tws/dtime.c :100644 000000 9ad02fac... 00000000... D zotnet/tws/dtimep.c-lexed :100644 000000 ab2e4f51... 00000000... D zotnet/tws/dtimep.lex :100644 000000 601df0f7... 00000000... D zotnet/tws/lexedit.sed :100644 000000 91506e72... 00000000... D zotnet/tws/lexstring.c :100644 000000 29702db4... 00000000... D zotnet/tws/tws.h commit 278a48ef53b5dde10d7c88f67f51ce15ad11c0c0 Author: Shantonu Sen AuthorDate: Tue Jan 9 06:01:19 2001 +0000 Commit: Shantonu Sen CommitDate: Tue Jan 9 06:01:19 2001 +0000 mh_profile-prev :100644 100644 32e5141c... a6114053... M man/Makefile.in :100644 100644 54ace521... 4e732451... M man/inc.man :100644 100644 80f18b22... de2efad4... M man/mh-profile.man :100644 100644 e131c97f... 0f3bacc8... M man/mh-sequence.man :100644 100644 4304dc8d... e687ae8f... M man/mh-tailor.man :100644 100644 7024e488... 97e38ab0... M man/mhbuild.man :100644 100644 f6685793... 61585648... M man/mhl.man :100644 100644 9ee15dbc... 12d09fc2... M man/mhlist.man :100644 100644 9e324212... 51be22ac... M man/mhmail.man :100644 100644 569e8342... ac740807... M man/mhn.man :100644 100644 dcba16ec... debcb752... M man/mhparam.man :100644 100644 5f1a15f1... 26913c80... M man/mhpath.man :100644 100644 3f5bb943... 79a4899d... M man/mhshow.man :100644 100644 b7f8a5e2... 8c1e9294... M man/mhstore.man :100644 100644 4c8a53ab... 7c8bf719... M man/msgchk.man :100644 100644 d5da462b... 2f01f6d2... M man/msh.man :100644 100644 b90fcbe2... f1cf35bc... M man/next.man :100644 100644 ed848387... 03c4d8d3... M man/nmh.man :100644 100644 ef0c2e55... d61879e1... M man/packf.man :100644 100644 6195cf94... 1ef41561... M man/pick.man :100644 100644 ca406044... 311d2f38... M man/post.man :100644 100644 e58e5230... f5ddc47c... M man/prev.man commit 926ece166ba6ea4bd421c163917172b04b9e3bbb Author: Shantonu Sen AuthorDate: Sat Jan 6 23:38:12 2001 +0000 Commit: Shantonu Sen CommitDate: Sat Jan 6 23:38:12 2001 +0000 mh_tailor-mhbuild :100644 100644 f1d0f657... 4304dc8d... M man/mh-tailor.man :100644 100644 1d053d6d... 7024e488... M man/mhbuild.man commit 729ebed9d5058d51ed2552e3bc835613f9af5bff Author: Shantonu Sen AuthorDate: Thu Jan 4 07:07:41 2001 +0000 Commit: Shantonu Sen CommitDate: Thu Jan 4 07:07:41 2001 +0000 Updating mh_sequence :100644 100644 ddda36f9... e131c97f... M man/mh-sequence.man commit 189ffcab13f5be9753ecf8dce5724b800dc05f25 Author: Shantonu Sen AuthorDate: Wed Jan 3 06:29:06 2001 +0000 Commit: Shantonu Sen CommitDate: Wed Jan 3 06:29:06 2001 +0000 mh_mail-mh_profile :100644 100644 0b7a8e1d... 73f2e836... M man/mh-mail.man :100644 100644 605db8eb... 80f18b22... M man/mh-profile.man commit 41ba2b3868d43d8c0573a0d29d7a948dde275d85 Author: Shantonu Sen AuthorDate: Tue Jan 2 08:10:46 2001 +0000 Commit: Shantonu Sen CommitDate: Tue Jan 2 08:10:46 2001 +0000 mh-format :100644 100644 01491690... 869aba85... M man/mh-format.man commit 7a18091d83e5b6e8de4d068559b36d23bf641ee6 Author: Shantonu Sen AuthorDate: Tue Jan 2 07:12:46 2001 +0000 Commit: Shantonu Sen CommitDate: Tue Jan 2 07:12:46 2001 +0000 Modularizing the Makefile caused some variable expansion problems on non-GNU makes :100644 100644 24d63c28... 32e5141c... M man/Makefile.in commit ba82c49879c9fda961ad77ef1922dee09f4c5488 Author: Shantonu Sen AuthorDate: Tue Jan 2 06:43:07 2001 +0000 Commit: Shantonu Sen CommitDate: Tue Jan 2 06:43:07 2001 +0000 mh_chart-mh_draft :100644 100644 3049933b... 9815d878... M man/mh-chart.man :100644 100644 6dc31256... 7f866358... M man/mh-draft.man commit 55c80a0ae8453ef6c3e0fcd0fac30644945d0ef2 Author: Shantonu Sen AuthorDate: Mon Jan 1 10:19:00 2001 +0000 Commit: Shantonu Sen CommitDate: Mon Jan 1 10:19:00 2001 +0000 Updating ali-mh_alias :100644 100644 1d220342... 49a0a888... M man/ali.man :100644 100644 76b71e44... 50693623... M man/anno.man :100644 100644 dcbe70a9... 89581351... M man/ap.man :100644 100644 85370927... 4d0eb96a... M man/burst.man :100644 100644 610e93ba... ca11dfb5... M man/comp.man :100644 100644 3bb683ad... 2be7daba... M man/conflict.man :100644 100644 1e437123... 2e65aafb... M man/dist.man :100644 100644 ce237b05... 15522dea... M man/dp.man :100644 100644 b3449ac4... a263a6a4... M man/flist.man :100644 100644 d30098ec... 5a667855... M man/fmtdump.man :100644 100644 5444581d... 8fd456df... M man/folder.man :100644 100644 e0651b53... 8561d93b... M man/forw.man :100644 100644 a450a93f... 54ace521... M man/inc.man :100644 100644 72c62757... b3b37856... M man/install-mh.man :100644 100644 31e48052... 128e77d8... M man/mark.man :100644 100644 0ee7cd4b... aa3c3f19... M man/mh-alias.man commit ffdced195920ef2cdd17a914b91e50ba0f801b45 Author: Shantonu Sen AuthorDate: Sun Dec 31 20:58:29 2000 +0000 Commit: Shantonu Sen CommitDate: Sun Dec 31 20:58:29 2000 +0000 add about pointers to shared pages :100644 100644 84275e94... fa423def... M docs/README.manpages commit 2c1aaf8b1495d2c7368b47edb04e9a2b7628377b Author: Shantonu Sen AuthorDate: Sun Dec 31 20:55:48 2000 +0000 Commit: Shantonu Sen CommitDate: Sun Dec 31 20:55:48 2000 +0000 Add date to files i missed last time :100644 100644 c2b9ff66... 5444581d... M man/folder.man :100644 100644 c00f678e... 72c62757... M man/install-mh.man :100644 100644 451ea63b... 0ee7cd4b... M man/mh-alias.man :100644 100644 0b71fd7b... 6dc31256... M man/mh-draft.man :100644 100644 bc40c88d... 01491690... M man/mh-format.man :100644 100644 df39b13c... 0b7a8e1d... M man/mh-mail.man :100644 100644 1829ae6e... 6c59bbc8... M man/mh-mts.man :100644 100644 351a7492... 605db8eb... M man/mh-profile.man :100644 100644 7d2c72b4... ddda36f9... M man/mh-sequence.man :100644 100644 b9f2560c... f1d0f657... M man/mh-tailor.man :100644 100644 23841f78... ca406044... M man/post.man commit 816e299358e7b2d3106e39f7b47ed854049f5f44 Author: Shantonu Sen AuthorDate: Sun Dec 31 20:55:06 2000 +0000 Commit: Shantonu Sen CommitDate: Sun Dec 31 20:55:06 2000 +0000 docs/README.manpages :100644 100644 d4e7c08a... bd1a4fbf... M ChangeLog commit 5459cb05a6f5bba960e6501b9f03d7e16bc54f41 Author: Shantonu Sen AuthorDate: Sun Dec 31 20:48:50 2000 +0000 Commit: Shantonu Sen CommitDate: Sun Dec 31 20:48:50 2000 +0000 Add manpage style guide :000000 100644 00000000... 84275e94... A docs/README.manpages commit 9892129b33a8da3329f6331078a94a18ff8fe0e2 Author: Shantonu Sen AuthorDate: Sun Dec 31 09:25:09 2000 +0000 Commit: Shantonu Sen CommitDate: Sun Dec 31 09:25:09 2000 +0000 Updating inc :100644 100644 7a371cb8... a450a93f... M man/inc.man commit ce2545144845a393150638904a4a27e94f62659d Author: Shantonu Sen AuthorDate: Sun Dec 31 08:19:20 2000 +0000 Commit: Shantonu Sen CommitDate: Sun Dec 31 08:19:20 2000 +0000 Updating comp-forw :100644 100644 78c26ecf... 24d63c28... M man/Makefile.in :100644 100644 353a4d93... 610e93ba... M man/comp.man :100644 100644 4f33e4ad... b3449ac4... M man/flist.man :100644 100644 00463777... d30098ec... M man/fmtdump.man :100644 100644 3eab7658... c2b9ff66... M man/folder.man :100644 100644 166d0313... e0651b53... M man/forw.man commit c6261bee75b36da2a558d40e804057a56f0ecbc0 Author: Shantonu Sen AuthorDate: Sun Dec 31 06:31:42 2000 +0000 Commit: Shantonu Sen CommitDate: Sun Dec 31 06:31:42 2000 +0000 add flists and folders as pointer pages to flist,folder. Modularize Makefile to allow easier addition of manpages :100644 100644 bc9b7999... 78c26ecf... M man/Makefile.in :000000 100644 00000000... fbc6b9be... A man/flists.man :000000 100644 00000000... 7c3e32aa... A man/folders.man commit 98621fb8067d3d20aa9834432b0e469fe0e32420 Author: Shantonu Sen AuthorDate: Sun Dec 31 02:44:18 2000 +0000 Commit: Shantonu Sen CommitDate: Sun Dec 31 02:44:18 2000 +0000 replace %components% and %distcomps% in man pages with corresponding files :100644 100644 cc4e8321... bc9b7999... M man/Makefile.in commit b36e2ab7892cdf30a8b33d02e00af70398013b5d Author: Shantonu Sen AuthorDate: Sun Dec 31 02:43:34 2000 +0000 Commit: Shantonu Sen CommitDate: Sun Dec 31 02:43:34 2000 +0000 updated ali-flist, with batch edit of others :100644 100644 6107cd0a... 76b71e44... M man/anno.man :100644 100644 ec6808b7... dcbe70a9... M man/ap.man :100644 100644 9ebe01cb... 85370927... M man/burst.man :100644 100644 aebcb004... 353a4d93... M man/comp.man :100644 100644 01f7936f... 3bb683ad... M man/conflict.man :100644 100644 f0c16aa8... 1e437123... M man/dist.man :100644 100644 f3fe6bfa... ce237b05... M man/dp.man :100644 100644 177ad1d1... 4f33e4ad... M man/flist.man :100644 100644 33b918bd... 3eab7658... M man/folder.man :100644 100644 6dab969f... 166d0313... M man/forw.man :100644 100644 3b25931e... 7a371cb8... M man/inc.man :100644 100644 426ea293... 31e48052... M man/mark.man :100644 100644 9f95ee82... 3049933b... M man/mh-chart.man :100644 100644 497ff3dd... 1d053d6d... M man/mhbuild.man :100644 100644 b81415c5... f6685793... M man/mhl.man :100644 100644 1cd7d0ed... 9ee15dbc... M man/mhlist.man :100644 100644 5902b7c3... 9e324212... M man/mhmail.man :100644 100644 473f4ac7... 569e8342... M man/mhn.man :100644 100644 a4af2b58... dcba16ec... M man/mhparam.man :100644 100644 ff17b73f... 5f1a15f1... M man/mhpath.man :100644 100644 f4b42eaa... 3f5bb943... M man/mhshow.man :100644 100644 7148dc8c... b7f8a5e2... M man/mhstore.man :100644 100644 f1a10ee9... 4c8a53ab... M man/msgchk.man :100644 100644 88ae414c... d5da462b... M man/msh.man :100644 100644 1bc25453... b90fcbe2... M man/next.man :100644 100644 6b1dfc05... ed848387... M man/nmh.man :100644 100644 37bae2a9... ef0c2e55... M man/packf.man :100644 100644 a2a54c41... 6195cf94... M man/pick.man :100644 100644 5bb1619a... e58e5230... M man/prev.man :100644 100644 d8a2ef03... 4fae53be... M man/prompter.man :100644 100644 1a2cfe57... 1429ee1b... M man/rcvdist.man :100644 100644 ed95ad00... 1dc77316... M man/rcvpack.man :100644 100644 eeb164d4... b0cf2526... M man/rcvstore.man :100644 100644 a00d1b16... 712f1e2b... M man/rcvtty.man :100644 100644 778616ea... 9eb0da5d... M man/refile.man :100644 100644 2ffa7ac3... 20c149d8... M man/repl.man :100644 100644 de9cd8f7... 9c282c43... M man/rmf.man :100644 100644 87738537... 967f9fb5... M man/rmm.man :100644 100644 d4ad6a7c... 1df9882d... M man/scan.man :100644 100644 9bb28972... 33f5b3d8... M man/send.man :100644 100644 7d00a718... 0837d2b9... M man/sendfiles.man :100644 100644 a864048b... 83c73519... M man/show.man :100644 100644 1f3cb9c1... de7cade1... M man/slocal.man :100644 100644 eeaac1a5... bb43993d... M man/sortm.man :100644 100644 050cdf7f... c8145a98... M man/vmh.man :100644 100644 bd3c77f5... 3a1ce6e1... M man/whatnow.man :100644 100644 9caf26c3... cdec69dd... M man/whom.man commit f90104a1c52886ee18a4af23b67535530b59f920 Author: Shantonu Sen AuthorDate: Sat Dec 30 23:18:28 2000 +0000 Commit: Shantonu Sen CommitDate: Sat Dec 30 23:18:28 2000 +0000 update ali,anno,ap.burst :100644 100644 e0bd11a9... 1d220342... M man/ali.man :100644 100644 5cf58313... 6107cd0a... M man/anno.man :100644 100644 d4c24a9e... ec6808b7... M man/ap.man :100644 100644 6b41d66b... 9ebe01cb... M man/burst.man commit 869cc73c5455f13b7adf07575373b4e68c32ed48 Author: Shantonu Sen AuthorDate: Sat Dec 30 10:01:29 2000 +0000 Commit: Shantonu Sen CommitDate: Sat Dec 30 10:01:29 2000 +0000 Updated man pages to remove dependence on tmac.h and have a more modern look :100644 100644 c81c15d5... cc4e8321... M man/Makefile.in :100644 100644 7e0c1817... e0bd11a9... M man/ali.man commit 9db4e02f086c65f82f28260f6b3809d54a49ea72 Author: Shantonu Sen AuthorDate: Sat Dec 30 10:00:42 2000 +0000 Commit: Shantonu Sen CommitDate: Sat Dec 30 10:00:42 2000 +0000 DATE an manpage updating :100644 100644 b1d7e834... d4e7c08a... M ChangeLog commit 4c4e933cf4f3c7b74a5a17d7ac3caf1b06fccb85 Author: Shantonu Sen AuthorDate: Sat Dec 30 09:51:55 2000 +0000 Commit: Shantonu Sen CommitDate: Sat Dec 30 09:51:55 2000 +0000 Use the DATE file :100644 100644 32a5057c... 7cd91b04... M Makefile.in :100755 100755 2a5ff8c9... 8a40de6c... M configure :100644 100644 f769d865... 09a8f0d2... M configure.in :100644 100644 2e80e18c... 359d8b1a... M stamp-h.in commit 942b25bf618535880b78278283911c26b3a86c0a Author: Shantonu Sen AuthorDate: Sat Dec 30 09:50:13 2000 +0000 Commit: Shantonu Sen CommitDate: Sat Dec 30 09:50:13 2000 +0000 Created DATE that contains a datestamp used in the man pages. It should be updated each release. :000000 100644 00000000... 6d20d9c2... A DATE :100644 100644 44000710... 14cf138e... M docs/README.developers commit 6cebd8f635da356285799b484e9005f74e4b706b Author: Shantonu Sen AuthorDate: Sun Dec 24 10:13:45 2000 +0000 Commit: Shantonu Sen CommitDate: Sun Dec 24 10:13:45 2000 +0000 hesiod and krb5 test changes. add --with-locking to INSTALL :100644 100644 520c9102... b1d7e834... M ChangeLog commit 11ae9c4bf5fa500a77f428f1e0a26428f5c36849 Author: Shantonu Sen AuthorDate: Sun Dec 24 10:06:30 2000 +0000 Commit: Shantonu Sen CommitDate: Sun Dec 24 10:06:30 2000 +0000 Add documentation for --with-locking option :100644 100644 1147641c... c040874a... M INSTALL commit b5dae53293e6752ee659b57e1e3f34a813022c5c Author: Shantonu Sen AuthorDate: Sun Dec 24 10:06:00 2000 +0000 Commit: Shantonu Sen CommitDate: Sun Dec 24 10:06:00 2000 +0000 hesiod and krb5 test fixes :100644 100644 bb2fbaf4... 85f9f96e... M config.h.in :100755 100755 686ca52d... 2a5ff8c9... M configure :100644 100644 b283d92a... 2e80e18c... M stamp-h.in commit 2e691051f6a09db9a33e8be13c901b4f44f3fd1e Author: Shantonu Sen AuthorDate: Sun Dec 24 10:04:58 2000 +0000 Commit: Shantonu Sen CommitDate: Sun Dec 24 10:04:58 2000 +0000 Fixed up the hesiod library test so that the location of res_send actually helps to determine whether -lresolv needs to be passed as a hesiod lib. Also, fixed the krb5 test to look for -lk5crypto if it exists, since that's the new name for -lcrypto. The old -lcrypto remains in case the new version isn't found. :100644 100644 c4b8cd89... f769d865... M configure.in commit 5fd902c1cb309c93e174241e84bd0346f0adadb0 Author: Dan Harkless AuthorDate: Sat Dec 23 06:11:03 2000 +0000 Commit: Dan Harkless CommitDate: Sat Dec 23 06:11:03 2000 +0000 -apop and -noapop were not documented in msgchk.man. -snoop was documented but didn't appear in the usage SYNOPSIS. :100644 100644 b9ed7d38... 520c9102... M ChangeLog :100644 100644 2f1fed5b... f1a10ee9... M man/msgchk.man commit e197e92c81fa482d05bd444f16e89a814d9671e1 Author: Shantonu Sen AuthorDate: Fri Dec 22 23:49:08 2000 +0000 Commit: Shantonu Sen CommitDate: Fri Dec 22 23:49:08 2000 +0000 add --with-locking option :100644 100644 3c3ea4a7... b9ed7d38... M ChangeLog commit 2ccd02143402aab6732ad1d2b84513949ddd7cb2 Author: Shantonu Sen AuthorDate: Fri Dec 22 23:42:16 2000 +0000 Commit: Shantonu Sen CommitDate: Fri Dec 22 23:42:16 2000 +0000 Autoconfing the file locking options :100644 100644 51ac68f2... 10866bf2... M acconfig.h :100644 100644 00f7c37a... bb2fbaf4... M config.h.in :100755 100755 21d5d89a... 686ca52d... M configure :100644 100644 4149de9d... c4b8cd89... M configure.in :100644 100644 2ab5ac0c... b283d92a... M stamp-h.in commit 4c26b43456abeb42ebe38fb5bc2282849a1338b8 Author: Shantonu Sen AuthorDate: Fri Dec 22 19:30:41 2000 +0000 Commit: Shantonu Sen CommitDate: Fri Dec 22 19:30:41 2000 +0000 put both linux entries on one line :100644 100644 06a1cd6a... c38c1a40... M MACHINES commit 459f09a7ac78cdf5b21773cf659cd0de6a76f44f Author: Shantonu Sen AuthorDate: Fri Dec 22 19:29:40 2000 +0000 Commit: Shantonu Sen CommitDate: Fri Dec 22 19:29:40 2000 +0000 dtimep, MACHINES :100644 100644 4fcbc07d... 3c3ea4a7... M ChangeLog commit 7793fde2bb56c76aa8d1fd819d6c60f720e6c44e Author: Shantonu Sen AuthorDate: Fri Dec 22 19:21:29 2000 +0000 Commit: Shantonu Sen CommitDate: Fri Dec 22 19:21:29 2000 +0000 Update to include Mac OS X and Linux 2.4 :100644 100644 5552b695... 06a1cd6a... M MACHINES commit 937a1d5deef2727cdf22ef3afda61fe766d234df Author: Shantonu Sen AuthorDate: Fri Dec 22 19:18:09 2000 +0000 Commit: Shantonu Sen CommitDate: Fri Dec 22 19:18:09 2000 +0000 When building on Mac OS X, don't set LDFLAGS=-s, since the linker doesn't like the flag :100755 100755 b74bba2d... 21d5d89a... M configure :100644 100644 8c43c763... 4149de9d... M configure.in :100644 100644 495aa404... 2ab5ac0c... M stamp-h.in commit 3995a01bfe4a35251a62c69ff118b436b311594d Author: Shantonu Sen AuthorDate: Fri Dec 22 19:15:02 2000 +0000 Commit: Shantonu Sen CommitDate: Fri Dec 22 19:15:02 2000 +0000 Take out memory hints, since we are assuming flex over lex, so this shouldn't be a problem :100644 100644 7b974318... e5dc8120... M sbr/dtimep.c :100644 100644 3a378257... 8e782452... M sbr/dtimep.lex commit 046d0584e019a627cb039eb86aa5be353ee75ea5 Author: Shantonu Sen AuthorDate: Wed Dec 20 16:03:36 2000 +0000 Commit: Shantonu Sen CommitDate: Wed Dec 20 16:03:36 2000 +0000 doc/README.developers update, and fixed typo in last ChangeLog entry :100644 100644 245c7842... 4fcbc07d... M ChangeLog commit 7379ff1546ba2feaabe8b6463f448ea0bafd69bb Author: Shantonu Sen AuthorDate: Wed Dec 20 16:00:46 2000 +0000 Commit: Shantonu Sen CommitDate: Wed Dec 20 16:00:46 2000 +0000 Marked deprecated directories in layout description, and added an entry for docs :100644 100644 74c3c075... 44000710... M docs/README.developers commit 22a08fd1babf7a0a5602684ea0c6c2485e15f6d9 Author: Dan Harkless AuthorDate: Wed Dec 20 03:30:14 2000 +0000 Commit: Dan Harkless CommitDate: Wed Dec 20 03:30:14 2000 +0000 Just changed a "can" to a "could" since I don't know if most POP3 servers are like qpopper in not allowing people with APOP activated to log in via normal POP3. :100644 100644 fe627ce5... 3b25931e... M man/inc.man commit 60dc51be518caa9fd1b09578e39c106045dfaaf2 Author: Dan Harkless AuthorDate: Wed Dec 20 03:18:33 2000 +0000 Commit: Dan Harkless CommitDate: Wed Dec 20 03:18:33 2000 +0000 -apop and -noapop were not documented in inc.man. -snoop was documented but didn't appear in the usage SYNOPSIS. :100644 100644 b00c1c79... 245c7842... M ChangeLog :100644 100644 4a06a7f6... fe627ce5... M man/inc.man commit 2ae2b2b449d5d8fc868e27d7b2ad920b99311ad7 Author: Shantonu Sen AuthorDate: Sun Dec 17 19:52:04 2000 +0000 Commit: Shantonu Sen CommitDate: Sun Dec 17 19:52:04 2000 +0000 Fixed a type from 'his' to 'this' :100644 100644 b54bc3f1... 1f3cb9c1... M man/slocal.man commit a4153c9c95d64260437a3383e9b97802d24f609e Author: Shantonu Sen AuthorDate: Thu Dec 14 14:55:17 2000 +0000 Commit: Shantonu Sen CommitDate: Thu Dec 14 14:55:17 2000 +0000 config.guess/sub update :100644 100644 14ef7894... b00c1c79... M ChangeLog commit 63057b6dbecabb2952103ceec796419feacf68a6 Author: Shantonu Sen AuthorDate: Thu Dec 14 14:35:40 2000 +0000 Commit: Shantonu Sen CommitDate: Thu Dec 14 14:35:40 2000 +0000 config update procedure (probably unneccessary) :100755 100755 cce08286... b74bba2d... M configure :100644 100644 511d101b... 495aa404... M stamp-h.in commit ed5dcd73bb7460266346d5ad3533d8d7ec9073bd Author: Shantonu Sen AuthorDate: Thu Dec 14 14:32:09 2000 +0000 Commit: Shantonu Sen CommitDate: Thu Dec 14 14:32:09 2000 +0000 Updated config.guess and config.sub from most recent version from ftp.gnu.org/pub/gnu/config, with timestamp='2000-12-07'. :100755 100755 4ad9e040... 69b1ab94... M config.guess :100755 100755 f307800d... d6c68210... M config.sub commit 9efff96e4e788fcc168f712390b505ffc0e66b45 Author: Dan Harkless AuthorDate: Thu Dec 14 03:14:08 2000 +0000 Commit: Dan Harkless CommitDate: Thu Dec 14 03:14:08 2000 +0000 Shantonu did his commit in the wrong order earlier today, making configure get re-built due to a "newer" configure.in. :100755 100755 b74bba2d... cce08286... M configure commit 11c91f3814210b05c7e99c44cb4b726dd98c3b2d Author: Shantonu Sen AuthorDate: Thu Dec 14 01:38:41 2000 +0000 Commit: Shantonu Sen CommitDate: Thu Dec 14 01:38:41 2000 +0000 Move mts/generic to sbr/ :100644 100644 089dfc7d... 14ef7894... M ChangeLog commit dee387b53ab0d42922f857b60d6f980c9e79d16f Author: Shantonu Sen AuthorDate: Thu Dec 14 01:30:43 2000 +0000 Commit: Shantonu Sen CommitDate: Thu Dec 14 01:30:43 2000 +0000 Resolve the circular dependency of libmh on libmts on libmh. The files mts/generic/client.c and mts.c are moved to sbr/, and mts/generic/mts.h is moved to h/mts.h. Thus, libmh is self-contained. All header includes have been appropriately updated, and the Makefiles and configure script no longer build mts/generic. :100755 100755 757e8d14... b74bba2d... M configure :100644 100644 2958b792... 8c43c763... M configure.in :100644 100644 6a5844f3... 6cf88b62... M h/Makefile.in :000000 100644 00000000... ce063d98... A h/mts.h :100644 100644 08b4754c... c72f3508... M mts/Makefile.in :100644 100644 40697ce9... 4b3d6069... M mts/smtp/hosts.c :100644 100644 e5966806... 6de440f7... M mts/smtp/smtp.c :100644 100644 7ca55540... 882094e6... M sbr/Makefile.in :000000 100644 00000000... eb2ffd51... A sbr/client.c :100644 100644 f62d0e80... 8a18e783... M sbr/m_getfld.c :000000 100644 00000000... 551fd1fe... A sbr/mts.c :100644 100644 ef8e1b45... 511d101b... M stamp-h.in :100644 100644 67e7aee5... 7cffc504... M uip/ali.c :100644 100644 5184bafc... 843ece4e... M uip/ap.c :100644 100644 c0ba63ba... dde06021... M uip/conflict.c :100644 100644 3c5fdd5b... 45d5c286... M uip/dropsbr.c :100644 100644 3ea3b9ef... 7475d5e1... M uip/inc.c :100644 100644 63204a50... 08227885... M uip/mhbuild.c :100644 100644 4a6a9869... ed330e3e... M uip/mhbuildsbr.c :100644 100644 0be30c05... 712ec042... M uip/mhcachesbr.c :100644 100644 57b18b25... 856bfc52... M uip/mhlist.c :100644 100644 42e0b05a... 2a91eac6... M uip/mhlistsbr.c :100644 100644 11c02767... 601ce5f5... M uip/mhn.c :100644 100644 f292ddc8... 5ed9b979... M uip/mhoutsbr.c :100644 100644 8f4d574e... 2511f855... M uip/mhparse.c :100644 100644 74a8f54b... abb399c9... M uip/mhshow.c :100644 100644 83616a26... 48999391... M uip/mhshowsbr.c :100644 100644 b56a5052... 2de12bc2... M uip/mhstore.c :100644 100644 f1b01627... 9f840dd9... M uip/mhstoresbr.c :100644 100644 90f73373... f10216f6... M uip/mhtest.c :100644 100644 9489ef0d... 3616ea8e... M uip/msgchk.c :100644 100644 0db7905c... 2eda3b23... M uip/msh.c :100644 100644 b8c7d925... d2d0ad77... M uip/mshcmds.c :100644 100644 2fae3816... 1dc74a3b... M uip/popi.c :100644 100644 d91e0038... 37db5f96... M uip/post.c :100644 100644 9eb9916e... 867104ad... M uip/rcvdist.c :100644 100644 a7601776... 1e85f803... M uip/rcvpack.c :100644 100644 8734ebc2... 726ff9ed... M uip/rcvstore.c :100644 100644 32d78d2f... cf54134f... M uip/rcvtty.c :100644 100644 d85d80e0... 56980e95... M uip/scan.c :100644 100644 8a3f5f7c... ce806dc6... M uip/slocal.c :100644 100644 18d1152e... 78c300c6... M uip/spost.c :100644 100644 2168f717... 9f79a2e1... M uip/viamail.c commit ef25ef28586541f0804dc6aa53a8519cf762ba6d Author: Dan Harkless AuthorDate: Tue Dec 12 06:19:25 2000 +0000 Commit: Dan Harkless CommitDate: Tue Dec 12 06:19:25 2000 +0000 When Shantonu made the new libmts.a, he swapped $(MTSLIB) and libmh.a in sbr/Makefile.in so that libmh.a comes first, but this causes the build to fail on Solaris, because libmts.a has to get ruserpass() out of libmh.a. Swapping them back to the way Ken Hornstein's patch (which I applied on Jul 20) put them, with libmh.a correctly coming second. If there are times when libmts.a needs to come second, then it would appear there's a circular dependency and someone (Shantonu?) did an mts merge incorrectly. :100644 100644 afb9c1d4... 089dfc7d... M ChangeLog :100644 100644 972caf94... 8f936990... M uip/Makefile.in commit 6682cb68fdaca9359f746912c594e1cc307597a9 Author: Dan Harkless AuthorDate: Fri Sep 8 23:19:37 2000 +0000 Commit: Dan Harkless CommitDate: Fri Sep 8 23:19:37 2000 +0000 Just fixed a formatting error. :100644 100644 c3dd1403... afb9c1d4... M ChangeLog commit a771f8520dbb5d5b16986ed463b1b74601f83dad Author: Shantonu Sen AuthorDate: Fri Sep 8 01:39:10 2000 +0000 Commit: Shantonu Sen CommitDate: Fri Sep 8 01:39:10 2000 +0000 Took out bad zones in dtimep :100644 100644 580cf4c3... c3dd1403... M ChangeLog commit 5b26f4fcdfeb7153b92c18f1478a0626341c609d Author: Shantonu Sen AuthorDate: Fri Sep 8 01:36:23 2000 +0000 Commit: Shantonu Sen CommitDate: Fri Sep 8 01:36:23 2000 +0000 Took out incorrect time zones like JST and BST. :100644 100644 69a0c741... 7b974318... M sbr/dtimep.c :100644 100644 0a65672f... 3a378257... M sbr/dtimep.lex commit cd5e92564c2b2c1d4c247b97ca27b016afb22976 Author: Shantonu Sen AuthorDate: Fri Sep 8 00:49:32 2000 +0000 Commit: Shantonu Sen CommitDate: Fri Sep 8 00:49:32 2000 +0000 Included code reorg of zotnet/mts :100644 100644 824f2a79... 580cf4c3... M ChangeLog commit 3a5923368d844e62f27bd078bf1986e7f548476f Author: Shantonu Sen AuthorDate: Fri Sep 8 00:37:54 2000 +0000 Commit: Shantonu Sen CommitDate: Fri Sep 8 00:37:54 2000 +0000 Don't make Makefiles in zotnet or mts/mmdf or mts/sendmail :100755 100755 bbdb686e... 757e8d14... M configure :100644 100644 f94fc6df... ef8e1b45... M stamp-h.in commit 0f9c227e69da12f00f09fbbb0b84c2726b5c256b Author: Shantonu Sen AuthorDate: Fri Sep 8 00:36:48 2000 +0000 Commit: Shantonu Sen CommitDate: Fri Sep 8 00:36:48 2000 +0000 Don't generate Makefiles for zotnet, or mts/mmdf and mts/sendmail, since they are no longer being compiled. :100644 100644 196fdc98... 2958b792... M configure.in commit cc6d2b40ffd2126cff8384d2c62eee44dc7b1fe1 Author: Shantonu Sen AuthorDate: Fri Sep 8 00:34:41 2000 +0000 Commit: Shantonu Sen CommitDate: Fri Sep 8 00:34:41 2000 +0000 Included h/nmh.h, since the MD5 algorithms were missing declarations for memcpy and memset (I think), which are indirectly included from strings.h :100644 100644 9a394b50... 6ca63993... M h/md5.h commit 8f4c5da8971926f7eccc912f7998c343aef3c33b Author: Shantonu Sen AuthorDate: Fri Sep 8 00:34:08 2000 +0000 Commit: Shantonu Sen CommitDate: Fri Sep 8 00:34:08 2000 +0000 Updated #include's to point to new location of mts.h on mts/generic :100644 100644 a1cdf8c3... 545d3972... M sbr/addrsbr.c :100644 100644 a667be82... f62d0e80... M sbr/m_getfld.c :100644 100644 ff9fa563... 972caf94... M uip/Makefile.in :100644 100644 5b38b831... 67e7aee5... M uip/ali.c :100644 100644 dde11759... 5184bafc... M uip/ap.c :100644 100644 cac0ea85... c0ba63ba... M uip/conflict.c :100644 100644 5cf4ee32... 3c5fdd5b... M uip/dropsbr.c :100644 100644 e6adb32f... 3ea3b9ef... M uip/inc.c :100644 100644 045146b0... 63204a50... M uip/mhbuild.c :100644 100644 227f111f... 4a6a9869... M uip/mhbuildsbr.c :100644 100644 4f1f9d7a... 0be30c05... M uip/mhcachesbr.c :100644 100644 3960b1cb... 57b18b25... M uip/mhlist.c :100644 100644 ae5463c8... 42e0b05a... M uip/mhlistsbr.c :100644 100644 adb06dae... 11c02767... M uip/mhn.c :100644 100644 c2e08056... f292ddc8... M uip/mhoutsbr.c :100644 100644 0813aa75... 8f4d574e... M uip/mhparse.c :100644 100644 a50292e9... 74a8f54b... M uip/mhshow.c :100644 100644 eb691001... 83616a26... M uip/mhshowsbr.c :100644 100644 14d7cde9... b56a5052... M uip/mhstore.c :100644 100644 b2a3e31b... f1b01627... M uip/mhstoresbr.c :100644 100644 9a73bbfa... 90f73373... M uip/mhtest.c :100644 100644 52aedc86... 9489ef0d... M uip/msgchk.c :100644 100644 6bb6f06d... 0db7905c... M uip/msh.c :100644 100644 c199502d... b8c7d925... M uip/mshcmds.c :100644 100644 cb249302... 2fae3816... M uip/popi.c :100644 100644 ef13279b... d91e0038... M uip/post.c :100644 100644 1c70d740... 9eb9916e... M uip/rcvdist.c :100644 100644 f120afda... a7601776... M uip/rcvpack.c :100644 100644 bef959ca... 8734ebc2... M uip/rcvstore.c :100644 100644 d769b40a... 32d78d2f... M uip/rcvtty.c :100644 100644 77bc999c... d85d80e0... M uip/scan.c :100644 100644 d50330d5... 8a3f5f7c... M uip/slocal.c :100644 100644 555bb68d... 18d1152e... M uip/spost.c :100644 100644 8e3332d0... 2168f717... M uip/viamail.c commit 97e7d6f2f5db4e8f09cb015ee6c2da2ff129f963 Author: Shantonu Sen AuthorDate: Fri Sep 8 00:32:47 2000 +0000 Commit: Shantonu Sen CommitDate: Fri Sep 8 00:32:47 2000 +0000 No longer descend into zotnet/ :100644 100644 b331c5da... 32a5057c... M Makefile.in commit 75e073ea52a427394690e0c1ef7943a1727c7095 Author: Shantonu Sen AuthorDate: Fri Sep 8 00:30:58 2000 +0000 Commit: Shantonu Sen CommitDate: Fri Sep 8 00:30:58 2000 +0000 Moved code from zotnet/mts to mts/generic. Also, unified generic mts code and smtp/sendmail into libmts.a as an intermediate, instead of having two static libs. :100644 100644 a8c5ee58... 08b4754c... M mts/Makefile.in :000000 100644 00000000... 97dca021... A mts/generic/Makefile.in :000000 100644 00000000... 00959590... A mts/generic/client.c :000000 100644 00000000... 7d9b718d... A mts/generic/mts.c :000000 100644 00000000... ce063d98... A mts/generic/mts.h :100644 100644 748d8d6e... a6d3139a... M mts/mmdf/hosts.c :100644 100644 83727d54... 40697ce9... M mts/sendmail/hosts.c :100644 100644 9a9c725f... 00fe825f... M mts/sendmail/sendmail.c :100644 100644 4a726b96... 341f0b1d... M mts/smtp/Makefile.in :100644 100644 83727d54... 40697ce9... M mts/smtp/hosts.c :100644 100644 f2390b83... e5966806... M mts/smtp/smtp.c commit e2d7f42498f9cb8cb4b0f4ddd7fcd395829157f2 Author: Shantonu Sen AuthorDate: Wed Sep 6 22:48:43 2000 +0000 Commit: Shantonu Sen CommitDate: Wed Sep 6 22:48:43 2000 +0000 Included changes to dtimep.lex to remove military zone parsing. :100644 100644 2ba743ee... 824f2a79... M ChangeLog commit 62f8542a68c21c0ec009e9275cbe54f0c921f2ea Author: Shantonu Sen AuthorDate: Wed Sep 6 22:40:03 2000 +0000 Commit: Shantonu Sen CommitDate: Wed Sep 6 22:40:03 2000 +0000 Took out parsing of military time, which was causing issues when it encountered something like (MET), which it doesn't recognize as a timezone, and which was then read as military characters. :100644 100644 68616b84... 69a0c741... M sbr/dtimep.c :100644 100644 c36844da... 0a65672f... M sbr/dtimep.lex commit a5ff28a9c0927f27efd1378ebc97ad72ffeb56d1 Author: Dan Harkless AuthorDate: Fri Aug 11 20:43:07 2000 +0000 Commit: Dan Harkless CommitDate: Fri Aug 11 20:43:07 2000 +0000 Further clarified Kimmo's etc/Makefile.in comments at his suggestion. :100644 100644 a8a566ba... 2ba743ee... M ChangeLog commit 93b9385f594f86b215fb786953b792473234b59d Author: Dan Harkless AuthorDate: Thu Aug 10 21:32:33 2000 +0000 Commit: Dan Harkless CommitDate: Thu Aug 10 21:32:33 2000 +0000 Changed my mind again on scan.MMDDYY and scan.YYYYMMDD. Put the replied / encrypted column back in, because it's useful to "always" (at least when you aren't using replied / encrypted) have a space in between the message number and date, so you can use awk (with the default field separators) to grab message numbers from scan output. :100644 100644 f475a012... a8a566ba... M ChangeLog :100644 100644 0f1fff26... dd20b290... M etc/scan.MMDDYY :100644 100644 f8bee9ff... 741681de... M etc/scan.YYYYMMDD commit 7394d9e002c22cb0ac9722fe51b877a7462efb3c Author: Dan Harkless AuthorDate: Thu Aug 10 20:33:25 2000 +0000 Commit: Dan Harkless CommitDate: Thu Aug 10 20:33:25 2000 +0000 Decided that limiting the message number columns to 3 on my scan.MMDDYY and scan.YYYYMMDD (to try to regain space taken by extra date info) was ill-conceived. It's not that tough to get past 999 messages, though I imagine it's rather rare to exceed 9999. Changed these to 4. I had already removed the "replied / encrypted" column in YYYYMMDD, but this time I removed it on MMDDYY as well (I've never seen it used...). :100644 100644 5e26bb10... f475a012... M ChangeLog :100644 100644 d79ad3c3... 0f1fff26... M etc/scan.MMDDYY :100644 100644 626ab742... f8bee9ff... M etc/scan.YYYYMMDD commit 0f540a390a62d9732f61fdb21f82048093a3d63d Author: Ruud de Rooij AuthorDate: Mon Aug 7 18:42:20 2000 +0000 Commit: Ruud de Rooij CommitDate: Mon Aug 7 18:42:20 2000 +0000 Modify umask set by mhshow to enable user execute bit, so that viewers that create temporary directories (e.g., lynx) will be able to access them. :100644 100644 f6b89bdf... 5e26bb10... M ChangeLog :100755 100755 64d0324f... bbdb686e... M configure :100644 100644 d8733953... eb691001... M uip/mhshowsbr.c commit 5e5e3a5b7bfe9b89b8f27712f9e0ec13ba384de7 Author: Dan Harkless AuthorDate: Sat Aug 5 16:00:49 2000 +0000 Commit: Dan Harkless CommitDate: Sat Aug 5 16:00:49 2000 +0000 Kimmo's etc/Makefile.in change note implied that install was previously completely broken. Not the case. I asked Kimmo about it and he clarified that it failed when building outside the source tree. Fixed the entry to reflect. :100644 100644 36866afc... f6b89bdf... M ChangeLog commit bff308e43d7bf5fc175fa0aa41a064f051506e28 Author: Dan Harkless AuthorDate: Fri Aug 4 00:15:52 2000 +0000 Commit: Dan Harkless CommitDate: Fri Aug 4 00:15:52 2000 +0000 TODO: Allow multiple simultaneous differing contexts, probably each tied to a parent (terminal) process. :100644 100644 1adac4e2... 36866afc... M ChangeLog :100644 100644 be9e6dd9... 7b5beee5... M docs/TODO commit 20e97363e4c0e84b3744f3642e7d350fa8916e32 Author: Kimmo Suominen AuthorDate: Tue Aug 1 14:55:53 2000 +0000 Commit: Kimmo Suominen CommitDate: Tue Aug 1 14:55:53 2000 +0000 Make "make install" work in etc/Makefile.in :100644 100644 2fd18542... 1adac4e2... M ChangeLog :100644 100644 1801d686... d50fcf78... M etc/Makefile.in commit da12435096e47ec1d362215141fc8b21f24e5e01 Author: Dan Harkless AuthorDate: Mon Jul 24 23:24:22 2000 +0000 Commit: Dan Harkless CommitDate: Mon Jul 24 23:24:22 2000 +0000 Renamed DSTXXX as ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST and added an explanatory comment by its #definition. :100644 100644 7789d871... 2fd18542... M ChangeLog :100644 100644 83ec8806... 47a31b9e... M h/tws.h :100644 100644 8de4b69c... 57b61c88... M sbr/dtime.c :100644 100644 159c901b... 68616b84... M sbr/dtimep.c :100644 100644 b4357a1e... c36844da... M sbr/dtimep.lex commit 0d6e062b466d0ef7c84b56258612cd87044917f6 Author: Dan Harkless AuthorDate: Mon Jul 24 23:06:42 2000 +0000 Commit: Dan Harkless CommitDate: Mon Jul 24 23:06:42 2000 +0000 Updated README.developers with the fact that zotnet/tws is going away. :100644 100644 a7ab1c03... 7789d871... M ChangeLog :100644 100644 9edd701e... 74c3c075... M docs/README.developers commit 11ce969d33d8d6ffafd010005af0b7188f0f5693 Author: Dan Harkless AuthorDate: Mon Jul 24 23:03:38 2000 +0000 Commit: Dan Harkless CommitDate: Mon Jul 24 23:03:38 2000 +0000 When Shantonu wrote the new, more portable dtimep.lex, he left out the #ifdef DSTXXX stuff for some reason. Not a good idea, as that code is required for proper printing of numeric-offset timezones that have daylight saving time. Without that code, -0700 during DST gets printed as MST instead of PDT. :100644 100644 98ec5687... a7ab1c03... M ChangeLog :100644 100644 b6a3fde4... 159c901b... M sbr/dtimep.c :100644 100644 2e79c46c... b4357a1e... M sbr/dtimep.lex commit f88898638f4f0f8f6d77b1235b704982d295b832 Author: Dan Harkless AuthorDate: Fri Jul 21 03:31:39 2000 +0000 Commit: Dan Harkless CommitDate: Fri Jul 21 03:31:39 2000 +0000 Fixed warnings from diff on first-time install of nmh. Also added 'echo's clarifying the etc file installation activities. :100644 100644 971101e4... 98ec5687... M ChangeLog :100644 100644 c2645cbe... 1801d686... M etc/Makefile.in commit 7d5df1b80b43bfe60de33b0b62c992eea1d8d531 Author: Dan Harkless AuthorDate: Fri Jul 21 02:35:43 2000 +0000 Commit: Dan Harkless CommitDate: Fri Jul 21 02:35:43 2000 +0000 Applied Kurt J. Lidl 's $MAILHOST patch: I have a small patch that would be nice to be included -- basically, it allows the usage of the "MAILHOST" environment variable, without having to have HESIOD turned on. I need this functionality for my environment, where we have identical /usr/local on all my machines (so I cannot just hardcode into the mts.conf file), and I have multiple POP mail servers for my users. Modified inc.man to reflect that along with "pophost:" and -host, $MAILHOST can now activate POP mail inclusion as well. :100644 100644 2e741c7c... 971101e4... M ChangeLog :100644 100644 fc53359d... 4a06a7f6... M man/inc.man :100644 100644 9c8049ab... e6adb32f... M uip/inc.c commit 7a39c12041b050791790cfbe33686377a98ff59e Author: Dan Harkless AuthorDate: Fri Jul 21 02:25:59 2000 +0000 Commit: Dan Harkless CommitDate: Fri Jul 21 02:25:59 2000 +0000 Last pass at README.developers -- Kimmo's 5-step commit was overkill. You only need 3 steps, since configure.in is the only autoconf file with the RCS $Id keyword. :100644 100644 9850614e... 2e741c7c... M ChangeLog :100644 100644 522244a1... 9edd701e... M docs/README.developers commit ea7b16ea79c5f06a3b220a0f02fe55ae566b9e82 Author: Dan Harkless AuthorDate: Fri Jul 21 02:11:59 2000 +0000 Commit: Dan Harkless CommitDate: Fri Jul 21 02:11:59 2000 +0000 Meaningless modification to test autoconf file commit order stuff. :100755 100755 6715aac6... 64d0324f... M configure :100644 100644 53105afe... 196fdc98... M configure.in :100644 100644 287375a4... f94fc6df... M stamp-h.in commit da571d9ecb8b8eeaa430b4e4d132bcdd4d1b0076 Author: Dan Harkless AuthorDate: Fri Jul 21 02:04:37 2000 +0000 Commit: Dan Harkless CommitDate: Fri Jul 21 02:04:37 2000 +0000 Meaningless change to test autoconf file commit order stuff. :100755 100755 c8ebc1c5... 6715aac6... M configure :100644 100644 300d02b0... 287375a4... M stamp-h.in commit e7f01acdf3b43d7e5df6398b0652c3be38b5f68f Author: Dan Harkless AuthorDate: Fri Jul 21 02:03:23 2000 +0000 Commit: Dan Harkless CommitDate: Fri Jul 21 02:03:23 2000 +0000 Meaningless change for testing autoconf file commit order stuff. :100644 100644 9d0bc248... 53105afe... M configure.in commit 011e533b32afd25a33ff44b02530dc50214925e0 Author: Dan Harkless AuthorDate: Fri Jul 21 01:56:17 2000 +0000 Commit: Dan Harkless CommitDate: Fri Jul 21 01:56:17 2000 +0000 Meaningless change to test autoconf commit order stuff. :100644 100644 9b76ddfd... 9d0bc248... M configure.in commit 1a6d560c7caf83a0419cd0f5c7337db2c672da0a Author: Dan Harkless AuthorDate: Fri Jul 21 01:43:58 2000 +0000 Commit: Dan Harkless CommitDate: Fri Jul 21 01:43:58 2000 +0000 People did not preserve my alphabetization of the --with options when they added new ones. Re-alphabetized. :100644 100644 ead1a4a5... 9850614e... M ChangeLog :100755 100755 4eb59512... c8ebc1c5... M configure :100644 100644 76e920f2... 9b76ddfd... M configure.in :100644 100644 93863e87... 300d02b0... M stamp-h.in commit fc80e34e8e9e3c726073d321e2075ead77baba08 Author: Dan Harkless AuthorDate: Thu Jul 20 20:49:00 2000 +0000 Commit: Dan Harkless CommitDate: Thu Jul 20 20:49:00 2000 +0000 Ken Hornstein's SASL patch was not integrated properly with Ruud's new merged mts/sendmail code. Kimmo has since fixed nmh so it compiles, but according to Ken, the SASL stuff still does not work. Integrating a patch from him for this. :100644 100644 d0485a66... ead1a4a5... M ChangeLog :100644 100644 a37ebea3... f2390b83... M mts/smtp/smtp.c :100644 100644 ca6b5bc4... ff9fa563... M uip/Makefile.in commit c0f27fe2e6f1e553818f6a43aad0e30cec7994b7 Author: Dan Harkless AuthorDate: Thu Jul 20 20:32:31 2000 +0000 Commit: Dan Harkless CommitDate: Thu Jul 20 20:32:31 2000 +0000 One more pass at README.developers now that it's clear that my previously-suggested one-line autoconf-file commit can cause unnecessary local makes and an out-of-sync stamp-h.in file, but would not cause problems for other people using the CVS files. :100644 100644 f4e32df5... d0485a66... M ChangeLog :100644 100644 0fe63112... 522244a1... M docs/README.developers commit c4dffde1321c04eddde696b28c05c4c68d85a617 Author: Dan Harkless AuthorDate: Thu Jul 20 20:14:39 2000 +0000 Commit: Dan Harkless CommitDate: Thu Jul 20 20:14:39 2000 +0000 Moved Kimmo's new "--with-hash-backup" to be output with the rest of the --with options in the configure --help output, rather than being in between two random --enable options. :100644 100644 efc679d0... f4e32df5... M ChangeLog :100755 100755 520d155d... 4eb59512... M configure :100644 100644 d80a2d2e... 76e920f2... M configure.in :100644 100644 281f6ef3... 93863e87... M stamp-h.in commit cc9976fbd511140bf7eef525a447c6e47f17850e Author: Kimmo Suominen AuthorDate: Tue Jul 18 23:39:45 2000 +0000 Commit: Kimmo Suominen CommitDate: Tue Jul 18 23:39:45 2000 +0000 Added answer. :100644 100644 88c3f1ea... efc679d0... M ChangeLog :100644 100644 f93c70bd... 0fe63112... M docs/README.developers commit a0524bceefc03aaa46957cf1c319eb74e04fe795 Author: Dan Harkless AuthorDate: Tue Jul 18 02:15:03 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jul 18 02:15:03 2000 +0000 Clarified and made some corrections to Kimmo's README.developers changes (BTW, if anyone can explain why the RCS Ids are able to cause problems with the dependencies, please fill in the explanation -- I never encountered a problem with the old single-commit method). :100644 100644 325e70e9... 88c3f1ea... M ChangeLog commit 2ef1a2bc54aa523b9edbb830959f17a3ed05d74d Author: Dan Harkless AuthorDate: Tue Jul 18 02:07:51 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jul 18 02:07:51 2000 +0000 I don't understand why Kim's split-up of the autoconf-file cvs commits should be necessary, so I left a little note hoping for someone to explain technically why that should be the case. I certainly never ran into any problems with my old single-commit version (which I added back in along with an explanation of why it supposedly won't always work). Also Kim's text implied that the _only_ reason for the given order is the RCS Ids -- not true -- the timestamps are the main reason a particular order is necessary. Made a couple of other clarifications as well. :100644 100644 b243b5d3... f93c70bd... M docs/README.developers commit d3df81fcf2e52e4e484da1c1df431c7a915a3139 Author: Kimmo Suominen AuthorDate: Sun Jul 16 06:18:03 2000 +0000 Commit: Kimmo Suominen CommitDate: Sun Jul 16 06:18:03 2000 +0000 Iterating the commit a bit, I think this is how it works without extra runs of autoconf, autoheader and make. :100644 100644 9314563c... b243b5d3... M docs/README.developers commit 1ea2cf126ad9ba559ceb8f4790254ea01d1721c2 Author: Kimmo Suominen AuthorDate: Sun Jul 16 06:05:26 2000 +0000 Commit: Kimmo Suominen CommitDate: Sun Jul 16 06:05:26 2000 +0000 Regen. :100755 100755 4421c63e... 520d155d... M configure :100644 100644 27602c4e... 281f6ef3... M stamp-h.in commit 6c381309884f3bf4e5ce90ea632509d615bdc3e4 Author: Kimmo Suominen AuthorDate: Sun Jul 16 06:01:28 2000 +0000 Commit: Kimmo Suominen CommitDate: Sun Jul 16 06:01:28 2000 +0000 If $LIBTOOL is empty we should not try to run it. This gets rid of the "--version: not found" error. :100644 100644 c264d6ec... d80a2d2e... M configure.in commit 61fba03f0ca8ba63ae594c5a136ffd36f7115c04 Author: Kimmo Suominen AuthorDate: Sun Jul 16 05:50:33 2000 +0000 Commit: Kimmo Suominen CommitDate: Sun Jul 16 05:50:33 2000 +0000 Got rid of one mktemp. :100644 100644 3a261342... 325e70e9... M ChangeLog commit 0dc7a85acb242ad851c28001435932526a9a6d29 Author: Kimmo Suominen AuthorDate: Sun Jul 16 05:11:46 2000 +0000 Commit: Kimmo Suominen CommitDate: Sun Jul 16 05:11:46 2000 +0000 Complete HAVE_MKSTEMP. :100644 100644 ec887374... 2cb6bdc1... M sbr/lock_file.c commit ca7903e5fcabe1d7dc9f51d08dfdb82d61b3d5bf Author: Kimmo Suominen AuthorDate: Sun Jul 16 04:23:50 2000 +0000 Commit: Kimmo Suominen CommitDate: Sun Jul 16 04:23:50 2000 +0000 We ignore the fact that the user requested SASL, since the pipe to the mailer is secure. This allows for easier sharing of the MH profile across hosts. :100644 100644 8273f14f... 9a9c725f... M mts/sendmail/sendmail.c commit 8ba87b1445d63dad96ca6a24f85790f16e1c1294 Author: Kimmo Suominen AuthorDate: Sun Jul 16 04:03:27 2000 +0000 Commit: Kimmo Suominen CommitDate: Sun Jul 16 04:03:27 2000 +0000 Note replacement of GNU-makeism in sbr/Makefile.in with a common statement. :100644 100644 53673174... 3a261342... M ChangeLog commit 836b477d0a4b0f1d22cea685ce1600f38c77aea7 Author: Kimmo Suominen AuthorDate: Sun Jul 16 03:58:57 2000 +0000 Commit: Kimmo Suominen CommitDate: Sun Jul 16 03:58:57 2000 +0000 So I don't think you can commit these all in a single commit. README.developers recommends that (with precise ordering) but things still get regenerated when I run "make". :100644 100644 3fed5720... 27602c4e... M stamp-h.in commit a9de2f144ecee3ca26a0f3e939adb8086d5fe21c Author: Kimmo Suominen AuthorDate: Sun Jul 16 03:57:47 2000 +0000 Commit: Kimmo Suominen CommitDate: Sun Jul 16 03:57:47 2000 +0000 Keep this working with other makes than GNU. :100644 100644 506c5597... 7ca55540... M sbr/Makefile.in commit 84546c458ff514a547b40d436259b77661565e9b Author: Kimmo Suominen AuthorDate: Sun Jul 16 03:56:45 2000 +0000 Commit: Kimmo Suominen CommitDate: Sun Jul 16 03:56:45 2000 +0000 Still missed one SASL stuff thing. :100644 100644 5b33ed82... a37ebea3... M mts/smtp/smtp.c commit a70d216f2b3319bb3e0a774c06a2bf624cb6e119 Author: Kimmo Suominen AuthorDate: Sun Jul 16 03:36:42 2000 +0000 Commit: Kimmo Suominen CommitDate: Sun Jul 16 03:36:42 2000 +0000 Changed "--with-backup-prefix" to "--with-hash-backup" because # is too difficult for config.status to get right. :100644 100644 6a63ff96... 53673174... M ChangeLog :100755 100755 50b6ac50... 4421c63e... M configure :100644 100644 69728f88... c264d6ec... M configure.in :100644 100644 b6fbbb65... 3fed5720... M stamp-h.in commit 8b9551fcc3ad258152778177ba29cf7613f976db Author: Kimmo Suominen AuthorDate: Sun Jul 16 03:15:17 2000 +0000 Commit: Kimmo Suominen CommitDate: Sun Jul 16 03:15:17 2000 +0000 Note "--with-backup-prefix". :100644 100644 2c4102a4... 6a63ff96... M ChangeLog commit 80822fbdf1fc94c899b1f690df3f24f1e4df6c55 Author: Kimmo Suominen AuthorDate: Sun Jul 16 03:13:25 2000 +0000 Commit: Kimmo Suominen CommitDate: Sun Jul 16 03:13:25 2000 +0000 Add "--with-backup-prefix" so it can be set easily. :100644 100644 29c66c0c... 51ac68f2... M acconfig.h :100644 100644 f8d23ba0... 00f7c37a... M config.h.in :100755 100755 a03cf2de... 50b6ac50... M configure :100644 100644 6d576424... 69728f88... M configure.in commit a60b66a4ee37b8cd59233b7f35a50398f0a27da6 Author: Kimmo Suominen AuthorDate: Sun Jul 16 02:08:18 2000 +0000 Commit: Kimmo Suominen CommitDate: Sun Jul 16 02:08:18 2000 +0000 SASL stuff. :100644 100644 ac6b32e9... 5b33ed82... M mts/smtp/smtp.c commit 365996ecb8f3c61c9912988ee0d9a99d616e33c8 Author: Kimmo Suominen AuthorDate: Sun Jul 16 01:48:37 2000 +0000 Commit: Kimmo Suominen CommitDate: Sun Jul 16 01:48:37 2000 +0000 SASL stuff. :100644 100644 f076e48a... 9c8049ab... M uip/inc.c commit 6b74eb547bce7c4436fc366073321b2f480c30da Author: Kimmo Suominen AuthorDate: Sun Jul 16 01:46:50 2000 +0000 Commit: Kimmo Suominen CommitDate: Sun Jul 16 01:46:50 2000 +0000 SASL mods. :100644 100644 a562ad29... ca6b5bc4... M uip/Makefile.in commit 0ed83fd34a89b1d39d161504f5ddb99071816fce Author: Dan Harkless AuthorDate: Thu Jul 13 21:49:45 2000 +0000 Commit: Dan Harkless CommitDate: Thu Jul 13 21:49:45 2000 +0000 Deleted the timezone on Kim's SASL patch entry. Ruud has taken to adding the timezone even though all previous entries are missing it, and I don't really agree with that. True, on occasion someone in a different timezone will commit something later in the day than someone else, and even though the second change happens later, the time may be earlier, but that doesn't happen too often and isn't really a big deal, IMHO. Putting textual timezones like "EDT" isn't really the right solution, IMHO, since some of those tags are ambiguous. Either an offset-style timezone should be used or all times should be given as UTC. I'd just as soon stick with local times, though. Oh, one thing I forgot to mention in my last CVS entry was that I removed "IMAP" from the list of protocols supported by Ken's SASL patches -- nmh doesn't have any IMAP support! :100644 100644 1f052922... 2c4102a4... M ChangeLog commit 7d59c664edde7474bcf6d0ed8023aade8b202752 Author: Dan Harkless AuthorDate: Thu Jul 13 21:42:52 2000 +0000 Commit: Dan Harkless CommitDate: Thu Jul 13 21:42:52 2000 +0000 Modified Kimmo's entry for the application of Ken Hornstein's SASL patches to clarify that it wasn't Ken applying them himself, and clarified what SASL support actually means. :100644 100644 5958552e... 1f052922... M ChangeLog commit d1563de82a4fed11ee45202be934bfba9a5ae6ea Author: Dan Harkless AuthorDate: Thu Jul 13 21:41:42 2000 +0000 Commit: Dan Harkless CommitDate: Thu Jul 13 21:41:42 2000 +0000 Kimmo neglected to commit the regenerated versions of these after changing configure.in, forcing people using the CVS source to have to have the autoconf tools installed. :100755 100755 443a38ba... a03cf2de... M configure :100644 100644 a26a0b80... b6fbbb65... M stamp-h.in commit 87d022d6809ee2a4f57bf527868c1690498a4216 Author: Dan Harkless AuthorDate: Tue Jul 11 21:20:04 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jul 11 21:20:04 2000 +0000 Clarified post.man and send.man for those not completely up on SASL terminology. "SASL encryption layers are not supported for SMTP" means that encryption is supported for the authentication but not for the subsequent data stream. :100644 100644 f84fb89d... 5958552e... M ChangeLog :100644 100644 69374ce9... 23841f78... M man/post.man :100644 100644 88fd9c3c... 9bb28972... M man/send.man commit ca5b47ddb9e25b55f3e1e0c6427851c6cd7b8e72 Author: Kimmo Suominen AuthorDate: Sat Jul 8 05:36:58 2000 +0000 Commit: Kimmo Suominen CommitDate: Sat Jul 8 05:36:58 2000 +0000 Note SASL commit. :100644 100644 96618bb5... f84fb89d... M ChangeLog commit cfc525a9b85207225cb4071d1d3b01e8d1db2424 Author: Kimmo Suominen AuthorDate: Fri Jul 7 03:48:02 2000 +0000 Commit: Kimmo Suominen CommitDate: Fri Jul 7 03:48:02 2000 +0000 SASL support from Ken Hornstein . :100644 100644 5fdea1b3... 29c66c0c... M acconfig.h :100644 100644 7b1c3fdc... f8d23ba0... M config.h.in :100644 100644 a3d33865... 6d576424... M configure.in :100644 100644 c53b291f... bc339638... M h/popsbr.h :100644 100644 8c11b2f9... fc53359d... M man/inc.man :100644 100644 5054c339... 2f1fed5b... M man/msgchk.man :100644 100644 45261778... 69374ce9... M man/post.man :100644 100644 43d1ad12... 88fd9c3c... M man/send.man :100644 100644 546097cc... 8273f14f... M mts/sendmail/sendmail.c :100644 100644 9890d1c3... 4a726b96... M mts/smtp/Makefile.in :100644 100644 c8fb5548... ac6b32e9... M mts/smtp/smtp.c :100644 100644 772035d7... 1d7d2c98... M mts/smtp/smtp.h :100644 100644 3209a97c... f076e48a... M uip/inc.c :100644 100644 fdf32d6c... 52aedc86... M uip/msgchk.c :100644 100644 6f2b35ad... 3ee198b2... M uip/popsbr.c :100644 100644 a866703c... ef13279b... M uip/post.c :100644 100644 3e2dc605... bf689f0d... M uip/send.c :100644 100644 0e2a9987... cf577927... M uip/whatnowsbr.c commit df7b16cb148474b3b80dbf1e226e858cf1e47edb Author: Ruud de Rooij AuthorDate: Mon Jun 12 18:07:34 2000 +0000 Commit: Ruud de Rooij CommitDate: Mon Jun 12 18:07:34 2000 +0000 * Merged mts/sendmail functionality into mts/smtp; switching between smtp and sendmail delivery method is now controlled by mts.conf. * If tsort cannot deal with loops, in addition to defining tsort as cat, also define lorder as echo. * Removed uip/popi.c from list of sources. :100644 100644 86ecc801... 96618bb5... M ChangeLog :100644 100644 ca45be7e... 1147641c... M INSTALL :100644 100644 612c9ece... 5fdea1b3... M acconfig.h :100644 100644 4f3b78db... 7b1c3fdc... M config.h.in :100755 100755 c6442749... 443a38ba... M configure :100644 100644 a60920a2... a3d33865... M configure.in :100644 100644 d463f78f... 99f6d1f3... M docs/FAQ :100644 100644 ebd93d3d... c2645cbe... M etc/Makefile.in :100644 100644 16b5bab5... c3c946df... M etc/mts.conf.in :100644 100644 856409e4... c3a468ce... M h/rcvmail.h :100644 100644 990e31c0... b9f2560c... M man/mh-tailor.man :100644 100644 8627795a... a8c5ee58... M mts/Makefile.in :100644 100644 0bc7532f... 83727d54... M mts/sendmail/hosts.c :100644 100644 025bb966... c8fb5548... M mts/smtp/smtp.c :100644 100644 1a20c5c7... a26a0b80... M stamp-h.in :100644 100644 b1e3950e... a562ad29... M uip/Makefile.in :100644 100644 d0d750c1... a866703c... M uip/post.c :100644 100644 3b0b1809... 7d9b718d... M zotnet/mts/mts.c :100644 100644 66aa590c... ce063d98... M zotnet/mts/mts.h commit 2bb7e26c6ae27f9b8a0ca9e5b7ddd1c824bcedda Author: Dan Harkless AuthorDate: Fri Jun 9 02:45:17 2000 +0000 Commit: Dan Harkless CommitDate: Fri Jun 9 02:45:17 2000 +0000 New dtimep.lex didn't parse day names properly. Fixed. Also clarified ambiguous comments preceding day_map[] array (from old dtimep.lex) that probably led to the erroneous cp++ being added. :100644 100644 1ae80ec6... 86ecc801... M ChangeLog :100644 100644 fa64ccba... b6a3fde4... M sbr/dtimep.c :100644 100644 4f019808... 2e79c46c... M sbr/dtimep.lex commit 877d0da4a8334e53ebc0a8b740efe489e0817e92 Author: Ruud de Rooij AuthorDate: Wed Jun 7 19:06:52 2000 +0000 Commit: Ruud de Rooij CommitDate: Wed Jun 7 19:06:52 2000 +0000 * Added one more mkstemp invocation to uip/spost.c (which was in a #if 0 block). * Applied patch from Peter Maydell to clean up permissions handling and error handling in uip/inc.c. :100644 100644 b9536ba7... 1ae80ec6... M ChangeLog :100644 100644 f68a293c... 1a20c5c7... M stamp-h.in :100644 100644 f203062c... 3209a97c... M uip/inc.c :100644 100644 57727371... 555bb68d... M uip/spost.c commit 7036a59145b61979bfd61344d55ac9ce36cc4d54 Author: Ruud de Rooij AuthorDate: Mon Jun 5 20:13:54 2000 +0000 Commit: Ruud de Rooij CommitDate: Mon Jun 5 20:13:54 2000 +0000 Use cat instead of tsort if tsort cannot deal with loops in its input (which is the case for tsort from GNU textutils). :100644 100644 b265764e... b9536ba7... M ChangeLog :100755 100755 26e4ab93... c6442749... M configure :100644 100644 d3f2c084... a60920a2... M configure.in commit 6918a091f788f34d97c176b1cfa1da8d9e463c6c Author: Ruud de Rooij AuthorDate: Mon Jun 5 19:20:38 2000 +0000 Commit: Ruud de Rooij CommitDate: Mon Jun 5 19:20:38 2000 +0000 If liblockfile is present, and its dotlockfile program is setgid, inc does not need to be setgid. :100644 100644 d13b3b25... b265764e... M ChangeLog :100755 100755 3f98efd6... 26e4ab93... M configure :100644 100644 7f4bd12e... d3f2c084... M configure.in :100644 100644 82f89525... f68a293c... M stamp-h.in commit 3a162432aa58eff6e48f99afaf746408905b008c Author: Ruud de Rooij AuthorDate: Sun Jun 4 20:24:39 2000 +0000 Commit: Ruud de Rooij CommitDate: Sun Jun 4 20:24:39 2000 +0000 * Added autoconf test for Miquel van Smoorenburg's liblockfile library, as found on Debian systems. * Added liblockfile support to sbr/lock_file.c. :100644 100644 80dc52d0... d13b3b25... M ChangeLog :100644 100644 26905920... 4f3b78db... M config.h.in :100755 100755 eeb5adc0... 3f98efd6... M configure :100644 100644 490fa0e4... 7f4bd12e... M configure.in :100644 100644 2ddeae61... fa64ccba... M sbr/dtimep.c :100644 100644 a99c681b... ec887374... M sbr/lock_file.c :100644 100644 9d2c7d56... 82f89525... M stamp-h.in commit ea4f02c6acdf50fbc114ea9dc7e2a81f149ea8ca Author: Shantonu Sen AuthorDate: Thu Jun 1 06:57:57 2000 +0000 Commit: Shantonu Sen CommitDate: Thu Jun 1 06:57:57 2000 +0000 make clean now removes generated bin files. :100644 100644 eec41463... ebd93d3d... M etc/Makefile.in commit b4376bf886a77fed4acec0505bbbf4150e71bbf9 Author: Shantonu Sen AuthorDate: Wed May 31 07:22:43 2000 +0000 Commit: Shantonu Sen CommitDate: Wed May 31 07:22:43 2000 +0000 Made dtimep.lex more lex-friendly. :100644 100644 2b03f0ad... 80dc52d0... M ChangeLog commit 859187428420e9089e91a45f3a833135172d1822 Author: Shantonu Sen AuthorDate: Wed May 31 07:19:30 2000 +0000 Commit: Shantonu Sen CommitDate: Wed May 31 07:19:30 2000 +0000 Added back memory options for AIX to increase available memory. Took out %option noyywrap, which wasn't understood by AT&T lex, as well as the -i case-insensitivity flag. :100644 100644 9e8e8aa8... 506c5597... M sbr/Makefile.in :100644 100644 a8cce79c... 2ddeae61... M sbr/dtimep.c :100644 100644 693925e9... 4f019808... M sbr/dtimep.lex commit de84e33cbf49bf0e70ad010d58ab9893c5438cff Author: Doug Morris AuthorDate: Wed May 31 05:48:06 2000 +0000 Commit: Doug Morris CommitDate: Wed May 31 05:48:06 2000 +0000 added lint targets for Makefiles and a configure test to find whether lclint or lint is installed on the system. :100644 100644 6fbfa727... 2b03f0ad... M ChangeLog :100644 100644 9492cd07... b331c5da... M Makefile.in :100644 100644 8468646b... 6776c86e... M config/Makefile.in :100755 100755 b214b705... eeb5adc0... M configure :100644 100644 7929547d... 490fa0e4... M configure.in :100644 100644 93c3ab55... 768eb851... M docs/Makefile.in :100644 100644 c4e315f6... 6a5844f3... M h/Makefile.in :100644 100644 ee5997c2... c81c15d5... M man/Makefile.in :100644 100644 328a9ead... 8627795a... M mts/Makefile.in :100644 100644 d076a137... eb720d8a... M mts/mmdf/Makefile.in :100644 100644 f812a2c5... b025b3b9... M mts/sendmail/Makefile.in :100644 100644 85ea7ea5... 9890d1c3... M mts/smtp/Makefile.in :100644 100644 a2bc3bd1... 9e8e8aa8... M sbr/Makefile.in :100644 100644 ae7d5305... 9d2c7d56... M stamp-h.in :100644 100644 0b50f290... b1e3950e... M uip/Makefile.in :100644 100644 cc20173a... 0a75e149... M zotnet/Makefile.in :100644 100644 7dedeeae... 80615a37... M zotnet/bboards/Makefile.in :100644 100644 7871ca7c... 01877141... M zotnet/mf/Makefile.in :100644 100644 ab8ad654... a57b2f1f... M zotnet/mts/Makefile.in :100644 100644 fe05e018... b14f24ef... M zotnet/tws/Makefile.in commit 1f90e5c5a3c7cb029ce1ac3c2e760c368fd2ce92 Author: Dan Harkless AuthorDate: Wed May 31 02:27:40 2000 +0000 Commit: Dan Harkless CommitDate: Wed May 31 02:27:40 2000 +0000 Applied Alec Wolman 's dropsbr.c patch: In the map_write routine, a call is made to map_open and this call is supposed to set the "clear" variable to 0 or 1, depending on whether the map file is empty or not. In mh6.8.3, this worked because map_open would set "clear" by calling the mbx_Xopen routine. In nmh, the code for mbx_Xopen was merged into mbx_open, but the interface for mbx_open doesn't support the clear variable, so that functionality was lost. The map_open interface still contains "int *clear" in the prototype, but never sets it. My patch eliminates "clear" from the map_open interface (I checked to make sure that map_write is the only client of map_open). Furthermore, my patch also sets the "clear" variable properly at the beginning of map_write by calling fstat(). This eliminates the bug in that the value of "clear" being used later in the routine was just stack garbage. Having a bad value of clear causes this next bug to be triggered: The fp file pointer was being opened with fdopen, but in two of the three switch cases it wasn't being closed. In certain cases, this was causing packf to run out of file descriptors if you attempted to pack a large folder. :100644 100644 c2abd854... 6fbfa727... M ChangeLog :100644 100644 6089a225... 5cf4ee32... M uip/dropsbr.c commit 3e2e8b43581f31be0cabe123dade6ff146dd31c7 Author: Dan Harkless AuthorDate: Wed May 31 02:13:57 2000 +0000 Commit: Dan Harkless CommitDate: Wed May 31 02:13:57 2000 +0000 A couple more tweaks to etc/Makefile.in: Generated sendfiles script was not a dependency of the `all' target, and was incorrectly included in the distribution. :100644 100644 1f740812... c2abd854... M ChangeLog :100644 100644 ad43e9db... eec41463... M etc/Makefile.in commit c40202d3d91242b22664e1bb056a13dde4205661 Author: Dan Harkless AuthorDate: Wed May 31 00:53:20 2000 +0000 Commit: Dan Harkless CommitDate: Wed May 31 00:53:20 2000 +0000 INSTALL never documented the etc/*.old thing. Documented the new etc/*.prev thing (including a note to watch for diff output). :100644 100644 69f94eae... 1f740812... M ChangeLog :100644 100644 63021e4f... ca45be7e... M INSTALL commit fababe8e55aedaed529554701b2d509cbea4be81 Author: Dan Harkless AuthorDate: Wed May 31 00:28:14 2000 +0000 Commit: Dan Harkless CommitDate: Wed May 31 00:28:14 2000 +0000 Reworded my last entry a bit. :100644 100644 5ea92b8d... 69f94eae... M ChangeLog commit 82e9ded8c02ea347c9cb9a8e507d0d0e5b2acc3b Author: Dan Harkless AuthorDate: Wed May 31 00:22:05 2000 +0000 Commit: Dan Harkless CommitDate: Wed May 31 00:22:05 2000 +0000 etc/Makefile.in was incorrectly installing mts.conf.in and sendfiles.in -- fixed. Changed the suffix for the backed-up previous versions of the etc files from the ambiguous .old to .prev. Use diff and only keep the .prev file around if different. :100644 100644 a5e306c5... 5ea92b8d... M ChangeLog :100644 100644 a32ee29f... ad43e9db... M etc/Makefile.in commit 673b2a0af17a1dd96c21ae9712accee5324f24cf Author: Dan Harkless AuthorDate: Tue May 30 22:52:43 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 30 22:52:43 2000 +0000 ChangeLog: I think we should use a uniform style in this file. Reformatted Ruud's recent entries. configure: Weird. There's some timestamp screwup somewhere, perhaps in the way Makefile.in is written, that caused autoconf to get run after I did a `cvs update'. It regenerated configure, and apparently I'm using a different version of autoconf, with a different order of awk alternatives. :100644 100644 d2a44430... a5e306c5... M ChangeLog :100755 100755 f37ac3c0... b214b705... M configure commit e5f66154adf0d51a8557c71e80f842f959713c00 Author: Shantonu Sen AuthorDate: Mon May 29 08:00:33 2000 +0000 Commit: Shantonu Sen CommitDate: Mon May 29 08:00:33 2000 +0000 Added entry for new lexing function and moving from zotnet/tws to sbr :100644 100644 61342349... d2a44430... M ChangeLog commit e5800b52263f682f4383d0c88872febb9cf76085 Author: Shantonu Sen AuthorDate: Mon May 29 07:48:14 2000 +0000 Commit: Shantonu Sen CommitDate: Mon May 29 07:48:14 2000 +0000 Updating root-level files so that zotnet/tws/Makefile is not generated. :100755 100755 53a353a9... f37ac3c0... M configure :100644 100644 bf570653... 7929547d... M configure.in commit 98dfa6e68dd83922cddf00ebe2a986d076c250d0 Author: Shantonu Sen AuthorDate: Mon May 29 07:44:51 2000 +0000 Commit: Shantonu Sen CommitDate: Mon May 29 07:44:51 2000 +0000 Synchronizing Makefiles that had gotten out of sync with directory contents. :100644 100644 61e9f59b... 93c3ab55... M docs/Makefile.in :100644 100644 0eee119b... a32ee29f... M etc/Makefile.in :100644 100644 4f992592... c4e315f6... M h/Makefile.in commit f812b86689024085d891b870d183792584cf67fb Author: Shantonu Sen AuthorDate: Mon May 29 07:43:29 2000 +0000 Commit: Shantonu Sen CommitDate: Mon May 29 07:43:29 2000 +0000 Updated sbr functions to include instead of . Also, update Makefile to include new functions dtime.c and dtimep.c :100644 100644 b27dda4b... a2bc3bd1... M sbr/Makefile.in :100644 100644 e857c7d9... 6baabdc7... M sbr/fmt_compile.c :100644 100644 b8273c98... 4f9078a4... M sbr/fmt_scan.c commit 7879ea4084333b448c5a3a49c1cb52023e3808d1 Author: Shantonu Sen AuthorDate: Mon May 29 07:35:32 2000 +0000 Commit: Shantonu Sen CommitDate: Mon May 29 07:35:32 2000 +0000 Updating user programs to use instead of :100644 100644 c2370220... e255a7bc... M uip/annosbr.c :100644 100644 ab441418... 687d4c44... M uip/dp.c :100644 100644 cc35f5f1... 6089a225... M uip/dropsbr.c :100644 100644 d8b17d34... 661a084b... M uip/forw.c :100644 100644 0d36423b... f203062c... M uip/inc.c :100644 100644 2450572c... 045146b0... M uip/mhbuild.c :100644 100644 7e805654... 227f111f... M uip/mhbuildsbr.c :100644 100644 c1af2180... 4f1f9d7a... M uip/mhcachesbr.c :100644 100644 bacaf245... 3960b1cb... M uip/mhlist.c :100644 100644 ca349022... ae5463c8... M uip/mhlistsbr.c :100644 100644 882304cb... f22303b8... M uip/mhlsbr.c :100644 100644 d4f462f5... adb06dae... M uip/mhn.c :100644 100644 f2b30b65... c2e08056... M uip/mhoutsbr.c :100644 100644 1c46076d... 0813aa75... M uip/mhparse.c :100644 100644 af42092b... a50292e9... M uip/mhshow.c :100644 100644 71f55a43... d8733953... M uip/mhshowsbr.c :100644 100644 806a3523... 14d7cde9... M uip/mhstore.c :100644 100644 41aa1a4c... b2a3e31b... M uip/mhstoresbr.c :100644 100644 4bc92454... 9a73bbfa... M uip/mhtest.c :100644 100644 d91330b7... fdf32d6c... M uip/msgchk.c :100644 100644 eeb87a10... 6bb6f06d... M uip/msh.c :100644 100644 5b69f076... c199502d... M uip/mshcmds.c :100644 100644 6cae130b... 72d97d65... M uip/pick.c :100644 100644 848adc0b... ebebf6c3... M uip/picksbr.c :100644 100644 abc22859... d0d750c1... M uip/post.c :100644 100644 ace5295d... 1c70d740... M uip/rcvdist.c :100644 100644 f5b1c054... f120afda... M uip/rcvpack.c :100644 100644 31ca80ab... d769b40a... M uip/rcvtty.c :100644 100644 7f5cf46f... 77bc999c... M uip/scan.c :100644 100644 76e87dcf... 6fd4bb32... M uip/scansbr.c :100644 100644 acbdf2e4... d50330d5... M uip/slocal.c :100644 100644 3ac2e3f2... d64f8bef... M uip/sortm.c :100644 100644 76478c87... 57727371... M uip/spost.c :100644 100644 a416fdfa... 8e3332d0... M uip/viamail.c commit 5f80fdd1ec6888f34af829208fd90fb9716ac289 Author: Shantonu Sen AuthorDate: Mon May 29 07:29:08 2000 +0000 Commit: Shantonu Sen CommitDate: Mon May 29 07:29:08 2000 +0000 Moved date/time functions from zotnet/tws to sbr. More importantly, wrote a new lexing function dparsetime (dtimep.lex) which plays nicely with flex, needs no "sed hackery". It might work with lex, but I haven't tried. :000000 100644 00000000... 83ec8806... A h/tws.h :000000 100644 00000000... 8de4b69c... A sbr/dtime.c :000000 100644 00000000... a8cce79c... A sbr/dtimep.c :000000 100644 00000000... 693925e9... A sbr/dtimep.lex :100644 100644 412a1521... cc20173a... M zotnet/Makefile.in commit 522138c8d86c20435f045eaee0944a9b008b1c5a Author: Ruud de Rooij AuthorDate: Sun May 28 16:17:49 2000 +0000 Commit: Ruud de Rooij CommitDate: Sun May 28 16:17:49 2000 +0000 * Added autoconf check for getutent(). * Changed uip/rcvtty.c and uip/slocal.c to use getutent() and friends. Since I can only check on Linux, please check if this works on other systems. :100644 100644 53201cbd... 61342349... M ChangeLog :100755 100755 55dd186b... 53a353a9... M configure :100644 100644 5bdddb23... 31ca80ab... M uip/rcvtty.c :100644 100644 22ba3e8b... acbdf2e4... M uip/slocal.c commit 832517a97394250ee37db56cb98fac9960d5522f Author: Ruud de Rooij AuthorDate: Sun May 28 16:15:58 2000 +0000 Commit: Ruud de Rooij CommitDate: Sun May 28 16:15:58 2000 +0000 Added autoconf check for getutent(). :100644 100644 a07a8917... 26905920... M config.h.in :100644 100644 613b2b00... bf570653... M configure.in :100644 100644 fe87a4ad... ae7d5305... M stamp-h.in commit aae44c933a5b035e0b23abf4dd4247cd37e4d041 Author: Ruud de Rooij AuthorDate: Sun May 28 14:42:01 2000 +0000 Commit: Ruud de Rooij CommitDate: Sun May 28 14:42:01 2000 +0000 * Applied patch from Peter Maydell to uip/scansbr.c for more checks for write failures. * Unlink temporary file properly in uip/rcvtty.c. * Moved viamail from bindir to libdir. * Changed sendfiles into sendfiles.in, so that path to viamail is patched in. * Added gzip support to sendfiles. * Added References header to replcomps and replgroupcomps. :100644 100644 be7e10fd... 53201cbd... M ChangeLog :100644 100644 2f78e341... 0eee119b... M etc/Makefile.in :100644 100644 04451812... 5b6f4bf3... M etc/replcomps :100644 100644 9295fd0e... 3226af74... M etc/replgroupcomps :100755 000000 d53ed82e... 00000000... D etc/sendfiles :000000 100755 00000000... b443067e... A etc/sendfiles.in :100644 100644 90b551c2... 0b50f290... M uip/Makefile.in :100644 100644 69a90311... 5bdddb23... M uip/rcvtty.c :100644 100644 143a059c... 76e87dcf... M uip/scansbr.c commit e1aadb9e23f706d4b19f49d1e7a6995a5b3c59e2 Author: Ruud de Rooij AuthorDate: Sun May 28 12:45:53 2000 +0000 Commit: Ruud de Rooij CommitDate: Sun May 28 12:45:53 2000 +0000 Fixed m_getfld bug which caused segmentation faults when incorporating messages which ended in multiple linefeeds crossing a buffer boundary. :100644 100644 a651862c... be7e10fd... M ChangeLog :100644 100644 beb6e765... a667be82... M sbr/m_getfld.c commit b706d049104ad0be9982d7e155acb340cb8dada0 Author: Dan Harkless AuthorDate: Fri May 26 20:35:30 2000 +0000 Commit: Dan Harkless CommitDate: Fri May 26 20:35:30 2000 +0000 msh has been unable to show MIME messages ever since 1.0. Alec Wolman tracked down the problem to the -show flag being passed to mhshow. mhshow is equivalent to the old mhn -show, so we don't need the -show anymore. Removed it. :100644 100644 ba01e87c... a651862c... M ChangeLog :100644 100644 b785aeba... 5b69f076... M uip/mshcmds.c commit f65f8722914d9cfba9317439d9712957719a35b4 Author: Shantonu Sen AuthorDate: Fri May 12 05:19:14 2000 +0000 Commit: Shantonu Sen CommitDate: Fri May 12 05:19:14 2000 +0000 Moved zotnet/mf to sbr. :100644 100644 aa33b022... ba01e87c... M ChangeLog :100755 100755 98eb0785... 55dd186b... M configure :100644 100644 2cec6f0e... 613b2b00... M configure.in :000000 100644 00000000... a4c81e89... A h/mf.h :100644 100644 1fba0874... b27dda4b... M sbr/Makefile.in :100644 100644 4f734b44... a1cdf8c3... M sbr/addrsbr.c :000000 100644 00000000... c7959103... A sbr/mf.c :100644 100644 9178debd... 412a1521... M zotnet/Makefile.in commit 888b0b63ab66bfa99505cb9817e6fe49cb1f2f70 Author: Shantonu Sen AuthorDate: Fri May 12 04:16:46 2000 +0000 Commit: Shantonu Sen CommitDate: Fri May 12 04:16:46 2000 +0000 zotnet/bboards no longer built by default. :100755 100755 f61647d6... 98eb0785... M configure :100644 100644 0158eaf7... fe87a4ad... M stamp-h.in commit 3b176725a91e7598fc51e5adbb5ee036fb9723cc Author: Shantonu Sen AuthorDate: Fri May 12 02:55:36 2000 +0000 Commit: Shantonu Sen CommitDate: Fri May 12 02:55:36 2000 +0000 zotnet/bboards is no longer built by default. :100644 100644 c6b6bdd9... aa33b022... M ChangeLog commit ae8be1b7c79bee73a0592c395605e2fd16953e07 Author: Shantonu Sen AuthorDate: Fri May 12 02:51:21 2000 +0000 Commit: Shantonu Sen CommitDate: Fri May 12 02:51:21 2000 +0000 Removed zotnet/bboards from default build. :100644 100644 d68b624b... 2cec6f0e... M configure.in :100644 100644 4f43ffbc... 9178debd... M zotnet/Makefile.in commit da6fe27ddf026247d34ea6789b221f999927cd52 Author: Shantonu Sen AuthorDate: Thu May 11 02:55:11 2000 +0000 Commit: Shantonu Sen CommitDate: Thu May 11 02:55:11 2000 +0000 Change to MACHINES to include what platforms nmh *does* compile on. :100644 100644 cfb8a61e... c6b6bdd9... M ChangeLog commit c92f75d729c463f70770543d296c560e35a7bb18 Author: Shantonu Sen AuthorDate: Thu May 11 02:53:07 2000 +0000 Commit: Shantonu Sen CommitDate: Thu May 11 02:53:07 2000 +0000 Added on whish platforms nmh is known to compile, as polled from recent mailings to nmh-workers. Please add liberally. :100644 100644 509fa7d2... 5552b695... M MACHINES commit 75a7e976493fbf8682928cef33a3b33c7096e1ed Author: Shantonu Sen AuthorDate: Thu May 11 02:24:59 2000 +0000 Commit: Shantonu Sen CommitDate: Thu May 11 02:24:59 2000 +0000 Entered minor change to sbr/Makefile.in :100644 100644 a2a1fa4d... cfb8a61e... M ChangeLog commit 50b82c508f3489b56ae626dc13c3013cbfde507f Author: Shantonu Sen AuthorDate: Thu May 11 02:21:34 2000 +0000 Commit: Shantonu Sen CommitDate: Thu May 11 02:21:34 2000 +0000 Removed explicit definition of both SRCS *and* OBJS, and made OBJS simple a pattern substitution of SRCS, with suffix .c -> .o :100644 100644 32f964d3... 1fba0874... M sbr/Makefile.in commit a7218df84a2234948126f62be121c6701d64c83d Author: Shantonu Sen AuthorDate: Thu May 11 02:14:21 2000 +0000 Commit: Shantonu Sen CommitDate: Thu May 11 02:14:21 2000 +0000 Added my getpass() addition to ChangeLog (after the fact, but at least it's in now). :100644 100644 04e1694d... a2a1fa4d... M ChangeLog commit fc35177f2bf93ba98b0da5691550914409e5bdf4 Author: Dan Harkless AuthorDate: Wed May 10 03:39:46 2000 +0000 Commit: Dan Harkless CommitDate: Wed May 10 03:39:46 2000 +0000 Added mts.conf.5 page per Neil W Rickert 's report: This happens on solaris: % man mts.conf windex entry incorrect: mts.conf(5) not found. No manual entry for mts.conf. It is fixed by % echo ".so man5/mh-tailor.5" > mts.conf.5 done in the man5 directory. We need to add 'mts.conf.5' as a reference sourcing mh-tailor.5. :100644 100644 5ef0e1db... 04e1694d... M ChangeLog :100644 100644 469dd8de... ee5997c2... M man/Makefile.in :000000 100644 00000000... 9d534fd1... A man/mts.conf.man commit 9744555b38947913e094380962ef0774b7c32e8f Author: Dan Harkless AuthorDate: Wed May 10 00:02:53 2000 +0000 Commit: Dan Harkless CommitDate: Wed May 10 00:02:53 2000 +0000 Prepended "Portions of this code are" to the copyright message in ruserpass.c also. :100644 100644 5f2e3a28... 5ef0e1db... M ChangeLog :100644 100644 6045c326... 9e50da68... M sbr/ruserpass.c commit e0233d70fb7bfac996b3514ae60d7eedef0e6ad3 Author: Dan Harkless AuthorDate: Tue May 9 21:44:15 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 21:44:15 2000 +0000 * Changed configure.in to use gcc -Wall even without --enable-debug, to prevent developers compiling optimized from introducing warnings, and to give end-users a warm, fuzzy feeling as they (hopefully) see no warnings come out (except perhaps on the lex output file) even with -Wall. * Renamed getpass() to nmh_getpass() since the prototype for getpass() varies from OS to OS, and we want to _always_ use our version of the function. Fixed all the callers to use nmh_getpass() and added it to prototypes.h. Semi-arbitrarily upped MAX_PASSWORD_LEN from 128 to 256. buf was being calloc()'d and the memory leaked -- should have just been declared as static char array. Prepended "Portions of this code are" to the copyright message, as this version has been changed significantly from the BSD version. * Added "nmh-local functions to use in preference to OS versions" section to README.developers (currently just says to use nmh_getpass() instead of system getpass()). :100644 100644 d26f289f... 5f2e3a28... M ChangeLog :100755 100755 ea958420... f61647d6... M configure :100644 100644 957b3dab... d68b624b... M configure.in :100644 100644 b2c2efa0... 9314563c... M docs/README.developers :100644 100644 4b5a0b8f... d252eada... M h/prototypes.h :100644 100644 a8238fb2... b33a3f8e... M sbr/getpass.c :100644 100644 085d493a... 6045c326... M sbr/ruserpass.c :100644 100644 ba1d8ed3... 0158eaf7... M stamp-h.in :100644 100644 aa3253e0... c820d69f... M zotnet/bboards/getbbent.c commit 31d7959584363f09dbf599e09313f2916ba03b84 Author: Dan Harkless AuthorDate: Tue May 9 19:56:57 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 19:56:57 2000 +0000 Oops. Forgot to commit this when I made configure changes yesterday. :100644 100644 3c16ec78... ba1d8ed3... M stamp-h.in commit 20fe3a947f2305fb271a811d50f8a7d263511ee7 Author: Dan Harkless AuthorDate: Tue May 9 08:16:18 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 08:16:18 2000 +0000 Added steps to README.developers saying to change the version number to X.Y.Z+dev. Did a little rearranging and changed the FTP dir from /home/ftp to /var/ftp to reflect Doug's new machine. :100644 100644 3bb7d272... d26f289f... M ChangeLog :100644 100644 ec2d2434... b2c2efa0... M docs/README.developers commit 09470876aa753a96fa312296ed3c39ba761f3dd2 Author: Dan Harkless AuthorDate: Tue May 9 07:55:58 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 07:55:58 2000 +0000 Got rid of four warnings in Shantonu's new getpass.c. Needed to #include for calloc(), for ttyname(), and "h/mh.h" for adios(). Also changed ch from char to int to get rid of "comparison is always 1 due to limited range of data type" on EOF. :100644 100644 401456f3... 3bb7d272... M ChangeLog :100644 100644 cca32f62... a8238fb2... M sbr/getpass.c commit a428afdfc7347e10e7e95faf719682e9283622b7 Author: Dan Harkless AuthorDate: Tue May 9 07:13:59 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 07:13:59 2000 +0000 Alphabetized Shantonu's $pop_kinds output on configure's "pop is enabled" line. If POP3 is the only kind of POP enabled, say so, rather than just saying "yes" (which is ambiguous). :100644 100644 1fdd6f87... 401456f3... M ChangeLog :100755 100755 7666c289... ea958420... M configure :100644 100644 3d204fbc... 957b3dab... M configure.in commit 5f98c0e77b9e8ef4320b87a008e6f4c02c17fe90 Author: Dan Harkless AuthorDate: Tue May 9 06:53:21 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 06:53:21 2000 +0000 Shantonu updated the DIFFERENCES file to no longer say that APOP isn't supported, but in so doing, he removed the note that RPOP isn't supported. Put it back. :100644 100644 fe72ffa9... 1fdd6f87... M ChangeLog :100644 100644 110f88e4... 15401970... M docs/DIFFERENCES commit 173c34078c1d520926a8dabeeec01d58d6c8615f Author: Dan Harkless AuthorDate: Tue May 9 06:47:50 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 06:47:50 2000 +0000 * I had alphabetized the --configure options in the --help output awhile back, but Shantonu added --enable-apop just under --enable-pop. Put it in alphabetical order and clarified what --enable-apop does vs. --enable-pop and --with-krb4. Also changed --with-mts help line from "mail transport agent" to "mail transport agent/service" so the 's' in "mts" doesn't seem to come out of nowhere. * Added two steps to "releasing nmh" in README.developers. After making the tarball, it's a good idea to diff the tree vs. the CVS tree to make sure no files got left out, and then to chown the files so that they're owned by root, preventing a Trojaning attack by a malicious remote user with a UID matching yours. :100644 100644 6533fdce... fe72ffa9... M ChangeLog :100755 100755 bba17f25... 7666c289... M configure :100644 100644 111c53f5... 3d204fbc... M configure.in :100644 100644 e2834a26... ec2d2434... M docs/README.developers commit 499d7322f5053d81e8392ed8251068b97c671e2b Author: Shantonu Sen AuthorDate: Tue May 9 06:27:38 2000 +0000 Commit: Shantonu Sen CommitDate: Tue May 9 06:27:38 2000 +0000 Updated POP capability to include APOP. :100644 100644 b6646393... 110f88e4... M docs/DIFFERENCES commit 4f641fbfdffbf55b1ad67b2abd67c80bc3339959 Author: Shantonu Sen AuthorDate: Tue May 9 06:16:52 2000 +0000 Commit: Shantonu Sen CommitDate: Tue May 9 06:16:52 2000 +0000 Removed unnecessary comments, such as "*This warning no longer applies*" :100644 100644 01cd8490... 509fa7d2... M MACHINES commit 966e60efa721d87e5f1cd475de08c26e3bac967e Author: Shantonu Sen AuthorDate: Tue May 9 06:09:05 2000 +0000 Commit: Shantonu Sen CommitDate: Tue May 9 06:09:05 2000 +0000 Fix some compile-time warnings. :100644 100644 6a53b72f... cca32f62... M sbr/getpass.c :100644 100644 68809df4... 085d493a... M sbr/ruserpass.c commit bb150a8ccfa50b732eeb47110a1f63d91260728c Author: Dan Harkless AuthorDate: Tue May 9 04:52:55 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 04:52:55 2000 +0000 Doug informed me that the way I had restored the "lost" version histories was wrong, because `cvs checkout's of old versions of nmh wouldn't work properly. It occurs to me that this could be fixed by simply deleting those tags in the new-location *,v files, but oh well. I'm putting everything back to the way Doug originally had it. To get the old version history for a file that used to be in the top directory, you'll need to "blindly" do a `cvs log' there (even though you won't have a local copy of the file in that directory). `cvs diff' will no longer be able to diff pre-move versions vs. post-move versions -- you'll have to do a lot of manual gyrations with `cvs checkout' and then use `diff'. :100644 100644 11acc13e... 6533fdce... M ChangeLog commit 07d8ddb2b6a1bc5cf167099d0d299441dc578823 Author: Dan Harkless AuthorDate: Tue May 9 04:08:55 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 04:08:55 2000 +0000 Okay, now that the old revisions have been recreated, deleting the file. The new version is in the 'docs' subdirectory. :100644 000000 e2eafb37... 00000000... D FAQ commit 4fdb8114b2b3b50182e744c68d76b0406daa7dce Author: Dan Harkless AuthorDate: Tue May 9 04:07:15 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 04:07:15 2000 +0000 This is the nmh-1.0.4 version from 2000-03-15 (I see that I was the one that originally made this change). :100644 100644 a312abe2... e2eafb37... M FAQ commit 43d8b10e72cbb9af18cf8a3e7150a9b6d05bf9ee Author: Dan Harkless AuthorDate: Tue May 9 04:05:46 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 04:05:46 2000 +0000 This is the nmh-1.0.3 version from 2000-01-18 (1.0.2 had no changes). :100644 100644 c0540c4d... a312abe2... M FAQ commit ba97fdd58632a6d23ff84b98cf1096c5b436445b Author: Dan Harkless AuthorDate: Tue May 9 04:03:55 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 04:03:55 2000 +0000 This is the nmh-1.0.1 version from 1999-05-17. :100644 100644 5d3f7fa8... c0540c4d... M FAQ commit 2fea01738af4f89020a3cf3eb8ba87ba7e751874 Author: Dan Harkless AuthorDate: Tue May 9 03:58:04 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 03:58:04 2000 +0000 For reasons explained better elsewhere (e.g. Attic/README.developers), the version history for this file got lost. Recreating it. This version is from 1998-05-08 -- it's the original nmh-1.0 version. :000000 100644 00000000... 5d3f7fa8... A FAQ commit 4d17de3c1e1ed6a9a717c18fa0d75c3b9f918016 Author: Dan Harkless AuthorDate: Tue May 9 03:29:37 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 03:29:37 2000 +0000 After nmh 1.0.4, moved from top-level 'nmh' directory to 'nmh/docs'. :000000 100644 00000000... be9e6dd9... A docs/TODO commit 58d60c818b22f8d260e02c509f58b31c33f5f8af Author: Dan Harkless AuthorDate: Tue May 9 03:27:53 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 03:27:53 2000 +0000 Okay. Removing it now. New location is in 'docs' subdirectory. :100644 000000 78fad7a3... 00000000... D README.developers commit 50c584a03c5139dc15daa38b65f2308ed4a7dd89 Author: Dan Harkless AuthorDate: Tue May 9 03:25:24 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 03:25:24 2000 +0000 In the hullaballoo with moving stuff back and forth out of the docs/ directory, and trying to figure out the right way to preserve the old version history, this file's version history prior to the first move into docs/ got wiped. I introduced this file into the project after 1.0.3 was released, and was the only one to modify it until after the 1.0.4 release. The post-1.0.4 changes have survived in docs/README.developers, so I just need to check in the 1.0.4 version and tag it as such, then remove it again, to make a `cvs checkout' of nmh 1.0.4 work again. :000000 100644 00000000... 78fad7a3... A README.developers commit 9a4fac3d10762b4f09080966839b96291b5c6a77 Author: Dan Harkless AuthorDate: Tue May 9 02:43:54 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 02:43:54 2000 +0000 After nmh 1.0.4, moved from top-level 'nmh' directory to 'nmh/docs'. :000000 100644 00000000... 5c10cc89... A docs/COMPLETION-ZSH :000000 100644 00000000... ea7cd58e... A docs/ChangeLog_MH-3_to_MH-6.6 :000000 100644 00000000... 1d6542ec... A docs/ChangeLog_MH-6.7.0_to_MH-6.8.4.html :000000 100644 00000000... b6646393... A docs/DIFFERENCES :000000 100644 00000000... d463f78f... A docs/FAQ :000000 100644 00000000... becf31a0... A docs/MAIL.FILTERING commit dc0eaaa97aca85ebe2ae9d17c1435f856fb67224 Author: Dan Harkless AuthorDate: Tue May 9 02:36:42 2000 +0000 Commit: Dan Harkless CommitDate: Tue May 9 02:36:42 2000 +0000 After nmh 1.0.4, moved from top-level 'nmh' directory to 'nmh/docs'. :000000 100644 00000000... f75933ee... A docs/COMPLETION-TCSH commit 8e33b82f8dc64159e993ec0e039baefd3c2a23da Author: Shantonu Sen AuthorDate: Sun May 7 06:59:15 2000 +0000 Commit: Shantonu Sen CommitDate: Sun May 7 06:59:15 2000 +0000 Updated pop instructions and indicated use of standard "./configure" instead of "sh configure" :100644 100644 c0193816... 63021e4f... M INSTALL commit 56bd3c9f2bf7b6061fa302c57250612f852bd92e Author: Shantonu Sen AuthorDate: Sun May 7 06:16:43 2000 +0000 Commit: Shantonu Sen CommitDate: Sun May 7 06:16:43 2000 +0000 An nmh-specific getpass, to remove dependency on system getpass()es, which may or may not do what we want (including flushing input streams, and taking input from stdin in the absence of a controlling tty). :000000 100644 00000000... 6a53b72f... A sbr/getpass.c commit b1e229fc408e1b3a26de6e0ca29f6feb9359298e Author: Shantonu Sen AuthorDate: Sun May 7 06:14:31 2000 +0000 Commit: Shantonu Sen CommitDate: Sun May 7 06:14:31 2000 +0000 Added getpass to SRCS and OBJS. :100644 100644 4d71970f... 32f964d3... M sbr/Makefile.in commit f0a05d5cbd24ccf2cb620ec5f97aaf86c88a5f97 Author: Dan Harkless AuthorDate: Sat May 6 15:53:40 2000 +0000 Commit: Dan Harkless CommitDate: Sat May 6 15:53:40 2000 +0000 Removed "installing nmh" section. Moved its note about the DIFFERENCES file up next to the other MH discussion. Changed out-of-date "README" title (should have been "README.history") to "README.about -- about nmh". After committing, I'll rename the file to README.about inside the CVSROOT. :100644 100644 e755961a... 9236b26d... M docs/README.about commit abef2feafec2ef1d80775451d80b20f338d8d623 Author: Dan Harkless AuthorDate: Sat May 6 15:29:19 2000 +0000 Commit: Dan Harkless CommitDate: Sat May 6 15:29:19 2000 +0000 Restored lost version histories for those moved files by doing a manual `mv' in the CVSROOT on mhost. CVS badly needs a `cvs mv' command so that you can move files (without having physical access to the CVSROOT) without losing versioning. Put MACHINES back at the top level as it needs to be read before building. Fixed DIST variable in {.,docs}/Makefile.in to reflect that and to add missing entry for "INSTALL" file. :100644 100644 4dcd1a73... 11acc13e... M ChangeLog commit 2894f47bd3f3d15d944e650cb4fadb1aec3a5e15 Author: Dan Harkless AuthorDate: Sat May 6 15:05:02 2000 +0000 Commit: Dan Harkless CommitDate: Sat May 6 15:05:02 2000 +0000 Fixed DIST targets to reflect that INSTALL and MACHINES are back at the top level. :100644 100644 e342d040... 9492cd07... M Makefile.in :100644 100644 236a5bca... 61e9f59b... M docs/Makefile.in commit 9f266941b583ea1dfc69d05c6c0f2fdf0920ab4c Author: Dan Harkless AuthorDate: Sat May 6 14:54:25 2000 +0000 Commit: Dan Harkless CommitDate: Sat May 6 14:54:25 2000 +0000 Files that must be read before building nmh should not go in the docs directory. Moved this file back to the top level (and made a couple of stylistic and grammar tweaks while I was at it). :100644 100644 df884bb7... 01cd8490... M MACHINES commit 1dbc35ec1f09fe240e15229e7492bb27973c08ed Author: Dan Harkless AuthorDate: Sat May 6 14:19:23 2000 +0000 Commit: Dan Harkless CommitDate: Sat May 6 14:19:23 2000 +0000 Deleting the versions Doug moved in with `cvs add', erasing the version history, in preparation for moving the original versions in the cvsroot. :100644 000000 df884bb7... 00000000... D docs/MACHINES commit d66e48eced59def411e289f040956b1ec3666cb0 Author: Doug Morris AuthorDate: Sat May 6 11:34:02 2000 +0000 Commit: Doug Morris CommitDate: Sat May 6 11:34:02 2000 +0000 reorganized documentation to make it bit neater again :100644 000000 f75933ee... 00000000... D COMPLETION-TCSH :100644 000000 5c10cc89... 00000000... D COMPLETION-ZSH :100644 100644 9f900858... 4dcd1a73... M ChangeLog :100644 000000 ea7cd58e... 00000000... D ChangeLog_MH-3_to_MH-6.6 :100644 000000 1d6542ec... 00000000... D ChangeLog_MH-6.7.0_to_MH-6.8.4.html :100644 000000 b6646393... 00000000... D DIFFERENCES :100644 000000 becf31a0... 00000000... D MAIL.FILTERING :100644 100644 7933b5b4... e342d040... M Makefile.in :100644 100644 d0ddc04d... 18f2557f... M README :100644 000000 be9e6dd9... 00000000... D TODO :100755 100755 0937a02b... bba17f25... M configure :100644 100644 735676d9... 111c53f5... M configure.in :000000 100644 00000000... df884bb7... A docs/MACHINES :000000 100644 00000000... 236a5bca... A docs/Makefile.in :100644 100644 eecf2705... 3c16ec78... M stamp-h.in commit dc35357cfd21782dac6f1fc35f375364b0d207a4 Author: uid1005 AuthorDate: Fri Apr 21 17:36:37 2000 +0000 Commit: uid1005 CommitDate: Fri Apr 21 17:36:37 2000 +0000 Corrected status printout when kpop is enabled :100755 100755 4b683300... 0937a02b... M configure :100644 100644 3caecbd2... 735676d9... M configure.in :100644 100644 673fec75... eecf2705... M stamp-h.in commit 6ac9c5dca97f6ecc5008d65f8f1e7ffcd8d6c77e Author: Dan Harkless AuthorDate: Tue Apr 18 00:17:50 2000 +0000 Commit: Dan Harkless CommitDate: Tue Apr 18 00:17:50 2000 +0000 One final tweak to the configure --help output for --enable-masquerade. :100644 100644 48b4bb20... 9f900858... M ChangeLog :100755 100755 42044bf6... 4b683300... M configure :100644 100644 e0089451... 3caecbd2... M configure.in :100644 100644 84db3c44... 673fec75... M stamp-h.in commit 0daa906477229d9f3e1ba2bd6982283e61c06a7a Author: Shantonu Sen AuthorDate: Mon Apr 17 22:49:39 2000 +0000 Commit: Shantonu Sen CommitDate: Mon Apr 17 22:49:39 2000 +0000 APOP supprt: Added info to ChangLog. :100644 100644 14d17bcb... 48b4bb20... M ChangeLog commit 13d2614380f499b1e5a1cc3546230239afe2b1dd Author: Dan Harkless AuthorDate: Mon Apr 17 22:09:00 2000 +0000 Commit: Dan Harkless CommitDate: Mon Apr 17 22:09:00 2000 +0000 The syntax I gave in the --help output for --enable-masquerade incorrectly implied that the earlier options were prerequisites for the later options (pointed out by Scott Blachowicz). No compact, non-confusing way to specify the real syntax that I can see, so I'll just remove the []s and leave the explaining about it being okay to specify a subset to the INSTALL file. Also added a TODO item to put in proper parsing of the masquerade: line and/or --enable-masquerade so if you misspell an option you find out about it, rather than just having it silently fail (this weakness was currently only documented in comments in the mts.conf-handling code). :100644 100644 28ccfea2... c0193816... M INSTALL :100644 100644 8c9f6985... be9e6dd9... M TODO :100755 100755 ebe1d164... 42044bf6... M configure :100644 100644 4bf21f97... e0089451... M configure.in :100644 100644 5419f61a... 84db3c44... M stamp-h.in commit e0f28fecbde8310591151f4688b96944c5284588 Author: Dan Harkless AuthorDate: Mon Apr 17 22:04:33 2000 +0000 Commit: Dan Harkless CommitDate: Mon Apr 17 22:04:33 2000 +0000 Someone (unfortunately original version history has been lost so I don't know who) changed "danh" to "your-id". That makes my introductory comment "we'll use version 1.0.4 and my mhost.com account, danh, as examples here" make no sense, though. If danh is going to be "parameterized", then 1.0.4 should be too. Doesn't make sense to parameterize one of the changing items and not the other one. If it's going to be done, danh should be changed to YOUR-ID or something and 1.0.4 (and 1_0_4) should be changed to X.Y.Z (and X_Y_Z). I just thought it'd be clearer to use real values and disclaim that fact up front. Anyhow, putting danh back until such time as someone wants to parameterize both items (and change the introductory text appropriately). :100644 100644 b384a30f... e2834a26... M docs/README.developers commit 98cf16c3e81c2be2122e16af7d58c2c8cbad9f7e Author: Dan Harkless AuthorDate: Mon Apr 17 21:25:23 2000 +0000 Commit: Dan Harkless CommitDate: Mon Apr 17 21:25:23 2000 +0000 I had left out aclocal.m4 on the "use this order" line as I didn't think it'd ever need to be changed. Someone ("ssen" -- looks like Doug forgot to update a chroot() passwd file again) added it, but in a separate sentence. That doesn't really make sense -- added it to the main sentence. Also changed my note that none of the mailing lists require you to be subscribed to post -- not true. As I originally thought, the exmh ones do require that -- the bounce messages were just slow in coming. :100644 100644 3529620c... b384a30f... M docs/README.developers commit b169c63d02335dac65f0c566cf8b95319bb932d4 Author: Dan Harkless AuthorDate: Mon Apr 17 18:48:03 2000 +0000 Commit: Dan Harkless CommitDate: Mon Apr 17 18:48:03 2000 +0000 Put a note saying that the paths this file refers to (stuff in docs/) are currently wrong. :100644 100644 e948d76b... d0ddc04d... M README commit 87d96c405cefd1785980e9246d243ae235b31c98 Author: Dan Harkless AuthorDate: Mon Apr 17 18:36:59 2000 +0000 Commit: Dan Harkless CommitDate: Mon Apr 17 18:36:59 2000 +0000 Undeleting everything at the top level for now. Doug's comment: Sat Apr 15 10:33:00 2000 Doug Morris * moved the documentation into a "docs" subdirectory. The top-level directory was becoming messy. I also created another file MAILING-LISTS describing the various nmh lists and the archival system, and updated the FAQ to refer to it. I also created a new README in the top level that is basically a list of pointers to the various documentation. The old README I've moved to docs/README.history, since that seemed like the right thing to call it. will be lost, but he can put back a modified version when we agree on what should really go in docs/. :100644 000000 7ec710c2... 00000000... D docs/ChangeLog commit cb057299c96a1adf1c47e1f2e038082baf28a723 Author: Dan Harkless AuthorDate: Mon Apr 17 18:34:40 2000 +0000 Commit: Dan Harkless CommitDate: Mon Apr 17 18:34:40 2000 +0000 Undeleting everything at the top level for now. :100644 000000 df884bb7... 00000000... D docs/MACHINES commit 320aaed58b655cad87c9591a14fa1bf7091d72d1 Author: Dan Harkless AuthorDate: Mon Apr 17 16:56:57 2000 +0000 Commit: Dan Harkless CommitDate: Mon Apr 17 16:56:57 2000 +0000 Added note that user questions are acceptable on nmh-workers. :100644 100644 afbbe01e... e65b9bb5... M docs/MAILING-LISTS commit 5dea0ddb8000c6d750a0f77b9b30adebdd5e8589 Author: Shantonu Sen AuthorDate: Mon Apr 17 05:29:49 2000 +0000 Commit: Shantonu Sen CommitDate: Mon Apr 17 05:29:49 2000 +0000 Added that you should check in aclocal.m4 after acconfig.h, if you change it. :100644 100644 4437340f... 3529620c... M docs/README.developers commit 80e6fa818d13dcbccce481789ea1cd269f1c7c72 Author: Shantonu Sen AuthorDate: Mon Apr 17 05:25:18 2000 +0000 Commit: Shantonu Sen CommitDate: Mon Apr 17 05:25:18 2000 +0000 APOP support: Making the apop option appear after pop in ./configure --help and committing in the right order to avoid unnecessary autoconfing. :100755 100755 c0add964... ebe1d164... M configure :100644 100644 9d3d2263... 4bf21f97... M configure.in :100644 100644 74ce6a8f... 5419f61a... M stamp-h.in commit 487fd343fb19fcf78eeacd79bf0099b278678971 Author: Shantonu Sen AuthorDate: Mon Apr 17 05:12:14 2000 +0000 Commit: Shantonu Sen CommitDate: Mon Apr 17 05:12:14 2000 +0000 Don't try to figure out ruserpass - just use version from sbr/ :100644 100644 cbfb4982... 7dd6110e... M aclocal.m4 commit 782849d31a0cc5a0f4cf989349152bdd7809f6ea Author: Shantonu Sen AuthorDate: Mon Apr 17 05:09:46 2000 +0000 Commit: Shantonu Sen CommitDate: Mon Apr 17 05:09:46 2000 +0000 APOP support: Use the ruserpass function in this directory for all password prompts, instead of using system functions. :100644 100644 10fb56ca... 4d71970f... M sbr/Makefile.in commit ac79e8d6a1a8a3cb3fb2438b03d3d0ba5ea2570d Author: Shantonu Sen AuthorDate: Mon Apr 17 05:08:32 2000 +0000 Commit: Shantonu Sen CommitDate: Mon Apr 17 05:08:32 2000 +0000 APOP support: If APOP is enabled, build it into inc and msgchk using $(APOPLIB). :100644 100644 e5b25e8c... 74ce6a8f... M stamp-h.in :100644 100644 f8e36c9e... 90b551c2... M uip/Makefile.in commit 3021e2535d74e219a9c7ccba2cc91c126e4b1a9f Author: Shantonu Sen AuthorDate: Mon Apr 17 05:07:03 2000 +0000 Commit: Shantonu Sen CommitDate: Mon Apr 17 05:07:03 2000 +0000 APOP support: Making APOP a ./configure option with --enable-apop, and giving more information about the types of POP support in the configuration summary. :100755 100755 de6c4cb1... c0add964... M configure :100644 100644 27b541dc... 9d3d2263... M configure.in commit 89f64d662eeac27f3b0e42fe77ee207f7971ecb8 Author: Shantonu Sen AuthorDate: Mon Apr 17 05:04:05 2000 +0000 Commit: Shantonu Sen CommitDate: Mon Apr 17 05:04:05 2000 +0000 Adding APOP #defines :100644 100644 c35d705a... 612c9ece... M acconfig.h :100644 100644 a97210fb... a07a8917... M config.h.in commit b28e871ba874a53257b37eed94adfc365ed6ebf2 Author: Shantonu Sen AuthorDate: Sun Apr 16 13:28:12 2000 +0000 Commit: Shantonu Sen CommitDate: Sun Apr 16 13:28:12 2000 +0000 Changed some string terminations from NULL to \0. :100644 100644 bfc39eaa... 6f2b35ad... M uip/popsbr.c commit 1a8f78d12723e301661fd469f39fb6a62bb10954 Author: Doug Morris AuthorDate: Sat Apr 15 04:28:27 2000 +0000 Commit: Doug Morris CommitDate: Sat Apr 15 04:28:27 2000 +0000 Moved most of the documentation into a new "docs" subdirectory. Added a MAILING-LISTS file talking about the lists and archives, and updated the FAQ to refer to it. :100644 100644 a4e21cdd... e948d76b... M README :000000 100644 00000000... 7ec710c2... A docs/ChangeLog :000000 100644 00000000... df884bb7... A docs/MACHINES :000000 100644 00000000... afbbe01e... A docs/MAILING-LISTS :000000 100644 00000000... e755961a... A docs/README.about :000000 100644 00000000... 4437340f... A docs/README.developers commit a92f475332a69dffb12d5587090d2f78891f81b8 Author: Dan Harkless AuthorDate: Sat Apr 15 02:00:43 2000 +0000 Commit: Dan Harkless CommitDate: Sat Apr 15 02:00:43 2000 +0000 Added a "releasing nmh" section to README.developers, while the process was fresh in my mind. :100644 100644 339c8759... 14d17bcb... M ChangeLog commit c47dab954653332ffa8c371f1fa90a12815e48c2 Author: Dan Harkless AuthorDate: Fri Apr 14 21:38:37 2000 +0000 Commit: Dan Harkless CommitDate: Fri Apr 14 21:38:37 2000 +0000 Okay, got that tag stuff straightened out. Now upping the version to 1.0.4+dev. :100644 100644 11bdd15c... 339c8759... M ChangeLog :100644 100644 ee90284c... e76778f2... M VERSION commit 24f6146050a375b70dee14c7e3b500d17fa64209 Author: Dan Harkless AuthorDate: Fri Apr 14 21:26:56 2000 +0000 Commit: Dan Harkless CommitDate: Fri Apr 14 21:26:56 2000 +0000 Oops. Had a duplicate entry. :100644 100644 669ef5bf... 11bdd15c... M ChangeLog commit dfbb9a28b051dec8034557c7d3e19216a861beec Author: Dan Harkless AuthorDate: Fri Apr 14 21:05:34 2000 +0000 Commit: Dan Harkless CommitDate: Fri Apr 14 21:05:34 2000 +0000 Oops. Didn't do a `cvs rtag` before changing the version to 1.0.4+dev. Putting it back. :100644 100644 9ec45a49... 669ef5bf... M ChangeLog :100644 100644 e76778f2... ee90284c... M VERSION commit 8837de0088fb9e04c6a08b4dcd7628eaf9394db4 Author: Dan Harkless AuthorDate: Fri Apr 14 20:47:32 2000 +0000 Commit: Dan Harkless CommitDate: Fri Apr 14 20:47:32 2000 +0000 Upped the version number to 1.0.4+dev. :100644 100644 cf2891e0... 9ec45a49... M ChangeLog :100644 100644 ee90284c... e76778f2... M VERSION commit da24fe8019b4d05c5f0762db60809e7a961c29c7 Author: Dan Harkless AuthorDate: Fri Apr 14 20:40:31 2000 +0000 Commit: Dan Harkless CommitDate: Fri Apr 14 20:40:31 2000 +0000 * Added new files README.developers, ChangeLog_MH-3_to_MH-6.6, and ChangeLog_MH-6.7.0_to_MH-6.8.4.html to DIST target in Makefile.in. * Released nmh-1.0.4. :100644 100644 fe23a54c... cf2891e0... M ChangeLog :100644 100644 ed091530... 7933b5b4... M Makefile.in :100644 100644 724c5dda... ee90284c... M VERSION commit e66e25ec491d0fb3df708000d8494b4d598f0263 Author: Dan Harkless AuthorDate: Wed Apr 12 00:54:54 2000 +0000 Commit: Dan Harkless CommitDate: Wed Apr 12 00:54:54 2000 +0000 Just reworded the bit about '%s' being safe not to quote (it's only safe not to quote on the -charset- line). :100644 100644 b3595558... fe23a54c... M ChangeLog commit b93692cdcea35c835fcbc3617f80decd545ca3b2 Author: Dan Harkless AuthorDate: Wed Apr 12 00:25:23 2000 +0000 Commit: Dan Harkless CommitDate: Wed Apr 12 00:25:23 2000 +0000 Applied Brian Campbell 's mhn.defaults.sh patch: It appears that there shouldn't be quotes around the %s in the iso-8859-1 charset entry; xterm passes the remaining arguments to the program, quoting them means that xterm thinks they're part of the program's name. %s doesn't come from MIME headers, so not quoting it is safe. :100644 100644 4adc15a4... b3595558... M ChangeLog :100755 100755 603bcb1c... e25cac42... M etc/mhn.defaults.sh commit 113043aa621e4ff98e543086abb754a8100bb850 Author: Doug Morris AuthorDate: Sun Apr 9 07:04:24 2000 +0000 Commit: Doug Morris CommitDate: Sun Apr 9 07:04:24 2000 +0000 bug fix - prevents core-dumping on scan -format '1' :100644 100644 d364005f... 4adc15a4... M ChangeLog :100644 100644 d3e5ea90... e857c7d9... M sbr/fmt_compile.c commit d72ac27d644108db991fe5335b904368010ddcf8 Author: Dan Harkless AuthorDate: Fri Apr 7 00:42:55 2000 +0000 Commit: Dan Harkless CommitDate: Fri Apr 7 00:42:55 2000 +0000 Richard Coleman threw out a lot of old MH-specific files in nmh. Much of the stuff, indeed, is not worth saving, but there are nuggets that are very worthwhile, and should probably be added back in. Most important, IMHO, are the MH change logs, as they can help answer questions like "Why is this code like this?" or "How long has this been broken?" or "What was this ever used for?" I've added a new file to the nmh tree called ChangeLog_MH-3_to_MH-6.6. It's cobbled together from the mh-6.8.4/papers/mh*/MHCHANGES files. I've re-ordered the entries to go from newest at the top to oldest at the bottom to match the ChangeLog convention. Unfortunately there are no change logs for versions of MH prior to 3 in the MH tar files available at . Also, it appears to me that there are MH-6.6 changes that aren't documented in the logs. I've also added ChangeLog_MH-6.7.0_to_MH-6.8.4.html. This is based on mh-6.8.4/papers/changes/mh-changes.ms. The nroff format and its "catman"-type output are a pain to deal with, but I was loath to throw away the formatting, so I converted the file to HTML. The only actual markup in the body are the "" and "" tags, and "<" and ">" instead of '<' and '>', so it's quite doable to view the file in plain ASCII mode as well. Note that some of the changes this file documents as having been made in MH-6.8.4 may not be present in nmh -- Richard started with 6.8.3 and later put in certain 6.8.4 stuff. :100644 100644 c15f9107... d364005f... M ChangeLog :000000 100644 00000000... ea7cd58e... A ChangeLog_MH-3_to_MH-6.6 :000000 100644 00000000... 1d6542ec... A ChangeLog_MH-6.7.0_to_MH-6.8.4.html commit 985869792a2afcc507d8bbd43f88680e81e3cc20 Author: Dan Harkless AuthorDate: Thu Apr 6 19:56:35 2000 +0000 Commit: Dan Harkless CommitDate: Thu Apr 6 19:56:35 2000 +0000 Whoah, this should have been changed a long time ago. For one thing, Richard forgot to update the copyright date when he made modifications in 1999, but more significantly, this COPYRIGHT notice hasn't been changed since Richard ceded control of nmh development and it became an open-source project. Changed the COPYRIGHT notice to a BSD License, with a couple of minor wording tweaks. Copyright is assigned to "the authors of nmh", which is anyone who writes code, whether they have CVS accounts or not. :100644 100644 19485053... 5734c15d... M COPYRIGHT commit 1b8316707b7154f58263e662771c0e81267884f8 Author: Dan Harkless AuthorDate: Thu Apr 6 00:22:06 2000 +0000 Commit: Dan Harkless CommitDate: Thu Apr 6 00:22:06 2000 +0000 * Add some way to configure whether you prefer to see text/plain or text/html parts of multipart/alternative messages. :100644 100644 890511d9... 8c9f6985... M TODO commit dfacc915824a819be2e33cdb2a34d1d1de27fc34 Author: Dan Harkless AuthorDate: Thu Apr 6 00:11:50 2000 +0000 Commit: Dan Harkless CommitDate: Thu Apr 6 00:11:50 2000 +0000 Applied Eric Schnoebelen 's mhshowsbr.c patch fixing apparent bugs in Dan Winship's new security quoting code: Since upgrading, I've been getting the following errors while attempting to process some MIME messages: (1) Syntax error: Unterminated quoted string exit 2 and: (2) line 1/10 (END)Segmentation fault (core dumped) (2) appears to be due to the testing of an unset pointer in mhshowsbr.c:show_multi_aux(). (1) appears to be caused by mis-quoting a filename being handed to the shell in mhshowsbr.c:show_content_aux(). Resolving the pointer reference issue in mhshowsbr.c:show_multi_aux() turned up a similar mis-quoting problem in the routine. :100644 100644 304ae741... c15f9107... M ChangeLog :100644 100644 97455045... 71f55a43... M uip/mhshowsbr.c commit 78e3296b837d83a015c255acbcf47b769dd3d585 Author: Dan Harkless AuthorDate: Fri Mar 31 04:25:26 2000 +0000 Commit: Dan Harkless CommitDate: Fri Mar 31 04:25:26 2000 +0000 Terran Melconian pointed out that my theory as to why -help was printed as "-(help)" in the -help output was probably not the most likely scenario. Added his. ;^> :100644 100644 b03b6e6b... 304ae741... M ChangeLog commit e7f0dbf0856b7eb1f97f4c95fe39497b1ca97998 Author: Doug Morris AuthorDate: Tue Mar 28 14:42:36 2000 +0000 Commit: Doug Morris CommitDate: Tue Mar 28 14:42:36 2000 +0000 added Todd Miller's packf patch :100644 100644 9caf15e2... b03b6e6b... M ChangeLog :100644 100644 857263a1... cc35f5f1... M uip/dropsbr.c commit 14976cc65aac9f1a8d3bc2987bccd437a158b3f1 Author: Dan Harkless AuthorDate: Fri Mar 17 20:19:43 2000 +0000 Commit: Dan Harkless CommitDate: Fri Mar 17 20:19:43 2000 +0000 When I applied Wesley Craig's original KPOP patch, I made a change directly to config.h.in. That's a no-no since that file is automatically generated. Now that I've applied Wesley's second patch that makes things work as I had originally documented, I'm re-making the change here, but this time by properly modifying acconfig.h and then generating config.h.in from that. :100644 100644 8d15ad9e... c35d705a... M acconfig.h :100644 100644 4fa91e5e... a97210fb... M config.h.in :100644 100644 61c09803... e5b25e8c... M stamp-h.in commit b1be76de8f184485753349ec27b2cdf2a4530965 Author: Dan Harkless AuthorDate: Fri Mar 17 20:11:03 2000 +0000 Commit: Dan Harkless CommitDate: Fri Mar 17 20:11:03 2000 +0000 wesley.craig@umich.edu did not document his previous KPOP patch, so I did so, and asked him to check what I wrote. Unfortunately he didn't notice my misunderstanding of his patch. I wrote that if you #define POPSERVICE "kpop", inc and msgchk will use KPOP exclusively, but if you leave it as "pop3", you can use Wesley's new -kpop switch on a given invocation. Instead, however, -kpop turned out to be necessary on every invocation, and a KPOP user complained. Applied Wesley's new patch, which makes things work like I thought his original patch did. After that, did one more clarifying pass to the documentation in inc.man and msgchk.man. :100644 100644 fe729fa3... 9caf15e2... M ChangeLog :100644 100644 dda206c6... 8c11b2f9... M man/inc.man :100644 100644 973fb4ba... 5054c339... M man/msgchk.man :100644 100644 f00c337e... 0d36423b... M uip/inc.c :100644 100644 2553c496... d91330b7... M uip/msgchk.c commit a8e56d438ed27c6c77a6be33b54f315eb1d4ba22 Author: Dan Harkless AuthorDate: Thu Mar 16 02:40:42 2000 +0000 Commit: Dan Harkless CommitDate: Thu Mar 16 02:40:42 2000 +0000 Added a new README.developers file. From the file: This file is intended to provide a few tips for anyone doing development on nmh. Developers who learn things "the hard way" about the nmh codebase (as opposed to local info best encoded in a comment) are encouraged to share their wisdom here. Currently the topics are "autoconf files" and "directory structure". :100644 100644 a4a698cf... fe729fa3... M ChangeLog commit fd2a10c17dec1491b240a3f098eb621c7bf55b31 Author: Dan Harkless AuthorDate: Wed Mar 15 23:37:30 2000 +0000 Commit: Dan Harkless CommitDate: Wed Mar 15 23:37:30 2000 +0000 When I added my --enable-masquerade option, you'll note that I didn't make it --enable-nmh-masquerade. I find the --enable-nmh-* options too wordy and I'm not sure why Richard went that route. I've renamed them to just --enable-*, but the old versions will still work as well (they just aren't advertised). Added a line to the "nmh configuration" output saying whether POP is enabled. :100644 100644 62dfdf3d... a4a698cf... M ChangeLog :100644 100644 b9523b5a... 28ccfea2... M INSTALL :100644 100644 519a6237... df884bb7... M MACHINES :100644 100644 9c0ff742... 8d15ad9e... M acconfig.h :100644 100644 2fc6d3ba... 4fa91e5e... M config.h.in :100755 100755 9b60c3ad... de6c4cb1... M configure :100644 100644 814884f4... 27b541dc... M configure.in :100644 100644 611b66d1... 990e31c0... M man/mh-tailor.man :100644 100644 1c406a7c... 61c09803... M stamp-h.in commit 50d72c7ccf5c1a2672ae3c5721e465a5b854a058 Author: Dan Harkless AuthorDate: Wed Mar 15 22:25:16 2000 +0000 Commit: Dan Harkless CommitDate: Wed Mar 15 22:25:16 2000 +0000 When I fixed the long-standing makedir() bugs in January, I had the code call strtoul(..., 0), which I believed to be safe as all modes specified as ASCII constants in the nmh code started with a leading zero (signifying octal), which I did as it would work if internal constants were ever changed to hex. Unfortunately I was unaware of the "Folder-Protect:" .mh_profile entry, which mh-profile.man documents as an octal-only constant, with no leading zero required. I've changed the strtoul() call to an atooi() call and removed the misleading leading zeroes on the ASCII octal constants in the code and man pages. Also changed the "Folder-Protect:" example in the man page to something more interesting than a duplication of the default. :100644 100644 26045ed1... 62dfdf3d... M ChangeLog :100644 100644 1050be78... 9c0ff742... M acconfig.h :100644 100644 89b10e89... 2fc6d3ba... M config.h.in :100644 100644 e1326ed4... 351a7492... M man/mh-profile.man :100644 100644 e4c3c26c... ec859cc1... M sbr/makedir.c :100644 100644 f790c365... 1c406a7c... M stamp-h.in commit 2c0f411d65a869c6020fa1b624aa56acaa8636ff Author: Dan Harkless AuthorDate: Tue Mar 14 21:21:28 2000 +0000 Commit: Dan Harkless CommitDate: Tue Mar 14 21:21:28 2000 +0000 Added: I put Simon's patch under the control of a new #define called FIX_NON_Y2K_COMPLIANT_MUA_DATES. There's some commentary in acconfig.h about when you might not want to #define it. :100644 100644 20601029... 26045ed1... M ChangeLog commit 36c5f274c2eda0d73f52a8e0066168f77475f324 Author: Dan Harkless AuthorDate: Tue Mar 14 21:15:55 2000 +0000 Commit: Dan Harkless CommitDate: Tue Mar 14 21:15:55 2000 +0000 Added missing dependency in zotnet/tws/Makefile.in for dtimep.c: dtimep.c-lexed. :100644 100644 0616c3f9... 20601029... M ChangeLog :100644 100644 3f96711e... fe05e018... M zotnet/tws/Makefile.in commit 79f8761e5c4f65083cd06b41e850c548fce8f4f0 Author: Dan Harkless AuthorDate: Tue Mar 14 21:07:56 2000 +0000 Commit: Dan Harkless CommitDate: Tue Mar 14 21:07:56 2000 +0000 Created new dtimep.c-lexed with Simon's change using dtimep.lex lexed on Solaris 2.6. Removed my comment about strdup(). The Solaris 2.6 failure was due to failing to do a make distclean after configuring for Ultrix 4.2A. I'll leave the change, though, since it's still a good one (just not worth reporting in the ChangeLog). :100644 100644 8d7c45ce... 0616c3f9... M ChangeLog :100644 100644 12a209bc... 9ad02fac... M zotnet/tws/dtimep.c-lexed commit 898bc853c79a8a8506f39c6f57a7febe98b6afe4 Author: Dan Harkless AuthorDate: Tue Mar 14 20:50:19 2000 +0000 Commit: Dan Harkless CommitDate: Tue Mar 14 20:50:19 2000 +0000 Changed strdup() in strdup.c to take a _const_ char*. Don't know why this didn't hit anyone before, but I wasn't able to compile on Solaris 2.6 without doing this, due to a "previous declaration" error. :100644 100644 cde4c5ef... 8d7c45ce... M ChangeLog :100644 100644 05a017e5... 18df0105... M sbr/strdup.c commit 6a471c368b128394153c13c6d8f55cf0855f5779 Author: Dan Harkless AuthorDate: Tue Mar 14 20:40:47 2000 +0000 Commit: Dan Harkless CommitDate: Tue Mar 14 20:40:47 2000 +0000 Applied Simon Burge 's dtimep.lex patch: It seems that some MUA's didn't handle y2k very well - ELM seems to be one of them, and Ultrix's DXmail (based on MH!). I've got a few emails this month that look like: 575 Jan 00 Xxxxxx Xxxx 3603 ... and 22+ Jan 00 Xxx Xxxxx 1771 ... The first has "15 Jan 100" as the date and the second has "19 Jan 00" as the date. The following works around this so that scan, show, sortm, etc work ok. Added scan.MMDDYY and scan.YYYYMMDD format files. :100644 100644 f4dfb1a5... cde4c5ef... M ChangeLog :100644 100644 15178d7e... 1050be78... M acconfig.h :100644 100644 b9b9ed16... 89b10e89... M config.h.in :100644 100644 42f38e63... 2f78e341... M etc/Makefile.in :000000 100644 00000000... d79ad3c3... A etc/scan.MMDDYY :000000 100644 00000000... 626ab742... A etc/scan.YYYYMMDD :100644 100644 ec0a3efa... f790c365... M stamp-h.in :100644 100644 467dc85d... ab2e4f51... M zotnet/tws/dtimep.lex commit 7593f8f93951b6ca853a72bdbcd0a34dc741bc52 Author: Dan Harkless AuthorDate: Tue Mar 14 09:20:27 2000 +0000 Commit: Dan Harkless CommitDate: Tue Mar 14 09:20:27 2000 +0000 * Applied, after some finessing, Simon Burge 's --with-smtpservers patch: Here's a patch that allows you to add --with-smtpservers= to the ./configure command line to set the "servers: " line in etc/mts.conf. Around here, we use "mailhost" so that all machines in the current domain just talk to a central machine and nothing else runs an MTA. Now, I can use --with-smtpservers=mailhost instead of having to remember to fix this by hand (and often forgetting to do so!). * Inspired by Simon's patch, added an --enable-masquerade option to configure. It will set the "masquerade:" line of mts.conf. You may specify a subset of the three types of masquerading, like --enable-masquerade="draft_from mmailid", or leave off explicit arguments to enable all three types. * Alphabetized the --enable and --with options in configure.in and INSTALL and added documentation of the two new options to the latter. * Added new dependency for mts.conf: Makefile. If this isn't done, then when you reconfigure nmh with new values for --enable-masquerade or --with-smtpservers, you'll fail to get an updated copy of mts.conf. :100644 100644 0410e493... f4dfb1a5... M ChangeLog :100644 100644 7eae1db9... b9523b5a... M INSTALL :100755 100755 d31b2e45... 9b60c3ad... M configure :100644 100644 a3d532f6... 814884f4... M configure.in :100644 100644 b45ef86c... 42f38e63... M etc/Makefile.in :100644 100644 4151d65f... 16b5bab5... M etc/mts.conf.in :100644 100644 b1e8c9c7... ec0a3efa... M stamp-h.in commit 79fcc0e0c68cd0cb8b9edc7c9db5eeaa2358d756 Author: Dan Harkless AuthorDate: Tue Mar 14 05:24:57 2000 +0000 Commit: Dan Harkless CommitDate: Tue Mar 14 05:24:57 2000 +0000 Applied Simon Burge 's dtime.c patch: There's a wrap-around problem that affects the implementation of Zeller's congruence in dtime.c. This causes the day-of-week calculations to fail for dates after Feb 29, 2000 (probably up until some year far in the future). :100644 100644 ba38c6b3... 0410e493... M ChangeLog :100644 100644 bbfccf0f... adf153b6... M zotnet/tws/dtime.c commit 34ec62af8fc74c3c9d143328f485c82ef7aad327 Author: Dan Harkless AuthorDate: Tue Mar 14 05:05:49 2000 +0000 Commit: Dan Harkless CommitDate: Tue Mar 14 05:05:49 2000 +0000 Modified username_extension masquerading to only use the extended address on generated [Resent-]From: lines and SMTP envelope From:. With Neil's original implementation, nmh's global idea of the username was changed, which would result in inc lying and saying you had no new mail because it was looking for a mailbox called, for instance, "dan-nmh" (where username was "dan" and $USERNAME_EXTENSION was "-nmh"). While in there (adrsprintf()), added checking of snprintf()'s return code and added calls to adios() when things are not kosher. Also simplfied the really confusing REALLYDUMB #ifdef'ing, which didn't even jibe with the comment explaining REALLYDUMB in acconfig.h. Now adrsprintf() will always return just the username, even if an explicit domain is passed in (which currently doesn't happen anywhere in nmh). :100644 100644 dc732461... ba38c6b3... M ChangeLog :100644 100644 53c0875b... 611b66d1... M man/mh-tailor.man :100644 100644 d1fd730d... 4f734b44... M sbr/addrsbr.c :100644 100644 91944042... 3b0b1809... M zotnet/mts/mts.c commit 8d61a39c1f636b7edd184767225492a4d5dacde5 Author: Dan Harkless AuthorDate: Tue Mar 14 02:39:13 2000 +0000 Commit: Dan Harkless CommitDate: Tue Mar 14 02:39:13 2000 +0000 Just removed the odd space between the "!" and the "/bin/sh". I believe some OSes might choke on that, and certainly no OS requires it. :100755 100755 8b29fcd1... 603bcb1c... M etc/mhn.defaults.sh commit c085eca6dea41bf9c0ac2749215e256cc54ff628 Author: Dan Harkless AuthorDate: Tue Mar 14 02:29:26 2000 +0000 Commit: Dan Harkless CommitDate: Tue Mar 14 02:29:26 2000 +0000 Applied Sullivan N. Beck 's mhshow-suffix patch: With the patch below, you can add lines like: mhshow-suffix-application/msword: .doc mhshow-suffix-application/PostScript: .ps to the mhn.defaults file to append the given suffix to a scratch file. This allows applications which require a certain suffix to run properly. Removed -force_html from lynx entry in mhn.defaults.sh (I believe older versions of lynx lack that option) and added "mhshow-suffix-text/html: .html". :100644 100644 7aa74d44... dc732461... M ChangeLog :100755 100755 5630bcca... 8b29fcd1... M etc/mhn.defaults.sh :100644 100644 e4719dcd... 473f4ac7... M man/mhn.man :100644 100644 30a925f0... f4b42eaa... M man/mhshow.man :100644 100644 86a08b7a... 1c46076d... M uip/mhparse.c commit ba32dee02e85132dd8bd05fae876692d61c50053 Author: Dan Harkless AuthorDate: Mon Mar 6 20:19:04 2000 +0000 Commit: Dan Harkless CommitDate: Mon Mar 6 20:19:04 2000 +0000 Applied Neil W Rickert 's msh.c patch: I finally tracked down the problem in msh that was causing errors whenever I tried to examine a 'mmdf' style mailbox. It turns out that not enough memory was being allocated with calloc(), causing memory pointers to be overwritten and corrupted. :100644 100644 9a29c0f3... 7aa74d44... M ChangeLog :100644 100644 2769c240... eeb87a10... M uip/msh.c commit 077b355833f623241d5d145810b91da60e4c260c Author: Dan Harkless AuthorDate: Sat Mar 4 00:02:46 2000 +0000 Commit: Dan Harkless CommitDate: Sat Mar 4 00:02:46 2000 +0000 Changed the new "plussed_user" option to mts.conf's "masquerade:" to "username_extension" after getting feedback from qmail users, who use '-' as a separator rather than '+'. Removed checking of $USERPLUS variable. Now check $USERNAME_EXTENSION, which needs to include the appropriate separator for your MTA ('-', '+', or whatever) as its first character. :100644 100644 deb61630... 9a29c0f3... M ChangeLog :100644 100644 6f1af4f0... 4151d65f... M etc/mts.conf.in :100644 100644 ff767b0d... 53c0875b... M man/mh-tailor.man :100644 100644 c344043a... 45261778... M man/post.man :100644 100644 0951c4c8... 91944042... M zotnet/mts/mts.c commit 975a1ff048a6f10f88225c4f06b22c898ede62c4 Author: Dan Harkless AuthorDate: Fri Mar 3 07:30:31 2000 +0000 Commit: Dan Harkless CommitDate: Fri Mar 3 07:30:31 2000 +0000 Oops. I was using an older email address for Neil -- now he uses the $USERPLUS feature that I'm crediting him for. ;^> :100644 100644 bbe8092e... deb61630... M ChangeLog commit a81c28f4a2ee69469c5e9f5d65389a89c6070ed4 Author: Dan Harkless AuthorDate: Fri Mar 3 07:24:41 2000 +0000 Commit: Dan Harkless CommitDate: Fri Mar 3 07:24:41 2000 +0000 Added a new "boolean" type to mh.h and TRUE and FALSE constants. Added a note to DIFFERENCES stating that it's out-of-date (Richard was the last one to update it) and that we should consider only documenting incompatibilities with MH there. Implemented (and documented) a third kind of username masquerading: "plussed user" masquerading. This one was suggested by Neil Rickert . It's based on sendmail's "plussed user" feature, where mail sent to + will be delivered to . When it's enabled, it's controlled by the $USERPLUS environment variable. How is it enabled? Well, that leads me to: Renamed the "mmailid:" setting in mts.conf to "masquerade:", and changed it so that rather than being a boolean, it can be set to any combination of the three values "draft_from", "mmailid", and "plussed_user". Thus it is now possible to enable the three types of masquerading individually. Fixed a bug with "mmailid" masquerading (dating back to MH?) where if it was turned on, ','s would no longer be considered GECOS field delimiters. :100644 100644 d96f7c10... bbe8092e... M ChangeLog :100644 100644 1a240370... b6646393... M DIFFERENCES :100644 100644 63dcbbed... 7eae1db9... M INSTALL :100644 100644 b8a61b8e... 6f1af4f0... M etc/mts.conf.in :100644 100644 a59b0a0e... 81a6021c... M h/mh.h :100644 100644 ea95045a... ff767b0d... M man/mh-tailor.man :100644 100644 d5b9e4e5... c344043a... M man/post.man :100644 100644 66d978cc... abc22859... M uip/post.c :100644 100644 26e48077... 0951c4c8... M zotnet/mts/mts.c commit 7bc88af67d0a3ef9df2309a7521b973033ecbe49 Author: Dan Harkless AuthorDate: Thu Mar 2 08:20:00 2000 +0000 Commit: Dan Harkless CommitDate: Thu Mar 2 08:20:00 2000 +0000 Oops. You can't just change comments in configure.in, or configure won't be modified (it doesn't contain the comments) and you won't be able to commit it, and then the timestamps'll be messed up for everyone and unnecessary autoconf calls will occur. Added some unnecessary (but frequently used in the file) trailing 'dnl's on some AC_SUBST()s. :100755 100755 b7c987be... d31b2e45... M configure :100644 100644 5176a8aa... a3d532f6... M configure.in :100644 100644 da7a698b... b1e8c9c7... M stamp-h.in commit 6496d88b11e854670d7a4dab05a7b4c4b4e3e978 Author: Dan Harkless AuthorDate: Thu Mar 2 07:56:00 2000 +0000 Commit: Dan Harkless CommitDate: Thu Mar 2 07:56:00 2000 +0000 Oops. My last group commit comment failed to mention what I was doing in this file. I was adding: * Change all man pages to group all the commandline options together in one section with each as a separate mini-heading. Having to dig through prose to find what a particular option does is a pain in the nads. This time, moved it out of the [POSSIBILITIES] section and put it in the [TODO] section, as I feel it's very important (and wouldn't be that difficult to do -- somewhat time-consuming, yes, but not difficult). :100644 100644 345960da... 890511d9... M TODO commit 84b98d0484fe61d4ebe205016e35a06da194f525 Author: Dan Harkless AuthorDate: Thu Mar 2 07:52:47 2000 +0000 Commit: Dan Harkless CommitDate: Thu Mar 2 07:52:47 2000 +0000 Changed the GECOS-field '&' translation behavior to be controlled by the BSD42 #define rather than GCOS_HACK, since it's apparently always appropriate on OSes where BSD42 is #defined, and never appropriate on any other OSes. Thanks to Kimmo Suominen for responding to my "What is this code here for?" comment in mts.c and explaining the feature. Also added ULTRIX 4.2A to the list of OSes that have an initgroups() function but no prototype in the system headers. :100644 100644 9ac95efe... d96f7c10... M ChangeLog :100644 100644 27ca1348... 345960da... M TODO :100644 100644 146d00a4... 15178d7e... M acconfig.h :100644 100644 e6073bd3... b9b9ed16... M config.h.in :100644 100644 37204fa2... 5176a8aa... M configure.in :100644 100644 ef93cba1... da7a698b... M stamp-h.in :100644 100644 e12b940e... 22ba3e8b... M uip/slocal.c :100644 100644 254a758e... 26e48077... M zotnet/mts/mts.c commit ba22f50e4261b7a2a07cd5baf6b035425c45df28 Author: Dan Harkless AuthorDate: Tue Feb 29 06:17:58 2000 +0000 Commit: Dan Harkless CommitDate: Tue Feb 29 06:17:58 2000 +0000 Made a goofy change so that I could produce a new configure because when I checked in the last version I did it with "cvs commit ... configure configure.in ..." and that apparently gives configure.in a newer timestamp than configure, which results in spurious autoconf runs when people download the source. We need to write a little note to developers somewhere saying what in order you need to check in those autoconf files and how long you need to wait in between each one and such... :100755 100755 c4b66cb6... b7c987be... M configure :100644 100644 0afb9279... 37204fa2... M configure.in :100644 100644 04a20d9a... ef93cba1... M stamp-h.in commit b1450ec537bd31be606633aa363201cc2ed95b9a Author: Dan Harkless AuthorDate: Tue Feb 29 05:59:16 2000 +0000 Commit: Dan Harkless CommitDate: Tue Feb 29 05:59:16 2000 +0000 Changed "echo > stamp-h.in" in Makefile.in to "date > stamp-h.in" so that stamp-h.in will be different each time configure.in and related files are changed, making it easier to check it in (which is necessary to prevent unnecessary autoconf calls). My declaration of initgroups() in slocal.c to eliminate the "no prototype" warning wasn't portable (FreeBSD 3.[23] choked). Now use AC_EGREP_HEADER to see where initgroups() is declared, if anywhere. :100644 100644 7a2a57fd... 9ac95efe... M ChangeLog :100644 100644 c6594d17... ed091530... M Makefile.in :100644 100644 dda87bfe... 146d00a4... M acconfig.h :100644 100644 81af712b... e6073bd3... M config.h.in :100755 100755 357e2efe... c4b66cb6... M configure :100644 100644 f211ca0d... 0afb9279... M configure.in :100644 100644 139597f9... 04a20d9a... M stamp-h.in :100644 100644 b665280b... e12b940e... M uip/slocal.c commit c4ce52f0d1cc06ae49317c31a068a5e555bf54d6 Author: Dan Harkless AuthorDate: Tue Feb 29 05:16:35 2000 +0000 Commit: Dan Harkless CommitDate: Tue Feb 29 05:16:35 2000 +0000 Upped the version number to 1.0.3+dev (ideally this should be done by whoever makes a release tar file, immediately after doing so). Applied Paul Fox 's scansbr.c patch, posted to comp.mail.mh, which he says prevents loss of mail when inc'ing into a full filesystem. :100644 100644 e44eda5d... 7a2a57fd... M ChangeLog :100644 100644 21e8796a... 724c5dda... M VERSION :100644 100644 44cbf0d4... 143a059c... M uip/scansbr.c commit 8146bc09fc2e8ad69520ba998be51fb02cbf069c Author: Ruud de Rooij AuthorDate: Mon Feb 28 17:09:02 2000 +0000 Commit: Ruud de Rooij CommitDate: Mon Feb 28 17:09:02 2000 +0000 * Fix security hole in mhshowsbr.c which allowed untrusted shell code to be executed. * Released nmh 1.0.3. :100644 100644 9b5ce64d... e44eda5d... M ChangeLog :100644 100644 f650172c... 21e8796a... M VERSION :100755 100755 8c9e7802... 357e2efe... M configure :100644 100644 ef6f02c1... 97455045... M uip/mhshowsbr.c commit e7842917b12445fe042f8b4656e8dde2c3105faf Author: Dan Harkless AuthorDate: Thu Feb 10 18:50:23 2000 +0000 Commit: Dan Harkless CommitDate: Thu Feb 10 18:50:23 2000 +0000 Oops. %-escapes on mhstore lines in mhn.defaults.sh should not be surrounded by single quotes, as a shell is not spawned when just saving files, and the filenames will end up with literal quotes embedded in them. :100644 100644 5bf89530... 9b5ce64d... M ChangeLog :100755 100755 e3fa2fd9... 5630bcca... M etc/mhn.defaults.sh commit e75d3193f9f7cbfe44f808620fbde90bd3e727c2 Author: Dan Harkless AuthorDate: Fri Feb 4 20:36:43 2000 +0000 Commit: Dan Harkless CommitDate: Fri Feb 4 20:36:43 2000 +0000 Removed an item that Richard did without removing its TODO, and removed an item that was duplicated in two different priority sections. :100644 100644 3ae3679d... 27ca1348... M TODO commit 5e6f0bdeffd667c5413ce27c73ea31c04fb9e9cf Author: Dan Harkless AuthorDate: Fri Feb 4 20:34:07 2000 +0000 Commit: Dan Harkless CommitDate: Fri Feb 4 20:34:07 2000 +0000 Whoever originally added the -help switch to all the commands got too cute and had the option itself print out as "-(help)" in the -help output. I guess the idea was to make reference to the fact that clearly you know about the -help option since you're currently looking at its output. I think it's a bad idea to overload the meaning of the parentheses, however -- they're supposed to indicate what abbreviated prefix of the switch you're allowed to specify. It doesn't make sense to show that you're allowed to "abbreviate" the switch to its entire length. :100644 100644 749e73cd... 5bf89530... M ChangeLog commit 017a82124bf2ea39ced5aa4c8f969c18b3c2fb90 Author: Dan Harkless AuthorDate: Fri Feb 4 20:28:23 2000 +0000 Commit: Dan Harkless CommitDate: Fri Feb 4 20:28:23 2000 +0000 Whoever originally added the -help switch to all the commands got too cute and had the option itself print out as "-(help)" in the -help output. I guess the idea was to make reference to the fact that clearly you know about the -help option since you're currently looking at its output. I think it's a bad idea to overload the meaning of the parentheses, however -- they're supposed to indicate what abbreviated prefix of the switch you're allowed to specify. It doesn't make sense to show that you're allowed to "abbreviate" the switch to its entire length. :100644 100644 d03d7173... 5b38b831... M uip/ali.c :100644 100644 34cd5daa... bf0e9cad... M uip/anno.c :100644 100644 2abba4bc... dde11759... M uip/ap.c :100644 100644 d367b97d... 4f654fba... M uip/burst.c :100644 100644 d380b521... 7e741383... M uip/comp.c :100644 100644 1a921cdc... cac0ea85... M uip/conflict.c :100644 100644 f8769a0f... 58ca45e5... M uip/dist.c :100644 100644 a9bc90f1... ab441418... M uip/dp.c :100644 100644 ad0cf2d1... dac84d50... M uip/flist.c :100644 100644 87e22bf1... baab4758... M uip/fmtdump.c :100644 100644 f9403169... c16dd96c... M uip/folder.c :100644 100644 cff49c73... d8b17d34... M uip/forw.c :100644 100644 fd7b55e2... f00c337e... M uip/inc.c :100644 100644 b2a1f1d5... 7b2ef2a3... M uip/install-mh.c :100644 100644 9bd45619... e53b3d58... M uip/mark.c :100644 100644 dc0059c1... 2450572c... M uip/mhbuild.c :100644 100644 ec2f9459... bacaf245... M uip/mhlist.c :100644 100644 68d08353... 882304cb... M uip/mhlsbr.c :100644 100644 222a0761... 5171f4e8... M uip/mhmail.c :100644 100644 f73853e4... d4f462f5... M uip/mhn.c :100644 100644 f6ebb651... ece8c3c1... M uip/mhparam.c :100644 100644 918371a9... 5c2ac313... M uip/mhpath.c :100644 100644 0791c483... af42092b... M uip/mhshow.c :100644 100644 c9b6a26b... 806a3523... M uip/mhstore.c :100644 100644 5c031091... 4bc92454... M uip/mhtest.c :100644 100644 23ede036... 2553c496... M uip/msgchk.c :100644 100644 41cf5102... 2769c240... M uip/msh.c :100644 100644 13ad3562... b785aeba... M uip/mshcmds.c :100644 100644 a607da81... 42e66944... M uip/packf.c :100644 100644 fb342856... 6cae130b... M uip/pick.c :100644 100644 a48c2234... cb249302... M uip/popi.c :100644 100644 e1f0e8d5... 79e0eb79... M uip/prompter.c :100644 100644 5fca8ec5... ace5295d... M uip/rcvdist.c :100644 100644 f9834be4... f5b1c054... M uip/rcvpack.c :100644 100644 43d38892... bef959ca... M uip/rcvstore.c :100644 100644 f9220127... 69a90311... M uip/rcvtty.c :100644 100644 906ea4aa... f484ccb8... M uip/refile.c :100644 100644 d3a8d078... f6d32d30... M uip/repl.c :100644 100644 9b12304b... 233a7bfe... M uip/rmf.c :100644 100644 21a0f901... 35236010... M uip/rmm.c :100644 100644 b40537c0... 7f5cf46f... M uip/scan.c :100644 100644 b98d89a8... 3e2dc605... M uip/send.c :100644 100644 e5f35c0a... b665280b... M uip/slocal.c :100644 100644 c7f53964... 3ac2e3f2... M uip/sortm.c :100644 100644 206698ee... 76478c87... M uip/spost.c :100644 100644 2ee6b3df... a416fdfa... M uip/viamail.c :100644 100644 b64bdab5... 2c2f6b5c... M uip/vmh.c :100644 100644 46ecf8cc... 96676fd0... M uip/vmhtest.c :100644 100644 854a9725... 0e2a9987... M uip/whatnowsbr.c :100644 100644 5a825344... 5d7172e4... M uip/whom.c :100644 100644 2e46dbb1... cd1ffaa9... M uip/wmh.c commit f2763b05544699fbc1455451652965f03385951f Author: Dan Harkless AuthorDate: Fri Feb 4 01:46:29 2000 +0000 Commit: Dan Harkless CommitDate: Fri Feb 4 01:46:29 2000 +0000 Modified INSTALL and config.h.in to reflect the new -kpop feature. :100644 100644 725c4b97... 749e73cd... M ChangeLog :100644 100644 b1e1d109... 63dcbbed... M INSTALL :100644 100644 84864078... 81af712b... M config.h.in commit 0d1c5f533f3a6cd1c7f038f59585378f53b666c2 Author: Dan Harkless AuthorDate: Fri Feb 4 01:32:12 2000 +0000 Commit: Dan Harkless CommitDate: Fri Feb 4 01:32:12 2000 +0000 * Applied wesley.craig@umich.edu's KPOP patches. According to him: The following patch fixes a problem with requesting a service key for a machine that has multiple 'A' records. It also makes "-kpop" a command line option, for users who would like to use both "kpop" and "pop". Did no testing of the new features, as I don't have access to a KPOP server. One tweak I made to the patch he sent to nmh-workers was to move the declaration of his new hp2 variable into the #ifdef KPOP section so you don't get an "unused variable" warning when compiling without KPOP. * Modified inc.man and msgchk.man to document Wesley's new -kpop. :100644 100644 c4939814... 725c4b97... M ChangeLog :100644 100644 a9e08838... c53b291f... M h/popsbr.h :100644 100644 b2e5c7b3... dda206c6... M man/inc.man :100644 100644 e7624a01... 973fb4ba... M man/msgchk.man :100644 100644 164ac987... fd7b55e2... M uip/inc.c :100644 100644 a063049a... 23ede036... M uip/msgchk.c :100644 100644 eec025dc... bfc39eaa... M uip/popsbr.c :100644 100644 924684c0... 00959590... M zotnet/mts/client.c commit c0a38419e027e400b370db10086bcb8a3c981ce7 Author: Dan Harkless AuthorDate: Sat Jan 29 01:34:20 2000 +0000 Commit: Dan Harkless CommitDate: Sat Jan 29 01:34:20 2000 +0000 Added check for lynx to write mhshow-show-text/html line in mhn.defaults.sh. :100644 100644 ee9581f2... c4939814... M ChangeLog :100755 100755 7de7ca68... e3fa2fd9... M etc/mhn.defaults.sh commit 264d458403709d8ad348c4c6fd8650d7a75ac949 Author: Dan Harkless AuthorDate: Fri Jan 28 23:29:06 2000 +0000 Commit: Dan Harkless CommitDate: Fri Jan 28 23:29:06 2000 +0000 Made a couple of minor whitespace changes to test if the latest beta version of CVS fixes this bug: dilvish-dan> cvs commit ../ChangeLog mhn.defaults.sh danh@mhost.com's password: Warning: Remote host denied X11 forwarding, perhaps xauth program could not be run on the server side. cvs: lock.c:179: lock_name: Assertion `*short_repos++ == '/'' failed. Terminated with fatal signal 6 cvs commit: saving log message in /tmp/cvslIx_yb :100644 100644 fd15ad34... ee9581f2... M ChangeLog :100644 100644 d7125769... 70a2c920... M sbr/m_scratch.c commit 5ea88cec12b303551f6bda0d78f4ec989bffe130 Author: Dan Harkless AuthorDate: Fri Jan 28 22:00:33 2000 +0000 Commit: Dan Harkless CommitDate: Fri Jan 28 22:00:33 2000 +0000 All %-escapes in mhn.defaults that actually expand to something should be surrounded by single quotes. Added quotes to the ones in mhn.defaults.sh that were missing them. :100644 100644 ccfb3319... fd15ad34... M ChangeLog :100755 100755 358baf11... 7de7ca68... M etc/mhn.defaults.sh commit a895b4103646a0cd84d82146758ad1c2e3f1ab54 Author: Dan Harkless AuthorDate: Thu Jan 27 20:20:01 2000 +0000 Commit: Dan Harkless CommitDate: Thu Jan 27 20:20:01 2000 +0000 makedir() had multiple bugs dating back to MH. It passed an octal constant to atoi(), which interpreted it as decimal, resulting in directories with no user read or execute permissions, making nested directory creation fail. Also, when creating a nested directory, correct permissions were only set on the inner one. A second `make install' would always fail because the check for whether mh_profile.5 existed was written incorrectly. :100644 100644 b2998798... ccfb3319... M ChangeLog commit 42ebc5bceefcb8a65eaa9dab779e44d35682ff1e Author: Dan Harkless AuthorDate: Thu Jan 27 20:14:58 2000 +0000 Commit: Dan Harkless CommitDate: Thu Jan 27 20:14:58 2000 +0000 Doug's check for whether mh_profile.5 exists was bad -- it looked in the local directory rather than the installation directory, so the check would always return false and re-installation when mh_profile.5 did exist would bomb out. :100644 100644 0b580631... 469dd8de... M man/Makefile.in commit 6e0e2e4490ebb9daf1f62ed7a2d30412551772ee Author: Dan Harkless AuthorDate: Thu Jan 27 20:12:38 2000 +0000 Commit: Dan Harkless CommitDate: Thu Jan 27 20:12:38 2000 +0000 Fixed multiple bugs in makedir(). First off, when creating nested folders, it only set permissions properly on the innermost one. Secondly, it passwd an octal constant to atoi(), which only works on decimal numbers, resulting in directories with no user read or execute permission, making creation of nested dirs fail. Also added a comment wondering why we do special processing when euid != uid. If no one disagrees with my comments, I'll remove that weird code in the future. :100644 100644 6cf9e03c... e4c3c26c... M sbr/makedir.c commit f3572e4b56fe8fffc75cb99b82b0cb063772836e Author: Dan Harkless AuthorDate: Wed Jan 26 21:35:43 2000 +0000 Commit: Dan Harkless CommitDate: Wed Jan 26 21:35:43 2000 +0000 Dan Winship informed me that the right fix when gcc -Wall complains about char indexes to arrays is to cast to unsigned char, not int. You want to prevent negative indexes into the array. :100644 100644 0db7bd99... beb6e765... M sbr/m_getfld.c :100644 100644 3d4e9782... 848adc0b... M uip/picksbr.c :100644 100644 4a2b951f... cc92b49b... M uip/vmhsbr.c commit 1556d4eb31f94b5fda4c635d400191ffca78c9b7 Author: Dan Harkless AuthorDate: Wed Jan 26 10:16:32 2000 +0000 Commit: Dan Harkless CommitDate: Wed Jan 26 10:16:32 2000 +0000 Added documentation on both types of masquerading to post's man page. Also clarified some wording and added a note that the new type of masquerading has been implemented only for post, not for the undocumented spost backend. :100644 100644 c84a74cf... b2998798... M ChangeLog commit ab59862a486279eecba25c0804c8522c0b38b808 Author: Dan Harkless AuthorDate: Wed Jan 26 10:14:14 2000 +0000 Commit: Dan Harkless CommitDate: Wed Jan 26 10:14:14 2000 +0000 Expanded the mention of the $SIGNATURE environment variable to talk about the three different ways to override "From:" header construction. Also added mh-tailor(5) to the "SEE ALSO" section. :100644 100644 397901a5... d5b9e4e5... M man/post.man commit 6f958fb7154627489372880917a901137b1ad11a Author: Dan Harkless AuthorDate: Wed Jan 26 09:27:59 2000 +0000 Commit: Dan Harkless CommitDate: Wed Jan 26 09:27:59 2000 +0000 Just added a comment explaining that akvalue() does mh alias substitution. :100644 100644 b15865e2... b3c4b228... M uip/aliasbr.c commit a928fd1215493206663ef9c96f2a5b5bbd822cc6 Author: Dan Harkless AuthorDate: Wed Jan 26 09:26:23 2000 +0000 Commit: Dan Harkless CommitDate: Wed Jan 26 09:26:23 2000 +0000 I had my envelope-From:-setting in the wrong place in the code, before alias processing was done. Put it in the right place, and properly implemented Resent-From:-handling, which I had neglected before. :100644 100644 a66e2411... 66d978cc... M uip/post.c commit 66049298f32287c4a411f1931ec4b66b380878a9 Author: Dan Harkless AuthorDate: Wed Jan 26 09:24:15 2000 +0000 Commit: Dan Harkless CommitDate: Wed Jan 26 09:24:15 2000 +0000 Added a comment bemoaning the lack of aliasing on the From: header and explaining why I wasn't going to bother implementing my new draft-From:-based email address masquerading right now. :100644 100644 1f3b014b... 206698ee... M uip/spost.c commit d72d136bb31bdb39e864662d4c541999c955671c Author: Dan Harkless AuthorDate: Wed Jan 26 06:51:50 2000 +0000 Commit: Dan Harkless CommitDate: Wed Jan 26 06:51:50 2000 +0000 Doug's portability fix of my setgid inc autodetection had a caching bug -- if you re-ran configure, uip/Makefile would be corrupted, and installation would fail on OSes where inc needs to be setgid. Implemented a new kind of email address masquerading. When a user writes a custom "From:" header in a draft, nmh uses it rather than generating one. However, the user's true address is used in the SMTP envelope "From:" and is revealed in the "Sender:" header. Now, when mmailid is set to non-zero, the envelope "From:" uses the address specified in the draft "From:" header, and there is no "Sender:" header. This is useful when sending on behalf of a remote POP3 account or when remote mail robots incorrectly use the envelope "From:" in preference to the body "From:". :100644 100644 f7d4eb48... c84a74cf... M ChangeLog commit b58f16902582d0b2058a76b315bfc92fa8034672 Author: Dan Harkless AuthorDate: Wed Jan 26 06:39:49 2000 +0000 Commit: Dan Harkless CommitDate: Wed Jan 26 06:39:49 2000 +0000 I'm surprised this didn't hit anyone sooner. Doug's portability fix of my setgid inc autodetection didn't do its caching properly. It cached the variable $nmh_cv_ls_mail_grp (previously $nmh_group_mailspool), but did substitution on $MAIL_SPOOL_GRP (previously $MAILGROUP) without setting the latter to the former. That meant that when re-running configure, $MAIL_SPOOL_GRP would be NULL, so the $(MAIL_SPOOL_GRP) Make variable would be NULL, and installation would fail with the error "install: 2755 does not exist" (since the argument to -g was missing). :100755 100755 f4d0d0ae... 8c9e7802... M configure :100644 100644 bb58e1ff... f211ca0d... M configure.in :100644 100644 8b137891... 139597f9... M stamp-h.in commit e804a366f5091e90f1c0971e2b7546df69f1315a Author: Dan Harkless AuthorDate: Wed Jan 26 05:40:30 2000 +0000 Commit: Dan Harkless CommitDate: Wed Jan 26 05:40:30 2000 +0000 Implemented a new type of username masquerading, which is also activated by setting mmailid to non-zero in mts.conf. The new type is based on the From: header in the message draft rather than the GECOS field of the passwd file like the old type. With mmailid turned off, when a user specifies a custom From: header in a draft, it'll be used, but the user's real address will be revealed in the SMTP envelope From: and in the Sender: header. With mmailid on, this revelation is disabled. Also copied to here my new comment from mh.h explaining (if I understand it correctly) the functionality of struct swit's minchars field. Also, changed the minchars for "help" from 4 to 0. It doesn't make sense to use a positive integer that's the exact length of the option. That'll make it print out like "-(help)". The parentheses are supposed to go around the minimum part of the option you need to specify when abbreviating it. Perhaps someone thought it would be cute to put "help" in parentheses to imply that you know about it already as you just specified it be seeing the current output, but I think this "overloading" of the meaning of the parentheses is awkward. I need to go around and change "help" to 0 everywhere, but it's getting too late to do it tonight. Also added some other explanatory comments to existing code. :100644 100644 a1cc05f6... a66e2411... M uip/post.c commit 98c25edae52fb18c950c6d9626b4f8434e59d08c Author: Dan Harkless AuthorDate: Wed Jan 26 05:28:33 2000 +0000 Commit: Dan Harkless CommitDate: Wed Jan 26 05:28:33 2000 +0000 Updated to reflect that there are now two types of username masquerading (GECOS-based, the old one, and draft-From:-based, the new one). Also clarified existing wording. :100644 100644 11ffd3b8... b1e1d109... M INSTALL :100644 100644 71cf0bc2... ea95045a... M man/mh-tailor.man commit aa4c0736256b9324588e16e52599b903c87f06da Author: Dan Harkless AuthorDate: Wed Jan 26 05:03:07 2000 +0000 Commit: Dan Harkless CommitDate: Wed Jan 26 05:03:07 2000 +0000 Documented the minchars field of struct swit to the best of my understanding. :100644 100644 c8ece5d1... a59b0a0e... M h/mh.h commit 2d5e7c8a48aca8b66e1ba85b9112157fc5b81fd9 Author: Dan Harkless AuthorDate: Wed Jan 26 05:01:06 2000 +0000 Commit: Dan Harkless CommitDate: Wed Jan 26 05:01:06 2000 +0000 Modified the mmailid comment to reflect that there are now two types of masquerading (wouldn't want sysadmins to not realize that by allowing one, they're allowing the other). I also prefer my new wording of "allow" vs. the old "turn on" because the latter implied that masquerading would take effect just by setting that variable (not the case unless /etc/passwd had been previously modified to have the s). :100644 100644 c892f0fd... b8a61b8e... M etc/mts.conf.in commit 1f9b59c7eb5c5394754bcc0fe28248f55ff6957d Author: Dan Harkless AuthorDate: Wed Jan 26 04:57:57 2000 +0000 Commit: Dan Harkless CommitDate: Wed Jan 26 04:57:57 2000 +0000 Whoever changed all the references to nmh-workers@math.gatech.edu to nmh-workers@mhost.com missed this file. :100644 100644 7cc20fc7... 6b1dfc05... M man/nmh.man commit c1db884b287ee5c7dbca66be973c88aba40b9bc9 Author: Dan Harkless AuthorDate: Wed Jan 26 04:54:30 2000 +0000 Commit: Dan Harkless CommitDate: Wed Jan 26 04:54:30 2000 +0000 Changed Mmailids to an extern so that we can access it from post.c to see if we should do the new draft-From:-based masquerading. Also clarified some comments now that there are two different types of masquerading. :100644 100644 61a604c6... 254a758e... M zotnet/mts/mts.c commit 30d5dd2e92c77402af6b7cfdbaa1339964ce034d Author: Dan Harkless AuthorDate: Tue Jan 25 21:06:09 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jan 25 21:06:09 2000 +0000 Just clarified a couple of points in my last change description. :100644 100644 c97e57c9... f7d4eb48... M ChangeLog commit ed7b16e77ac3662db77d362d15e84b69e5cd3fe6 Author: Dan Harkless AuthorDate: Tue Jan 25 07:45:10 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jan 25 07:45:10 2000 +0000 The prototype I gave for initgroups() which was documented in the AIX 4.1 info page conflicted with the real one that comes from grp.h on Solaris 2.6. Adjusted it so the local prototype is correct on both (hopefully all) platforms. Also added an include of , which is where initgroups() lives on HP-UX 10.20. :100644 100644 dce96638... e5f35c0a... M uip/slocal.c commit 8fa6d765350de7b4a8d7c0c59013969261640fa0 Author: Dan Harkless AuthorDate: Tue Jan 25 07:10:25 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jan 25 07:10:25 2000 +0000 I kept going back and forth checking in new pointless revisions of configure[.in], but it now looks like the problem was that stamp-h.in was older than configure.in (or maybe there were two problems). Hopefully this'll get rid of the needless auto* calls. :100644 100644 e69de29b... 8b137891... M stamp-h.in commit 403ef747e65b7a6441ea0ab022f6e6ee6591beb7 Author: Dan Harkless AuthorDate: Tue Jan 25 06:56:25 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jan 25 06:56:25 2000 +0000 Shoot. Apparently it gets the timestamp from the check-in time rather than preserving the actual timestamp on the file when you check it in, so the timestamp was the same for configure.in and configure, so the Makefile was doing an autoconf just in case. This time I'm checking in configure.in first and configure at least a second later. What a pain. :100755 100755 83bfaf37... f4d0d0ae... M configure :100644 100644 76237e26... bb58e1ff... M configure.in commit eeef255a56fa2a1551c88571cf4bc34eeb858ef8 Author: Dan Harkless AuthorDate: Tue Jan 25 06:46:13 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jan 25 06:46:13 2000 +0000 Accidentally checked in configure with older date than configure.in, but I hadn't made changes to configure.in that would result in a different configure, so I can't check one in with the right timestamp. Therefore, I made a meaningless change to configure.in (adding a "dnl" to the end of line that was like others that had "dnl" at the end but didn't have one itself) and regenerated configure. :100755 100755 c7b809be... 83bfaf37... M configure :100644 100644 1910558d... 76237e26... M configure.in commit e32a18146eb52fc278833d7cfb49ed8d9ace62bc Author: Dan Harkless AuthorDate: Tue Jan 25 06:21:38 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jan 25 06:21:38 2000 +0000 The conditional definition of the "np" variable didn't make any sense. It was only defined if HAVE_GETHOSTBYNAME was defined and only used when HAVE_GETHOSTBYNAME wasn't defined. I'm kind of surprised that never blew up anywhere. Changed the definition conditional to match the usage conditional. :100644 100644 20933744... 924684c0... M zotnet/mts/client.c commit 1b6605465016726e2be105c01fd331ff4658e569 Author: Dan Harkless AuthorDate: Tue Jan 25 06:19:51 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jan 25 06:19:51 2000 +0000 Got rid of the rest of the warnings that I didn't have time for on 1999-07-15 (and, it would seem, some new ones people introduced since then). The primary ones were the warnings that default prototypes were being used for [v]snprintf() and str[n]casecmp(). As of right now, there are _no_ compilation warnings except on the lex output file (at least under AIX 4.1.5 and Solaris 2.6). :100644 100644 61e91a36... c97e57c9... M ChangeLog commit c466879717f7cc03e987c5fc5fc5f1c9cb522c66 Author: Dan Harkless AuthorDate: Tue Jan 25 06:18:54 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jan 25 06:18:54 2000 +0000 On AIX 4.1, snprintf() is defined in libc.a but there's no prototype in or elsewhere. Apparently it's not officially supported (though it seems to work perfectly and IBM apparently uses it in internal code). Anyhow, if we omit our own snprintf() and vsnprintf() prototypes when we HAVE_SNPRINTF, we get a billion warnings at compile time. Use the C preprocessor to preprocess stdio.h and make sure that there's actually a prototype. Define HAVE_SNPRINTF_PROTOTYPE if so, and use that to control our local prototype definition. Also, define strcasecmp() and strncasecmp() here all the time since we define our own versions and always use them. The only way we could get into trouble doing this would be if the vendor's versions didn't have the same parameters, but I don't see that happening. If we don't define them here, we get warnings all over the place that default prototypes are being used for 'em, and the system header to include varies from OS to OS. :100644 100644 59841a22... 4b5a0b8f... M h/prototypes.h commit 45274379ba9b2e9bb165a213bca5e5682c64cba0 Author: Dan Harkless AuthorDate: Tue Jan 25 06:13:38 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jan 25 06:13:38 2000 +0000 On AIX 4.1, snprintf() is defined in libc.a but there's no prototype in or elsewhere. Apparently it's not officially supported (though it seems to work perfectly and IBM apparently uses it in internal code). Anyhow, if we omit our own snprintf() and vsnprintf() prototypes when we HAVE_SNPRINTF, we get a billion warnings at compile time. Use the C preprocessor to preprocess stdio.h and make sure that there's actually a prototype. Define HAVE_SNPRINTF_PROTOTYPE if so, and use that to control our local prototype definition. :100644 100644 317e93eb... dda87bfe... M acconfig.h :100644 100644 ae0684e7... 84864078... M config.h.in :100755 100755 eb9c392c... c7b809be... M configure :100644 100644 35c22129... 1910558d... M configure.in :100644 100644 8b137891... e69de29b... M stamp-h.in commit cb8a7b870ba2f2f6c7c23152a4482132e59f678e Author: Dan Harkless AuthorDate: Tue Jan 25 06:06:18 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jan 25 06:06:18 2000 +0000 Added include of signals.h for SIGNAL() prototype. :100644 100644 05f8c33f... 546097cc... M mts/sendmail/sendmail.c commit f2cc76d9a760ebf86b61d609696999330449aecb Author: Dan Harkless AuthorDate: Tue Jan 25 06:04:29 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jan 25 06:04:29 2000 +0000 Added include of mh.h for snprintf() prototype. :100644 100644 f53a8be6... 61a604c6... M zotnet/mts/mts.c :100644 100644 b4d2eec3... bbfccf0f... M zotnet/tws/dtime.c commit 0c16fb9103d38e955469dd65b68cbc20e894d332 Author: Dan Harkless AuthorDate: Tue Jan 25 06:00:22 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jan 25 06:00:22 2000 +0000 Added include of mh.h to get snprintf() prototype and changed all references to getcpy() to our_getcpy() to prevent conflict with the external one. :100644 100644 5f8e88bb... aa3253e0... M zotnet/bboards/getbbent.c commit 90f1d5866d7d0c7c270fac0939b7de6bf4c35be9 Author: Dan Harkless AuthorDate: Tue Jan 25 05:58:26 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jan 25 05:58:26 2000 +0000 Put in a prototype for stdio internal function _filbuf() to get rid of the "default prototype" warning (only do this when we didn't #define it to something specific due to another #define telling us to do so). :100644 100644 cddf362b... 0db7bd99... M sbr/m_getfld.c commit 7736b0a60c15cc20db0ba8c3e0fe8e11d1c78c20 Author: Dan Harkless AuthorDate: Tue Jan 25 05:55:20 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jan 25 05:55:20 2000 +0000 Put in a prototype for client() to get rid of the "default prototype" warning. The prototype should really go in a new client.h file or somewhere, but I don't have time right now for that. :100644 100644 f86d5d32... eec025dc... M uip/popsbr.c commit 193489472a436a4437498b448e11e8992baaaf67 Author: Dan Harkless AuthorDate: Tue Jan 25 05:53:40 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jan 25 05:53:40 2000 +0000 Typecast to get rid of warnings that index into cc[] is a char. :100644 100644 b13ea669... 3d4e9782... M uip/picksbr.c commit 411195e89109d7b1c0a0d552d1644837be781eeb Author: Dan Harkless AuthorDate: Tue Jan 25 05:52:31 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jan 25 05:52:31 2000 +0000 Put in prototype for initgroups() to get rid of "default prototype" warning. On AIX 4.1, at least, the function exists in libc.a but doesn't exist in any .h. :100644 100644 03dea148... dce96638... M uip/slocal.c commit 5fc7e12e8c45a78bddb8e68b6c69653f8d30d11c Author: Dan Harkless AuthorDate: Tue Jan 25 05:50:12 2000 +0000 Commit: Dan Harkless CommitDate: Tue Jan 25 05:50:12 2000 +0000 Typecast to get rid of warnings that array index into types[] is a char. :100644 100644 c8743959... 4a2b951f... M uip/vmhsbr.c commit 264318e5898da32e9a0e3ec2b4c69185db89bb8a Author: Ruud de Rooij AuthorDate: Thu Jan 6 21:30:07 2000 +0000 Commit: Ruud de Rooij CommitDate: Thu Jan 6 21:30:07 2000 +0000 * Move mhtest from bindir to libdir. * Move sendfiles from libdir to bindir. * Updated sendfiles manpage to reflect this change. * Added documentation for -build and -file switches to repl and forw manpages (patch from Peter Maydell). * Fixed interaction between specifying -cc in profile and -group on command-line. :100644 100644 84dfb76e... 61e91a36... M ChangeLog :100644 100644 e58951ea... b45ef86c... M etc/Makefile.in :100644 100644 7d95613c... 6dab969f... M man/forw.man :100644 100644 f767db7b... 2ffa7ac3... M man/repl.man :100644 100644 72f843c0... 7d00a718... M man/sendfiles.man :100644 100644 364b3599... f8e36c9e... M uip/Makefile.in :100644 100644 8455431a... cff49c73... M uip/forw.c :100644 100644 d7c09ac8... d3a8d078... M uip/repl.c commit c9021f4b5e565c9ec7606b8b0229172bd01ba1ae Author: Dan Harkless AuthorDate: Thu Nov 11 01:01:07 1999 +0000 Commit: Dan Harkless CommitDate: Thu Nov 11 01:01:07 1999 +0000 * Add command to reverse the action of rmm [-nounlink] -- "urmm"? "umm"? "um"? * Allow user customization of which kinds of text parts in multipart/alternative messages are preferred. It would be nice if one selectable behavior would be to be prompted at runtime for which version to show. * Add a new %-escape that makes temp files more permanent than %f, so that you can use gnuclient -q or netscape -remote on message parts. Put netscape -remote in mhn.defaults for text/html once this is done. :100644 100644 8760d1ae... 3ae3679d... M TODO commit b84e9d0b0e3e007c103c5a903f44e8e4e37e6714 Author: Dan Harkless AuthorDate: Tue Nov 2 21:49:47 1999 +0000 Commit: Dan Harkless CommitDate: Tue Nov 2 21:49:47 1999 +0000 Changed the version number from 1.0.3 to 1.0.2+dev. There was not unanimous support for my proposed even/odd release/developer version number dichotomy. 1.0.2+dev implies release 1.0.2 plus some development. :100644 100644 a5b07d54... 84dfb76e... M ChangeLog :100644 100644 21e8796a... f650172c... M VERSION commit 2c98333d77456e28ebef0af55ea6f7101a581778 Author: Dan Harkless AuthorDate: Fri Oct 29 20:42:13 1999 +0000 Commit: Dan Harkless CommitDate: Fri Oct 29 20:42:13 1999 +0000 Upped the version number to 1.0.3. If we don't do this, then when people report bugs against 1.0.2, we won't know "which" 1.0.2 they're talking about (since the development source is publically available via CVS). I think the Linux kernel version numbers are a good model, so the next time we roll a tarball, it should be version 1.0.4 (or higher -- anyhow, an even-numbered version). :100644 100644 13eaf816... a5b07d54... M ChangeLog :100644 100644 6d7de6e6... 21e8796a... M VERSION commit 8cd63866a8c844c892b3554968f600e639a97b53 Author: Doug Morris AuthorDate: Fri Oct 29 05:10:18 1999 +0000 Commit: Doug Morris CommitDate: Fri Oct 29 05:10:18 1999 +0000 updated INSTALL directions :100644 100644 1bfae3f7... 11ffd3b8... M INSTALL commit 690baeee8169f93061c4f3cfcb813528ef7b5bde Author: Doug Morris AuthorDate: Fri Oct 29 04:49:01 1999 +0000 Commit: Doug Morris CommitDate: Fri Oct 29 04:49:01 1999 +0000 release nmh-1.0.2 :100644 100644 0ca05aaa... 13eaf816... M ChangeLog commit b986c0df2a745f3f5f5f4a4a6ccc384125bafbc7 Author: Doug Morris AuthorDate: Fri Oct 29 04:32:50 1999 +0000 Commit: Doug Morris CommitDate: Fri Oct 29 04:32:50 1999 +0000 updated the TODO list and bumped the revision to 1.0.2. :100644 100644 cd8988dc... 8760d1ae... M TODO :100644 100644 5601a1d4... 6d7de6e6... M VERSION commit d02ec5835693084c86f676b35dd96f44a22ff534 Author: Doug Morris AuthorDate: Wed Oct 27 05:21:12 1999 +0000 Commit: Doug Morris CommitDate: Wed Oct 27 05:21:12 1999 +0000 fixed test in Makefiles for LIBTOOL for the case where it doesn't exist :100755 100755 e8cfcade... eb9c392c... M configure :100644 100644 e1748f1f... f812a2c5... M mts/sendmail/Makefile.in :100644 100644 a4fc8d95... 85ea7ea5... M mts/smtp/Makefile.in :100644 100644 f77f9887... 10fb56ca... M sbr/Makefile.in :100644 100644 a706bd03... 4f43ffbc... M zotnet/Makefile.in commit e001a96010a62d4bd79a33955bb29e3c18bb26fe Author: Doug Morris AuthorDate: Tue Oct 26 21:12:36 1999 +0000 Commit: Doug Morris CommitDate: Tue Oct 26 21:12:36 1999 +0000 fixed libtool check, sort of... :100644 100644 21474d84... 0ca05aaa... M ChangeLog :100644 100644 2fe31b55... 519a6237... M MACHINES :100755 100755 ce9cd8d8... e8cfcade... M configure :100644 100644 7da07800... 35c22129... M configure.in :100644 100644 16b1d7a0... e1748f1f... M mts/sendmail/Makefile.in :100644 100644 55997a4e... a4fc8d95... M mts/smtp/Makefile.in :100644 100644 3eba53fe... f77f9887... M sbr/Makefile.in :100644 100644 de661262... a706bd03... M zotnet/Makefile.in commit d3a67123c9d05b6d639adb0e6b4a874807602a6b Author: Doug Morris AuthorDate: Thu Oct 21 18:59:35 1999 +0000 Commit: Doug Morris CommitDate: Thu Oct 21 18:59:35 1999 +0000 changes to allow building under Mac OS X/Rhapsody :100644 100644 54119771... 21474d84... M ChangeLog :100644 100644 69b0c7de... 2fe31b55... M MACHINES :100644 100644 861da67d... cd8988dc... M TODO :100644 100644 6db7549c... 317e93eb... M acconfig.h :100755 100755 4d39b912... 4ad9e040... M config.guess :100644 100644 9daa5944... ae0684e7... M config.h.in :100755 100755 3f5c202f... f307800d... M config.sub :100755 100755 3bc1ecbf... ce9cd8d8... M configure :100644 100644 a5cac97e... 7da07800... M configure.in :100644 100644 d5580a5b... 16b1d7a0... M mts/sendmail/Makefile.in :100644 100644 7d197d55... 55997a4e... M mts/smtp/Makefile.in :100644 100644 9aad677b... 3eba53fe... M sbr/Makefile.in :100644 100644 2a21bd7b... 364b3599... M uip/Makefile.in :100644 100644 7391814b... de661262... M zotnet/Makefile.in commit 1e6e0b5cc1bd2d49ffcef4ea7bb1bb6c256d07b7 Author: Ruud de Rooij AuthorDate: Sun Oct 17 17:39:22 1999 +0000 Commit: Ruud de Rooij CommitDate: Sun Oct 17 17:39:22 1999 +0000 * Changed repl defaults to partly revert to MH behaviour: "-cc all" is now only implied with -group. * The replcomps template includes cc: header again (as in MH). * Updated repl man page to reflect these changes. :100644 100644 693d7c8f... 54119771... M ChangeLog :100644 100644 52170a76... 04451812... M etc/replcomps :100644 100644 a7e11658... f767db7b... M man/repl.man :100644 100644 67155fa5... d7c09ac8... M uip/repl.c commit e4f812b967a682665b19183a6189e458e4a983ee Author: Doug Morris AuthorDate: Sat Oct 16 00:56:05 1999 +0000 Commit: Doug Morris CommitDate: Sat Oct 16 00:56:05 1999 +0000 sunos/solaris modifications :100644 100644 ab88fa9e... 693d7c8f... M ChangeLog :100644 100644 64b33bda... 9daa5944... M config.h.in :100755 100755 c4ee350f... 3bc1ecbf... M configure :100644 100644 f06a1d20... a5cac97e... M configure.in commit 3d251965606d6a6e47897504594f84d12e3e292a Author: Doug Morris AuthorDate: Fri Oct 15 22:38:55 1999 +0000 Commit: Doug Morris CommitDate: Fri Oct 15 22:38:55 1999 +0000 replaced the BIND guess (based on BSDishness) with checks for gethostbyname and sethostent :100644 100644 cb6de263... ab88fa9e... M ChangeLog :100644 100644 476bb92d... 6db7549c... M acconfig.h :100644 100644 6d03f36e... 64b33bda... M config.h.in :100755 100755 456d6ba3... c4ee350f... M configure :100644 100644 5bf050cd... f06a1d20... M configure.in :100644 100644 7d1d8085... 0bc7532f... M mts/sendmail/hosts.c :100644 100644 daa59b6b... 83727d54... M mts/smtp/hosts.c :100644 100644 671a533d... 525554e7... M uip/ftpsbr.c :100644 100644 b9679e9a... 20933744... M zotnet/mts/client.c :100644 100644 31d96bdd... f53a8be6... M zotnet/mts/mts.c commit aa8860b86ba41d70c454d5d824835c8cd92a1555 Author: Doug Morris AuthorDate: Wed Oct 13 14:56:41 1999 +0000 Commit: Doug Morris CommitDate: Wed Oct 13 14:56:41 1999 +0000 fixed bug in mh-profile/mh_profile manpage link - it did not check first :100644 100644 a206efd7... 6d03f36e... M config.h.in :100755 100755 244672c9... 456d6ba3... M configure :100644 100644 8bfa3df4... 0b580631... M man/Makefile.in commit 1856d44cafff88b8721971fbac940a469c81a38b Author: Doug Morris AuthorDate: Wed Oct 13 13:58:41 1999 +0000 Commit: Doug Morris CommitDate: Wed Oct 13 13:58:41 1999 +0000 updated manpage's Makefile and modified the way configure tests to see whether it should define LINUX_STDIO. :100644 100644 3c4f4234... cb6de263... M ChangeLog :100644 100644 af77c9eb... 476bb92d... M acconfig.h :100644 100644 5062e215... a206efd7... M config.h.in :100755 100755 967f80bc... 244672c9... M configure :100644 100644 d4b924d7... 5bf050cd... M configure.in :100644 100644 d08c3a2a... 8bfa3df4... M man/Makefile.in commit 4434c06e069d65e39e93c0b5c69747b278190175 Author: Dan Harkless AuthorDate: Mon Oct 4 22:23:29 1999 +0000 Commit: Dan Harkless CommitDate: Mon Oct 4 22:23:29 1999 +0000 Added '-L' to the calls of 'ls' in configure.in -- I have seen multiple machines in the past where the mail spool was a symlink to a directory on another device with more free space. :100644 100644 79319351... 3c4f4234... M ChangeLog :100755 100755 f4bf5591... 967f80bc... M configure :100644 100644 0904f1b2... d4b924d7... M configure.in :100644 100644 e69de29b... 8b137891... M stamp-h.in commit e9b4dc0cb4a13da6abe919b99a67e1076edd5b6d Author: Dan Harkless AuthorDate: Sat Oct 2 06:00:54 1999 +0000 Commit: Dan Harkless CommitDate: Sat Oct 2 06:00:54 1999 +0000 * Fixed a portability problem in Doug's fix of a portability problem in my MAILGROUP autoconf support ('ls -l' vs. 'ls -lg'). :100644 100644 0f5d80a9... 79319351... M ChangeLog commit bf46cc47a8f442fdbc08d81f8b51d30115637a93 Author: Dan Harkless AuthorDate: Sat Oct 2 06:00:11 1999 +0000 Commit: Dan Harkless CommitDate: Sat Oct 2 06:00:11 1999 +0000 I didn't like the double use of "MAILGROUP" for two different variables used in different languages, with different values. I renamed Doug's new Makefile "MAILGROUP" to MAIL_SPOOL_GRP. :100644 100644 a2ecd08b... 2a21bd7b... M uip/Makefile.in commit e5294f420c762bb7818e4bda47c717589103c13e Author: Dan Harkless AuthorDate: Sat Oct 2 05:57:23 1999 +0000 Commit: Dan Harkless CommitDate: Sat Oct 2 05:57:23 1999 +0000 Touched because I changed configure.in. :100644 100644 8b137891... e69de29b... M stamp-h.in commit a3727d33995d2782f111f159768d42a5c0cdfd99 Author: Dan Harkless AuthorDate: Sat Oct 2 05:55:54 1999 +0000 Commit: Dan Harkless CommitDate: Sat Oct 2 05:55:54 1999 +0000 Doug's fix for my MAILGROUP autoconf support on his platform (yep, I was ignorant about that "wheel" group) broke it on my platforms (AIX 4.1.5.0.01 and Solaris 2.6). `ls -lg` doesn't do what Doug was expecting on these platforms -- it displays _only_ the group rather than the user and the group (thus awk '{print $4}' did the wrong thing). Also did some miscellaneous cleanup, like making variables that were intended to be cached actually be cached (renamed to nmh_cv_*, etc.), and using the $AWK that we've auto-detected rather than relying on the $PATH to find one. :100755 100755 b3567355... f4bf5591... M configure :100644 100644 14690b60... 0904f1b2... M configure.in commit 2da3024caea2be71550f9eabd2fbc08fefe29bb5 Author: Ruud de Rooij AuthorDate: Sun Sep 26 17:45:55 1999 +0000 Commit: Ruud de Rooij CommitDate: Sun Sep 26 17:45:55 1999 +0000 * Added config.sub and config.guess to the list of files to be distributed. * Fixed bug in sbr/fmt_scan.c where an extra newline would be added if a list of addresses was split over several header lines. * In mts/smtp/smtp.c, undefine strlen and strcpy if they are macros, regardless of platform. * Allow q to quit mhshow, and n to skip to next part. Patch from Kimmo Suominen . * Modified mhstore to recognize attachments created by sendfiles with x-conversions=gzip. :100644 100644 a92dd7bf... 0f5d80a9... M ChangeLog :100644 100644 60fb9159... c6594d17... M Makefile.in :100644 100644 a0d84d5f... 025bb966... M mts/smtp/smtp.c :100644 100644 ae311621... b8273c98... M sbr/fmt_scan.c :100644 100644 e76dbaac... ef6f02c1... M uip/mhshowsbr.c :100644 100644 2d0fdc81... 41aa1a4c... M uip/mhstoresbr.c commit 4a78892df0b95cc22a976632445f3dca8893aae4 Author: Doug Morris AuthorDate: Mon Sep 13 19:23:29 1999 +0000 Commit: Doug Morris CommitDate: Mon Sep 13 19:23:29 1999 +0000 moved canonical guesses back into user config section of config.h :100644 100644 49360125... a92dd7bf... M ChangeLog :100644 100644 a54d1d77... af77c9eb... M acconfig.h :100644 100644 da9d917c... 5062e215... M config.h.in commit d036480eb208e821aba1485ec77da7f06bdf13a8 Author: Doug Morris AuthorDate: Mon Sep 13 18:20:28 1999 +0000 Commit: Doug Morris CommitDate: Mon Sep 13 18:20:28 1999 +0000 updates to post.c and termsbr.c that prevent warnings on OpenBSD :100644 100644 810b8230... 49360125... M ChangeLog :100644 100644 ffd460e4... a1cc05f6... M uip/post.c :100644 100644 28aaa8f5... 556158d1... M uip/termsbr.c commit 8563731b02ce9d750806f6b1769af8b399d964e8 Author: Doug Morris AuthorDate: Sun Sep 12 13:50:11 1999 +0000 Commit: Doug Morris CommitDate: Sun Sep 12 13:50:11 1999 +0000 Lots of little code cleanups to prevent warnings - mostly making sure some function prototypes are available at compile time. Also fixed Makefile.in so that make nmhdist will work -- it just blew up after COMPLETION-TCSH was added and ZSH-COMPLETION was changed to COMPLETION-ZSH. :100644 100644 81cf02da... 810b8230... M ChangeLog :100644 100644 3474570c... 60fb9159... M Makefile.in :100644 100644 5fe0b0c2... 59841a22... M h/prototypes.h :100644 100644 55f33938... daa59b6b... M mts/smtp/hosts.c :100644 100644 90b37a82... a0d84d5f... M mts/smtp/smtp.c :100644 100644 339ac0a2... d3e5ea90... M sbr/fmt_compile.c :100644 100644 0af69aba... ae311621... M sbr/fmt_scan.c :100644 100644 fe42196b... a99c681b... M sbr/lock_file.c :100644 100644 47528933... cddf362b... M sbr/m_getfld.c :100644 100644 54c8b05a... d03d7173... M uip/ali.c :100644 100644 11381f3c... 2abba4bc... M uip/ap.c :100644 100644 9ae23b41... 87e22bf1... M uip/fmtdump.c :100644 100644 a65736f3... 7e805654... M uip/mhbuildsbr.c :100644 100644 b372f950... c1af2180... M uip/mhcachesbr.c :100644 100644 6ef30fbf... 33e9f3fa... M uip/mhl.c :100644 100644 3d6e260f... 13ad3562... M uip/mshcmds.c :100644 100644 36ca6956... b13ea669... M uip/picksbr.c :100644 100644 8eb3b77f... ffd460e4... M uip/post.c :100644 100644 922670b5... 5fca8ec5... M uip/rcvdist.c :100644 100644 5a3dcbe0... 43d38892... M uip/rcvstore.c :100644 100644 464a0276... f9220127... M uip/rcvtty.c :100644 100644 cbd92773... b40537c0... M uip/scan.c :100644 100644 b7c4cf24... 2c2e3a63... M uip/sendsbr.c :100644 100644 7927ac56... d656bf95... M uip/show.c :100644 100644 c6aa286c... 03dea148... M uip/slocal.c :100644 100644 f2d6311a... 1f3b014b... M uip/spost.c :100644 100644 34c560ee... 0033f8b2... M uip/whatnow.c :100644 100644 caeeec2c... 7f88fc48... M uip/whatnowproc.c commit 3da6cc979e0e8e466f760acc113314c57176fea9 Author: Doug Morris AuthorDate: Sun Sep 12 07:19:40 1999 +0000 Commit: Doug Morris CommitDate: Sun Sep 12 07:19:40 1999 +0000 updating changelog, should have been done with last commit :100644 100644 796c9b19... 81cf02da... M ChangeLog commit 58653b7e9a9f44dc35a4d0f0a8584f425f14fb0c Author: Doug Morris AuthorDate: Sun Sep 12 06:44:02 1999 +0000 Commit: Doug Morris CommitDate: Sun Sep 12 06:44:02 1999 +0000 fix for configure to find db1/ndbm.h in new linux systems :100644 100644 5051962e... a54d1d77... M acconfig.h :100644 100644 daf4e6fc... da9d917c... M config.h.in :100755 100755 db6525ec... b3567355... M configure :100644 100644 c153c944... 14690b60... M configure.in :100644 100644 a306cada... c6aa286c... M uip/slocal.c :100644 100644 d1db19fc... ab6dfa47... M zotnet/mf/mf.c commit 045b9601403a216c400642229f2b291f85f88f7d Author: Doug Morris AuthorDate: Fri Sep 10 05:22:40 1999 +0000 Commit: Doug Morris CommitDate: Fri Sep 10 05:22:40 1999 +0000 configure, configure.in stamp-h.in, and uip/Makefile.in modified to fix MAILGROUP test. m_getfld.c - added the patch submitted by Richard Cohen to fix crashing when mh_profile has no trailing newline. smtp.c, lock_file.c, m_scratch.c, m_tmpfil.c, mhscmds.c, rcvtty.c, and spost.c modified to fix mkstemp bugs. Some I've simply commented out because the repair requries either creating another new tempfile function (there are 3 already) or cleaning up the existing tmpfile functions and all the calls to them. I'm opting for the latter but it will take a while. :100644 100644 8d9db3b1... 796c9b19... M ChangeLog :100755 100755 22a3e43b... db6525ec... M configure :100644 100644 6b3367f5... c153c944... M configure.in :100644 100644 773696b8... 90b37a82... M mts/smtp/smtp.c :100644 100644 9771543c... fe42196b... M sbr/lock_file.c :100644 100644 aca481a1... 47528933... M sbr/m_getfld.c :100644 100644 e29b10a0... d7125769... M sbr/m_scratch.c :100644 100644 31bce67a... bac70b0a... M sbr/m_tmpfil.c :100644 100644 c5b89ec1... 8b137891... M stamp-h.in :100644 100644 71fd13b9... a2ecd08b... M uip/Makefile.in :100644 100644 427bff60... 3d6e260f... M uip/mshcmds.c :100644 100644 b847b563... 464a0276... M uip/rcvtty.c :100644 100644 5bc41d8a... f2d6311a... M uip/spost.c commit 17e31955aca3a425a3c6d6fc128f6648f9550369 Author: Dan Harkless AuthorDate: Tue Sep 7 23:45:20 1999 +0000 Commit: Dan Harkless CommitDate: Tue Sep 7 23:45:20 1999 +0000 Renamed ZSH.COMPLETION to COMPLETION-ZSH and added COMPLETION-TCSH. :100644 100644 c1d59d81... 8d9db3b1... M ChangeLog commit e5488fbd9e926b87e20f4b28e3f0bceb55f9df50 Author: Dan Harkless AuthorDate: Tue Sep 7 23:41:37 1999 +0000 Commit: Dan Harkless CommitDate: Tue Sep 7 23:41:37 1999 +0000 New file along the lines of the old ZSH.COMPLETION, but for tcsh. Pretty bare right now. :000000 100644 00000000... f75933ee... A COMPLETION-TCSH commit bd2c7d4966fd6588d11a1b639479959d6a948afc Author: Dan Harkless AuthorDate: Tue Sep 7 23:34:00 1999 +0000 Commit: Dan Harkless CommitDate: Tue Sep 7 23:34:00 1999 +0000 Renamed to COMPLETION-ZSH so it'll alphabetize next to new COMPLETION-TCSH. :100644 000000 5c10cc89... 00000000... D ZSH.COMPLETION commit af1c787868b636316a63606e42ea0db2104573be Author: Dan Harkless AuthorDate: Tue Sep 7 23:29:14 1999 +0000 Commit: Dan Harkless CommitDate: Tue Sep 7 23:29:14 1999 +0000 Renamed from ZSH.COMPLETION so it'll alphabetize next to new COMPLETION-TCSH. :000000 100644 00000000... 5c10cc89... A COMPLETION-ZSH commit 95565d966a1821b0284cd7a55f1102da080799b9 Author: Dan Harkless AuthorDate: Wed Aug 18 00:05:24 1999 +0000 Commit: Dan Harkless CommitDate: Wed Aug 18 00:05:24 1999 +0000 Crap. That's what I get for using vi instead of xemacs for a change. Inserted missing newline. :100644 100644 7e66b1e1... c5b89ec1... M stamp-h.in commit 8da1cc086ae018f7268ea0fb8def491367be604c Author: Dan Harkless AuthorDate: Wed Aug 18 00:01:28 1999 +0000 Commit: Dan Harkless CommitDate: Wed Aug 18 00:01:28 1999 +0000 Just adding some text to this file so that cvs will see a difference and let me check it in. Every time acconfig.h or configure.in are changed (which I just did), the timestamp on this file needs to be updated or when people do a make an unnecessary `cd . && autoheader` will be done, and not everybody has the autoconf tools installed. The next person to change those two files (or aclocal.m4) will need to change this text, maybe just to a message saying which dependency files were changed and by whom. :100644 100644 8b137891... 7e66b1e1... M stamp-h.in commit 22a3fbc005f448c0e0c624f81f9f96e21dede885 Author: Dan Harkless AuthorDate: Tue Aug 17 23:31:23 1999 +0000 Commit: Dan Harkless CommitDate: Tue Aug 17 23:31:23 1999 +0000 Automated #define of MAILGROUP and installation of inc as setgid mail when the mail spool directory isn't world-writable. :100644 100644 d3197432... daf4e6fc... M config.h.in :100755 100755 56ac422f... 22a3e43b... M configure commit b9b7473dc3c3931475d3dacbe827db62731bce4c Author: Dan Harkless AuthorDate: Tue Aug 17 23:15:31 1999 +0000 Commit: Dan Harkless CommitDate: Tue Aug 17 23:15:31 1999 +0000 Automated #define of MAILGROUP and installation of inc as setgid mail when the mail spool directory isn't world-writable. :100644 100644 6114a59a... c1d59d81... M ChangeLog :100644 100644 c292bd20... 71fd13b9... M uip/Makefile.in commit 8ac7f0a5c44a9a81a10e684cea8f2822434b9af0 Author: Dan Harkless AuthorDate: Tue Aug 17 23:12:42 1999 +0000 Commit: Dan Harkless CommitDate: Tue Aug 17 23:12:42 1999 +0000 Just removed some useless whitespace that [X]Emacs' Make mode highlights as being semi-bogus. :100644 100644 97313fc4... 3474570c... M Makefile.in commit d3d0096ab170eec3ccfb35615a246a4d5d31b878 Author: Dan Harkless AuthorDate: Tue Aug 17 23:09:46 1999 +0000 Commit: Dan Harkless CommitDate: Tue Aug 17 23:09:46 1999 +0000 Automated #define of MAILGROUP and installation of inc as setgid mail when the mail spool directory isn't world-writable. :100644 100644 5d2429e4... 5051962e... M acconfig.h :100644 100644 63274ce3... 6b3367f5... M configure.in commit 96d0d8f5b5fc28cad71f5f2cf67dc518fbbae245 Author: Dan Harkless AuthorDate: Fri Jul 16 01:39:09 1999 +0000 Commit: Dan Harkless CommitDate: Fri Jul 16 01:39:09 1999 +0000 * slocal -debug used to leave a copy of each message processed in /tmp. * Got rid of a ton of compilation warnings output by gcc -Wall. * rcvdistcomps no longer has "Resent-Fcc: outbox"; new rcvdistcomps.outbox does. :100644 100644 1175c197... 6114a59a... M ChangeLog commit 197f95940cc0860683e6988352f721e6603f9339 Author: Dan Harkless AuthorDate: Fri Jul 16 01:30:05 1999 +0000 Commit: Dan Harkless CommitDate: Fri Jul 16 01:30:05 1999 +0000 Eliminated compilation warnings. :100644 100644 c318a227... 34cd5daa... M uip/anno.c :100644 100644 7e16b926... 11381f3c... M uip/ap.c :100644 100644 e40c9688... d380b521... M uip/comp.c :100644 100644 29a12e79... 1a921cdc... M uip/conflict.c :100644 100644 1fb17413... f8769a0f... M uip/dist.c :100644 100644 0041198a... a9bc90f1... M uip/dp.c :100644 100644 bced89fd... ad0cf2d1... M uip/flist.c :100644 100644 89e70ef6... 9ae23b41... M uip/fmtdump.c :100644 100644 c023e114... f9403169... M uip/folder.c :100644 100644 ade775ed... 8455431a... M uip/forw.c :100644 100644 b2d24864... b2a1f1d5... M uip/install-mh.c :100644 100644 2bbba6d8... 9bd45619... M uip/mark.c :100644 100644 4c9e5e0f... 6ef30fbf... M uip/mhl.c :100644 100644 f9dc33bf... 222a0761... M uip/mhmail.c commit b89abf4ec88b6bb884c427f5cf48005720e94e29 Author: Dan Harkless AuthorDate: Fri Jul 16 01:19:29 1999 +0000 Commit: Dan Harkless CommitDate: Fri Jul 16 01:19:29 1999 +0000 Eliminated unsued sigset_t variables set and oset. :100644 100644 0bbe5880... 20b1fb55... M sbr/pidwait.c commit 9616cec52fff44e9ca53e287f6ee74b37d0d4f3b Author: Dan Harkless AuthorDate: Fri Jul 16 01:16:08 1999 +0000 Commit: Dan Harkless CommitDate: Fri Jul 16 01:16:08 1999 +0000 Previously contained the code: if (numburst == 0) if (!quietsw) admonish (NULL, "message %d not in digest format", msgnum); else adios (NULL, "burst() botch -- you lose big"); If the indentation is to be believed, this is a bug. I trusted the indentation and added {}s around the inner if(). :100644 100644 d13b0760... d367b97d... M uip/burst.c commit 13d528f11ebbe35544897590a4973e90d9b2f55e Author: Dan Harkless AuthorDate: Fri Jul 16 01:13:05 1999 +0000 Commit: Dan Harkless CommitDate: Fri Jul 16 01:13:05 1999 +0000 Eliminated compilation warnings. pop_action() and pop_pack() used to return garbage. They now (arbitrarily) return 0. Dunno if their return values are ever used... :100644 100644 9752b5aa... 164ac987... M uip/inc.c commit 3c9700d8d045f3ff26ce5dd2a174454dafc14822 Author: Dan Harkless AuthorDate: Fri Jul 16 01:11:44 1999 +0000 Commit: Dan Harkless CommitDate: Fri Jul 16 01:11:44 1999 +0000 Eliminated compilation warnings. :100644 100644 55f33938... 7d1d8085... M mts/sendmail/hosts.c :100644 100644 1ff41387... 05f8c33f... M mts/sendmail/sendmail.c :100644 100644 0e2f0a42... d1fd730d... M sbr/addrsbr.c :100644 100644 782eb0a9... 150aa73d... M sbr/fmt_addr.c :100644 100644 630cfc5c... 0af69aba... M sbr/fmt_scan.c :100644 100644 8ea8c13e... b15865e2... M uip/aliasbr.c :100644 100644 bacec100... dc0059c1... M uip/mhbuild.c :100644 100644 d5f29082... ec2f9459... M uip/mhlist.c :100644 100644 70f730b5... f73853e4... M uip/mhn.c :100644 100644 1da25d31... f6ebb651... M uip/mhparam.c :100644 100644 ac1854e4... 918371a9... M uip/mhpath.c :100644 100644 ff2bee85... 0791c483... M uip/mhshow.c :100644 100644 a52e00bf... c9b6a26b... M uip/mhstore.c :100644 100644 80a0c7b3... 5c031091... M uip/mhtest.c :100644 100644 ec2f975a... a607da81... M uip/packf.c :100644 100644 d2f72efb... fb342856... M uip/pick.c :100644 100644 59ab61ae... a48c2234... M uip/popi.c :100644 100644 fa1bfae8... e1f0e8d5... M uip/prompter.c :100644 100644 1520cbe1... f9834be4... M uip/rcvpack.c :100644 100644 81a03e8f... 5a3dcbe0... M uip/rcvstore.c :100644 100644 83e56395... 906ea4aa... M uip/refile.c :100644 100644 af58c59c... 67155fa5... M uip/repl.c :100644 100644 059e6075... 9b12304b... M uip/rmf.c :100644 100644 1b09907a... 21a0f901... M uip/rmm.c :100644 100644 1f9b8c0d... cbd92773... M uip/scan.c :100644 100644 2370ea4c... b98d89a8... M uip/send.c :100644 100644 245a538c... b7c4cf24... M uip/sendsbr.c :100644 100644 75e4827f... 7927ac56... M uip/show.c :100644 100644 77af4680... 28aaa8f5... M uip/termsbr.c :100644 100644 8b398e60... b64bdab5... M uip/vmh.c :100644 100644 813e6b74... 46ecf8cc... M uip/vmhtest.c :100644 100644 083650ed... 34c560ee... M uip/whatnow.c :100644 100644 b12307dc... 854a9725... M uip/whatnowsbr.c :100644 100644 aeb8d3b6... 5a825344... M uip/whom.c :100644 100644 fce1f59b... 2e46dbb1... M uip/wmh.c :100644 100644 b9904be2... 5f8e88bb... M zotnet/bboards/getbbent.c :100644 100644 b129785e... d1db19fc... M zotnet/mf/mf.c commit 8f8d299c72fdf8105947681d459dde45eda94e9d Author: Dan Harkless AuthorDate: Fri Jul 16 01:03:34 1999 +0000 Commit: Dan Harkless CommitDate: Fri Jul 16 01:03:34 1999 +0000 donote() previously was written such that it could return garbage. :100644 100644 65fed7e3... a063049a... M uip/msgchk.c commit 6ee86a18ee336cce7df303753e4989e519162cf5 Author: Dan Harkless AuthorDate: Fri Jul 16 01:01:24 1999 +0000 Commit: Dan Harkless CommitDate: Fri Jul 16 01:01:24 1999 +0000 err2peer() previously returned garbage. Now it returns result of callee verr2peer(). :100644 100644 8ef03108... c8743959... M uip/vmhsbr.c commit 9dc2494d155597ca15d9d05853d5bcad73701c00 Author: Dan Harkless AuthorDate: Fri Jul 16 00:59:36 1999 +0000 Commit: Dan Harkless CommitDate: Fri Jul 16 00:59:36 1999 +0000 Eliminated compilation warnings. :100644 100644 e075322d... 68d08353... M uip/mhlsbr.c commit 794dab6aa5027ffaf024506140c258f6a0a9322d Author: Dan Harkless AuthorDate: Fri Jul 16 00:53:17 1999 +0000 Commit: Dan Harkless CommitDate: Fri Jul 16 00:53:17 1999 +0000 Eliminated compilation warnings. :100644 100644 08975511... a65736f3... M uip/mhbuildsbr.c :100644 100644 75ac1583... 80ebcbb6... M uip/mhmisc.c :100644 100644 6d2914ae... f2b30b65... M uip/mhoutsbr.c :100644 100644 fc5ab20b... 86a08b7a... M uip/mhparse.c :100644 100644 a95ff7d5... e76dbaac... M uip/mhshowsbr.c :100644 100644 d849609f... 2d0fdc81... M uip/mhstoresbr.c :100644 100644 6755a8cf... 41cf5102... M uip/msh.c :100644 100644 a665536f... 427bff60... M uip/mshcmds.c :100644 100644 88463ede... 36ca6956... M uip/picksbr.c :100644 100644 0b0551d1... f86d5d32... M uip/popsbr.c :100644 100644 4602dc01... 8eb3b77f... M uip/post.c :100644 100644 b210696f... 922670b5... M uip/rcvdist.c :100644 100644 cb194dd5... b847b563... M uip/rcvtty.c :100644 100644 57eb6cdc... 7515f116... M uip/replsbr.c :100644 100644 398045b4... c7f53964... M uip/sortm.c :100644 100644 c5b27a08... 5bc41d8a... M uip/spost.c :100644 100644 bb5b12cd... 2ee6b3df... M uip/viamail.c commit ae4c23b5c35a12a8a0a39eb6194c48f6ae4ca055 Author: Dan Harkless AuthorDate: Fri Jul 16 00:52:20 1999 +0000 Commit: Dan Harkless CommitDate: Fri Jul 16 00:52:20 1999 +0000 Eliminated compilation warnings. slocal -debug left a file in /tmp for every single message it processed! Totally unacceptable since some people like to have slocal -debug in their .forward files to get better logging. :100644 100644 c1ee80fb... a306cada... M uip/slocal.c commit 14d4fe34a364d78ca25f39b82713255a3e9006cb Author: Dan Harkless AuthorDate: Fri Jul 16 00:50:01 1999 +0000 Commit: Dan Harkless CommitDate: Fri Jul 16 00:50:01 1999 +0000 Changed done() from returning void to returning int so that main()s who call done() at the end can instead return done() at the end to eliminate the compilation warning about falling off the end of a non-void function. :100644 100644 0dccfa2e... 5fe0b0c2... M h/prototypes.h commit 13f32d980c37d425a846e59ea63949bd5c2572c3 Author: Dan Harkless AuthorDate: Fri Jul 16 00:48:59 1999 +0000 Commit: Dan Harkless CommitDate: Fri Jul 16 00:48:59 1999 +0000 Changed from returning void to returning int so that main()s who call done() at the end can instead return done() at the end to eliminate the compilation warning about falling off the end of a non-void function. :100644 100644 02465ea0... b5072a69... M sbr/done.c commit f3897a21dafb3e2219520a45052b2618620910c4 Author: Dan Harkless AuthorDate: Fri Jul 16 00:47:33 1999 +0000 Commit: Dan Harkless CommitDate: Fri Jul 16 00:47:33 1999 +0000 Changed call of done() to return of done() to eliminate compilation warning. :100644 100644 bbbf0c18... 54c8b05a... M uip/ali.c commit e458e7d100c31d7229d376272f90ef93052ff43f Author: Dan Harkless AuthorDate: Fri Jul 16 00:44:40 1999 +0000 Commit: Dan Harkless CommitDate: Fri Jul 16 00:44:40 1999 +0000 I think it's totally inappropriate for the default rcvdistcomps to save all outgoing messages in an "outbox" folder. I have made a new file called rcvdistcomps.outbox which looks like this file used to. :100644 100644 13fe8082... f5cc117e... M etc/rcvdistcomps commit 03560c9427c1ae048364d0bb0306cd3c803a0d6d Author: Dan Harkless AuthorDate: Fri Jul 16 00:43:04 1999 +0000 Commit: Dan Harkless CommitDate: Fri Jul 16 00:43:04 1999 +0000 New $(DIST_FILES) entry: rcvdistcomps.outbox. :100644 100644 67eed058... e58951ea... M etc/Makefile.in commit 8179163d2de10c9e373a82c0cddf45e9c902b163 Author: Dan Harkless AuthorDate: Fri Jul 16 00:40:35 1999 +0000 Commit: Dan Harkless CommitDate: Fri Jul 16 00:40:35 1999 +0000 I renamed the old rcvdistcomps to rcvdistcomps.outbox and removed the "Resent-Fcc: outbox" line from rcvdistcomps. :000000 100644 00000000... 13fe8082... A etc/rcvdistcomps.outbox commit 431bb19e74a59bca00fdc4e8118097c1fdeac8bf Author: Doug Morris AuthorDate: Sat Jun 12 09:29:45 1999 +0000 Commit: Doug Morris CommitDate: Sat Jun 12 09:29:45 1999 +0000 added my name to the change :100644 100644 63b1e20b... 1175c197... M ChangeLog commit bd1e50a7d47bda4778120d39ec9d168e26d0bd9d Author: Doug Morris AuthorDate: Sat Jun 12 09:26:50 1999 +0000 Commit: Doug Morris CommitDate: Sat Jun 12 09:26:50 1999 +0000 added explanation of change made two nights ago. :100644 100644 71de17cc... 63b1e20b... M ChangeLog commit 0ccd1945560c715e4cc4063209bd0d68b75d5470 Author: Doug Morris AuthorDate: Wed Jun 9 20:51:59 1999 +0000 Commit: Doug Morris CommitDate: Wed Jun 9 20:51:59 1999 +0000 use mkstemp on systems that have it :100644 100644 0b50e390... 5d2429e4... M acconfig.h :100644 100644 2192ddf4... d3197432... M config.h.in :100755 100755 524f9ea6... 56ac422f... M configure :100644 100644 87b4add6... 63274ce3... M configure.in :100644 100644 e2f65744... 773696b8... M mts/smtp/smtp.c :100644 100644 fac895b3... 9771543c... M sbr/lock_file.c :100644 100644 123a4983... e29b10a0... M sbr/m_scratch.c :100644 100644 1b4f3549... 31bce67a... M sbr/m_tmpfil.c :100644 100644 fcdd5e16... a665536f... M uip/mshcmds.c :100644 100644 9eb365f1... cb194dd5... M uip/rcvtty.c :100644 100644 58d4ae39... c5b27a08... M uip/spost.c commit fd96433a81a97a1e2d8667c7087693e94706807d Author: Doug Morris AuthorDate: Thu May 13 14:42:34 1999 +0000 Commit: Doug Morris CommitDate: Thu May 13 14:42:34 1999 +0000 Added notes about the configure change. :100644 100644 7b5db909... 71de17cc... M ChangeLog commit 673859dfa72a5f4d485ae22d29ff2e2fc4147bf5 Author: Doug Morris AuthorDate: Thu May 13 14:28:25 1999 +0000 Commit: Doug Morris CommitDate: Thu May 13 14:28:25 1999 +0000 Modified configure to use config.guess and config.sub to auto-detect the system type and correctly set the #defines in config.h. :100644 100644 64a9da0c... 0b50e390... M acconfig.h :000000 100755 00000000... 4d39b912... A config.guess :100644 100644 eaa7f40d... 2192ddf4... M config.h.in :000000 100755 00000000... 3f5c202f... A config.sub :100755 100755 c00aeb39... 524f9ea6... M configure :100644 100644 fec2eabd... 87b4add6... M configure.in commit 3b52c3944968810e976ae3ec214dfa4dec8178dc Author: Dan Harkless AuthorDate: Thu May 13 03:42:11 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 03:42:11 1999 +0000 1.0.1 :100644 100644 77c5348e... 7b5db909... M ChangeLog :100644 100644 1beee2ba... 5601a1d4... M VERSION commit 603560103f9b6a5808e3fc165a484f040552b5af Author: Dan Harkless AuthorDate: Thu May 13 01:32:53 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:32:53 1999 +0000 1.0.1 patches :100644 100644 fa6ef473... 77c5348e... M ChangeLog commit c9f5db670ffbc6e761fb0512e621f2aee71509ee Author: Dan Harkless AuthorDate: Thu May 13 01:31:47 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:31:47 1999 +0000 Update for the brave new world :100644 100644 92bffa21... 1bfae3f7... M INSTALL :100644 100644 595e444d... a4e21cdd... M README commit 910f3846bb30636fe25bdc6e06e72d50c6779bd9 Author: Dan Harkless AuthorDate: Thu May 13 01:31:00 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:31:00 1999 +0000 Use "#include " instead of "extern int errno;". Suggested by Stephen Wilson Bailey :100644 100644 75565036... 1ff41387... M mts/sendmail/sendmail.c :100644 100644 f7756381... e2f65744... M mts/smtp/smtp.c :100644 100644 0e02f2ab... 41f031a5... M sbr/error.c :100644 100644 d36e0e50... 671a533d... M uip/ftpsbr.c :100644 100644 6b026c6e... 0b0551d1... M uip/popsbr.c :100644 100644 664c388e... 8ef03108... M uip/vmhsbr.c :100644 100644 6d860578... b9679e9a... M zotnet/mts/client.c commit 4cb1b8e5faf3f8d7dbd458f1edaeba2c613b09fb Author: Dan Harkless AuthorDate: Thu May 13 01:28:40 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:28:40 1999 +0000 add a note about Irix make :100644 100644 71f5362d... 69b0c7de... M MACHINES commit 5a5ef8e8fd626315f6cc8972d9d0e8c7cd69dc68 Author: Dan Harkless AuthorDate: Thu May 13 01:28:16 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:28:16 1999 +0000 man page updates from Jerry Peek :100644 100644 a9f66cbd... 37bae2a9... M man/packf.man :100644 100644 1a015bbc... bd3c77f5... M man/whatnow.man commit e0c210b265a8d6500d1e391f853ecee8d9827165 Author: Dan Harkless AuthorDate: Thu May 13 01:26:41 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:26:41 1999 +0000 deal with SIGPIPE so mhl doesn't print "Broken pipe" if you quit out of the moreproc :100644 100644 18617d31... e075322d... M uip/mhlsbr.c commit e6082c44cba0749864df4db1e0ce43fb9ce2a68a Author: Dan Harkless AuthorDate: Thu May 13 01:25:52 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:25:52 1999 +0000 Fixed a signal-handling bug that could cause whatnow to sometimes exit without prompting the user. Based on a patch by Richard Geiger . :100644 100644 4bd02e3e... 0bbe5880... M sbr/pidwait.c commit 34019fa0a2ec3e20b9256394acf54a53d5c35402 Author: Dan Harkless AuthorDate: Thu May 13 01:24:47 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:24:47 1999 +0000 Changed configure.in's check for sigsetjmp to properly deal with systems like Linux where it is a macro. From . :100644 100644 5c3f6024... 64a9da0c... M acconfig.h :100644 100644 eccfb102... eaa7f40d... M config.h.in :100755 100755 a84b3106... c00aeb39... M configure :100644 100644 dd5ebdc6... fec2eabd... M configure.in commit 2b5c5779f2eb63019446a69c3e2c6f871e71c3df Author: Dan Harkless AuthorDate: Thu May 13 01:22:54 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:22:54 1999 +0000 Added -library switch so it can parse user aliases like post does. From Ruud de Rooij . :100644 100644 7d65eada... 58d4ae39... M uip/spost.c commit e49cacf800179ed9650c07f9fc13c5e8736cb9e7 Author: Dan Harkless AuthorDate: Thu May 13 01:22:03 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:22:03 1999 +0000 Don't add line breaks in the middle of long addresses when building a draft. Fixes a bug where repl would generate invalid headers. From Ruud de Rooij . :100644 100644 2086a94c... 630cfc5c... M sbr/fmt_scan.c commit d057cb7218d8e5a6b30f38a863b73b7d562bf9d0 Author: Dan Harkless AuthorDate: Thu May 13 01:17:23 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:17:23 1999 +0000 Allow display of 8bit encoded messages. From Kimmo Suominen . :100644 100644 73907ab3... 08975511... M uip/mhbuildsbr.c :100644 100644 1839a15d... fc5ab20b... M uip/mhparse.c commit 6f48e12f2d4dd510f1610338648c2f6ab904392f Author: Dan Harkless AuthorDate: Thu May 13 01:16:14 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:16:14 1999 +0000 Change ordering of a conditional to prevent a bad pointer dereference. Fixes a segv in inc (and occasionally other programs). Originally from Ruud de Rooij :100644 100644 8697f206... aca481a1... M sbr/m_getfld.c commit ebe7903c571e88539acf6bfb636f7d212f279022 Author: Dan Harkless AuthorDate: Thu May 13 01:13:58 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:13:58 1999 +0000 Fix a buffer overrun that caused packf -mbox to mess up on Return-Path: lines. From Kimmo Suominen :100644 100644 7e791f34... b4d2eec3... M zotnet/tws/dtime.c commit 9361ec85a7f8cc7c12dd90ed549392c815d0d7de Author: Dan Harkless AuthorDate: Thu May 13 01:12:12 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:12:12 1999 +0000 Make whatnow "list" work with "lproc: show" again. From Ruud de Rooij :100644 100644 5ab63702... 75e4827f... M uip/show.c commit aa4db278d4cea684124ffcbd520abc56b0317139 Author: Dan Harkless AuthorDate: Thu May 13 01:10:45 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:10:45 1999 +0000 add HAVE_LIBM :100644 100644 3915bde2... eccfb102... M config.h.in commit 3f2164f3652497ab2a07373b4fb1d41e3a57da34 Author: Dan Harkless AuthorDate: Thu May 13 01:07:15 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:07:15 1999 +0000 Add check for modf and link with -lm if it's not in libc. Needed for at least Digital UNIX. Problem noted by Kevin Oberman :100755 100755 c2cbd6da... a84b3106... M configure :100644 100644 6b4e237e... dd5ebdc6... M configure.in commit 4f09543a71a26f8f30d4bd0a83faede0a144f23d Author: Dan Harkless AuthorDate: Thu May 13 01:05:49 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:05:49 1999 +0000 Fix krb4 code to work with the original krb4 libraries as well as the krb5-compat ones. Based on a patch by Assar Westerlund :100755 100755 87860376... c2cbd6da... M configure :100644 100644 f544ac6f... 6b4e237e... M configure.in commit 38efa847bbbb0f0bfaca90d7665bfe21de725f99 Author: Dan Harkless AuthorDate: Thu May 13 01:03:23 1999 +0000 Commit: Dan Harkless CommitDate: Thu May 13 01:03:23 1999 +0000 Properly deal with relative folder names. Problem noted by Jerry Peek :100644 100644 0e2b1614... bced89fd... M uip/flist.c commit 1691e80890e5d8ba258c51c214a3e91880e1db2b Author: Doug Morris AuthorDate: Fri Apr 30 18:08:34 1999 +0000 Commit: Doug Morris CommitDate: Fri Apr 30 18:08:34 1999 +0000 Initial revision :000000 100644 00000000... 19485053... A COPYRIGHT :000000 100644 00000000... fa6ef473... A ChangeLog :000000 100644 00000000... 1a240370... A DIFFERENCES :000000 100644 00000000... 92bffa21... A INSTALL :000000 100644 00000000... 71f5362d... A MACHINES :000000 100644 00000000... becf31a0... A MAIL.FILTERING :000000 100644 00000000... 97313fc4... A Makefile.in :000000 100644 00000000... 595e444d... A README :000000 100644 00000000... 861da67d... A TODO :000000 100644 00000000... 1beee2ba... A VERSION :000000 100644 00000000... 5c10cc89... A ZSH.COMPLETION :000000 100644 00000000... 5c3f6024... A acconfig.h :000000 100644 00000000... cbfb4982... A aclocal.m4 :000000 100644 00000000... 3915bde2... A config.h.in :000000 100644 00000000... 8468646b... A config/Makefile.in :000000 100644 00000000... 2a01c1bb... A config/config.c :000000 100755 00000000... 6257186f... A config/version.sh :000000 100755 00000000... 87860376... A configure :000000 100644 00000000... f544ac6f... A configure.in :000000 100644 00000000... c5be1413... A etc/MailAliases :000000 100644 00000000... 67eed058... A etc/Makefile.in :000000 100644 00000000... 2669f040... A etc/components :000000 100644 00000000... d527e1d1... A etc/digestcomps :000000 100644 00000000... c6dc39a3... A etc/distcomps :000000 100644 00000000... 2669f040... A etc/forwcomps :000000 100644 00000000... 70ae4632... A etc/mhl.body :000000 100644 00000000... ea4a6d51... A etc/mhl.digest :000000 100644 00000000... 7f8a5672... A etc/mhl.format :000000 100644 00000000... 82b4ebc7... A etc/mhl.forward :000000 100644 00000000... 8fee181c... A etc/mhl.headers :000000 100644 00000000... 0caf5db2... A etc/mhl.reply :000000 100755 00000000... 358baf11... A etc/mhn.defaults.sh :000000 100755 00000000... 8f128f79... A etc/mhn.find.sh :000000 100644 00000000... c892f0fd... A etc/mts.conf.in :000000 100644 00000000... 13fe8082... A etc/rcvdistcomps :000000 100644 00000000... 52170a76... A etc/replcomps :000000 100644 00000000... 9295fd0e... A etc/replgroupcomps :000000 100644 00000000... f898e86c... A etc/scan.default :000000 100644 00000000... 27d18d32... A etc/scan.mailx :000000 100644 00000000... 8e2cedf6... A etc/scan.nomime :000000 100644 00000000... a6b6698c... A etc/scan.size :000000 100644 00000000... ee54a523... A etc/scan.time :000000 100644 00000000... 06c068c2... A etc/scan.timely :000000 100644 00000000... d1cd195c... A etc/scan.unseen :000000 100755 00000000... d53ed82e... A etc/sendfiles :000000 100644 00000000... 4f992592... A h/Makefile.in :000000 100644 00000000... e3aa7e80... A h/addrsbr.h :000000 100644 00000000... 2e464d92... A h/aliasbr.h :000000 100644 00000000... 146a63bf... A h/dropsbr.h :000000 100644 00000000... f9115040... A h/fmt_compile.h :000000 100644 00000000... fd4c555d... A h/fmt_scan.h :000000 100644 00000000... 9a394b50... A h/md5.h :000000 100644 00000000... c8ece5d1... A h/mh.h :000000 100644 00000000... a1977384... A h/mhcachesbr.h :000000 100644 00000000... f99a1c7a... A h/mhparse.h :000000 100644 00000000... b741b2f2... A h/mime.h :000000 100644 00000000... c6b0fa59... A h/msh.h :000000 100644 00000000... 41b0226f... A h/netdb.h :000000 100644 00000000... f00a3ad3... A h/nmh.h :000000 100644 00000000... b2329495... A h/nntp.h :000000 100644 00000000... 811836d7... A h/picksbr.h :000000 100644 00000000... a9e08838... A h/popsbr.h :000000 100644 00000000... 0dccfa2e... A h/prototypes.h :000000 100644 00000000... 856409e4... A h/rcvmail.h :000000 100644 00000000... b050d978... A h/scansbr.h :000000 100644 00000000... 9648e04f... A h/signals.h :000000 100644 00000000... 452f2e3f... A h/vmhsbr.h :000000 100755 00000000... 0d02bf25... A install-sh :000000 100644 00000000... d08c3a2a... A man/Makefile.in :000000 100644 00000000... 7e0c1817... A man/ali.man :000000 100644 00000000... 5cf58313... A man/anno.man :000000 100644 00000000... d4c24a9e... A man/ap.man :000000 100644 00000000... 6b41d66b... A man/burst.man :000000 100644 00000000... aebcb004... A man/comp.man :000000 100644 00000000... 01f7936f... A man/conflict.man :000000 100644 00000000... f0c16aa8... A man/dist.man :000000 100644 00000000... f3fe6bfa... A man/dp.man :000000 100644 00000000... 177ad1d1... A man/flist.man :000000 100644 00000000... 00463777... A man/fmtdump.man :000000 100644 00000000... 33b918bd... A man/folder.man :000000 100644 00000000... 7d95613c... A man/forw.man :000000 100644 00000000... b2e5c7b3... A man/inc.man :000000 100644 00000000... c00f678e... A man/install-mh.man :000000 100644 00000000... 426ea293... A man/mark.man :000000 100644 00000000... 451ea63b... A man/mh-alias.man :000000 100644 00000000... 9f95ee82... A man/mh-chart.man :000000 100644 00000000... 0b71fd7b... A man/mh-draft.man :000000 100644 00000000... bc40c88d... A man/mh-format.man :000000 100644 00000000... df39b13c... A man/mh-mail.man :000000 100644 00000000... 1829ae6e... A man/mh-mts.man :000000 100644 00000000... e1326ed4... A man/mh-profile.man :000000 100644 00000000... 7d2c72b4... A man/mh-sequence.man :000000 100644 00000000... 71cf0bc2... A man/mh-tailor.man :000000 100644 00000000... 497ff3dd... A man/mhbuild.man :000000 100644 00000000... b81415c5... A man/mhl.man :000000 100644 00000000... 1cd7d0ed... A man/mhlist.man :000000 100644 00000000... 5902b7c3... A man/mhmail.man :000000 100644 00000000... e4719dcd... A man/mhn.man :000000 100644 00000000... a4af2b58... A man/mhparam.man :000000 100644 00000000... ff17b73f... A man/mhpath.man :000000 100644 00000000... 30a925f0... A man/mhshow.man :000000 100644 00000000... 7148dc8c... A man/mhstore.man :000000 100644 00000000... e7624a01... A man/msgchk.man :000000 100644 00000000... 88ae414c... A man/msh.man :000000 100644 00000000... 1bc25453... A man/next.man :000000 100644 00000000... 7cc20fc7... A man/nmh.man :000000 100644 00000000... a9f66cbd... A man/packf.man :000000 100644 00000000... a2a54c41... A man/pick.man :000000 100644 00000000... 397901a5... A man/post.man :000000 100644 00000000... 5bb1619a... A man/prev.man :000000 100644 00000000... d8a2ef03... A man/prompter.man :000000 100644 00000000... 1a2cfe57... A man/rcvdist.man :000000 100644 00000000... ed95ad00... A man/rcvpack.man :000000 100644 00000000... eeb164d4... A man/rcvstore.man :000000 100644 00000000... a00d1b16... A man/rcvtty.man :000000 100644 00000000... 778616ea... A man/refile.man :000000 100644 00000000... a7e11658... A man/repl.man :000000 100644 00000000... de9cd8f7... A man/rmf.man :000000 100644 00000000... 87738537... A man/rmm.man :000000 100644 00000000... d4ad6a7c... A man/scan.man :000000 100644 00000000... 43d1ad12... A man/send.man :000000 100644 00000000... 72f843c0... A man/sendfiles.man :000000 100644 00000000... a864048b... A man/show.man :000000 100644 00000000... b54bc3f1... A man/slocal.man :000000 100644 00000000... eeaac1a5... A man/sortm.man :000000 100644 00000000... 7b49b791... A man/tmac.h.in :000000 100644 00000000... 050cdf7f... A man/vmh.man :000000 100644 00000000... 1a015bbc... A man/whatnow.man :000000 100644 00000000... 9caf26c3... A man/whom.man :000000 100755 00000000... 0801ec2c... A mkinstalldirs :000000 100644 00000000... 328a9ead... A mts/Makefile.in :000000 100644 00000000... d076a137... A mts/mmdf/Makefile.in :000000 100644 00000000... 748d8d6e... A mts/mmdf/hosts.c :000000 100644 00000000... d5580a5b... A mts/sendmail/Makefile.in :000000 100644 00000000... 55f33938... A mts/sendmail/hosts.c :000000 100644 00000000... 75565036... A mts/sendmail/sendmail.c :000000 100644 00000000... 7d197d55... A mts/smtp/Makefile.in :000000 100644 00000000... 55f33938... A mts/smtp/hosts.c :000000 100644 00000000... f7756381... A mts/smtp/smtp.c :000000 100644 00000000... 772035d7... A mts/smtp/smtp.h :000000 100644 00000000... 9aad677b... A sbr/Makefile.in :000000 100644 00000000... f38110f7... A sbr/add.c :000000 100644 00000000... 0e2f0a42... A sbr/addrsbr.c :000000 100644 00000000... 48b7328e... A sbr/ambigsw.c :000000 100644 00000000... ab58cb46... A sbr/atooi.c :000000 100644 00000000... 715aaf5e... A sbr/brkstring.c :000000 100644 00000000... e16f3603... A sbr/check_charset.c :000000 100644 00000000... 86f91a76... A sbr/closefds.c :000000 100644 00000000... 939a484f... A sbr/concat.c :000000 100644 00000000... 702c15d0... A sbr/context_del.c :000000 100644 00000000... 1e324013... A sbr/context_find.c :000000 100644 00000000... 208c45e7... A sbr/context_foil.c :000000 100644 00000000... d2836ba3... A sbr/context_read.c :000000 100644 00000000... 435127b2... A sbr/context_replace.c :000000 100644 00000000... b3f8168b... A sbr/context_save.c :000000 100644 00000000... 577e811e... A sbr/copy.c :000000 100644 00000000... 8d7b6f54... A sbr/copyip.c :000000 100644 00000000... a8c33758... A sbr/cpydata.c :000000 100644 00000000... 068fb6e8... A sbr/cpydgst.c :000000 100644 00000000... fffc0fa8... A sbr/discard.c :000000 100644 00000000... 02465ea0... A sbr/done.c :000000 100644 00000000... 0e02f2ab... A sbr/error.c :000000 100644 00000000... 3956a7b9... A sbr/fdcompare.c :000000 100644 00000000... 782eb0a9... A sbr/fmt_addr.c :000000 100644 00000000... 339ac0a2... A sbr/fmt_compile.c :000000 100644 00000000... e3384e8b... A sbr/fmt_def.c :000000 100644 00000000... 003ec2bc... A sbr/fmt_new.c :000000 100644 00000000... a9c3d0bd... A sbr/fmt_rfc2047.c :000000 100644 00000000... 2086a94c... A sbr/fmt_scan.c :000000 100644 00000000... 6858f4db... A sbr/folder_addmsg.c :000000 100644 00000000... e5374b5d... A sbr/folder_delmsgs.c :000000 100644 00000000... 1c1051de... A sbr/folder_free.c :000000 100644 00000000... 05365a86... A sbr/folder_pack.c :000000 100644 00000000... 0d012932... A sbr/folder_read.c :000000 100644 00000000... f3130f14... A sbr/folder_realloc.c :000000 100644 00000000... dcfb316c... A sbr/gans.c :000000 100644 00000000... 987ed3c8... A sbr/getans.c :000000 100644 00000000... f38a834f... A sbr/getanswer.c :000000 100644 00000000... 1c61d9bb... A sbr/getarguments.c :000000 100644 00000000... 07bc3651... A sbr/getcpy.c :000000 100644 00000000... 21db9a98... A sbr/getfolder.c :000000 100644 00000000... fac895b3... A sbr/lock_file.c :000000 100644 00000000... b1b5133d... A sbr/m_atoi.c :000000 100644 00000000... aa9edc8d... A sbr/m_backup.c :000000 100644 00000000... e9a5d188... A sbr/m_convert.c :000000 100644 00000000... 712e173d... A sbr/m_draft.c :000000 100644 00000000... 8697f206... A sbr/m_getfld.c :000000 100644 00000000... 3f54c456... A sbr/m_gmprot.c :000000 100644 00000000... 11c6ee3e... A sbr/m_maildir.c :000000 100644 00000000... 89e0f296... A sbr/m_msgdef.c :000000 100644 00000000... dd8303e3... A sbr/m_name.c :000000 100644 00000000... 123a4983... A sbr/m_scratch.c :000000 100644 00000000... 1b4f3549... A sbr/m_tmpfil.c :000000 100644 00000000... 6cf9e03c... A sbr/makedir.c :000000 100644 00000000... df5d963b... A sbr/path.c :000000 100644 00000000... d77039bc... A sbr/peekc.c :000000 100644 00000000... aa664649... A sbr/pidstatus.c :000000 100644 00000000... 4bd02e3e... A sbr/pidwait.c :000000 100644 00000000... 1ceeb859... A sbr/print_help.c :000000 100644 00000000... c9c1159c... A sbr/print_sw.c :000000 100644 00000000... 1b37b1ea... A sbr/print_version.c :000000 100644 00000000... 05c3942f... A sbr/push.c :000000 100644 00000000... 2c6af0dc... A sbr/putenv.c :000000 100644 00000000... 0036d20e... A sbr/pwd.c :000000 100644 00000000... 087ed78d... A sbr/r1bindex.c :000000 100644 00000000... 9cd128e3... A sbr/readconfig.c :000000 100644 00000000... 17c67155... A sbr/refile.c :000000 100644 00000000... 4ef1649a... A sbr/remdir.c :000000 100644 00000000... 68809df4... A sbr/ruserpass.c :000000 100644 00000000... b586fc37... A sbr/seq_add.c :000000 100644 00000000... b0f6e6c0... A sbr/seq_bits.c :000000 100644 00000000... ed70c5d9... A sbr/seq_del.c :000000 100644 00000000... c44f1775... A sbr/seq_getnum.c :000000 100644 00000000... afa8671c... A sbr/seq_list.c :000000 100644 00000000... 66319b5e... A sbr/seq_nameok.c :000000 100644 00000000... ee34fd9e... A sbr/seq_print.c :000000 100644 00000000... 649a360e... A sbr/seq_read.c :000000 100644 00000000... e0f42aec... A sbr/seq_save.c :000000 100644 00000000... 7e7acba0... A sbr/seq_setcur.c :000000 100644 00000000... e5161c5a... A sbr/seq_setprev.c :000000 100644 00000000... 906b0ac2... A sbr/seq_setunseen.c :000000 100644 00000000... 7ed13cac... A sbr/showfile.c :000000 100755 00000000... d4f6e52e... A sbr/sigmsg.awk :000000 100644 00000000... a8c12d62... A sbr/signals.c :000000 100644 00000000... 54ff550e... A sbr/smatch.c :000000 100644 00000000... 06140c8f... A sbr/snprintb.c :000000 100644 00000000... efb6df06... A sbr/snprintf.c :000000 100644 00000000... dd5c0977... A sbr/ssequal.c :000000 100644 00000000... bbb26cba... A sbr/strcasecmp.c :000000 100644 00000000... 05a017e5... A sbr/strdup.c :000000 100644 00000000... d7809550... A sbr/strerror.c :000000 100644 00000000... 03910fdf... A sbr/strindex.c :000000 100644 00000000... d1355485... A sbr/trimcpy.c :000000 100644 00000000... 7adc3218... A sbr/uprf.c :000000 100644 00000000... 52a8e74d... A sbr/vfgets.c :000000 100644 00000000... 8b137891... A stamp-h.in :000000 100644 00000000... c292bd20... A uip/Makefile.in :000000 100644 00000000... bbbf0c18... A uip/ali.c :000000 100644 00000000... 8ea8c13e... A uip/aliasbr.c :000000 100644 00000000... c318a227... A uip/anno.c :000000 100644 00000000... c2370220... A uip/annosbr.c :000000 100644 00000000... 7e16b926... A uip/ap.c :000000 100644 00000000... d13b0760... A uip/burst.c :000000 100644 00000000... e40c9688... A uip/comp.c :000000 100644 00000000... 29a12e79... A uip/conflict.c :000000 100644 00000000... 1fb17413... A uip/dist.c :000000 100644 00000000... be2716be... A uip/distsbr.c :000000 100644 00000000... 0041198a... A uip/dp.c :000000 100644 00000000... 857263a1... A uip/dropsbr.c :000000 100644 00000000... 0e2b1614... A uip/flist.c :000000 100644 00000000... 89e70ef6... A uip/fmtdump.c :000000 100644 00000000... c023e114... A uip/folder.c :000000 100644 00000000... ade775ed... A uip/forw.c :000000 100644 00000000... d36e0e50... A uip/ftpsbr.c :000000 100644 00000000... 9752b5aa... A uip/inc.c :000000 100644 00000000... b2d24864... A uip/install-mh.c :000000 100644 00000000... 2bbba6d8... A uip/mark.c :000000 100644 00000000... 2cb6cb57... A uip/md5.c :000000 100644 00000000... bacec100... A uip/mhbuild.c :000000 100644 00000000... 73907ab3... A uip/mhbuildsbr.c :000000 100644 00000000... b372f950... A uip/mhcachesbr.c :000000 100644 00000000... aef86cd8... A uip/mhfree.c :000000 100644 00000000... 4c9e5e0f... A uip/mhl.c :000000 100644 00000000... d5f29082... A uip/mhlist.c :000000 100644 00000000... ca349022... A uip/mhlistsbr.c :000000 100644 00000000... 18617d31... A uip/mhlsbr.c :000000 100644 00000000... f9dc33bf... A uip/mhmail.c :000000 100644 00000000... 75ac1583... A uip/mhmisc.c :000000 100644 00000000... 70f730b5... A uip/mhn.c :000000 100644 00000000... 6d2914ae... A uip/mhoutsbr.c :000000 100644 00000000... 1da25d31... A uip/mhparam.c :000000 100644 00000000... 1839a15d... A uip/mhparse.c :000000 100644 00000000... ac1854e4... A uip/mhpath.c :000000 100644 00000000... ff2bee85... A uip/mhshow.c :000000 100644 00000000... a95ff7d5... A uip/mhshowsbr.c :000000 100644 00000000... a52e00bf... A uip/mhstore.c :000000 100644 00000000... d849609f... A uip/mhstoresbr.c :000000 100644 00000000... 80a0c7b3... A uip/mhtest.c :000000 100644 00000000... 65fed7e3... A uip/msgchk.c :000000 100644 00000000... 6755a8cf... A uip/msh.c :000000 100644 00000000... fcdd5e16... A uip/mshcmds.c :000000 100644 00000000... ec2f975a... A uip/packf.c :000000 100644 00000000... d2f72efb... A uip/pick.c :000000 100644 00000000... 88463ede... A uip/picksbr.c :000000 100644 00000000... 59ab61ae... A uip/popi.c :000000 100644 00000000... 6b026c6e... A uip/popsbr.c :000000 100644 00000000... 4602dc01... A uip/post.c :000000 100644 00000000... fa1bfae8... A uip/prompter.c :000000 100644 00000000... b210696f... A uip/rcvdist.c :000000 100644 00000000... 1520cbe1... A uip/rcvpack.c :000000 100644 00000000... 81a03e8f... A uip/rcvstore.c :000000 100644 00000000... 9eb365f1... A uip/rcvtty.c :000000 100644 00000000... 83e56395... A uip/refile.c :000000 100644 00000000... af58c59c... A uip/repl.c :000000 100644 00000000... 57eb6cdc... A uip/replsbr.c :000000 100644 00000000... 059e6075... A uip/rmf.c :000000 100644 00000000... 1b09907a... A uip/rmm.c :000000 100644 00000000... 1f9b8c0d... A uip/scan.c :000000 100644 00000000... 44cbf0d4... A uip/scansbr.c :000000 100644 00000000... 2370ea4c... A uip/send.c :000000 100644 00000000... 245a538c... A uip/sendsbr.c :000000 100644 00000000... 5ab63702... A uip/show.c :000000 100644 00000000... c1ee80fb... A uip/slocal.c :000000 100644 00000000... 398045b4... A uip/sortm.c :000000 100644 00000000... 7d65eada... A uip/spost.c :000000 100644 00000000... 77af4680... A uip/termsbr.c :000000 100644 00000000... bb5b12cd... A uip/viamail.c :000000 100644 00000000... 8b398e60... A uip/vmh.c :000000 100644 00000000... 664c388e... A uip/vmhsbr.c :000000 100644 00000000... 813e6b74... A uip/vmhtest.c :000000 100644 00000000... 083650ed... A uip/whatnow.c :000000 100644 00000000... caeeec2c... A uip/whatnowproc.c :000000 100644 00000000... b12307dc... A uip/whatnowsbr.c :000000 100644 00000000... aeb8d3b6... A uip/whom.c :000000 100644 00000000... fce1f59b... A uip/wmh.c :000000 100644 00000000... 7391814b... A zotnet/Makefile.in :000000 100644 00000000... 7dedeeae... A zotnet/bboards/Makefile.in :000000 100644 00000000... 227bee5e... A zotnet/bboards/bboards.h :000000 100644 00000000... b9904be2... A zotnet/bboards/getbbent.c :000000 100644 00000000... 7871ca7c... A zotnet/mf/Makefile.in :000000 100644 00000000... b129785e... A zotnet/mf/mf.c :000000 100644 00000000... a4c81e89... A zotnet/mf/mf.h :000000 100644 00000000... ab8ad654... A zotnet/mts/Makefile.in :000000 100644 00000000... 6d860578... A zotnet/mts/client.c :000000 100644 00000000... 31d96bdd... A zotnet/mts/mts.c :000000 100644 00000000... 66aa590c... A zotnet/mts/mts.h :000000 100644 00000000... 3f96711e... A zotnet/tws/Makefile.in :000000 100644 00000000... 7e791f34... A zotnet/tws/dtime.c :000000 100644 00000000... 12a209bc... A zotnet/tws/dtimep.c-lexed :000000 100644 00000000... 467dc85d... A zotnet/tws/dtimep.lex :000000 100644 00000000... 601df0f7... A zotnet/tws/lexedit.sed :000000 100644 00000000... 91506e72... A zotnet/tws/lexstring.c :000000 100644 00000000... 29702db4... A zotnet/tws/tws.h mmh-0.4/autogen.sh0000755000000000000000000000026213414435726012646 0ustar rootroot#!/bin/sh # # Regenerate config.h.in, configure, etc. # Necessary if building from VCS; not needed if # building from a distributed tarball. set -e autoreconf date > stamp-h.in mmh-0.4/stamp-h.in0000644000000000000000000000003513414435727012545 0ustar rootrootSun Jan 6 16:10:55 CET 2019 mmh-0.4/h/0000755000000000000000000000000013414435726011074 5ustar rootrootmmh-0.4/h/mhparse.h0000644000000000000000000001573713414435726012721 0ustar rootroot/* ** mhparse.h -- definitions for parsing/building of MIME content ** -- (mhparse.c/mhbuild.c) */ #define NPARTS 50 #define NTYPES 20 #define NPARMS 10 /* ** Abstract type for header fields */ typedef struct hfield *HF; /* ** Abstract types for MIME parsing/building */ typedef struct cefile *CE; typedef struct CTinfo *CI; typedef struct Content *CT; /* ** type for Init function (both type and transfer encoding) */ typedef int (*InitFunc) (CT); /* ** types for various transfer encoding access functions */ typedef int (*OpenCEFunc) (CT, char **); typedef void (*CloseCEFunc) (CT); typedef unsigned long (*SizeCEFunc) (CT); /* ** Structure for storing/encoding/decoding ** a header field and its value. */ struct hfield { char *name; /* field name */ char *value; /* field body */ int hf_encoding; /* internal flag for transfer encoding to use */ HF next; /* link to next header field */ }; /* ** Structure for storing parsed elements ** of the Content-Type component. */ struct CTinfo { char *ci_type; /* content type */ char *ci_subtype; /* content subtype */ char *ci_attrs[NPARMS + 2]; /* attribute names */ char *ci_values[NPARMS]; /* attribute values */ char *ci_comment; /* RFC-822 comments */ char *ci_magic; }; /* ** Structure for storing decoded contents after ** removing Content-Transfer-Encoding. */ struct cefile { char *ce_file; /* decoded content (file) */ FILE *ce_fp; /* decoded content (stream) */ int ce_unlink; /* remove file when done? */ }; /* ** Primary structure for handling Content (Entity) */ struct Content { /* source (read) file */ char *c_file; /* read contents (file) */ FILE *c_fp; /* read contents (stream) */ int c_unlink; /* remove file when done? */ long c_begin; /* where content body starts in file */ long c_end; /* where content body ends in file */ /* linked list of header fields */ HF c_first_hf; /* pointer to first header field */ HF c_last_hf; /* pointer to last header field */ /* copies of MIME related header fields */ char *c_vrsn; /* MIME-Version: */ char *c_ctline; /* Content-Type: */ char *c_celine; /* Content-Transfer-Encoding: */ char *c_id; /* Content-ID: */ char *c_descr; /* Content-Description: */ char *c_dispo; /* Content-Disposition: */ char *c_partno; /* within multipart content */ /* Content-Type info */ boolean crlf; /* are the line ending CRLF */ struct CTinfo c_ctinfo; /* parsed elements of Content-Type */ int c_type; /* internal flag for content type */ int c_subtype; /* internal flag for content subtype */ char *c_charset; /* charset string */ /* Content-Transfer-Encoding info (decoded contents) */ CE c_cefile; /* structure holding decoded content */ int c_encoding; /* internal flag for encoding type */ /* pointers to content-specific structures */ void *c_ctparams; /* content type specific data */ /* function pointers */ InitFunc c_ctinitfnx; /* parse content body */ OpenCEFunc c_ceopenfnx; /* get a stream to decoded contents */ CloseCEFunc c_ceclosefnx; /* release stream */ SizeCEFunc c_cesizefnx; /* size of decoded contents */ int c_umask; /* associated umask */ char *c_showproc; /* default, if not in profile */ char *c_storeproc; /* overrides profile entry, if any */ char *c_storage; /* write contents (file) */ char *c_folder; /* write contents (folder) */ }; /* ** Flags for Content-Type (Content->c_type) */ #define CT_UNKNOWN 0x00 #define CT_APPLICATION 0x01 #define CT_AUDIO 0x02 #define CT_IMAGE 0x03 #define CT_MESSAGE 0x04 #define CT_MULTIPART 0x05 #define CT_TEXT 0x06 #define CT_VIDEO 0x07 #define CT_EXTENSION 0x08 /* ** Flags for Content-Transfer-Encoding (Content->c_encoding) */ #define CE_UNKNOWN 0x00 #define CE_BASE64 0x01 #define CE_QUOTED 0x02 #define CE_8BIT 0x03 #define CE_7BIT 0x04 #define CE_BINARY 0x05 #define CE_EXTENSION 0x06 #define CE_EXTERNAL 0x07 /* for external-body */ /* ** TEXT content */ /* Flags for subtypes of TEXT */ #define TEXT_UNKNOWN 0x00 #define TEXT_PLAIN 0x01 #define TEXT_RICHTEXT 0x02 #define TEXT_ENRICHED 0x03 /* Flags for character sets */ #define CHARSET_UNKNOWN 0x00 #define CHARSET_UNSPECIFIED 0x01 /* only needed when building drafts */ #define CHARSET_USASCII 0x01 #define CHARSET_LATIN 0x02 /* Structure for text content */ struct text { int tx_charset; /* flag for character set */ }; /* ** MULTIPART content */ /* Flags for subtypes of MULTIPART */ #define MULTI_UNKNOWN 0x00 #define MULTI_MIXED 0x01 #define MULTI_ALTERNATE 0x02 #define MULTI_DIGEST 0x03 #define MULTI_PARALLEL 0x04 /* Structure for subparts of a multipart content */ struct part { CT mp_part; /* Content structure for subpart */ struct part *mp_next; /* pointer to next subpart structure */ }; /* Main structure for multipart content */ struct multipart { char *mp_start; /* boundary string separating parts */ char *mp_stop; /* terminating boundary string */ struct part *mp_parts; /* pointer to first subpart structure */ }; /* ** MESSAGE content */ /* Flags for subtypes of MESSAGE */ #define MESSAGE_UNKNOWN 0x00 #define MESSAGE_RFC822 0x01 #define MESSAGE_PARTIAL 0x02 #define MESSAGE_EXTERNAL 0x03 /* Structure for message/partial */ struct partial { char *pm_partid; int pm_partno; int pm_maxno; int pm_marked; int pm_stored; }; /* ** APPLICATION content */ /* Flags for subtype of APPLICATION */ #define APPLICATION_UNKNOWN 0x00 #define APPLICATION_OCTETS 0x01 #define APPLICATION_POSTSCRIPT 0x02 /* ** Structures for mapping types to their internal flags */ struct k2v { char *kv_key; int kv_value; }; extern struct k2v SubText[]; extern struct k2v Charset[]; extern struct k2v SubMultiPart[]; extern struct k2v SubMessage[]; extern struct k2v SubApplication[]; /* ** Structures for mapping (content) types to ** the functions to handle them. */ struct str2init { char *si_key; int si_val; InitFunc si_init; }; extern struct str2init str2cts[]; extern struct str2init str2ces[]; /* ** prototypes */ int pidcheck(int); CT parse_mime(char *); int add_header(CT, char *, char *); int get_ctinfo(unsigned char *, CT, int); int open7Bit(CT, char **); void close_encoding(CT); char *extract_name_value(char *, char *); mmh-0.4/h/crawl_folders.h0000644000000000000000000000120213414435726014066 0ustar rootroot/* ** crawl_folders.h -- crawl folder hierarchy */ #define CRAWL_NUMFOLDERS 100 /* ** Callbacks return TRUE crawl_folders should crawl the children of `folder'. ** Callbacks need not duplicate folder, as crawl_folders does not free it. */ typedef boolean (crawl_callback_t)(char *folder, void *baton); /* ** Crawl the folder hierarchy rooted at the relative path `dir'. For each ** folder, pass `callback' the folder name (as a path relative to the current ** directory) and `baton'; the callback may direct crawl_folders not to crawl ** its children; see above. */ void crawl_folders(char *dir, crawl_callback_t *callback, void *baton); mmh-0.4/h/fmt_scan.h0000644000000000000000000000517113414435726013043 0ustar rootroot/* ** fmt_scan.h -- definitions for fmt_scan() */ /* ** This structure describes an "interesting" component. It holds ** the name & text from the component (if found) and one piece of ** auxiliary info. The structure for a particular component is located ** by (open) hashing the name and using it as an index into the ptr array ** "wantcomp". All format entries that reference a particular component ** point to its comp struct (so we only have to do component specific ** processing once. e.g., parse an address.). */ struct comp { char *c_name; /* component name (in lower case) */ char *c_text; /* component text (if found) */ struct comp *c_next; /* hash chain linkage */ short c_flags; /* misc. flags (from fmt_scan) */ short c_type; /* type info (from fmt_compile) */ union { struct tws *c_u_tws; struct mailname *c_u_mn; } c_un; }; #define c_tws c_un.c_u_tws #define c_mn c_un.c_u_mn /* ** c_type bits */ #define CT_ADDR (1<<0) /* referenced as address */ #define CT_DATE (1<<1) /* referenced as date */ /* ** c_flags bits */ #define CF_TRUE (1<<0) /* usually means component is present */ #define CF_PARSED (1<<1) /* address/date has been parsed */ #define CF_DATEFAB (1<<2) /* datefield fabricated */ extern int fmt_norm; /* ** Hash table for deciding if a component is "interesting". */ extern struct comp *wantcomp[128]; /* ** Hash function for component name. The function should be ** case independent and probably shouldn't involve a routine ** call. This function is pretty good but will not work on ** single character component names. */ #define CHASH(nm) (((((nm)[0]) - ((nm)[1])) & 0x1f) + (((nm)[2]) & 0x5f)) /* ** Find a component in the hash table. */ #define FINDCOMP(comp,name) \ for (comp = wantcomp[CHASH(name)]; \ comp && strcmp(comp->c_name,name)!=0; \ comp = comp->c_next) ; /* ** This structure defines one formatting instruction. */ struct format { unsigned char f_type; char f_fill; short f_width; /* output field width */ union { struct comp *f_u_comp; /* associated component */ char *f_u_text; /* literal text */ char f_u_char; /* literal character */ int f_u_value; /* literal value */ } f_un; }; #define f_skip f_width /* instr to skip (false "if") */ #define f_comp f_un.f_u_comp #define f_text f_un.f_u_text #define f_char f_un.f_u_char #define f_value f_un.f_u_value /* ** prototypes */ struct format *fmt_scan(struct format *, char *, int, int *); int fmt_compile(char *, struct format **); char *formataddr(char *, char *); mmh-0.4/h/signals.h0000644000000000000000000000043713414435726012711 0ustar rootroot/* ** signals.h -- header file for nmh signal interface */ #include #include /* ** The type for a signal handler */ typedef void (*SIGNAL_HANDLER)(int); /* ** prototypes */ SIGNAL_HANDLER SIGNAL(int, SIGNAL_HANDLER); SIGNAL_HANDLER SIGNAL2(int, SIGNAL_HANDLER); mmh-0.4/h/rcvmail.h0000644000000000000000000000025513414435726012704 0ustar rootroot/* ** rcvmail.h -- rcvmail hook definitions */ # include # include # include # include # define RCV_MOK 0 # define RCV_MBX 1 mmh-0.4/h/mf.h0000644000000000000000000000070313414435726011647 0ustar rootroot/* ** mf.h -- include file for mailbox filters */ #ifndef TRUE # define TRUE 1 #endif #ifndef FALSE # define FALSE 0 #endif #ifndef NOTOK # define NOTOK (-1) #endif #ifndef OK # define OK 0 #endif #ifndef DONE # define DONE 1 #endif struct adrx { char *text; char *pers; char *mbox; char *host; char *path; char *grp; int ingrp; char *note; char *err; }; /* ** prototypes */ char *legal_person(char *); struct adrx *getadrx(char *); mmh-0.4/h/tws.h0000644000000000000000000000445013414435726012065 0ustar rootroot/* ** tws.h */ /* ** If the following is #defined, a timezone given as a numeric-only ** offset will be treated specially if it's in a zone that observes ** Daylight Saving Time. For instance, during DST, a Date: like "Mon, ** 24 Jul 2000 12:31:44 -0700" will be printed as "Mon, 24 Jul 2000 ** 12:31:44 PDT". Without the code activated by the following #define, ** that'd be incorrectly printed as "...MST". */ #define ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST 1 struct tws { int tw_sec; /* seconds after the minute - [0, 61] */ int tw_min; /* minutes after the hour - [0, 59] */ int tw_hour; /* hour since midnight - [0, 23] */ int tw_mday; /* day of the month - [1, 31] */ int tw_mon; /* months since January - [0, 11] */ int tw_year; /* 4 digit year (ie, 1997) */ int tw_wday; /* days since Sunday - [0, 6] */ int tw_yday; /* days since January 1 - [0, 365] */ int tw_zone; time_t tw_clock; /* if != 0, corresponding calendar value */ int tw_flags; }; #define TW_NULL 0x0000 #define TW_SDAY 0x0003 /* how day-of-week was determined */ #define TW_SNIL 0x0000 /* not given */ #define TW_SEXP 0x0001 /* explicitly given */ #define TW_SIMP 0x0002 /* implicitly given */ #define TW_SZONE 0x0004 /* how timezone was determined */ #define TW_SZNIL 0x0000 /* not given */ #define TW_SZEXP 0x0004 /* explicitly given */ #define TW_DST 0x0010 /* daylight savings time */ #define TW_SUCC 0x0040 /* whether parsing was successful */ #define TW_YES 0x0040 /* yes, found */ #define TW_NO 0x0000 /* no, not found */ #define dtwszone(tw) dtimezone(tw->tw_zone, tw->tw_flags) extern char *tw_dotw[]; extern char *tw_ldotw[]; extern char *tw_moty[]; /* ** prototypes */ char *dtime(time_t *); char *dtimenow(void); char *dctime(struct tws *); struct tws *dlocaltimenow(void); struct tws *dlocaltime(time_t *); struct tws *dgmtime(time_t *); char *dasctime(struct tws *); char *dtimezone(int, int); void twscopy(struct tws *, struct tws *); int twsort(struct tws *, struct tws *); time_t dmktime(struct tws *); void set_dotw(struct tws *); struct tws *dparsetime(char *); mmh-0.4/h/scansbr.h0000644000000000000000000000101513414435726012675 0ustar rootroot/* ** scansbr.h -- definitions for scan() */ extern char *scanl; #define SCNMSG 1 /* message just fine */ #define SCNEOF 0 /* empty message */ #define SCNERR (-1) /* error message */ #define SCNNUM (-2) /* number out of range */ #define SCNFAT (-3) /* fatal error */ #define WIDTH 78 #define SCN_MBOX (-1) #define SCN_FOLD 0 /* ** prototypes */ int scan(FILE *, int, int, char *, int, int, int); mmh-0.4/h/utils.h0000644000000000000000000000071013414435726012403 0ustar rootroot/* ** utils.h -- utility prototypes */ void *mh_xrealloc(void *, size_t); void *mh_xcalloc(size_t, size_t); void mh_free0(void *); char *pwd(void); char *add(const char *, char *); void create_folder(char *, int, void (*)(int)); int num_digits(int); char *mh_xstrdup(const char *); struct msgs_array { int max, size; char **msgs; }; void app_msgarg(struct msgs_array *, char *); int parse_msgs(const struct msgs_array *, char *, struct msgs_array *); mmh-0.4/h/fmt_compile.h0000644000000000000000000001527713414435726013557 0ustar rootroot/* ** fmt_compile.h -- format types */ /* types that output text */ #define FT_COMP 1 /* the text of a component */ #define FT_COMPF 2 /* comp text, filled */ #define FT_LIT 3 /* literal text */ #define FT_LITF 4 /* literal text, filled */ #define FT_CHAR 5 /* a single ascii character */ #define FT_NUM 6 /* "value" as decimal number */ #define FT_NUMF 7 /* "value" as filled dec number */ #define FT_STR 8 /* "str" as text */ #define FT_STRF 9 /* "str" as text, filled */ #define FT_STRFW 10 /* "str" as text, filled, width in "value" */ #define FT_PUTADDR 11 /* split and print address line */ /* types that modify the "str" or "value" registers */ #define FT_LS_COMP 12 /* set "str" to component text */ #define FT_LS_LIT 13 /* set "str" to literal text */ #define FT_LS_GETENV 14 /* set "str" to getenv(text) */ #define FT_LS_CFIND 15 /* set "str" to context_find(text) */ #define FT_LS_DECODECOMP 16 /* set "str" to decoded component text */ #define FT_LS_DECODE 17 /* decode "str" as RFC-2047 header */ #define FT_LS_TRIM 18 /* trim white space from "str" */ #define FT_LV_COMP 19 /* set "value" to comp (as dec. num) */ #define FT_LV_COMPFLAG 20 /* set "value" to comp flag word */ #define FT_LV_LIT 21 /* set "value" to literal num */ #define FT_LV_DAT 22 /* set "value" to dat[n] */ #define FT_LV_STRLEN 23 /* set "value" to length of "str" */ #define FT_LV_PLUS_L 24 /* set "value" += literal */ #define FT_LV_MINUS_L 25 /* set "value" -= literal */ #define FT_LV_DIVIDE_L 26 /* set "value" to value / literal */ #define FT_LV_MODULO_L 27 /* set "value" to value % literal */ #define FT_LV_CHAR_LEFT 28 /* set "value" to char left in output */ #define FT_LS_MONTH 29 /* set "str" to tws month */ #define FT_LS_LMONTH 30 /* set "str" to long tws month */ #define FT_LS_ZONE 31 /* set "str" to tws timezone */ #define FT_LS_DAY 32 /* set "str" to tws weekday */ #define FT_LS_WEEKDAY 33 /* set "str" to long tws weekday */ #define FT_LS_822DATE 34 /* set "str" to 822 date str */ #define FT_LS_PRETTY 35 /* set "str" to pretty (?) date str */ #define FT_LV_SEC 36 /* set "value" to tws second */ #define FT_LV_MIN 37 /* set "value" to tws minute */ #define FT_LV_HOUR 38 /* set "value" to tws hour */ #define FT_LV_MDAY 39 /* set "value" to tws day of month */ #define FT_LV_MON 40 /* set "value" to tws month */ #define FT_LV_YEAR 41 /* set "value" to tws year */ #define FT_LV_YDAY 42 /* set "value" to tws day of year */ #define FT_LV_WDAY 43 /* set "value" to tws weekday */ #define FT_LV_ZONE 44 /* set "value" to tws timezone */ #define FT_LV_CLOCK 45 /* set "value" to tws clock */ #define FT_LV_RCLOCK 46 /* set "value" to now - tws clock */ #define FT_LV_DAYF 47 /* set "value" to tws day flag */ #define FT_LV_DST 48 /* set "value" to tws daylight savings flag */ #define FT_LV_ZONEF 49 /* set "value" to tws timezone flag */ #define FT_LS_PERS 50 /* set "str" to person part of addr */ #define FT_LS_MBOX 51 /* set "str" to mbox part of addr */ #define FT_LS_HOST 52 /* set "str" to host part of addr */ #define FT_LS_PATH 53 /* set "str" to route part of addr */ #define FT_LS_GNAME 54 /* set "str" to group part of addr */ #define FT_LS_NOTE 55 /* set "str" to comment part of addr */ #define FT_LS_ADDR 56 /* set "str" to mbox@host */ #define FT_LS_822ADDR 57 /* set "str" to 822 format addr */ #define FT_LS_FRIENDLY 58 /* set "str" to "friendly" format addr */ #define FT_LV_HOSTTYPE 59 /* set "value" to addr host type */ #define FT_LV_INGRPF 60 /* set "value" to addr in-group flag */ #define FT_LS_UNQUOTE 61 /* remove RFC 2822 quotes from "str" */ #define FT_LV_NOHOSTF 62 /* set "value" to addr no-host flag */ /* Date Coercion */ #define FT_LOCALDATE 63 /* Coerce date to local timezone */ #define FT_GMTDATE 64 /* Coerce date to gmt */ /* pre-format processing */ #define FT_PARSEDATE 65 /* parse comp into a date (tws) struct */ #define FT_PARSEADDR 66 /* parse comp into a mailaddr struct */ #define FT_FORMATADDR 67 /* let external routine format addr */ #define FT_MYMBOX 68 /* do "mymbox" test on comp */ /* conditionals & control flow (must be last) */ #define FT_SAVESTR 70 /* save current str reg */ #define FT_DONE 71 /* stop formatting */ #define FT_PAUSE 72 /* pause */ #define FT_NOP 73 /* nop */ #define FT_GOTO 74 /* (relative) goto */ #define FT_IF_S_NULL 75 /* test if "str" null */ #define FT_IF_S 76 /* test if "str" non-null */ #define FT_IF_V_EQ 77 /* test if "value" = literal */ #define FT_IF_V_NE 78 /* test if "value" != literal */ #define FT_IF_V_GT 79 /* test if "value" > literal */ #define FT_IF_MATCH 80 /* test if "str" contains literal */ #define FT_IF_AMATCH 81 /* test if "str" starts with literal */ #define FT_S_NULL 82 /* V = 1 if "str" null */ #define FT_S_NONNULL 83 /* V = 1 if "str" non-null */ #define FT_V_EQ 84 /* V = 1 if "value" = literal */ #define FT_V_NE 85 /* V = 1 if "value" != literal */ #define FT_V_GT 86 /* V = 1 if "value" > literal */ #define FT_V_MATCH 87 /* V = 1 if "str" contains literal */ #define FT_V_AMATCH 88 /* V = 1 if "str" starts with literal */ #define FT_LS_UNMAILTO 89 /* remove "mailto:" */ #define IF_FUNCS FT_S_NULL /* start of "if" functions */ mmh-0.4/h/mh.h0000644000000000000000000002017713414435726011660 0ustar rootroot/* ** mh.h -- main header file for all of nmh */ #include #include #include #include #include #include /* ** Well-used constants */ #define NOTOK (-1) /* syscall()s return this on error */ #define OK 0 /* ditto on success */ #define DONE 1 /* trinary logic */ #define ALL "" #define Nbby 8 /* number of bits/byte */ #define MAXARGS 1000 /* max arguments to exec */ #define NFOLDERS 1000 /* max folder arguments on command line */ #define DMAXFOLDER 4 /* typical number of digits */ #define MAXFOLDER 1000 /* message increment */ #ifndef FALSE # define FALSE 0 #endif #ifndef TRUE # define TRUE 1 #endif typedef unsigned char boolean; /* not int so we can pack in a structure */ /* If we're using gcc then give it some information about ** functions that abort. */ #if __GNUC__ > 2 # define NORETURN __attribute__((__noreturn__)) #else # define NORETURN #endif /* ** we should be getting this value from pathconf(_PC_PATH_MAX) */ #ifndef PATH_MAX # ifdef MAXPATHLEN # define PATH_MAX MAXPATHLEN # else /* so we will just pick something */ # define PATH_MAX 1024 # endif #endif /* ** we should be getting this value from sysconf(_SC_OPEN_MAX) */ #ifndef OPEN_MAX # ifdef NOFILE # define OPEN_MAX NOFILE # else /* so we will just pick something */ # define OPEN_MAX 64 # endif #endif /* ** user context/profile structure */ struct node { char *n_name; /* key */ char *n_field; /* value */ char n_context; /* context, not profile */ struct node *n_next; /* next entry */ }; /* ** switches structure */ #define AMBIGSW (-2) /* from smatch() on ambiguous switch */ #define UNKWNSW (-1) /* from smatch() on unknown switch */ struct swit { char *sw; /* ** The minchars field is apparently used like this: ** ** -# : Switch can be abbreviated to # chars; switch hidden in -help. ** 0 : Switch can't be abbreviated; switch shown in -help. ** # : Switch can be abbreviated to # chars; switch shown in -help. */ int minchars; }; extern struct swit anoyes[]; /* standard yes/no switches */ /* ** general folder attributes */ #define READONLY (1<<0) /* No write access to folder */ #define SEQMOD (1<<1) /* folder's sequences modifed */ #define ALLOW_BEYOND (1<<2) /* allow the beyond sequence */ #define OTHERS (1<<3) /* folder has other files */ #define FBITS "\020\01READONLY\02SEQMOD\03ALLOW_BEYOND\04OTHERS" /* ** type for holding the sequence set of a message */ typedef unsigned int seqset_t; /* ** internal messages attributes (sequences) */ #define EXISTS (1<<0) /* exists */ #define SELECTED (1<<1) /* selected for use */ #define SELECT_UNSEEN (1<<2) /* inc/show "unseen" */ #define MBITS "\020\01EXISTS\02SELECTED\03UNSEEN" /* ** first free slot for user-defined sequences */ #define FFATTRSLOT 3 /* ** Determine the number of user defined sequences we ** can have. The first few sequence flags are for ** internal nmh message flags. */ #define NUMATTRS ((sizeof(seqset_t) * Nbby) - FFATTRSLOT) /* ** Primary structure of folder/message information */ struct msgs { int lowmsg; /* Lowest msg number */ int hghmsg; /* Highest msg number */ int nummsg; /* Actual Number of msgs */ int lowsel; /* Lowest selected msg number */ int hghsel; /* Highest selected msg number */ int numsel; /* Number of msgs selected */ int curmsg; /* Number of current msg if any */ int msgflags; /* Folder attributes (READONLY, etc) */ char *foldpath; /* Pathname of folder */ /* ** Name of sequences in this folder. We add an ** extra slot, so we can NULL terminate the list. */ char *msgattrs[NUMATTRS + 1]; /* ** bit flags for whether sequence ** is public (0), or private (1) */ seqset_t attrstats; /* ** These represent the lowest and highest possible ** message numbers we can put in the message status ** area, without calling folder_realloc(). */ int lowoff; int hghoff; /* ** This is an array of seqset_t which we allocate dynamically. ** Each seqset_t is a set of bits flags for a particular message. ** These bit flags represent general attributes such as ** EXISTS, SELECTED, etc. as well as track if message is ** in a particular sequence. */ seqset_t *msgstats; /* msg status */ }; /* ** Amount of space to allocate for msgstats. Allocate ** the array to have space for messages numbers lo to hi. */ #define MSGSTATSIZE(mp,lo,hi) ((size_t) (((hi) - (lo) + 1) * sizeof(*(mp)->msgstats))) #define NULLMP ((struct msgs *) 0) /* ** m_getfld() message parsing */ #define NAMESZ 999 /* ** Limit on component name size. ** RFC 2822 limits line lengths to ** 998 characters, so a header name ** can be at most that long. ** m_getfld limits header names to 2 ** less than NAMESZ, which is fine, ** because header names must be ** followed by a colon. Add one for ** terminating NULL. */ /* m_getfld2() returned data */ struct field { char name[NAMESZ]; size_t namelen; char *value; size_t valuelen; size_t alloclen; boolean crlf; }; /* m_getfld2() states */ enum state { LENERR2 = -2, /* Line too long */ FMTERR2 = -3, /* Format error in message */ IOERR2 = -1, /* Read error */ FLD2 = 0, /* Header field returned */ BODY2, /* Body line returned */ FILEEOF2 /* Reached end of input file */ }; #define NOUSE 0 /* draft being re-used */ #define OUTPUTLINELEN 72 /* default line length for headers */ /* ** miscellaneous macros */ #ifndef max # define max(a,b) ((a) > (b) ? (a) : (b)) #endif #ifndef min # define min(a,b) ((a) < (b) ? (a) : (b)) #endif /* ** GLOBAL VARIABLES */ #define CTXMOD 0x01 /* context information modified */ #define DBITS "\020\01CTXMOD" extern char ctxflags; extern char *invo_name; /* command invocation name */ extern char *mypath; /* user's $HOME */ extern char *mmhdir; extern char *mmhpath; extern char *defpath; /* pathname of user's profile */ extern char *ctxpath; /* pathname of user's context */ extern struct node *m_defs; /* list of profile/context entries */ extern char *mailstore; /* name of mail storage directory */ /* ** These standard strings are defined in config.c. They are the ** only system-dependent parameters in nmh, and thus by redefining ** their values and reloading the various modules, nmh will run ** on any system. */ extern char *attach_hdr; extern char *sign_hdr; extern char *enc_hdr; extern char *components; extern char *context; extern char *curfolder; extern char *defaulteditor; extern char *defaultpager; extern char *defaultfolder; extern char *digestcomps; extern char *distcomps; extern char *draftfolder; extern char *foldprot; extern char *forwcomps; extern char *inbox; extern char *listproc; extern char *mhetcdir; extern char *mailspool; extern char *mh_seq; extern char *mhlformat; extern char *mhlreply; extern char *mimetypequery; extern char *mimetypequeryproc; extern char *msgprot; extern char *nmhstorage; extern char *nsequence; extern char *profile; extern char *psequence; extern char *rcvdistcomps; extern char *replcomps; extern char *replgroupcomps; extern char *scanformat; extern char *sendmail; extern char *seq_all; extern char *seq_beyond; extern char *seq_cur; extern char *seq_first; extern char *seq_last; extern char *seq_next; extern char *seq_prev; extern char *seq_unseen; extern char *seq_neg; extern char *trashfolder; extern char *usequence; extern char *version; extern char *lib_version; extern char *whatnowproc; #include mmh-0.4/h/mime.h0000644000000000000000000000142013414435726012171 0ustar rootroot/* ** mime.h -- definitions for MIME */ #define VRSN_FIELD "MIME-Version" #define VRSN_VALUE "1.0" #define XXX_FIELD_PRF "Content-" #define TYPE_FIELD "Content-Type" #define ENCODING_FIELD "Content-Transfer-Encoding" #define ID_FIELD "Content-ID" #define DESCR_FIELD "Content-Description" #define DISPO_FIELD "Content-Disposition" /* ** Test for valid characters used in "token" ** as defined in RFC2045 */ #define istoken(c) (!isspace (c) && !iscntrl (c) && (c) != '(' \ && (c) != ')' && (c) != '<' && (c) != '>' \ && (c) != '@' && (c) != ',' && (c) != ';' \ && (c) != ':' && (c) != '\\' && (c) != '"' \ && (c) != '/' && (c) != '[' && (c) != ']' \ && (c) != '?' && (c) != '=') #define CPERLIN 76 #define BPERLIN (CPERLIN / 4) mmh-0.4/h/prototypes.h0000644000000000000000000001174113414435726013501 0ustar rootroot/* ** prototypes.h -- various prototypes */ /* ** missing system prototypes */ #ifndef HAVE_TERMCAP_H extern int tgetent(char *bp, char *name); extern int tgetnum(char *id); extern int tgetflag(char *id); extern char *tgetstr(char *id, char **area); extern char *tgoto(char *cm, int destcol, int destline); extern int tputs(char *cp, int affcnt, int (*outc) (int)); #endif /* ** prototype from config.h */ char *etcpath(char *); /* ** prototypes from the nmh subroutine library */ void adios(int, char *, char *, ...) NORETURN; void admonish(char *, char *, ...); void advertise(char *, char *, char *, va_list); void advise(char *, char *, ...); void ambigsw(char *, struct swit *); char **brkstring(char *, char *, char *); int is_native_charset(char *); char *concat(char *, ...); int context_del(char *); char *context_find(char *); void context_read(void); void context_replace(char *, char *); void context_save(void); void cpydata(int, int, char *, char *); void cpydgst(int, int, char *, char *); int decode_rfc2047(char *, char *, size_t); int default_done(int); int encode_rfc2047(const char *name, char **value, const char *charset); int execprog(char *, char **); int execprogl(char *, char *, ...); char *expandfol(char *); char *expanddir(char *); int ext_hook(char *, char *, char *); int folder_addmsg(struct msgs **, char *, int, int, int, int, char *); int folder_delmsgs(struct msgs *, int); void folder_free(struct msgs *); struct msgs *folder_read(char *); struct msgs *folder_realloc(struct msgs *, int, int); int gans(char *, struct swit *); char **getans(char *, struct swit *); int getanswer(char *); char **getarguments(char *, int, char **, int); char *get_charset(); char *getcurfol(void); char *getdeffol(void); int lkclose(int, char*); int lkfclose(FILE *, char *); FILE *lkfopen(char *, char *); int lkopen(char *, int, mode_t); int m_atoi(char *); char *m_backup(char *); int m_convert(struct msgs *, char *); char *m_draft(char *); enum state m_getfld2(enum state, struct field *, FILE *); int m_gmprot(void); char *m_name(int); int m_putenv(char *, char *); char *m_mktemp(const char *, int *, FILE **); char *m_mktemp2(const char *, const char *, int *, FILE **); void thisisanmbox(FILE *); int makedir(char *); int mh_strcasecmp(const char *s1, const char *s2); char *norm_charmap(char *); char *new_fs(char *, char *); int pidwait(pid_t, int); int pidstatus(int, FILE *, char *); int pidXwait(int, char *); void print_help(char *, struct swit *, int); void print_sw(char *, struct swit *, char *, FILE *); void print_version(char *); void push(void); char *pwd(void); char *mhbasename(char *); void readconfig(struct node **, FILE *, char *, int); int seq_addmsg(struct msgs *, char *, int, int, int); int seq_addsel(struct msgs *, char *, int, int); char *seq_bits(struct msgs *); int seq_delmsg(struct msgs *, char *, int); int seq_delsel(struct msgs *, char *, int, int); int seq_getnum(struct msgs *, char *); char *seq_list(struct msgs *, char *); int seq_nameok(unsigned char *); void seq_print(struct msgs *, char *); void seq_printall(struct msgs *); void seq_read(struct msgs *); void seq_save(struct msgs *); void seq_setcur(struct msgs *, int); void seq_setprev(struct msgs *); void seq_setunseen(struct msgs *, int); int showfile(char **, char *); int smatch(char *, struct swit *); char *snprintb(char *, size_t, unsigned, char *); int stringdex(char *, char *); char *toabsdir(char *); char *trim(unsigned char *); char *rtrim(char *); char *trimcpy(unsigned char *); int unputenv(char *); void unquote_string(const char *input, char *output); int uprf(char *, char *); int vfgets(FILE *, char **); char *write_charset_8bit(void); /* ** prototypes for some routines in uip */ int distout(char *, char *, char *); int what_now(char *, int, char *, char *, int, struct msgs *, char *, char *); /* ** from the former mts.h */ char *LocalName(void); /* hostname */ char *getusername(void); char *getfullname(void); /* ** prototypes for message and sequence manipulation */ void clear_msg_flags(struct msgs *, int); void copy_msg_flags(struct msgs *, int, int); void get_msg_flags(struct msgs *, seqset_t *, int); void set_msg_flags(struct msgs *, seqset_t *, int); seqset_t does_exist(struct msgs *, int); void unset_exists(struct msgs *, int); void set_exists(struct msgs *, int); seqset_t is_selected(struct msgs *, int); void unset_selected(struct msgs *, int); void set_selected(struct msgs *, int); seqset_t is_unseen(struct msgs *, int); void unset_unseen(struct msgs *, int); void set_unseen(struct msgs *, int); seqset_t in_sequence(struct msgs *, int, int); void clear_sequence(struct msgs *, int, int); void add_sequence(struct msgs *, int, int); int is_seq_private(struct msgs *, int); void make_seq_public(struct msgs *, int); void make_seq_private(struct msgs *, int); void make_all_public(struct msgs *); void clear_folder_flags(struct msgs *); int is_readonly(struct msgs *); void set_readonly(struct msgs *); int other_files(struct msgs *); void set_other_files(struct msgs *); char *getthreadid(const char *); mmh-0.4/h/Makefile.in0000644000000000000000000000133113414435726013137 0ustar rootroot# # Makefile for h subdirectory # SHELL = /bin/sh srcdir = @srcdir@ VPATH = @srcdir@ # header files included in distribution HDRS = addrsbr.h aliasbr.h crawl_folders.h dropsbr.h fmt_compile.h \ fmt_scan.h mf.h mh.h mhparse.h mime.h \ prototypes.h rcvmail.h scansbr.h signals.h tws.h utils.h # ========== DEPENDENCIES FOR BUILDING AND INSTALLING ========== all: install: uninstall: lint: # ========== DEPENDENCIES FOR CLEANUP ========== mostlyclean: rm -f *~ clean: mostlyclean distclean: clean rm -f Makefile realclean: distclean superclean: realclean # ========== DEPENDENCIES FOR MAINTENANCE ========== subdir = h Makefile: Makefile.in ../config.status cd .. && ./config.status $(subdir)/$@ mmh-0.4/h/addrsbr.h0000644000000000000000000000151513414435726012670 0ustar rootroot/* ** addrsbr.h -- definitions for the address parsing system */ #define AD_HOST 1 /* getm(): lookup official hostname */ #define AD_NHST 0 /* getm(): do not lookup official name */ #define AD_NAME AD_NHST /* AD_HOST is TOO slow */ #define LOCALHOST 0 #define NETHOST 1 #define BADHOST 2 #include #include struct mailname { struct mailname *m_next; char *m_text; char *m_pers; char *m_mbox; char *m_host; char *m_path; int m_type; char m_nohost; char m_bcc; int m_ingrp; char *m_gname; char *m_note; }; /* ** prototypes */ void mnfree(struct mailname *); int ismymbox(struct mailname *); char *getname(char *); char *adrformat(struct mailname *); struct mailname *getm(char *, char *, int, int, char *); ssize_t getmboxes(char *, struct mailname **); mmh-0.4/h/aliasbr.h0000644000000000000000000000304613414435726012665 0ustar rootroot/* ** aliasbr.h -- definitions for the aliasing system */ struct aka { char *ak_name; /* name to match against */ struct adr *ak_addr; /* list of addresses that it maps to */ struct aka *ak_next; /* next aka in list */ char ak_visible; /* should be visible in headers */ }; struct adr { char *ad_text; /* text of this address in list */ struct adr *ad_next; /* next adr in list */ char ad_local; /* text is local (check for expansion) */ }; /* ** incore version of /etc/passwd */ struct home { char *h_name; /* user name */ uid_t h_uid; /* user id */ gid_t h_gid; /* user's group */ char *h_home; /* user's home directory */ char *h_shell; /* user's shell */ int h_ngrps; /* number of groups this user belongs to */ struct home *h_next; /* next home in list */ }; struct home *seek_home(char *); /* ** prototypes */ int alias(char *); int akvisible(void); void init_pw(void); char *akresult(struct aka *); char *akvalue(char *); char *akerror(int); /* codes returned by alias() */ #define AK_OK 0 /* file parsed ok */ #define AK_NOFILE 1 /* couldn't read file */ #define AK_ERROR 2 /* error parsing file */ #define AK_LIMIT 3 /* memory limit exceeded */ #define AK_NOGROUP 4 /* no such group */ mmh-0.4/h/dropsbr.h0000644000000000000000000000026313414435726012721 0ustar rootroot/* ** dropsbr.h -- definitions for maildrop-style files */ /* ** prototypes */ int mbox_open(char *, uid_t, gid_t, mode_t); int mbox_copy(int, int); int mbox_close(char *, int); mmh-0.4/DATE0000644000000000000000000000001313414435726011277 0ustar rootroot2019-01-06 mmh-0.4/VERSION0000644000000000000000000000000413414435726011707 0ustar rootroot0.4 mmh-0.4/configure.ac0000644000000000000000000004614013414435726013140 0ustar rootrootdnl dnl configure.ac -- autoconf template for mmh dnl dnl Move this up a bit AC_PREREQ(2.61) dnl (I was able to configure with autoconf-2.59 --meillo 2012-03-22) AC_INIT(mmh, m4_normalize(m4_include([VERSION]))) AC_CONFIG_SRCDIR(h/mh.h) AC_CONFIG_HEADER(config.h) AC_CANONICAL_TARGET dnl --------------------- dnl define a macro or two dnl --------------------- AC_DEFUN([NMH_PROG_GNU_LIBTOOL], [ if test -n "$LIBTOOL" ; then tmptest=`$LIBTOOL --version 2>&1 | grep GNU` if test x"$tmptest" != x ; then GNU_LIBTOOL=1 AC_SUBST(GNU_LIBTOOL)dnl fi fi ] ) echo "configuring for AC_PACKAGE_NAME-AC_PACKAGE_VERSION" AC_SUBST(VERSION,AC_PACKAGE_VERSION)dnl dnl What date of mmh are we building? DATE=`cat ${srcdir}/DATE` echo "configuring for mmh dated $DATE" AC_SUBST(DATE)dnl dnl -------------------------- dnl CHECK COMMAND LINE OPTIONS dnl -------------------------- dnl Do you want to debug mmh? AC_ARG_ENABLE(debug, AS_HELP_STRING([--enable-debug],[enable nmh code debugging])) dnl The old redundant --enable-nmh-debug is deprecated and undocumented. if test x"$enable_nmh_debug" = x"yes"; then enable_debug=yes fi dnl What method of locking to use? AC_ARG_WITH(locking, AS_HELP_STRING([--with-locking=@<:@dot|fcntl|flock|lockf@:>@], [specify the file locking method])) if test x"$with_locking" = x"dot"; then LOCKTYPE="dot" AC_DEFINE(DOT_LOCKING, 1, [Define to use dot based file locking.])dnl elif test x"$with_locking" = x"flock"; then LOCKTYPE="flock" AC_DEFINE(FLOCK_LOCKING, 1, [Define to use flock() based locking.])dnl elif test x"$with_locking" = x"lockf"; then LOCKTYPE="lockf" AC_DEFINE(LOCKF_LOCKING, 1, [Define to use lockf() based locking.])dnl elif test x"$with_locking" = x"fcntl"; then LOCKTYPE="fcntl" AC_DEFINE(FCNTL_LOCKING, 1, [Define to use fnctl() based locking.])dnl else LOCKTYPE="dot" AC_DEFINE(DOT_LOCKING)dnl fi dnl Should we use a locking directory? AC_ARG_WITH(lockdir, AS_HELP_STRING([--with-lockdir=dir], [Store dot-lock files in "dir"]), [ AS_IF([test "x$with_lockdir" = xyes],[ AC_MSG_ERROR([--with-lockdir requires an argument])]) ]) if test x"$with_lockdir" != x; then LOCKDIR="$with_lockdir" AC_DEFINE_UNQUOTED(LOCKDIR, ["$with_lockdir"], [Directory to store dot-locking lock files.])dnl fi dnl ---------------------------------------------------- dnl Default location is /usr/local/mmh/{bin,etc,lib,share/man} dnl ---------------------------------------------------- AC_PREFIX_DEFAULT(/usr/local/mmh) dnl ------------------ dnl CHECK THE COMPILER dnl ------------------ dnl We want these before the checks, dnl so the checks can modify their values. test -z "$CFLAGS" && CFLAGS= auto_cflags=1 if test x"$enable_debug" = x"yes"; then test -z "$LDFLAGS" && LDFLAGS=-g fi AC_PROG_CC AC_CACHE_CHECK(whether compiler supports -Wno-pointer-sign, nmh_cv_has_noptrsign, [nmh_saved_cflags="$CFLAGS" CFLAGS="$CFLAGS -Wno-pointer-sign" AC_TRY_COMPILE([],[],nmh_cv_has_noptrsign=yes,nmh_cv_has_noptrsign=no) CFLAGS="$nmh_saved_cflags"]) dnl if the user hasn't specified CFLAGS, then dnl if compiler is gcc, then dnl use -O2 and some warning flags dnl else use -O dnl We use -Wall; if the compiler supports it we also use -Wno-pointer-sign, dnl because gcc 4 now produces a lot of new warnings which are probably mostly dnl spurious and which in any case we don't want to deal with now. if test "$nmh_cv_has_noptrsign" = "yes"; then nmh_gcc_warnflags="-Wall -Wno-pointer-sign" else nmh_gcc_warnflags="-Wall" fi if test -n "$auto_cflags"; then if test x"$enable_debug" = x"yes"; then if test -n "$GCC"; then test -z "$CFLAGS" && CFLAGS="$nmh_gcc_warnflags -g" || CFLAGS="$CFLAGS $nmh_gcc_warnflags -g" else test -z "$CFLAGS" && CFLAGS=-g || CFLAGS="$CFLAGS -g" fi else if test -z "$LDFLAGS"; then case "$build_os" in darwin*) LDFLAGS= ;; *) LDFLAGS=-s ;; esac fi if test -n "$GCC"; then test -z "$CFLAGS" && CFLAGS="$nmh_gcc_warnflags -O2" || CFLAGS="$CFLAGS $nmh_gcc_warnflags -O2" else test -z "$CFLAGS" && CFLAGS=-O || CFLAGS="$CFLAGS -O" fi fi fi AC_C_CONST dnl Does compiler support `const'. dnl ------------------ dnl CHECK FOR PROGRAMS dnl ------------------ AC_PROG_MAKE_SET dnl Does make define $MAKE AC_PROG_INSTALL dnl Check for BSD compatible `install' AC_PROG_RANLIB dnl Check for `ranlib' AC_PROG_AWK dnl Check for mawk,gawk,nawk, then awk AC_PROG_LEX dnl Check for lex/flex dnl Look for `cut' pathtmp=/usr/bin:/bin:/usr/local/bin:/usr/xpg4/bin:/usr/ucb AC_PATH_PROG(cutpath, cut, no, [$pathtmp]) dnl ---------------------------------------------- dnl check for lclint, and lint if it doesn't exist dnl ---------------------------------------------- AC_CHECK_PROG(linttmp1, lclint, lclint, no)dnl if test x$ac_cv_prog_linttmp1 != xno ; then LINT=$ac_cv_prog_linttmp1 LINTFLAGS="-weak +posixlib -macrovarprefixexclude" else AC_CHECK_PROG(linttmp2, lint, lint, no)dnl if test x$ac_cv_prog_linttmp2 != xno ; then LINT=$ac_cv_prog_linttmp2 LINTFLAGS="" else LINT="echo 'No lint program found'" LINTFLAGS="" fi fi AC_SUBST(LINT)dnl AC_SUBST(LINTFLAGS)dnl dnl try to figure out which one we've got AC_CHECK_PROG(LIBTOOL, libtool, libtool, , [$pathtmp]) NMH_PROG_GNU_LIBTOOL dnl Check for lorder and tsort commands AC_CHECK_PROG(LORDER, lorder, lorder, no)dnl AC_CHECK_PROG(TSORT, tsort, tsort, no)dnl dnl If either doesn't exist, replace them with echo and cat if test x$ac_cv_prog_LORDER != xlorder -o x$ac_cv_prog_TSORT != xtsort; then LORDER=echo TSORT=cat AC_SUBST(LORDER)dnl AC_SUBST(TSORT)dnl dnl Mac OS X has lorder, but sh is too broken for it to work dnl elif test -z "`lorder config/config.c 2>&1 | grep config/config.c`" ; then dnl LORDER=echo dnl TSORT=cat dnl AC_SUBST(LORDER)dnl dnl AC_SUBST(TSORT)dnl fi dnl Check whether tsort can deal with loops AC_CACHE_CHECK(whether tsort can deal with loops, nmh_cv_tsort_loop, [if test -z "`echo a b b a | tsort 2>/dev/null | grep a`" ; then nmh_cv_tsort_loop=no else nmh_cv_tsort_loop=yes fi]) if test x$nmh_cv_tsort_loop = xno ; then LORDER=echo TSORT=cat AC_SUBST(LORDER)dnl AC_SUBST(TSORT)dnl fi dnl Look for `ls' pathtmp=/usr/bin:/bin:/usr/local/bin:/usr/xpg4/bin:/usr/ucb AC_PATH_PROG(lspath, ls, no, [$pathtmp]) dnl See how we get ls to display the owner and the group if test "$lspath" != "no"; then AC_CACHE_CHECK(how to get ls to show us the group ownership of a file, nmh_cv_ls_grpopt, [if test x"`$lspath -dl / | $AWK '{print $9}'`" = x"/"; then dnl There were 9 parameters, so unless this is a really bizarre, nonstandard dnl ls, it would seem -l gave us both the user and group. On this type of dnl ls, -g makes _only_ the group be displayed (and not the user). nmh_cv_ls_grpopt="-l" else dnl Looks like -l only gave us the user, so we need -g to get the group too. nmh_cv_ls_grpopt="-lg" fi]) fi dnl Look for `sendmail' pathtmp=/usr/lib:/usr/sbin:/usr/etc:/usr/ucblib:/usr/bin:/bin AC_PATH_PROG(sendmailpath, sendmail, /usr/sbin/sendmail, [$pathtmp]) dnl Look for `vi' pathtmp=/usr/bin:/bin:/usr/ucb:/usr/local/bin AC_PATH_PROG(vipath, vi, /bin/vi, [$pathtmp]) dnl ---------------------------------------------------------- dnl FIND MAIL SPOOL AND SEE IF WE NEED TO MAKE inc SETGID MAIL dnl ---------------------------------------------------------- AC_CACHE_CHECK(where mail spool is located, nmh_cv_mailspool, [for mailspool in /var/mail dnl /var/spool/mail dnl /usr/spool/mail dnl /dev/null; dnl Just in case we fall through do test -d $mailspool && break done nmh_cv_mailspool=$mailspool ]) mailspool=$nmh_cv_mailspool AC_SUBST(mailspool)dnl dnl See whether the mail spool directory is world-writable. if test "$lspath" != "no" -a "$cutpath" != "no"; then AC_CACHE_CHECK(whether the mail spool is world-writable, nmh_cv_mailspool_world_writable, [if test "`$lspath -dl $mailspool/ | $cutpath -c9`" = "-"; then nmh_cv_mailspool_world_writable=no else nmh_cv_mailspool_world_writable=yes fi]) fi dnl Also, check for liblockfile (as found on Debian systems) AC_CHECK_HEADER(lockfile.h, AC_CHECK_LIB(lockfile, lockfile_create) ) dnl and whether its companion program dotlockfile is setgid AC_PATH_PROG(dotlockfilepath, dotlockfile, no) if test "$ac_cv_lib_lockfile_lockfile_create" != "no" ; then if test "$ac_cv_path_dotlockfilepath" != "no" ; then AC_CACHE_CHECK(whether dotlockfile is setgid, nmh_cv_dotlockfile_setgid, [ if test -g "$ac_cv_path_dotlockfilepath" ; then nmh_cv_dotlockfile_setgid=yes else nmh_cv_dotlockfile_setgid=no fi]) fi fi dnl If mailspool is not world-writable and dotlockfile is not setgid, dnl we need to #define MAILGROUP to 1 and make inc setgid. if test x"$LOCKTYPE" = x"dot" -a x"$nmh_cv_mailspool_world_writable" = x"no" -a x"$nmh_cv_dotlockfile_setgid" != x"yes" ; then dnl do we really need both of these? AC_DEFINE(MAILGROUP,1, [Define to 1 if you need to make `inc' set-group-id because your mail spool is not world writable. There are no guarantees as to the safety of doing this, but this #define will add some extra security checks.])dnl SETGID_MAIL=1 fi AC_SUBST(SETGID_MAIL)dnl dnl Use ls to see which group owns the mail spool directory. AC_CACHE_CHECK(what group owns the mail spool, nmh_cv_ls_mail_grp, [nmh_cv_ls_mail_grp=`$lspath -dL $nmh_cv_ls_grpopt $mailspool|$AWK '{print $4}'` ]) MAIL_SPOOL_GRP=$nmh_cv_ls_mail_grp AC_SUBST(MAIL_SPOOL_GRP)dnl dnl ------------------ dnl CHECK HEADER FILES dnl ------------------ dnl On glibc we need to define at least the '_XOPEN_SOURCE' level of features, dnl or wchar.h doesn't declare a prototype for wcwidth(). But if we only define dnl that level then db.h won't compile. So we define _GNU_SOURCE which turns dnl on everything. Perhaps other OSes need some feature switch set to get wcwidth() dnl declared; if so they should have an entry added to this case statement. dnl NB that we must define this on the compiler command line, not in config.h, dnl because it must be set before any system header is included and there's no dnl portable way to make sure that files generated by lex include config.h dnl before system header files. case "$target_os" in linux*) # Like DEFS, but doesn't get stomped on by configure when using config.h: OURDEFS="$OURDEFS -D_GNU_SOURCE" ;; esac AC_SUBST(OURDEFS) AC_HEADER_STDC AC_HEADER_TIOCGWINSZ AC_CHECK_HEADERS(fcntl.h crypt.h termcap.h \ langinfo.h wchar.h wctype.h iconv.h \ sys/param.h sys/time.h sys/stream.h ) dnl dnl Checks for _IO_write_ptr. A Linuxism used by nmh on linux. We dnl really use a whole set of them, but this check should be dnl sufficient. dnl AC_CHECK_HEADER(libio.h, [ AC_EGREP_HEADER(_IO_write_ptr, libio.h, [ AC_DEFINE(LINUX_STDIO,1,[Use the Linux _IO_*_ptr defines from .]) ]) ]) AC_CHECK_HEADER([sys/ptem.h], AC_DEFINE(WINSIZE_IN_PTEM,1, [Define to 1 if `struct winsize' requires .]),, [[#if HAVE_SYS_STREAM_H # include #endif ]]) dnl --------------- dnl CHECK FUNCTIONS dnl --------------- AC_CHECK_FUNCS(nl_langinfo mbtowc wcwidth) dnl Look for the initgroups() declaration. On AIX 4.[13], Solaris 4.1.3, and dnl ULTRIX 4.2A the function is defined in libc but there's no declaration in dnl any system header. dnl dnl On Solaris 2.[456], the declaration is in . On HP-UX 9-11 and dnl (reportedly) FreeBSD 3.[23], it's in . Any other locations we dnl need to check? AH_TEMPLATE(INITGROUPS_HEADER, [Define to the header containing the declaration of `initgroups'.]) AC_EGREP_HEADER(initgroups, grp.h, AC_DEFINE(INITGROUPS_HEADER, ), AC_EGREP_HEADER(initgroups, unistd.h, AC_DEFINE(INITGROUPS_HEADER, ))) dnl Check for multibyte character set support if test "x$ac_cv_header_wchar_h" = "xyes" -a "x$ac_cv_header_wctype_h" = "xyes" \ -a "x$ac_cv_func_wcwidth" = "xyes" -a "x$ac_cv_func_mbtowc" = "xyes"; then AC_DEFINE(MULTIBYTE_SUPPORT, 1, [Define to enable support for multibyte character sets.]) fi dnl ------------------- dnl CHECK FOR LIBRARIES dnl ------------------- dnl Check location of modf AC_CHECK_FUNC(modf, , AC_CHECK_LIB(m, modf)) termcap_curses_order="termcap curses ncurses tinfo" for lib in $termcap_curses_order; do AC_CHECK_LIB(${lib}, tgetent, [TERMLIB="-l$lib"; break]) done AC_SUBST(TERMLIB)dnl if test "x$TERMLIB" = "x"; then echo 'Could not find tgetent() in any library.' echo 'Is there a ncurses-devel package that you can install?' exit 1 fi dnl --------------- dnl CHECK FOR ICONV dnl --------------- dnl Find iconv. It may be in libiconv and may be iconv() or libiconv() if test "x$ac_cv_header_iconv_h" = "xyes"; then AC_CHECK_FUNC(iconv, ac_found_iconv=yes, ac_found_iconv=no) if test "x$ac_found_iconv" = "xno"; then AC_CHECK_LIB(iconv, iconv, ac_found_iconv=yes) if test "x$ac_found_iconv" = "xno"; then AC_CHECK_LIB(iconv, libiconv, ac_found_iconv=yes) fi if test "x$ac_found_iconv" != "xno"; then LIBS="-liconv $LIBS" fi else dnl Handle case where there is a native iconv but iconv.h is from libiconv AC_CHECK_DECL(_libiconv_version, [ AC_CHECK_LIB(iconv, libiconv, LIBS="-liconv $LIBS") ],, [ #include ]) fi fi if test "x$ac_found_iconv" = xyes; then AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) fi dnl Check if iconv uses const in prototype declaration if test "x$ac_found_iconv" = "xyes"; then AC_CACHE_CHECK(for iconv declaration, ac_cv_iconv_const, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include #include ]], [[#ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif]])], [ac_cv_iconv_const=], [ac_cv_iconv_const=const])]) AC_DEFINE_UNQUOTED([ICONV_CONST], $ac_cv_iconv_const, [Define as const if the declaration of iconv() needs const.]) fi dnl --------------------- dnl CHECK TERMCAP LIBRARY dnl --------------------- dnl Add the termcap library, so that the following configure dnl tests will find it when it tries to link test programs. nmh_save_LIBS="$LIBS" LIBS="$TERMLIB $LIBS" dnl Check if tgetent accepts NULL (and will allocate its own termcap buffer) dnl Some termcaps reportedly accept a zero buffer, but then dump core dnl in tgetstr(). dnl Under Cygwin test program crashes but exit code is still 0. So, dnl we test for a file that porgram should create AH_TEMPLATE([TGETENT_ACCEPTS_NULL], [Define to 1 if tgetent() accepts NULL as a buffer.]) AC_CACHE_CHECK(if tgetent accepts NULL, nmh_cv_func_tgetent_accepts_null, [AC_TRY_RUN([ main() { char buf[4096]; int r1 = tgetent(buf, "vt100"); int r2 = tgetent(NULL,"vt100"); if (r1 >= 0 && r1 == r2) { char tbuf[1024], *u; u = tbuf; tgetstr("cl", &u); creat("conftest.tgetent", 0640); } exit((r1 != r2) || r2 == -1); } ], if test -f conftest.tgetent; then nmh_cv_func_tgetent_accepts_null=yes else nmh_cv_func_tgetent_accepts_null=no fi, nmh_cv_func_tgetent_accepts_null=no, nmh_cv_func_tgetent_accepts_null=no)]) if test x$nmh_cv_func_tgetent_accepts_null = xyes; then AC_DEFINE(TGETENT_ACCEPTS_NULL) fi AC_CACHE_CHECK(if tgetent returns 0 on success, nmh_cv_func_tgetent_zero_success, [AC_TRY_RUN([ main() { char buf[4096]; int r1 = tgetent(buf, "!@#$%^&*"); int r2 = tgetent(buf, "vt100"); if (r1 < 0 && r2 == 0) { char tbuf[1024], *u; u = tbuf; tgetstr("cl", &u); creat("conftest.tgetent0", 0640); } exit(r1 == r2); } ], if test -f conftest.tgetent0; then nmh_cv_func_tgetent_zero_success=yes else nmh_cv_func_tgetent_zero_success=no fi, nmh_cv_func_tgetent_zero_success=no, nmh_cv_func_tgetent_zero_success=no)]) AH_TEMPLATE([TGETENT_SUCCESS], [Define to what tgetent() returns on success (0 on HP-UX X/Open curses).]) if test x$nmh_cv_func_tgetent_zero_success = xyes; then AC_DEFINE(TGETENT_SUCCESS, 0) else AC_DEFINE(TGETENT_SUCCESS, 1) fi dnl Now put the libraries back to what it was before we dnl starting checking the termcap library. LIBS="$nmh_save_LIBS" dnl -------------- dnl CHECK TYPEDEFS dnl -------------- AC_TYPE_PID_T AC_TYPE_OFF_T AC_TYPE_UID_T AC_TYPE_MODE_T AC_TYPE_SIZE_T dnl ---------------- dnl CHECK STRUCTURES dnl ---------------- dnl For platforms such as FreeBSD that have tm_gmtoff in struct tm. dnl (FreeBSD has a timezone() function but not a timezone global dnl variable that is visible). AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,,[#include ]) AC_STRUCT_DIRENT_D_TYPE dnl Where is located? Needed as input for signames.awk AC_CACHE_CHECK(where signal.h is located, nmh_cv_path_signal_h, [for SIGNAL_H in /usr/include/bsd/sys/signal.h dnl Next /usr/include/asm/signal.h dnl Linux 1.3.0 and above /usr/include/asm/signum.h dnl some versions of Linux/Alpha /usr/include/linux/signal.h dnl Linux up to 1.2.11 /usr/include/sys/signal.h dnl Almost everybody else /dev/null; dnl Just in case we fall through do test -f $SIGNAL_H && \ grep '#[ ]*define[ ][ ]*SIG[0-9A-Z]*[ ]*[0-9][0-9]*' $SIGNAL_H > /dev/null && \ break done nmh_cv_path_signal_h=$SIGNAL_H ]) SIGNAL_H=$nmh_cv_path_signal_h AC_SUBST(SIGNAL_H)dnl dnl ---------------- dnl OUTPUT MAKEFILES dnl ---------------- AC_CONFIG_FILES(Makefile config/Makefile h/Makefile sbr/Makefile uip/Makefile \ etc/Makefile man/Makefile) AC_CONFIG_COMMANDS([stamp],[test -z "$CONFIG_HEADERS" || echo > stamp-h]) AC_OUTPUT dnl These odd looking assignments are done to expand out unexpanded dnl variables in bindir et al (for instance mandir is '${datarootdir}/man', dnl but expanding that gives '${prefix}/share/man', so we need to expand dnl again to get the final answer. dnl We only use the expanded versions to print the install paths in dnl the final summary and should use them nowhere else (see the autoconf dnl docs for the rationale for bindir etc being unexpanded). eval "nmhbin=${bindir}"; eval "nmhbin=${nmhbin}" eval "nmhsysconf=${sysconfdir}"; eval "nmhsysconf=${nmhsysconf}" eval "nmhlib=${libdir}"; eval "nmhlib=${nmhlib}" eval "nmhman=${mandir}"; eval "nmhman=${nmhman}" cat <. Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | msp430 \ | ns16k | ns32k \ | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | msp430-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; or32 | or32-*) basic_machine=or32-unknown os=-coff ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sh64) basic_machine=sh64-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: mmh-0.4/config.guess0000755000000000000000000012513213414435726013171 0ustar rootroot#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. timestamp='2005-02-10' # This file 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. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; amd64:OpenBSD:*:*) echo x86_64-unknown-openbsd${UNAME_RELEASE} exit 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; cats:OpenBSD:*:*) echo arm-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; luna88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; macppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvmeppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mips64-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sun3:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit 0 ;; macppc:MirBSD:*:*) echo powerppc-unknown-mirbsd${UNAME_RELEASE} exit 0 ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit 0 ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit 0 ;; *:OS400:*:*) echo powerpc-ibm-os400 exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit 0 ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7 && exit 0 ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c \ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && exit 0 echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then # avoid double evaluation of $set_cc_for_build test -n "$CC_FOR_BUILD" || eval $set_cc_for_build if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; x86:Interix*:[34]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; amd64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit 0 ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit 0 ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit 0 ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit 0 ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; i*86:*:5:[78]*) case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit 0 ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit 0 ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in *86) UNAME_PROCESSOR=i686 ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit 0 ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit 0 ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms && exit 0 ;; I*) echo ia64-dec-vms && exit 0 ;; V*) echo vax-dec-vms && exit 0 ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: mmh-0.4/etc/0000755000000000000000000000000013414435726011420 5ustar rootrootmmh-0.4/etc/scan.MMDDYY0000644000000000000000000000053013414435726013267 0ustar rootroot%; scan.MMDDYY %; %; Like scan.default, but the date is printed in MM/DD/YY format rather than %; MM/DD. %; %4(msg)%<(cur)+%| %>%<{replied}-%| %>\ %02(mon{date})/%02(mday{date})/%(void(year{date}))%02(modulo 100)%<{date} %|*%>\ %<(mymbox{from})%<{to}To:%14(decode(friendly{to}))%>%>\ %<(zero)%17(decode(friendly{from}))%> \ %(decode{subject}) mmh-0.4/etc/components0000644000000000000000000000004513414435726013527 0ustar rootrootTo: Cc: Fcc: +sent Subject: -------- mmh-0.4/etc/scan.YYYYMMDD0000644000000000000000000000051013414435726013547 0ustar rootroot%; scan.YYYYMMDD %; %; Like scan.default, but the date is printed in YYYY-MM-DD format rather than %; MM/DD. %; %4(msg)%<(cur)+%| %>%<{replied}-%| %>\ %4(year{date})-%02(mon{date})-%02(mday{date})%<{date} %|*%>\ %<(mymbox{from})%<{to}To:%14(decode(friendly{to}))%>%>\ %<(zero)%17(decode(friendly{from}))%> \ %(decode{subject}) mmh-0.4/etc/scan.size0000644000000000000000000000032413414435726013237 0ustar rootroot%4(msg)%<(cur)+%| %>%<{replied}-%| %>\ %02(mon{date})/%02(mday{date})%<{date} %|*%>\ %5(size) \ %<(mymbox{from})%<{to}To:%14(decode(friendly{to}))%>%>\ %<(zero)%17(decode(friendly{from}))%> \ %(decode{subject}) mmh-0.4/etc/forwcomps0000644000000000000000000000004513414435726013361 0ustar rootrootTo: Cc: Fcc: +sent Subject: -------- mmh-0.4/etc/mhl.forward0000644000000000000000000000043413414435726013567 0ustar rootroot; mhl.forward ; ; default message filter for `forw' (forw -format) ; width=80,overflowtext=,overflowoffset=10 leftadjust,compress,compwidth=9 Date:formatfield="%<(nodate{text})%{text}%|%(tws{text})%>" From: To: Cc: Subject: : body:nocomponent,overflowoffset=0,noleftadjust,nocompress mmh-0.4/etc/mhl.reply0000644000000000000000000000017213414435726013255 0ustar rootroot; mhl.reply ; ; default message filter for `repl' (repl -format) ; body:component="> ",overflowtext="> ",overflowoffset=0 mmh-0.4/etc/replgroupcomps0000644000000000000000000000255213414435726014430 0ustar rootroot%; replgroupcomps %; %; form (components) file for `repl -group' %; %; Check the following headers to create reply addresses. %; %; To: Mail-Followup-To %; %; OR %; %; To: Mail-Reply-To (or) %; Reply-To (or) %; From (or) %; Sender (or) %; Return-Path %; %; AND %; %; Cc: To (and) %; Cc (and) %; personal address %; %(lit)%(formataddr{mail-followup-to})\ %<(nonnull)%(void(width))%(void(decode))%(putaddr To: )\n\ %|\ %(lit)%(formataddr %<{mail-reply-to}%?{reply-to}%?{from}%?{sender}%?{return-path}%>)\ %<(nonnull)%(void(width))%(void(decode))%(putaddr To: )\n%>\ %(lit)%(formataddr{to})%(formataddr{cc})%(formataddr(me))\ %<(nonnull)%(void(width))%(void(decode))%(putaddr Cc: )\n%>%>\ %; Fcc: +sent Subject: %<{subject}Re: %(putstr(trim(decode{subject})))%> %; %; Make References: and In-reply-to: fields for threading. %; Use (trim) to eat trailing whitespace. %; %<{message-id}In-reply-to: %{message-id}\n%>\ %<{message-id}References: \ %<{references}%(trim{references})%(putstr) %>\ %(trim{message-id})%(putstr)\n%>\ Comments: In-reply-to \ %<{from}%(void{from})%?(void{apparently-from})%|%(void{sender})%>\ %(putstr(trim(decode)))\n\ message dated "%<(nodate{date})%{date}%|%(tws{date})%>." -------- [%4(year{date})-%02(mon{date})-%02(mday{date}) \ %02(hour{date}):%02(min{date})] %(decode{from}) > mmh-0.4/etc/rcvdistcomps0000644000000000000000000000014313414435726014061 0ustar rootroot%(lit)%(formataddr{addresses})\ %<(nonnull)%(void(width))%(void(decode))%(putaddr Resent-To: )\n%> mmh-0.4/etc/repllistcomps0000644000000000000000000000277413414435726014255 0ustar rootroot%; repllistcomps %; %; form (components) file for mailing list replies %; %; Check the following headers to create reply addresses. %; %; To: List-Post %; %; OR %; %; To: Mail-Followup-To %; %; OR %; %; To: Mail-Reply-To (or) %; Reply-To (or) %; From (or) %; Sender (or) %; Return-Path %; %; AND %; %; Cc: To (and) %; Cc (and) %; personal address %; %(lit)%(formataddr(unmailto{list-post}))\ %<(nonnull)%(void(width))%(void(decode))%(putaddr To: )\n\ %|\ %(lit)%(formataddr{mail-followup-to})\ %<(nonnull)%(void(width))%(void(decode))%(putaddr To: )\n\ %|\ %(lit)%(formataddr %<{mail-reply-to}%?{reply-to}%?{from}%?{sender}%?{return-path}%>)\ %<(nonnull)%(void(width))%(void(decode))%(putaddr To: )\n%>\ %(lit)%(formataddr{to})%(formataddr{cc})%(formataddr(me))\ %<(nonnull)%(void(width))%(void(decode))%(putaddr Cc: )\n%>\ %>\ %>\ %; Fcc: +sent Subject: %<{subject}Re: %(putstr(trim(decode{subject})))%> %; %; Make References: and In-reply-to: fields for threading. %; Use (trim) to eat trailing whitespace. %; %<{message-id}In-reply-to: %{message-id}\n%>\ %<{message-id}References: \ %<{references}%(trim{references})%(putstr) %>\ %(trim{message-id})%(putstr)\n%>\ Comments: In-reply-to \ %<{from}%(void{from})%?(void{apparently-from})%|%(void{sender})%>\ %(putstr(trim(decode)))\n\ message dated "%<(nodate{date})%{date}%|%(tws{date})%>." -------- [%4(year{date})-%02(mon{date})-%02(mday{date}) \ %02(hour{date}):%02(min{date})] %(decode{from}) > mmh-0.4/etc/mhl.whatnow20000644000000000000000000000010113414435726013663 0ustar rootrootignores=mmh-* extras:raw : body:nocomponent,overflowoffset=0,raw mmh-0.4/etc/scan.mailx0000644000000000000000000000040313414435726013375 0ustar rootroot%<(cur)>%| %>\ %<{status} %|N%>\ %<{replied}R%| %>\ %4(msg) \ %<(mymbox{from})%<{to}To: %13(decode(friendly{to}))%>%>\ %<(zero)%17(decode(friendly{from}))%> \ %3(day{date}) %3(month{date}) %02(mday{date}) \ %02(hour{date}):%02(min{date}) \ %(decode{subject}) mmh-0.4/etc/Makefile.in0000644000000000000000000000370613414435726013473 0ustar rootroot# # Makefile for etc subdirectory # SHELL = /bin/sh top_srcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ etcdir = @sysconfdir@ mailspool = @mailspool@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_DATA = @INSTALL_DATA@ SED = sed .SUFFIXES: # static configuration, format, and components files STATIC_FILES = components digestcomps distcomps forwcomps \ mhl.body mhl.format mhl.forward mhl.headers \ mhl.reply mhl.whatnow2 rcvdistcomps rcvdistcomps.outbox \ replcomps replgroupcomps scan.MMDDYY scan.YYYYMMDD \ scan.nmh scan.mailx scan.nomime scan.size scan.time \ scan.timely scan.unseen scan.meillo scan.default \ mhn.defaults repllistcomps pick.default # ========= DEPENDENCIES FOR BUILDING ========== all: install: install-etc-files install-etc-files: mkdir -p $(DESTDIR)$(etcdir) for file in $(STATIC_FILES); do \ if [ -f "$(DESTDIR)$(etcdir)/$$file" ]; then \ if cmp -s "$(srcdir)/$$file" "$(DESTDIR)$(etcdir)/$$file" ; then \ :; \ else \ $(INSTALL_DATA) "$(srcdir)/$$file" "$(DESTDIR)$(etcdir)/$$file.dist"; \ echo "$(DESTDIR)$(etcdir)/$$file has local modifications; installing with .dist suffix"; \ fi; \ else \ $(INSTALL_DATA) $(srcdir)/$$file $(DESTDIR)$(etcdir)/$$file; \ fi; \ done uninstall: uninstall-etc-files uninstall-etc-files: for file in $(STATIC_FILES) ; do \ rm -f $(DESTDIR)$(etcdir)/$$file; \ done # ========== DEPENDENCIES FOR CLEANUP ========== mostlyclean: rm -f *~ clean: mostlyclean distclean: clean rm -f Makefile realclean: distclean superclean: realclean # ========== DEPENDENCIES FOR MAINTENANCE ========== subdir = etc Makefile: Makefile.in ../config.status cd .. && ./config.status $(subdir)/$@ mmh-0.4/etc/scan.meillo0000644000000000000000000000101613414435726013545 0ustar rootroot%; scan.meillo %; %; The listing format I use myself. %; %(date2local{date})\ %4(year{date})-%02(mon{date})-%02(mday{date}) %02(hour{date}):%02(min{date})\ \ %<(unseen)u%| %>\ %<{replied}r%| %>\ %<{forwarded}f%| %>\ %(void(msg))%<(gt 9999)%(msg)%|%4(msg)%>\ \ %<(cur)*%| %>\ \ %<(mymbox{from})%<{to}-> %17(decode(friendly{to}))%>%>\ %<(zero)%20(decode(friendly{from}))%>\ \ %;(void(size))%<(gt 1000)%4(divide 1000)%|%4(size)b%>) %(void(size))%4(divide 1024)\ %<{mime-version} %|~%>\ \ %(putstr(trim(decode{subject}))) mmh-0.4/etc/scan.time0000644000000000000000000000037313414435726013227 0ustar rootroot%4(msg)%<(cur)+%| %>%<{replied}-%| %>\ %02(mon{date})/%02(mday{date}) \ %02(hour{date}):%02(min{date})%3(tzone{date})\ %<{date} %|*%>\ %<(mymbox{from})%<{to}To:%14(decode(friendly{to}))%>%>\ %<(zero)%17(decode(friendly{from}))%> \ %(decode{subject}) mmh-0.4/etc/replcomps0000644000000000000000000000240213414435726013345 0ustar rootroot%; $Header$ %; %; These next lines slurp in lots of addresses for To: and Cc:. %; Use with repl -query or else you may get flooded with addresses! %; %; If no To:/Cc:/Fcc: text, we output empty fields for prompter to fill in. %; %(lit)%(formataddr{reply-to})\ %(formataddr %<{from}%(void{from})%|%(void{apparently-from})%>)\ %(formataddr{resent-to})\ %(formataddr{prev-resent-to})\ %(formataddr{x-to})\ %(formataddr{apparently-to})\ %(void(width))%(void(decode))%(putaddr To: ) %(lit)%(formataddr{to})\ %(formataddr{cc})\ %(formataddr{x-cc})\ %(formataddr{resent-cc})\ %(formataddr{prev-resent-cc})\ %(formataddr(me))\ %(void(width))%(void(decode))%(putaddr Cc: ) Fcc: +sent Subject: %<{subject}Re: %(putstr(trim(decode{subject})))%> %; %; Make References: and In-reply-to: fields for threading. %; Use (trim) to eat trailing whitespace. %; %<{message-id}In-reply-to: %{message-id}\n%>\ %<{message-id}References: \ %<{references}%(trim{references})%(putstr) %>\ %(trim{message-id})%(putstr)\n%>\ Comments: In-reply-to \ %<{from}%(void{from})%?(void{apparently-from})%|%(void{sender})%>\ %(putstr(trim(decode)))\n\ message dated "%<(nodate{date})%{date}%|%(tws{date})%>." -------- [%4(year{date})-%02(mon{date})-%02(mday{date}) \ %02(hour{date}):%02(min{date})] %(decode{from}) > mmh-0.4/etc/scan.nomime0000644000000000000000000000052713414435726013556 0ustar rootroot%; scan.nomime %; %; This file is a modification of the standard (non-UK version) %; format for scan, that doesn't do any RFC-2047 decoding of %; header components. %; %4(msg)%<(cur)+%| %>%<{replied}-%| %>\ %02(mon{date})/%02(mday{date})%<{date} %|*%>\ %<(mymbox{from})%<{to}To:%14(friendly{to})%>%>%<(zero)%17(friendly{from})%> \ %{subject} mmh-0.4/etc/mhl.format0000644000000000000000000000060713414435726013415 0ustar rootroot; mhl.format ; ; default message filter for `show' ; : overflowtext="***",overflowoffset=5 leftadjust,compwidth=9 ignores=msgid,message-id,received,content-type,content-transfer-encoding,content-id Date:formatfield="%<(nodate{text})%{text}%|%(pretty{text})%>" From:decode To:decode Cc:decode Subject:decode : extras:nocomponent : body:nocomponent,overflowtext=,overflowoffset=0,noleftadjust mmh-0.4/etc/scan.timely0000644000000000000000000000056313414435726013575 0ustar rootroot%4(msg)%<(cur)+%| %>%<{replied}-%| %>\ %(void(rclock{date}))\ %<(gt 15768000)%03(month{date})%(void(year{date}))%02(modulo 100)\ %?(gt 604800)%02(mday{date})%03(month{date})\ %?(gt 86400) %(day{date}) %|\ %02(hour{date}):%02(min{date})%>\ %<{date} %|*%>\ %<(mymbox{from})%<{to}To:%14(decode(friendly{to}))%>%>\ %<(zero)%17(decode(friendly{from}))%> \ %(decode{subject}) mmh-0.4/etc/scan.nmh0000644000000000000000000000042613414435726013052 0ustar rootroot%; scan.nmh %; %; This is nmh's default format string (for non-UK sites). %; %4(msg)%<(cur)+%| %>%<{replied}-%| %>\ %02(mon{date})/%02(mday{date})%<{date} %|*%>\ %<(mymbox{from})%<{to}To:%14(decode(friendly{to}))%>%>\ %<(zero)%17(decode(friendly{from}))%> \ %(decode{subject}) mmh-0.4/etc/digestcomps0000644000000000000000000000044113414435726013663 0ustar rootrootFrom: %{digest}-request To: %{digest} Distribution: dist-%{digest}; Subject: %{digest} Digest V%(cur) #%(msg) Reply-To: %{digest} -------- %{digest} Digest Volume %(cur) : Issue %(msg) %(weekday{date}), %02(mday{date}) %(month{date}) %(year{date}) Today's Topics are attached. mmh-0.4/etc/scan.default0000644000000000000000000000044413414435726013714 0ustar rootroot%; %; default scan/inc listing format %; %4(msg)%<(cur)+%| %>%<{replied}-%| %>\ %4(year{date})-%02(mon{date})-%02(mday{date}) \ %02(hour{date}):%02(min{date}) \ %<(mymbox{from})%<{to}To:%14(decode(friendly{to}))%>%>\ %<(zero)%17(decode(friendly{from}))%> \ %(putstr(trim(decode{subject}))) mmh-0.4/etc/scan.unseen0000644000000000000000000000033113414435726013560 0ustar rootroot%4(msg)%<(cur)+%| %>%<(unseen)U%| %>%<{replied}-%| %>\ %02(mon{date})/%02(mday{date})%<{date} %|*%>\ %<(mymbox{from})%<{to}To:%14(decode(friendly{to}))%>%>\ %<(zero)%17(decode(friendly{from}))%> \ %(decode{subject}) mmh-0.4/etc/mhn.defaults0000644000000000000000000000434613414435726013742 0ustar rootrootmhshow-suffix-application/msword: .doc mhshow-suffix-application/msword: .docx mhshow-suffix-application/ogg: .ogg mhshow-suffix-application/pdf: .pdf mhshow-suffix-application/postscript: .ps mhshow-suffix-application/rtf: .rtf mhshow-suffix-application/vnd.ms-excel: .xla mhshow-suffix-application/vnd.ms-excel: .xlc mhshow-suffix-application/vnd.ms-excel: .xld mhshow-suffix-application/vnd.ms-excel: .xll mhshow-suffix-application/vnd.ms-excel: .xlm mhshow-suffix-application/vnd.ms-excel: .xls mhshow-suffix-application/vnd.ms-excel: .xlt mhshow-suffix-application/vnd.ms-excel: .xlw mhshow-suffix-application/vnd.ms-powerpoint: .pot mhshow-suffix-application/vnd.ms-powerpoint: .pps mhshow-suffix-application/vnd.ms-powerpoint: .ppt mhshow-suffix-application/vnd.ms-powerpoint: .ppz mhshow-suffix-application/x-bzip2: .bz2 mhshow-suffix-application/x-cpio: .cpio mhshow-suffix-application/x-dvi: .dvi mhshow-suffix-application/x-gzip: .gz mhshow-suffix-application/x-java-archive: .jar mhshow-suffix-application/x-javascript: .js mhshow-suffix-application/x-latex: .latex mhshow-suffix-application/x-sh: .sh mhshow-suffix-application/x-tar: .tar mhshow-suffix-application/x-texinfo: .texinfo mhshow-suffix-application/x-tex: .tex mhshow-suffix-application/x-troff-man: .man mhshow-suffix-application/x-troff-me: .me mhshow-suffix-application/x-troff-ms: .ms mhshow-suffix-application/x-troff: .t mhshow-suffix-application/zip: .zip mhshow-suffix-audio/basic: .au mhshow-suffix-audio/midi: .midi mhshow-suffix-audio/mpeg: .mp3 mhshow-suffix-audio/mpeg: .mpg mhshow-suffix-audio/x-ms-wma: .wma mhshow-suffix-audio/x-wav: .wav mhshow-suffix-image/gif: .gif mhshow-suffix-image/jpeg: .jpeg mhshow-suffix-image/jpeg: .jpg mhshow-suffix-image/png: .png mhshow-suffix-image/tiff: .tif mhshow-suffix-image/tiff: .tiff mhshow-suffix-text/calendar: .ics mhshow-suffix-text/css: .css mhshow-suffix-text/html: .html mhshow-suffix-text/rtf: .rtf mhshow-suffix-text/sgml: .sgml mhshow-suffix-text/xml: .xml mhshow-suffix-video/mpeg: .mpeg mhshow-suffix-video/mpeg: .mpg mhshow-suffix-video/quicktime: .moov mhshow-suffix-video/quicktime: .mov mhshow-suffix-video/quicktime: .qt mhshow-suffix-video/quicktime: .qtvr mhshow-suffix-video/x-msvideo: .avi mhshow-suffix-video/x-ms-wmv: .wmv mmh-0.4/etc/mhl.body0000644000000000000000000000005613414435726013060 0ustar rootrootwidth=10000 body:nocomponent,overflowoffset=0 mmh-0.4/etc/mhl.headers0000644000000000000000000000071713414435726013542 0ustar rootroot; mhl.headers ; ; Default format file for displaying headers in ; MIME messages. show calls mhl with this ; filter to display message header. ; overflowtext="***",overflowoffset=5 leftadjust,compwidth=9 Date:formatfield="%<(nodate{text})%{text}%|%(pretty{text})%>" From:formatfield="%(putstr(trim(decode{text})))" To:formatfield="%(putstr(trim(decode{text})))" Cc:formatfield="%(putstr(trim(decode{text})))" Subject:formatfield="%(putstr(trim(decode{text})))" : mmh-0.4/etc/distcomps0000644000000000000000000000004213414435726013344 0ustar rootrootResent-To: Resent-Cc: Resent-Fcc: mmh-0.4/etc/pick.default0000644000000000000000000000000713414435726013711 0ustar rootroot%(msg) mmh-0.4/etc/rcvdistcomps.outbox0000644000000000000000000000014613414435726015403 0ustar rootroot%(lit)%(formataddr{addresses})\ %<(nonnull)%(void(width))%(putaddr Resent-To: )\n%>\ Resent-Fcc: sent mmh-0.4/test/0000755000000000000000000000000013414435726011624 5ustar rootrootmmh-0.4/test/tests/0000755000000000000000000000000013414435726012766 5ustar rootrootmmh-0.4/test/tests/config/0000755000000000000000000000000013414435726014233 5ustar rootrootmmh-0.4/test/tests/config/test-inbox0000644000000000000000000000123313414435726016251 0ustar rootroot#!/bin/sh ###################################################### # # Test the creation of the inbox # ###################################################### export MMHP="$MH_TEST_DIR/profile2" rm -rf "$MH_TEST_DIR/Mail2" printf "Path: %s\n" "$MH_TEST_DIR/Mail2" > "$MMHP" < /dev/null | folder > /dev/null if [ ! -d "$MH_TEST_DIR/Mail2" ]; then exit 1 fi if [ ! -d "$MH_TEST_DIR/Mail2/inbox" ]; then exit 1 fi folder -create +test > /dev/null rmdir "$MH_TEST_DIR/Mail2/inbox" printf "inbox: testinbox\n" >> $MMHP < /dev/null | folder > /dev/null if [ ! -d "$MH_TEST_DIR/Mail2/testinbox" ]; then exit 1 fi if [ -d "$MH_TEST_DIR/Mail2/inbox" ]; then exit 1 fi mmh-0.4/test/tests/mhparam/0000755000000000000000000000000013414435726014413 5ustar rootrootmmh-0.4/test/tests/mhparam/test-mhparam0000755000000000000000000000770613414435726016755 0ustar rootroot#!/bin/sh ###################################################### # # Test mhparam # ###################################################### . "$MH_TEST_COMMON" # check -help runandcheck "mhparam -help" <&2 failed=`expr ${failed:-0} + 1`;; esac # check unknown option runandcheck 'mhparam -nonexistent' </dev/null" </dev/null" <>"$MMHP" runandcheck 'mhparam path AliasFile' </dev/null; echo \$?" </dev/null; echo \$?" </dev/null; echo \$?" <>"$MMHP" <>"$MMHP" export VISUAL=ed runandcheck 'mhparam -nocomponent editor' <&2 failed=`expr "${failed:-0}" + 1`;; esac # check unknown switch runandcheck "anno -nonexistent ||:" <"`mhpath b`" runandcheck "cat `mhpath l`" <"`mhpath b`" runandcheck "cat `mhpath l`" <"`mhpath b`" runandcheck "cat `mhpath l`" </dev/null runandcheck "anno 11 -component Nmh-test" <"`mhpath b`" runandcheck "cat `mhpath l`" <"`mhpath b`" runandcheck "cat `mhpath l`" <"`mhpath b`" runandcheck "cat `mhpath l`" <&2 failed=`expr ${failed:-0} + 1`;; esac # check unknown switch runandcheck "rcvstore -nonexistent" <>"`mhparam defpath`" runandcheck "rcvstore <$MH_TEST_DIR/Mail/inbox/1" <&2 failed=`expr ${failed:-0} + 1`;; esac # check unknown switch runandcheck "rcvdist -nonexistent" < "$mts_fakesendmail" printf 'sendmail: %s/test/fakesendmail\n' "$srcdir" >>"$mts_fakesendmail" MHMTSCONF="$mts_fakesendmail" # arguments: rcvdist switches test_rcvdist () { run_prog $rcvdist "$@" # fakesendmail drops the message and any cc's into this mbox. mbox="${MH_TEST_DIR}"/Mail/fakesendmail.mbox inc -silent -file "$mbox" rm -f "$mbox" "$mbox.map" # It's hard to calculate the exact Date: header post is going to # use, so we'll just use sed to remove the actual date so we can # easily compare it against our "correct" output. sed -e 's/^Resent-Date:.*/Resent-Date:/' `mhpath last` > "$actual" check "$expected" "$actual" } # check with address cat > "$expected" < To: Some User Date: Fri, 29 Sep 2006 00:00:00 Message-Id: 1@test.nmh Subject: Testing message 1 Resent-From: `${MH_LIBEXEC_DIR}/ap -format '%(localmbox)' 0 | \ sed 's/^<\(.*\)>$/\1/'` Resent-To: recipient@example.com Resent-Date: This is message number 1 EOF test_rcvdist recipient@example.com < "$MH_TEST_DIR/Mail/inbox/1" # check -form cat > "$expected" < To: Some User Date: Fri, 29 Sep 2006 00:00:00 Message-Id: 2@test.nmh Subject: Testing message 2 Resent-To: recipient@example.com Resent-From: Some User Resent-Date: This is message number 2 EOF cat > "$MH_TEST_DIR/Mail/rcvdistcomps" <<'EOF' %(lit)%(formataddr{addresses})\ %<(nonnull)%(void(width))%(putaddr Resent-To:)%> %(lit)%(formataddr{to})\ %<(nonnull)%(void(width))%(putaddr Resent-From:)\n%> EOF test_rcvdist -form "$MH_TEST_DIR/Mail/rcvdistcomps" recipient@example.com \ < "$MH_TEST_DIR/Mail/inbox/2" mmh-0.4/test/tests/rcv/test-rcvpack0000755000000000000000000000214713414435726016120 0ustar rootroot#!/bin/sh ###################################################### # # Test rcvpack # ###################################################### . "$MH_TEST_COMMON" # check -help runandcheck "rcvpack -help" <&2 failed=`expr ${failed:-0} + 1`;; esac # check unknown switch runandcheck "rcvpack -nonexistent" < /dev/null runandcheck mhlist < $msgfile < $msgfile < $msgfile < Subject: mhlist test Date: Thu, 29 Jan 2015 18:12:21 +0000 (GMT) Content-Type: multipart/mixed; boundary="BoundaryMixed" --BoundaryMixed Content-type: multipart/alternative; boundary="BoundaryAlternative1" --BoundaryAlternative1 Content-type: text/enriched; CHARSET=US-ASCII Content-transfer-encoding: 7bit This is supposedly enriched. --BoundaryAlternative1 Content-type: text/plain; charset=ISO-8859-1; format=flowed Content-transfer-encoding: 8bit This is the body text/plain part. --BoundaryAlternative1 Content-type: text/html; CHARSET=US-ASCII Content-transfer-encoding: 7bit
This is the text/html body part.
--BoundaryAlternative1-- --BoundaryMixed Content-type: multipart/alternative; boundary="BoundaryAlternative2" --BoundaryAlternative2 Content-type: audio/wav Content-transfer-encoding: 8bit pretend wav audio --BoundaryAlternative2 Content-type: audio/mp3 Content-transfer-encoding: 8bit pretend mp3 audio --BoundaryAlternative2 Content-type: audio/basic Content-transfer-encoding: 8bit pretend basic audio --BoundaryAlternative2-- --BoundaryMixed-- EOF # check it -- vanilla output runandcheck "mhlist $msgnum" < $msgfile < $msgfile < $msgfile <"$profile" < Metafile-Extension: .meta ! cd - >/dev/null export MMHP="$profile" runandcheck "comp -editor cat -whatnowproc whatnow2" <`mhpath l +drafts` < To: alice Date: Sun, 25 Oct 2015 18:59:56 +0100 Subject: Test ---------------- foo ! runandcheck 'whatnow2 send -debug | replace_contentid' < To: alice Date: Sun, 25 Oct 2015 18:59:56 +0100 Subject: Test MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-ID: foo ----EOM---- alice ! mmh-0.4/test/tests/whatnow2/test-workflow0000644000000000000000000000151213414435726017310 0ustar rootroot#test whatnow2 workflow . "$MH_TEST_COMMON" profile="$MMH/profile-send" cd "$MMH" cat "`mhparam profile`" - >"$profile" < ! cd - >/dev/null export MMHP="$profile" runandcheck "comp -editor cat -whatnowproc whatnow2" <`mhpath l +drafts` < To: alice Date: Sun, 25 Oct 2015 18:59:56 +0100 Subject: Test ---------------- foo ! runandcheck 'whatnow2 send -debug | replace_contentid' < To: alice Date: Sun, 25 Oct 2015 18:59:56 +0100 Subject: Test MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-ID: foo ----EOM---- alice ! mmh-0.4/test/tests/inc/0000755000000000000000000000000013414435726013537 5ustar rootrootmmh-0.4/test/tests/inc/test-read-stdin0000644000000000000000000000470113414435726016473 0ustar rootroot#!/bin/sh ########################################################## # Test incorporating mail from stdin with `inc -file -`. # ########################################################## . "$MH_TEST_COMMON" # Test empty stdin from a pipe. runandcheck "printf '' |inc -file -" <$f && inc -file - <$f" <$f && inc -file - <$f" < KKKK: KKKKKK K. KKKKKK KK: KKKKKKKK@KKKKKKKKKKK.KKK.KK KKKKKKK: KKK KKKKKKK - KKK KKKKK! KKKK: KKK, 00 KKK 0000 00:00:00 +0000 KKKK-KKKKKKK: 0.0 KKKKKKK-KKKK: KKKKKKKKK/KKKKKKKKKKK; KKKKKKKK="----=_KKKKKKKK_000_0000_0K0000KK.00K000K0" K-KKKKKKKK: 0 K-KKKKKK-KKKKKKKK: KKKKKK K-KKKKKK: KKKKKKKKK KKKKKKK KKKKKKK K0.00.0000.0000 K-KKKKKKK: KKKKKKKK KK KKKKKKKKK KKKKKKK K0.00.0000.0000 K-KKK-KKKKKKK: (KKK-KKK.KKKKKKKK.KKK) KKKK://KKK.KKKKKKKK.KKK/KKKKK/KK?KK=000.00.000.000 K-KKK-KKKKKKK: (KKK.KKKKKKK.KKK) KKKKKKK - KKK KKKK://KKK.KKKKKKK.KKK/KKKKKK.KKK?KK=000.00.000.000 KKKK KK K KKKKK-KKKK KKKKKKK KK KKKK KKKKKK. ------=_KKKKKKKK_000_0000_0K0000KK.00K000K0 KKKKKKK-KKKK: KKKK/KKKKK; KKKKKKK="KKK-0000-0" KKKKKKK-KKKKKKKK-KKKKKKKK: 0KKK KKKK KKKKKK KK KKKKK KKKKKKK - KKKKK KKKKKK KK K.K.K. KKKKKKK - KKKKKKK KK K KKKK KKK KKKK KKKKKKKKKK KKK KKKKKKK KKKKK, KKKKK KKKKKKKK, KKKKK KKKKKKK, KKKKKKK, KKKKKK KKKKKK .. KKK 00 KKKKK KKKK KKKKKK KKKKKKKKKKKKK. KKKK://000.KKK-KKK-KKKKKKK.KKK KKK KKKKKKK KKK KKK KKKK $000.00 - $000.00! ________________________________ KK KKKKKK KKKK KKKK KKKKKKKKKKK, KK KKKK ------=_KKKKKKKK_000_0000_0K0000KK.00K000K0 KKKKKKK-KKKK: KKKK/KKKK; KKKKKKK="KKK-0000-0" KKKKKKK-KKKKKKKK-KKKKKKKK: KKKKKK-KKKKKKKKK = KKKK KKKKKK KK KKKKK KKKKKKK - KKKKK KKKKKK KK K.K.K. KKKKKKK - KKKKKKK KK K KKKK KKK KKKK KKKKKKKKKK KKK KKKKKKK KKKKK, KKKKK KKKKKKKK, KKKKK KKKKKKK, KKKKKKK, KKKKKK KKKKKK .. KKK 00 KKKKK KKKK KKKKKK KKKKKKKKKKKKK. KKKK://000.KKK-KKK-KKKKKKK.KKK KKK KKKKKKK KKK KKK KKKK $000.00 - $000.00! ________________________________ KK KKKKKK KKKK KKKK KKKKKKKKKKK, KK KKKK ------=_KKKKKKKK_000_0000_0K0000KK.00K000K0-- mmh-0.4/test/tests/inc/test-deb3591670000644000000000000000000000060013414435726015664 0ustar rootroot#!/bin/sh # Test a variant of a mailbox which caused debian bug 359167. set -e . $MH_TEST_COMMON THISDIR="tests/inc" require_prog valgrind TESTMBOX="$THISDIR/deb359167.mbox" if [ "$(cksum "$TESTMBOX")" != \ "2235746290 3324 tests/inc/deb359167.mbox" ]; then echo "Test mailbox has been corrupted" exit 1 fi valgrind --error-exitcode=1 --quiet inc -silent -file "$TESTMBOX" mmh-0.4/test/tests/bad-input/0000755000000000000000000000000013414435726014651 5ustar rootrootmmh-0.4/test/tests/bad-input/test-header0000644000000000000000000001257113414435726017007 0ustar rootroot#!/bin/sh # # Test bogus and strange headers . "$MH_TEST_COMMON" expected=$MH_TEST_DIR/$$.expected # Write message with bogus header field (missing blank line, really). msgfile="`mhpath b`" msgnum="${msgfile##*/}" cat >"$msgfile" <"$msgfile" runandcheck "scan l" <"$msgfile" <"$msgfile" <"$msgfile" <"$msgfile" <"$msgfile" <"$msgfile" <"$msgfile" <"$msgfile" <"$msgfile" <"$msgfile" < $form <\n\ X-NUMBER: %(num)%(lit)%<(num 3) yes%| no%>\n\ X-NOSTRING: %(num 3)%(lit x)%<(lit) found%| missing%>\n\ X-NONUMBER: %(num 3)%(lit x)%<(num) yes%| no%>\n\ -------- EOF expected=$MH_TEST_DIR/$$.expected actual=$MH_TEST_DIR/Mail/drafts/1 cat > $expected < part text/plain 25 > This is message number 1 EOF repl -editor true -form $form -group -nocc me -whatnowproc true 1 diff -u $expected $actual mmh-0.4/test/tests/repl/test-decode-addr0000644000000000000000000000461313414435726016767 0ustar rootroot#!/bin/sh ###################################################### # # Test that repl and repl -g decode recipient addrs # ###################################################### . "$MH_TEST_COMMON" require_locale en_US.utf-8 en_US.utf8 LC_ALL=en_US.UTF-8 export LC_ALL unset MM_CHARSET # create message to reply to msgfile=`mhpath b +inbox` cat >"$msgfile" < To: bob@example.com Cc: =?UTF-8?Q?K=C3=A4the?= Subject: repl addr decode Date: Mon, 18 Apr 2016 08:36:14 +0200 MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Message-ID: <1as2n8-1Q9-00@deseo.home.schnalke.org> foo EOF # create the reply draft runandcheck 'repl -nocc all -whatnow true l +inbox' < Cc: Fcc: +sent Subject: Re: repl addr decode In-reply-to: <1as2n8-1Q9-00@deseo.home.schnalke.org> References: <1as2n8-1Q9-00@deseo.home.schnalke.org> Comments: In-reply-to Jürgen message dated "Mon, 18 Apr 2016 08:36:14 +0200." -------- [2016-04-18 08:36] Jürgen > > part text/plain 4 > foo ! # create the group reply draft runandcheck 'repl -group -nocc me -whatnow true l +inbox' < Cc: bob@example.com, Käthe Fcc: +sent Subject: Re: repl addr decode In-reply-to: <1as2n8-1Q9-00@deseo.home.schnalke.org> References: <1as2n8-1Q9-00@deseo.home.schnalke.org> Comments: In-reply-to Jürgen message dated "Mon, 18 Apr 2016 08:36:14 +0200." -------- [2016-04-18 08:36] Jürgen > > part text/plain 4 > foo ! LC_ALL=C export LC_ALL # create the group reply draft runandcheck 'repl -group -nocc me -whatnow true l +inbox' < Cc: bob@example.com, K?the Fcc: +sent Subject: Re: repl addr decode In-reply-to: <1as2n8-1Q9-00@deseo.home.schnalke.org> References: <1as2n8-1Q9-00@deseo.home.schnalke.org> Comments: In-reply-to J?rgen message dated "Mon, 18 Apr 2016 08:36:14 +0200." -------- [2016-04-18 08:36] J?rgen > > part text/plain 4 > foo ! mmh-0.4/test/tests/manpages/0000755000000000000000000000000013414435726014561 5ustar rootrootmmh-0.4/test/tests/manpages/test-manpages0000644000000000000000000000141013414435726017250 0ustar rootroot#!/bin/sh ###################################################### # # Test that the manpages don't have any syntax errors # as detected by groff. # ###################################################### . $MH_TEST_COMMON require_prog groff cd $MH_TEST_DIR/share/man # groff will still exit with status zero even if warnings # were emitted, so we have to jump through hoops to # find out if any were emitted. expected=$MH_TEST_DIR/$$.expected actual=$MH_TEST_DIR/$$.actual # There aren't any expected warnings at the moment but # this mechanism does let us add them if necessary later. rm -f "$expected" "$actual" touch "$expected" "$actual" for manpage in man?/*.?; do groff -Tutf8 -mandoc -wmac "$manpage" > /dev/null 2>>"$actual" done diff -u "$expected" "$actual" mmh-0.4/test/tests/dist/0000755000000000000000000000000013414435726013731 5ustar rootrootmmh-0.4/test/tests/dist/test-dist0000755000000000000000000000161013414435726015575 0ustar rootroot# Test dist . "$MH_TEST_COMMON" msgfile=`mhpath b +inbox` cat >"$msgfile" < To: bob@example.com Subject: test dist Date: Mon, 18 Apr 2016 08:36:14 +0200 MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Message-ID: <1as2n8-1Q9-00@deseo.home.schnalke.org> foo EOF runandcheck 'dist -whatnow true l +inbox' < `mhpath +drafts l` runandcheck 'send -debug +drafts l |sed "s/^Resent-Date:.*/Resent-Date:/" |sed "s/^Resent-From:.*/Resent-From:/"' < To: bob@example.com Subject: test dist Date: Mon, 18 Apr 2016 08:36:14 +0200 MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Message-ID: <1as2n8-1Q9-00@deseo.home.schnalke.org> Resent-To: test@example.com Resent-Date: Resent-From: foo ----EOM---- test@example.com ! mmh-0.4/test/tests/whatnow/0000755000000000000000000000000013414435726014455 5ustar rootrootmmh-0.4/test/tests/whatnow/test-attach-detach0000644000000000000000000000271613414435726020055 0ustar rootroot#!/bin/sh ###################################################### # # Test that whatnow's "ls" copes with directory names # which have spaces in them (see bug #23319) # ###################################################### set -e cd "$MH_TEST_DIR" rm -f "baz's boz" touch "baz's boz" # whatnow's attach stuff needs a draft to work on # cp "$MH_TEST_DIR/Mail/inbox/1" "$MH_TEST_DIR/Mail/draft" comp +inbox 1 -whatnow true expectederr=$MH_TEST_DIR/$$.expectederr actualerr=$MH_TEST_DIR/$$.actualerr expected=$MH_TEST_DIR/$$.expected actual=$MH_TEST_DIR/$$.actual rm -f $expected $expectederr $actual $actualerr touch $expected $expectederr $actual $actualerr cat > $expected < $expectederr <> $actualerr >> $actual echo "alist" | whatnow -editor true -prompt '' 2>> $actualerr >> $actual echo "detach 1" | whatnow -editor true -prompt '' 2>> $actualerr >> $actual echo "alist" | whatnow -editor true -prompt '' 2>> $actualerr >> $actual set -e diff -u $expectederr $actualerr <$actual sed 's,/.*/,/XXX/,' >$actual.clean diff -u $expected $actual.clean mmh-0.4/test/tests/whatnow/test-ls0000644000000000000000000000150313414435726015772 0ustar rootroot#!/bin/sh ###################################################### # # Test that whatnow's "ls" copes with directory names # which have spaces and quotes in them (see bug #23319) # ###################################################### set -e SPDIR="$MH_TEST_DIR/foo's bar" rm -rf "$SPDIR" mkdir "$SPDIR" cd "$SPDIR" touch baz boz expectederr=$MH_TEST_DIR/$$.expectederr actualerr=$MH_TEST_DIR/$$.actualerr expected=$MH_TEST_DIR/$$.expected actual=$MH_TEST_DIR/$$.actual cat > $expected < $expectederr < "$actualerr" | sort > "$actual" diff -u $expectederr $actualerr diff -u $expected $actual mmh-0.4/test/tests/whatnow/test-cd0000644000000000000000000000164513414435726015751 0ustar rootroot#!/bin/sh ###################################################### # # Test that whatnow's "cd" copes with directory names # which have spaces and quotes in them (see bug #23319) # ###################################################### set -e SPDIR="$MH_TEST_DIR/foo's bar" rm -rf "$SPDIR" mkdir "$SPDIR" cd "$SPDIR" touch baz boz cd expectederr=$MH_TEST_DIR/$$.expectederr actualerr=$MH_TEST_DIR/$$.actualerr expected=$MH_TEST_DIR/$$.expected actual=$MH_TEST_DIR/$$.actual cat > $expected < $expectederr < "$actualerr" > "$actual" || true diff -u $expectederr $actualerr diff -u $expected $actual mmh-0.4/test/tests/send/0000755000000000000000000000000013414435726013717 5ustar rootrootmmh-0.4/test/tests/send/test-mimeify0000644000000000000000000001571113414435726016263 0ustar rootroot#Test if MIME conversion work . "$MH_TEST_COMMON" draft="$MH_TEST_DIR/send-$$.draft" profile="$MMH/profile-send" cd "$MMH" cat "`mhparam profile`" - >"$profile" < ! cd - >/dev/null export MMHP="$profile" cat >"$draft" < To: alice Date: Sun, 25 Oct 2015 18:59:56 +0100 Subject: Test MIME ---------------- foo ! runandcheck 'send -debug "$draft" | replace_contentid' < To: alice Date: Sun, 25 Oct 2015 18:59:56 +0100 Subject: Test MIME MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-ID: foo ----EOM---- alice ! cat >"$draft" < To: alice Date: Sun, 25 Oct 2015 18:59:56 +0100 Subject: Test MIME MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-ID: ---------------- foo ! runandcheck 'send -debug "$draft"' < To: alice Date: Sun, 25 Oct 2015 18:59:56 +0100 Subject: Test MIME MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-ID: foo ----EOM---- alice ! cat >"$draft" < From: Bob foo ----EOM---- meillo ! cat >"$draft" < Content-Transfer-Encoding: quoted-printable From: Bob foo f=C3=BC=C3=9Fe ----EOM---- meillo ! cat >"$draft" < foo ----EOM---- meillo ! cat >"$draft" <füße
! runandcheck 'send -debug "$draft"' < füße ----EOM---- meillo ! cat >"$draft" < füße ----EOM---- meillo ! # now something more complex with separate call to mhbuild(1) cat >"$draft" <bar #text/plain tests/send/ulm.txt Käse #begin [Picture of an Amphioctopus marginatus] alternative #image/png tests/send/amphioctopus-marginatus.png Amphioctopus marginatus sitting in its portable home composed of coconut shell pieces. #end end ! runandcheck 'mhbuild "$draft"' <"$draft.temp" && mv "$draft.temp" "$draft" runandcheck 'mhlist -v -file "$draft"' < From: Bob ------- =_aaaaaaaaaa0 Content-Type: text/plain; charset="us-ascii" Content-ID: foo ------- =_aaaaaaaaaa0 Content-Type: text/html; charset="us-ascii" Content-ID: bar ------- =_aaaaaaaaaa0 Content-Type: text/plain; charset="us-ascii" Content-ID: in ulm und um ulm und um ulm herum ------- =_aaaaaaaaaa0 Content-Type: text/plain; charset="UTF-8" Content-ID: Content-Transfer-Encoding: quoted-printable K=C3=A4se ------- =_aaaaaaaaaa0 Content-Type: multipart/alternative; boundary="----- =_aaaaaaaaaa1" Content-ID: Content-Description: Picture of an Amphioctopus marginatus ------- =_aaaaaaaaaa1 Content-Type: image/png Content-ID: Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAADIAAAArBAMAAADIyMbRAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC AK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAADBQTFRF NSswLygsMycvCwcEKBwThW21iHWuSDhEnZG1b1icUjWPkXXINCBcrp7PzsPhjXtoqrnPvAAAAAx0 Uk5TAS5a/flp/tv9/vz8kbJyBAAAAAlwSFlzAAALiQAAC4kBN8nLrQAAAAl2cEFnAAAAlgAAACsA qJ21PgAAAlhJREFUOMu9kz9o20AUxpU60NXQNYOHlkDI4OaudOkQcpeKemlwIVDqoUtVqa0hg8F1 KXQL50FOl4ieFAgUHJCsOeAcyZAQaEzGYmSM1NWlWGMcQ+F6lhw7drO2b9Cf99N337v3TpL0z2Im dUMyIUkpafX1DWhpZU4vGvnvfwEM5L2gy1WyMQ0w/v3ND7kevJwywahUzpg+53xjWvLQKB9/tDjv f56UyPiJelDNNXa5PymBRbRuNd13DdrfngCzGEObqjtuQyVrUnKyMGzu6fVzJ0+ys9kxSggg21ab OXbe67dfrQ3QTFpcbuG7OGNQxlQShEHo/byYTd7mkT9CMGPX/bavd8NOZcvQva/vtyKCIfpgsKOw o+thePlDVT3NL0Q2BQRzFmPBJiFhxyNEI5wvx6Uh6FhvLV9RBSL+pvqF91DcMwBr+6zGtItLQipB k/IeXo72CRE8q2s2o4qqV7rem6ogqUgDAFxkpmOZiii70irt9jBOx0MTGstxapqhEt/LzfeKeCVq AcJg3lDMhiCEHTbxpyKObMR+ALinsabF6lRhQetprzBcTBK1PWjlw5CVbUqPSK8oYzwcghA9t4Lw l2KbxuGucBHfxr0GCDy282HXpyZVqnJhQMBwCmhpnTK/rR1Qc1ssJkCMIERyyab7dcehTlZIwBVJ QDG7F6bjnJ/abhbHkpgAgNHqgttwwZn77LpElDDo6vHiCWi4J2AEpCXxAON3sOCeRvf0VQ9GMWdW RwpJugbAI6c6yguftEglktExA+c76ftjkhD/2/D43UmMFf8r/gD+qh1F0ZufSgAAACV0RVh0ZGF0 ZTpjcmVhdGUAMjAxNi0wOC0xMFQxODo0MTo1NyswMjowMDnWAU8AAAAldEVYdGRhdGU6bW9kaWZ5 ADIwMTYtMDgtMTBUMTg6NDE6NTcrMDI6MDBIi7nzAAAAAElFTkSuQmCC ------- =_aaaaaaaaaa1 Content-Type: text/plain; charset="us-ascii" Content-ID: Amphioctopus marginatus sitting in its portable home composed of coconut shell pieces. ------- =_aaaaaaaaaa1-- ------- =_aaaaaaaaaa0 Content-Type: text/plain; charset="us-ascii" Content-ID: end ------- =_aaaaaaaaaa0-- ----EOM---- meillo ! rm "$draft.orig" mmh-0.4/test/tests/send/amphioctopus-marginatus.png0000644000000000000000000000167213414435726021316 0ustar rootroot‰PNG  IHDR2+ÈÈÆÑgAMA± üasRGB®Îé cHRMz&€„ú€èu0ê`:˜pœºQ<0PLTE5+0/(,3'/ (…mµˆu®H8D‘µoXœR5‘uÈ4 \®žÏÎÃá{hª¹Ï¼ tRNS.ZýùiþÛýþüü‘²r pHYs ‰ ‰7ÉË­ vpAg–+¨µ>XIDAT8˽“?hÛ@Æ•:ÐÕÐ5ƒ‡–@Èàæ®tér—Šzip!Pê¡KU©­!ƒÁu)t çAN—ˆž¬9àÉhLÆbdŒÔÕ¥XcCáz–;v³¶oП÷Ówß»÷N’ôÏb&uC2!I)iõõ hieN/ùï ä½ ËU²1 0þý͹¼œ2Á¨TΘ>ç|cZòÐ(´8ïž”Èø‰zPÍ5v¹?)E´n5Ýw Úßž³C›ª;nC%kRr²0lîéõs'O²³Ù1J ÛV›9vÞë·_­ ÐLZ\ná»8cPÆT„Aèý¼˜MÞæ‘?B0c×ý¶¯wÃNeËн¯ï·"‚!ú`°£°£ëaxùCU=Í/D6scÁ&!aÇ#D#œ/Ç¥!èXo-_Q"þ¦ú…÷PÜ3kû¬Æ´‹KB*A“ò^Žö <«k6£ŠªWºÞ›ª ©H\d¦c™Š(»Ò*íö0NÇCËqjš¡ßËÍ÷Šx%jÂ`ÞP̆ „6ñ§"ŽlÄ~¸§±¦ÅêTaAëi¯0\Lµ=håÕmJH¯(c<‚=·‚ð—b›Æá®p߯½<¶óa×§&Uªra@Àp hi2¿­Ps[,&@Œ DrɦûuÇ¡NVHÀI@1»¦ãœŸÚnÇ’˜€Ñê‚ÛpÁ™ûìºD”0èêñâ h¸'`¤%ñãw°àžF÷ôUF1gVG IºÀ#§:Ê Ÿ´H%’Ñ1ç;éûc’ÿÛðøÝIŒÿ+þþªEÑ›ŸJ%tEXtdate:create2016-08-10T18:41:57+02:009ÖO%tEXtdate:modify2016-08-10T18:41:57+02:00H‹¹óIEND®B`‚mmh-0.4/test/tests/send/ulm.txt0000644000000000000000000000004313414435726015252 0ustar rootrootin ulm und um ulm und um ulm herum mmh-0.4/test/tests/whom/0000755000000000000000000000000013414435726013740 5ustar rootrootmmh-0.4/test/tests/whom/test-dcc-bcc0000644000000000000000000000216013414435726016115 0ustar rootroot# test whom . "$MH_TEST_COMMON" draft="$MH_TEST_DIR/whom-$$.draft" # to + cc headers # cat >"$draft" <"$draft" <"$draft" <"$draft" </dev/null runandcheck "refile 4 +fol1" </dev/null runandcheck "refile 6 +fol1 +fol2" </dev/null runandcheck "refile 8 9 +fol1 +fol2" </dev/null runandcheck "refile -src +fol1 1 +fol2" <"$msgfile" < Date: Wed, 20 Apr 2016 07:38:12 +0200 Message-Id: <83C58147-7B2B-4B7F-9502-17C1EB9526BC@example.org> To: Alice Content-Type: text/plain; charset=utf-8 The subject line has three trailing spaces, inside the RFC 2047 encoding. They get removed if we first (decode) and afterwards (trim) on diplay. ! # output has no trailing spaces runandcheck "scan -width 80 +inbox l" < To: Alice Subject: 3 trailing spaces part text/plain 145 The subject line has three trailing spaces, inside the RFC 2047 encoding. They get removed if we first (decode) and afterwards (trim) on diplay. ! mmh-0.4/test/tests/scan/test-scan-multibyte0000644000000000000000000000312313414435726017551 0ustar rootroot#!/bin/sh # # test scan(1) with multibytes . $MH_TEST_COMMON require_locale en_US.utf-8 en_US.utf8 LC_ALL=en_US.UTF-8 export LC_ALL cat >"$MH_TEST_DIR/Mail/inbox/11" < To: Baz Subject: Subject Test Header =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=83=98=E3=83=BC=E3=83=87=E3=83=BC?= Date: Mon, 15 May 2017 15:55:01 +0900 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=UTF-8 Message-Id: <20170515065506.03959103B49@example.org> This is a test email ! cat >"$MH_TEST_DIR/Mail/inbox/12" < Date: Mon, 22 Sep 2014 01:17:05 +0200 Message-Id: <83C54147-7D2B-4B7F-9502-11C1EB9526BC@example.org> To: Alice Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=iso-8859-1 Hallo Alice, hier ist dein Schl=FCssel, ich hoffe das Signieren hat funktioniert. = Mein =F6ffentlicher Schl=FCssel liegt auf dem Keyserver. Viele Gr=FC=DFe Bob ! runandcheck "scan 12 +inbox" </dev/null runandcheck "scan" <N 5 Test5 Fri Sep 29 00:00 Testing message 5 N 6 Test6 Fri Sep 29 00:00 Testing message 6 N 7 Test7 Fri Sep 29 00:00 Testing message 7 N 8 Test8 Fri Sep 29 00:00 Testing message 8 N 9 Test9 Fri Sep 29 00:00 Testing message 9 N 10 Test10 Fri Sep 29 00:00 Testing message 10 ! runandcheck "scan -form '=%(msg) %{from}' 1-c" < 2 Test2 3 Test3 4 Test4 5 Test5 ! mmh-0.4/test/tests/prompter/0000755000000000000000000000000013414435726014636 5ustar rootrootmmh-0.4/test/tests/prompter/test-prompter0000755000000000000000000000606413414435726017417 0ustar rootroot#!/bin/sh ###################################################### # # Test prompter # ###################################################### . "$MH_TEST_COMMON" # check -help runandcheck "prompter -help" <&2 failed=`expr ${failed:-0} + 1`;; esac # check unknown switch runandcheck 'prompter -nonexistent' <$MH_TEST_DIR/prompter-file </dev/null runandcheck "cat $MH_TEST_DIR/prompter-file" <$MH_TEST_DIR/prompter-file </dev/null runandcheck "cat $MH_TEST_DIR/prompter-file" <$MH_TEST_DIR/prompter-file </dev/null runandcheck "cat $MH_TEST_DIR/prompter-file" < $msgfile < Date: Tue, 05 Mar 2002 18:20:35 +0000 This is a test; this is the body. EOF # check it cat > $expected < $actual 2>&1 diff -u $expected $actual mmh-0.4/test/tests/show/test-multibytes0000644000000000000000000000177013414435726017054 0ustar rootroot#!/bin/sh # # test show(1) with multibytes . $MH_TEST_COMMON require_locale en_US.utf-8 en_US.utf8 LC_ALL=en_US.UTF-8 export LC_ALL cat >"$MH_TEST_DIR/Mail/inbox/11" < Date: Mon, 22 Sep 2014 01:17:05 +0200 Message-Id: <83C54147-7D2B-4B7F-9502-11C1EB9526BC@example.org> To: Alice Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=iso-8859-1 Hallo Alice, hier ist dein Schl=FCssel, ich hoffe das Signieren hat funktioniert. = Mein =F6ffentlicher Schl=FCssel liegt auf dem Keyserver. Viele Gr=FC=DFe Bob ! runandcheck "show 11 +inbox" < To: Alice Subject: Schlüssel part text/plain 151 Hallo Alice, hier ist dein Schlüssel, ich hoffe das Signieren hat funktioniert. \ Mein öffentlicher Schlüssel liegt auf dem Keyserver. Viele Grüße Bob ! mmh-0.4/test/tests/show/test-qp0000644000000000000000000000214613414435726015271 0ustar rootroot#!/bin/sh ###################################################### # # Test quoted-printable decoding. # ###################################################### set -e expected=$MH_TEST_DIR/$$.expected actual=$MH_TEST_DIR/$$.actual # Write message with bogus quoted-printable data. msgfile=$(mhpath b) msgnum=$(basename $msgfile) cat > $msgfile < $expected < $actual 2>&1 diff -u $expected $actual mmh-0.4/test/tests/show/test-longlines0000644000000000000000000000562313414435726016646 0ustar rootroot#!/bin/sh ###################################################### # # Test long header line handling (998 chars) # ###################################################### set -e expected=$MH_TEST_DIR/$$.expected actual=$MH_TEST_DIR/$$.actual genlongsubject() { len="${1:-998}" awk -v len="$len" 'BEGIN { prefix = "Subject: " len " " while (i++> "$MMH/profile" trap 'printf "/^mhl:/d\nw\nq\n" | ed - "$MMH/profile"' 0 1 2 15 len=997 # Write message with long header line msgfile=$(mhpath b) msgnum=$(basename $msgfile) cat > $msgfile <<-EOF From: foo@example.edu To: bar@example.edu `genlongsubject $len` Date: Sun, 15 Jul 2018 12:26:59 +0200 foo EOF # check it cat > $expected <<-EOF Date: Sun, 15 Jul 2018 12:26:59 +0200 From: foo@example.edu To: bar@example.edu `genlongsubject $len` part text/plain 4 foo EOF COLUMNS=2000 show $msgnum > $actual 2>&1 diff -u $expected $actual len=998 # Write message with long header line msgfile=$(mhpath b) msgnum=$(basename $msgfile) cat > $msgfile <<-EOF From: foo@example.edu To: bar@example.edu `genlongsubject $len` Date: Sun, 15 Jul 2018 12:26:59 +0200 foo EOF # check it cat > $expected <<-EOF Date: Sun, 15 Jul 2018 12:26:59 +0200 From: foo@example.edu To: bar@example.edu `genlongsubject $len` part text/plain 4 foo EOF COLUMNS=2000 show $msgnum > $actual 2>&1 diff -u $expected $actual len=999 # Write message with long header line msgfile=$(mhpath b) msgnum=$(basename $msgfile) cat > $msgfile <<-EOF From: foo@example.edu To: bar@example.edu `genlongsubject $len` Date: Sun, 15 Jul 2018 12:26:59 +0200 foo EOF # check it cat > $expected <<-EOF mhl: format error in message 13 part text/plain 4 foo EOF COLUMNS=2000 show $msgnum > $actual 2>&1 diff -u $expected $actual # now with CRLF len=998 # Write message with long header line msgfile=$(mhpath b) msgnum=$(basename $msgfile) cat > $msgfile <<-EOF From: foo@example.edu To: bar@example.edu `genlongsubject $len | addcr` Date: Sun, 15 Jul 2018 12:26:59 +0200 foo EOF # check it cat > $expected <<-EOF Date: Sun, 15 Jul 2018 12:26:59 +0200 From: foo@example.edu To: bar@example.edu `genlongsubject $len` part text/plain 4 foo EOF COLUMNS=2000 show $msgnum > $actual 2>&1 diff -u $expected $actual len=999 # Write message with long header line msgfile=$(mhpath b) msgnum=$(basename $msgfile) cat > $msgfile <<-EOF From: foo@example.edu To: bar@example.edu `genlongsubject $len | addcr` Date: Sun, 15 Jul 2018 12:26:59 +0200 foo EOF # check it cat > $expected <<-EOF mhl: format error in message 15 part text/plain 4 foo EOF COLUMNS=2000 show $msgnum > $actual 2>&1 diff -u $expected $actual mmh-0.4/test/tests/ali/0000755000000000000000000000000013414435726013533 5ustar rootrootmmh-0.4/test/tests/ali/test-ali0000755000000000000000000000557013414435726015212 0ustar rootroot#!/bin/sh ###################################################### # # Test ali # ###################################################### . "$MH_TEST_COMMON" expected=$MH_TEST_DIR/$$.expected expected_err=$MH_TEST_DIR/$$.expected_err actual=$MH_TEST_DIR/$$.actual actual_err=$MH_TEST_DIR/$$.actual_err runandcheck "ali -help" <&2 failed=`expr "${failed:-0}" + 1`;; esac # check with no arguments and no AliasFile profile component runandcheck 'ali' <"${MH_TEST_DIR}/Mail/aliases" <"${MH_TEST_DIR}/Mail/aliases" <"${MH_TEST_DIR}/Mail/aliases" < $folders <>"$MH_TEST_DIR/Mail/foo2/.mh_sequences" # test with the empty sequence cat > $expected < $actual 2>&1 check new -folders $folders empty > $actual 2>&1 check # test fnext/fprev with the empty sequence > $expected fnext empty > $actual 2>&1 check fprev empty > $actual 2>&1 check mmh-0.4/test/tests/new/test-basic0000644000000000000000000000736413414435726015552 0ustar rootroot#!/bin/sh # TODO: Move to a common file tests can source; need more framework... failed=0 check() { diff -u $expected $actual if [ $? -ne 0 ]; then failed=$((failed + 1)) fi } folders=$MH_TEST_DIR/Mail/.folders expected=$MH_TEST_DIR/$$.expected actual=$MH_TEST_DIR/$$.actual # make second folder cp -r $MH_TEST_DIR/Mail/inbox $MH_TEST_DIR/Mail/foo1 cp -r $MH_TEST_DIR/Mail/inbox $MH_TEST_DIR/Mail/foo2 # but only list inbox and foo2 in .folders, and sorted differently cat > $folders < $expected < $actual 2>&1 check new -folders $folders aseq > $actual 2>&1 check # test fnext/fprev with no desired messages cat /dev/null > $expected fnext aseq > $actual 2>&1 check fprev aseq > $actual 2>&1 check # add 1 desired message in each folder echo 'aseq: 1' > $MH_TEST_DIR/Mail/inbox/.mh_sequences echo 'aseq: 1' > $MH_TEST_DIR/Mail/foo1/.mh_sequences echo 'aseq: 1' > $MH_TEST_DIR/Mail/foo2/.mh_sequences # test with all folders cat > $expected < $actual 2>&1 check # test with .folders cat > $expected < $actual 2>&1 check # add 2 desired messages to another sequence in each folder echo 'bseq: 3-4' >> $MH_TEST_DIR/Mail/inbox/.mh_sequences echo 'bseq: 3-4' >> $MH_TEST_DIR/Mail/foo1/.mh_sequences echo 'bseq: 3-4' >> $MH_TEST_DIR/Mail/foo2/.mh_sequences # test listing aseq and bseq cat > $expected < $actual 2>&1 check # set aseq bseq as unseen echo 'Unseen-Sequence: aseq bseq' >>"$MMH/profile" new > $actual 2>&1 check # test unseen cat > $expected < $actual 2>&1 check # test fnext with the current folder not in the list echo 'Current-Folder: foo1' >"$MMH/context" echo 'inbox 1 3-4' > $expected fnext -folders $folders > $actual 2>&1 check # test fprev with the current folder not in the list echo 'Current-Folder: foo1' >"$MMH/context" echo 'inbox 1 3-4' > $expected fprev -folders $folders > $actual 2>&1 check # test fnext with current folder in the middle of the list echo 'Current-Folder: foo2' >"$MMH/context" echo 'inbox 1 3-4' > $expected fnext > $actual 2>&1 check # test fprev with current folder in the middle of the list echo 'Current-Folder: foo2' >"$MMH/context" echo 'foo1 1 3-4' > $expected fprev > $actual 2>&1 check # test fprev with current folder at the beginning of the list echo 'Current-Folder: foo1' >"$MMH/context" echo 'inbox 1 3-4' > $expected fprev > $actual 2>&1 check # test fnext with current folder at the end of the list echo 'Current-Folder: inbox' >"$MMH/context" echo 'foo1 1 3-4' > $expected fnext > $actual 2>&1 check # test fnext with no current folder rm "$MMH/context" echo 'foo1 1 3-4' > $expected fnext > $actual 2>&1 check # test fnext with only one folder in the list cat > $folders < $expected fnext -folders $folders > $actual 2>&1 check exit $failed mmh-0.4/test/tests/mhl/0000755000000000000000000000000013414435726013546 5ustar rootrootmmh-0.4/test/tests/mhl/test-mhl-flags0000755000000000000000000000177013414435726016330 0ustar rootroot#!/bin/sh # # Test of various (well, start with one) function escapes. . "$MH_TEST_COMMON" cat >`mhpath b` <"$MH_TEST_DIR/test.format" < There are two blank lines below. And there is a trailing space: > And another trailing space: > > ! # check rtrim cat >"$MH_TEST_DIR/test.format" < There are two blank lines below. And there is a trailing space: > And another trailing space: > > ! rm -f "$MH_TEST_DIR/test.format" mmh-0.4/test/tests/mhbuild/0000755000000000000000000000000013414435726014412 5ustar rootrootmmh-0.4/test/tests/mhbuild/test-header-encode0000644000000000000000000000227313414435726020001 0ustar rootroot#!/bin/sh ###################################################### # # Test encoding headers according to RFC 2047 # ###################################################### . "$MH_TEST_COMMON" draft="$MH_TEST_DIR/mhbuild-$$.draft" export MM_CHARSET=UTF-8 # Subject cat >"$draft" < To: Somebody Subject: This is ä test This is a test ! runandcheck 'mhbuild "$draft"' </" "$draft"' < To: Somebody Subject: =?UTF-8?Q?This_is_=C3=A4_test?= MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-ID: This is a test ! # To + From cat >"$draft" < To: Gönül Subject: Names with Umlauts This is a test ! runandcheck 'mhbuild "$draft"' </" "$draft"' < To: =?UTF-8?Q?G=C3=B6n=C3=BCl?= Subject: Names with Umlauts MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-ID: This is a test ! mmh-0.4/test/tests/mhbuild/test-forw0000644000000000000000000000176713414435726016302 0ustar rootroot#!/bin/sh ###################################################### # # Test forwarding messages # ###################################################### . "$MH_TEST_COMMON" draft="$MH_TEST_DIR/mhbuild-$$.draft" cat >"$draft" </" "$draft"' < Content-Description: forwarded messages ------- =_aaaaaaaaaa0 Content-Type: message/rfc822 From: Test1 To: Some User Date: Fri, 29 Sep 2006 00:00:00 Subject: Testing message 1 This is message number 1 ------- =_aaaaaaaaaa0 Content-Type: message/rfc822 From: Test2 To: Some User Date: Fri, 29 Sep 2006 00:00:00 Subject: Testing message 2 This is message number 2 ------- =_aaaaaaaaaa0-- ! mmh-0.4/test/tests/mhbuild/test-linebreak0000644000000000000000000000526713414435726017260 0ustar rootroot# test mhbuild linebreak for quoted-printable . "$MH_TEST_COMMON" draft="$MH_TEST_DIR/mhbuild-$$.draft" cat >"$draft" </" "$draft"' < Content-Transfer-Encoding: quoted-printable F=C3=BC=C3=9Fe <-- to ensure quoted-printable is used 1 2 3 4 5 6 7 1234567890123456789012345678901234567890123456789012345678901234567890 123456789012345678901234567890123456789012345678901234567890123456789012345 1234567890123456789012345678901234567890123456789012345678901234567890123. 12345678901234567890123456789012345678901234567890123456789012345678901234. 123456789012345678901234567890123456789012345678901234567890123456789012345= =2E 123456789012345678901234567890123456789012345678901234567890123456789012345= 6. 12345678901234567890123456789012345678901234567890123456789012345678901234.= xx 123456789012345678901234567890123456789012345678901234567890123456789012345= =2Exx 123456789012345678901234567890123456789012345678901234567890123456789012345= 6.xx 12345678901234567890123456789012345678901234567890123456789012345678901234.= =2Eyy 123456789012345678901234567890123456789012345678901234567890123456789012345= =2E.yy 123456789012345678901234567890123456789012345678901234567890123456789012345= 6..yy ! mmh-0.4/test/tests/spost/0000755000000000000000000000000013414435726014136 5ustar rootrootmmh-0.4/test/tests/spost/test-group0000644000000000000000000000615713414435726016203 0ustar rootroot# test spost: Group Addresses . "$MH_TEST_COMMON" draft="$MH_TEST_DIR/spost-$$.draft" profile="$MMH/profile-spost" cd "$MMH" cat "`mhparam profile`" - >"$profile" < ! cd - >/dev/null export MMHP="$profile" # Group Recipients cat >"$draft" <, Gill ; Date: Sun, 25 Oct 2015 18:59:56 +0100 Subject: Group Recipients ---------------- foo ! runandcheck 'spost -debug "$draft"' < foo ----EOM---- alice@example.org gill@example.org ! cat >"$draft" <; Date: Sun, 25 Oct 2015 18:59:56 +0100 Subject: Group in CC ---------------- foo ! runandcheck 'spost -debug "$draft"' < foo ----EOM---- alice@example.org gill@example.org charly@example.net ! cat >"$draft" < Date: Sun, 25 Oct 2015 18:59:56 +0100 Subject: No semicolon at the end of the group ---------------- foo ! runandcheck 'spost -debug "$draft"' < foo ----EOM---- alice@example.org gill@example.org charly@example.net ! cat >"$draft" <, Gill ;, charly@example.net Date: Sun, 25 Oct 2015 18:59:56 +0100 Subject: Group plus address with comma ---------------- foo ! runandcheck 'spost -debug "$draft"' < foo ----EOM---- alice@example.org gill@example.org charly@example.net ! cat >"$draft" <, Gill ; charly@example.net Date: Sun, 25 Oct 2015 18:59:56 +0100 Subject: Group plus address, no comma ---------------- foo ! runandcheck 'spost -debug "$draft"' < foo ----EOM---- alice@example.org gill@example.org charly@example.net ! cat >"$draft" < foo ----EOM---- alice ! cat >"$draft" <, Gill ; Date: Sun, 25 Oct 2015 18:59:56 +0100 Subject: Group in Dcc ---------------- foo ! runandcheck 'spost -debug "$draft"' < foo ----EOM---- alice@example.org gill@example.org charly ! mmh-0.4/test/tests/spost/test-bcc-dcc0000644000000000000000000000364313414435726016322 0ustar rootroot# test spost: bcc and dcc headers . "$MH_TEST_COMMON" draft="$MH_TEST_DIR/spost-$$.draft" profile="$MMH/profile-spost" cd "$MMH" cat "`mhparam profile`" - >"$profile" < ! cd - >/dev/null export MMHP="$profile" # to + cc headers cat >"$draft" < foo ----EOM---- jack charly alice gill ! # to + bcc headers cat >"$draft" < foo ----EOM---- alice ! # only bcc headers cat >"$draft" < Bcc: undisclosed-recipients:; foo ----EOM---- ! # to + dcc headers cat >"$draft" < foo ----EOM---- john paul george ringo alice ! # only dcc headers cat >"$draft" < Bcc: undisclosed-recipients:; foo ----EOM---- john paul george ringo ! mmh-0.4/test/tests/spost/test-sender-header0000644000000000000000000000604613414435726017552 0ustar rootroot# test spost: sender header . "$MH_TEST_COMMON" profile="$MMH/profile-spost" cd "$MMH" cat "`mhparam profile`" - >"$profile" < alternate-mailboxes: ziggy@example.net, walther@example.net ! cd - >/dev/null export MMHP="$profile" draft="$MH_TEST_DIR/spost-$$.draft" # no from header cat >"$draft" < foo ----EOM---- alice ! # single from addr (my default one) cat >"$draft" <"$draft" <"$draft" < foo ----EOM---- alice ! # multiple from addrs (including my default addr) cat >"$draft" <"$draft" <"$draft" < foo ----EOM---- alice ! mmh-0.4/test/tests/spost/test-bad-address0000644000000000000000000000061713414435726017213 0ustar rootroot# test spost: bcc and dcc headers . "$MH_TEST_COMMON" draft="$MH_TEST_DIR/spost-$$.draft" cat >"$draft" <&1 ; echo $?' <"$profile" < Aliasfile: $alias ! cd - >/dev/null export MMHP="$profile" cat > "$alias" < bob: Bob ! # to + cc headers cat >"$draft" < To: Alice Date: Sun, 25 Oct 2015 18:59:56 +0100 Subject: Test alias in to and from foo ----EOM---- alice@example.com ! mmh-0.4/test/tests/folder/0000755000000000000000000000000013414435726014241 5ustar rootrootmmh-0.4/test/tests/folder/test-create0000644000000000000000000000056313414435726016410 0ustar rootroot#!/bin/sh ###################################################### # # Test the creation and removal of a folder. # ###################################################### folder -create +testfolder > /dev/null if [ ! -d "$MH_TEST_DIR/Mail/testfolder" ]; then exit 1 fi rmf +testfolder > /dev/null if [ -d "$MH_TEST_DIR/Mail/testfolder" ]; then # Test failed exit 1 fi mmh-0.4/test/tests/folder/test-recurse0000755000000000000000000000114513414435726016615 0ustar rootroot#!/bin/sh ###################################################### # # Test of the -recuse option # ###################################################### . "$MH_TEST_COMMON" runandcheck "folder -create +testfolder" <$MH_TEST_DIR/Mail/inbox/11 < To: Some User Date: Fri, 29 Sep 2006 00:00:01 Alt-Date: Thu, 1 Sep 2005 00:00:00 Subject: Re: common subject This is message number 11 EOF cat >$MH_TEST_DIR/Mail/inbox/12 < To: Some User Date: Thu, 28 Sep 2006 23:59:59 Alt-Date: Sat, 30 Sep 2006 00:00:00 Subject: common subject This is message number 12 EOF # check with no options runandcheck sortm </dev/null runandcheck "sortm +inbox" </dev/null runandcheck "sortm -verbose" </dev/null runandcheck "sortm -verbose -noverbose" </dev/null runandcheck "sortm f l" </dev/null runandcheck "sortm -textfield subject -limit 0" </dev/null runandcheck "sortm -textfield from -limit 0" <$MH_TEST_DIR/Mail/inbox/13 < To: Some User Date: Tue, 31 Oct 2006 23:59:59 Subject: Re: common subject This is message number 13 EOF # check -textfield with finite -limit that doesn't cover message 13 refile 2-7 +inbox refile 1 +inbox folder -pack l >/dev/null runandcheck "sortm -textfield subject -limit 10" </dev/null runandcheck "sortm -textfield subject -limit 60" </dev/null runandcheck "sortm -textfield subject -limit 60 -notextfield" < $MH_TEST_DIR/Mail/inbox/14 runandcheck "sortm" <msgbox" </dev/null inc +inbox2 -file msgbox >/dev/null rm -f msgbox for i in `pick +inbox`; do diff -u "`mhpath +inbox $i`" "`mhpath +inbox2 $i`" done runandcheck 'echo $i' <msgbox" </dev/null rm -f msgbox for i in `pick +inbox`; do diff -u "`mhpath +inbox "$i"`" "`mhpath +inbox2 "$i"`" done runandcheck "echo $i" <msgbox" </dev/null rm -f msgbox for i in `pick +inbox2`; do diff -u "`mhpath +inbox "$i"`" "`mhpath +inbox2 "$i"`" done runandcheck "echo $i" < $msgfile < $expected_out < $expected_err pick > $actual_out 2> $actual_err diff -u $expected_err $actual_err diff -u $expected_out $actual_out mmh-0.4/test/tests/pick/test-stderr0000644000000000000000000000115313414435726016117 0ustar rootroot#!/bin/sh ###################################################### # # Test that errors are not written to stdout. # ###################################################### expected_err=$MH_TEST_DIR/$$.expected_err expected_out=$MH_TEST_DIR/$$.expected_out actual_err=$MH_TEST_DIR/$$.actual_err actual_out=$MH_TEST_DIR/$$.actual_out # Error message should go to stderr. cat > $expected_err < $expected_out pick -a > $actual_out 2> $actual_err diff -u $expected_err $actual_err diff -u $expected_out $actual_out mmh-0.4/test/tests/pick/test-rfc20470000644000000000000000000000146513414435726015711 0ustar rootroot#!/bin/sh ###################################################### # # Test pick parse rfc2047-header # ###################################################### set -e expected_err=$MH_TEST_DIR/$$.expected_err expected_out=$MH_TEST_DIR/$$.expected_out actual_err=$MH_TEST_DIR/$$.actual_err actual_out=$MH_TEST_DIR/$$.actual_out # Test MIME-encoded header. cat >"$MH_TEST_DIR/Mail/inbox/13" < To: Some User Date: Fri, 29 Sep 2006 00:00:00 Message-Id: 13@test.nmh Subject: =?us-ascii?q?=66=6f=6f?= =?utf-8?q?=62=61=72?= This is message number 13, with MIME-encoded Subject "foobar". EOF echo 13 >"$expected_out" cat /dev/null > $expected_err pick -subject foobar 13 > $actual_out 2> $actual_err diff -u $expected_err $actual_err diff -u $expected_out $actual_out mmh-0.4/test/tests/pick/test-thread0000644000000000000000000000122713414435726016065 0ustar rootroot#!/bin/sh ###################################################### # # Test that the -thread option works. # ###################################################### expected_err=$MH_TEST_DIR/$$.expected_err expected_out=$MH_TEST_DIR/$$.expected_out actual_err=$MH_TEST_DIR/$$.actual_err actual_out=$MH_TEST_DIR/$$.actual_out # All messages should be go to stdout cp `mhpath 5` 5.old anno -component 'Message-Id' -text '' 5 -nodate cat > $expected_out < $expected_err pick -thread 5 > $actual_out 2> $actual_err mv 5.old `mhpath 5` diff -u $expected_err $actual_err diff -u $expected_out $actual_out mmh-0.4/test/tests/pick/test-thread-without-msgid0000644000000000000000000000116313414435726020666 0ustar rootroot#!/bin/sh ###################################################### # # Test that the -thread option works. # ###################################################### expected_err=$MH_TEST_DIR/$$.expected_err expected_out=$MH_TEST_DIR/$$.expected_out actual_err=$MH_TEST_DIR/$$.actual_err actual_out=$MH_TEST_DIR/$$.actual_out # All messages should be go to stdout cat > $expected_out < $expected_err < $actual_out 2> $actual_err diff -u $expected_err $actual_err || exit 1 diff -u $expected_out $actual_out || exit 1 mmh-0.4/test/tests/pick/test-output-on-error0000644000000000000000000000123313414435726017714 0ustar rootroot#!/bin/sh ###################################################### # # Test output is handelt corect and ``0'' is giving to stdout. # ###################################################### expected_err=$MH_TEST_DIR/$$.expected_err expected_out=$MH_TEST_DIR/$$.expected_out actual_err=$MH_TEST_DIR/$$.actual_err actual_out=$MH_TEST_DIR/$$.actual_out # A zero should go to standard out to protect other programms cat > $expected_out < $expected_err < $actual_out 2> $actual_err diff -u $expected_err $actual_err diff -u $expected_out $actual_out mmh-0.4/test/tests/mhsign/0000755000000000000000000000000013414435726014253 5ustar rootrootmmh-0.4/test/tests/mhsign/test-mhsign0000755000000000000000000000334613414435726016451 0ustar rootroot#!/bin/sh ###################################################### # # Test mhsign (correct alias expansion with -enc) # ###################################################### . "$MH_TEST_COMMON" # setup some aliases cat >"$MH_TEST_DIR/.mmh/aliases" < a4: Unknown Person a5: "Unknown Person" a6: (Unknown) (Person) a7: Unknown , unknownperson@example.org ! cat >>"$MH_TEST_DIR/.mmh/profile" <"$MH_TEST_DIR/bin/gpg" chmod +x "$MH_TEST_DIR/bin/gpg" export MMHPGPKEY=0x12345678 # now test it draft=`mhpath +drafts b` cat >"$draft" < Unknown Person "Unknown Person" (Unknown) (Person) Unknown unknownperson@example.org ! runandcheck "mhsign -enc $draft" < Could not find key for Could not find key for Could not find key for Could not find key for Could not find key for Could not find key for Could not find key for ! mmh-0.4/test/tests/burst/0000755000000000000000000000000013414435726014125 5ustar rootrootmmh-0.4/test/tests/burst/test-burst0000755000000000000000000000605013414435726016170 0ustar rootroot#!/bin/sh # # Tests to see if bursting messages works correctly. # . "$MH_TEST_COMMON" # # Create a test message that we can burst # msgpath="`mhpath b`" msgnum="${msgpath##*/}" cat > "$msgpath" < To: Test Recipient Date: Friday, 29 Sep 2006 00:00:00 Subject: Test digest ------- Message one From: Mister Burster To: Nobody 1 Date: Thursday, 28 Sep 2006 00:01:00 Subject: Message one This is message one ------- Message two From: Mister Burster To: Nobody 2 Date: Thursday, 28 Sep 2006 00:02:00 Subject: Message two This is message two For real. ------- End of all messages EOF runandcheck "scan $msgnum" <"$msgpath" < To: Test Recipient Date: Friday, 29 Sep 2006 00:00:00 Subject: Test digest This is a preamble ------- Message one From: Mister Burster To: Nobody 1 Date: Thursday, 28 Sep 2006 00:01:00 Subject: Message one - -This is message one ------- Message two From: Mister Burster To: Nobody 2 Date: Thursday, 28 Sep 2006 00:02:00 Subject: Message two This is message two - For real. ------- Message three From: Mister Burster To: Nobody 3 Date: Thursday, 28 Sep 2006 00:03:00 Subject: Message three Will this one work? ------ Message three End of all messages EOF runandcheck "burst $msgnum" </dev/null runandcheck "next" < To: Nobody 1 Date: Thursday, 28 Sep 2006 00:01:00 Subject: Message one -This is message one ! runandcheck "next" < To: Nobody 2 Date: Thursday, 28 Sep 2006 00:02:00 Subject: Message two This is message two For real. ! runandcheck "next" < To: Nobody 3 Date: Thursday, 28 Sep 2006 00:03:00 Subject: Message three Will this one work? ! mmh-0.4/test/tests/burst/test-burst-mime0000755000000000000000000000621413414435726017117 0ustar rootroot#!/bin/sh # # Tests to see if bursting MIME messages works correctly. # . "$MH_TEST_COMMON" # # Create a one-part test message that we can burst # msgpath="`mhpath b`" msgnum="${msgpath##*/}" cat >"$msgpath" < To: Test Recipient Date: Friday, 29 Sep 2006 00:00:00 Subject: Test MIME digest MIME-Version: 1.0 Content-type: message/rfc822 From: Mister Burster To: Nobody 1 Date: Thursday, 28 Sep 2006 00:01:00 Subject: Message one - - This line should not be unstuffed EOF runandcheck "burst $msgnum" < "$msgpath" < To: Test Recipient Date: Friday, 29 Sep 2006 00:00:00 Subject: Test digest MIME-Version: 1.0 Content-Type: multipart/digest; boundary="----- =_aaaaaaaaaa0" This is a preamble ------- =_aaaaaaaaaa0 Content-Type: message/rfc822 From: Mister Burster To: Nobody 1 Date: Thursday, 28 Sep 2006 00:01:00 Subject: Message one - -This is message one ------- =_aaaaaaaaaa0 From: Mister Burster To: Nobody 2 Date: Thursday, 28 Sep 2006 00:02:00 Subject: Message two This is message two - For real. ------- =_aaaaaaaaaa0 From: Mister Burster To: Nobody 3 Date: Thursday, 28 Sep 2006 00:03:00 Subject: Message three Will this one work? ------- =_aaaaaaaaaa0-- EOF runandcheck "burst $msgnum" </dev/null runandcheck "next" < To: Nobody 1 Subject: Message one part text/plain 21 -This is message one ! runandcheck "next" < To: Nobody 2 Subject: Message two part text/plain 30 This is message two For real. ! # # The CR/LF that appears right before the boundary line is considered part # of the boundary line, so this has the practical effect of "eating" a # blank line if it's before the boundary (RFC 2046. 5.1.1). So make sure # a double blank line results in only one blank line at the end of a message. # runandcheck "next" < To: Nobody 3 Subject: Message three part text/plain 20 Will this one work? ! mmh-0.4/test/teardown-test0000755000000000000000000000007413414435726014353 0ustar rootroot#!/bin/sh rm -rf "`cat test-temp-dir`" rm -f test-temp-dir mmh-0.4/test/common.sh0000644000000000000000000000432313414435726013452 0ustar rootroot# Common helper routines for test shell scripts # -- intended to be sourced by them tmpfile="`mktemp`" trap ' rm -f "$tmpfile" exit "$failed" ' 0 1 2 15 failed=0 test_skip() { echo "$0: $1" failed=120 exit } # portable implementation of 'which' utility findprog() { FOUND= PROG="$1" IFS_SAVE="$IFS" IFS=: for D in $PATH; do if [ -z "$D" ]; then D=. fi if [ -f "$D/$PROG" ] && [ -x "$D/$PROG" ]; then printf '%s\n' "$D/$PROG" break fi done IFS="$IFS_SAVE" } require_prog() { if [ -z "$(findprog $1)" ]; then test_skip "missing $1" fi } require_locale() { for locale in "$@"; do if locale -a | grep -i "$locale" >/dev/null; then return fi done test_skip "no suitable locale available" } # Do a best guess at FQDN mh_hostname() { hostname -f 2>/dev/null || uname -n } # Some stuff for doing silly progress indicators progress_update() { test -t 1 || return 0 # suppress progress meter if non-interactive this="$1" first="$2" last="$3" range="$(expr $last - $first ||:)" prog="$(expr $this - $first ||:)" # this automatically rounds to nearest integer perc="$(expr 100 \* $prog / $range ||:)" # note \r so next update will overwrite printf "%3d%%\r" $perc } progress_done() { test -t 1 || return 0 # suppress progress meter if non-interactive printf "100%%\n" } #### Replace generated Content-ID headers with static value replace_contentid() { sed "/^Content-ID/s/:.*/: /" "$@" } #### Filter that squeezes blank lines, partially emulating GNU cat -s, #### but sufficient for our purpose. #### From http://www-rohan.sdsu.edu/doc/sed.html, compiled by Eric Pement. squeeze_lines() { sed '/^$/N;/\n$/D' } #### Filter that converts non-breakable space U+00A0 to an ASCII space. prepare_space() { sed 's/'"`printf '\\302\\240'`"'/ /g' } # first argument: command line to run # second argument: "normspace" to normalize the whitespace # stdin: expected output runandcheck() { if [ "$2" = "normspace" ]; then eval "$1" 2>&1 | prepare_space >"$tmpfile" diff="`prepare_space | diff -ub - "$tmpfile" || :`" else eval "$1" >"$tmpfile" 2>&1 diff="`diff -u - "$tmpfile"`" fi if [ "$diff" ]; then echo "$0: $1 failed" echo "$diff" failed=`expr "${failed:-0}" + 1` fi } mmh-0.4/test/setup-test0000755000000000000000000000072613414435726013674 0ustar rootroot#!/bin/sh set -e if TEMPDIR="`cat test-temp-dir 2>/dev/null`" \ && [ -f "$TEMPDIR/build/Makefile" ]; then (cd "$TEMPDIR/build" && make all install) exit fi TEMPDIR="`mktemp -d /tmp/mmh-test-XXXXXXXX`" echo "$TEMPDIR" >test-temp-dir cd .. srcdir="$PWD" if [ ! -f configure ]; then ./autogen.sh fi if [ -f Makefile ]; then make -s clean fi mkdir "$TEMPDIR/build" cd "$TEMPDIR/build" "$srcdir/configure" -q --prefix="$TEMPDIR" --enable-debug make -s all install mmh-0.4/test/README0000644000000000000000000000231413414435726012504 0ustar rootrootMmh test suite. The purpose of these tests is to verify the functionality of the mmh commands. The goal of the suite is to create an environment where testing mmh commands is easy and useful. Each test is a shell script, and is launched via the 'sh' command. The script should run the test and report the result by one of: * for a test pass: exit with status 0 * where a test has been skipped (perhaps because it depends on an external program which can't be found) execute: `test_skip "reason"'. (test_skip() is defined in common.sh; it exits with status 120) * for a test fail: exit with some status other than 0 or 120 The Suite is arranged as such: setup-test Create the test framework. This will re-generate your configure script and make files. teardown-test Remove the temporary files created as part of the tests. runtest Run a single test. runalltests Run all tests in the suite tests Directory containing the tests. All files found in this and all sub-directories which have the name test-* will be treated as one test each. Complex tests may be given their own directory as long as there is a file named 'test-*' in the directory which will launch the test. mmh-0.4/test/runtest0000755000000000000000000000273513414435726013265 0ustar rootroot#!/bin/sh set -e export MH_TEST_COMMON="$PWD/common.sh" if [ ! -f test-temp-dir ]; then echo "test-temp-dir not found: running setup-test" ./setup-test fi export MH_TEST_DIR=`cat test-temp-dir` if [ ! -f "$MH_TEST_DIR/build/Makefile" ]; then echo "temporary directory missing or broken: running setup-test" ./setup-test export MH_TEST_DIR=`cat test-temp-dir` fi unset MMHP MMHC export PATH="$MH_TEST_DIR/bin:$PATH" export MMH="$MH_TEST_DIR/.mmh" MAILDIR="$MH_TEST_DIR/Mail" # clean old test data rm -rf "$MAILDIR" "$MMH" # setup mmh mkdir "$MAILDIR" "$MMH" cat >"$MMH/profile" <<-! Path: $MAILDIR Inbox: +inbox ! folder -create `mhparam inbox` >/dev/null folder -create `mhparam trashfolder` >/dev/null folder -create `mhparam draftfolder` >/dev/null # create 10 basic messages for i in 1 2 3 4 5 6 7 8 9 10; do cat >"$MAILDIR/inbox/$i" <<-! From: Test$i To: Some User Date: Fri, 29 Sep 2006 00:00:00 Subject: Testing message $i This is message number $i ! done folder +inbox >/dev/null # now run the test set +e export SHELL="${SHELL:-/bin/sh}" /bin/sh "$1" return_value=$? set -e if [ $return_value -eq 0 ] ; then printf "Test %-60s\tPASS\n" "$1" exit 0 elif [ $return_value -eq 120 ]; then # indicates test was skipped (eg needed program not found) # test itself should have printed a message about this, # so print nothing here. printf "Test %-60s\tSKIP\n" "$1" exit 2 else printf "Test %-60s\tFAIL\n" "$1" exit 1 fi mmh-0.4/test/runalltests0000755000000000000000000000163013414435726014132 0ustar rootroot#!/bin/sh passed=0 failed=0 skipped=0 # Note that we ignore *~ files as these are probably editor backups for i in `find tests -name 'test-*[!~]' -type f | LC_ALL=C sort`; do ./runtest "$i" case $? in 0) passed="`expr $passed + 1`" ;; 1) failed="`expr $failed + 1`" ;; 2) skipped="`expr $skipped + 1`" ;; esac done awk -v passed="$passed" -v failed="$failed" -v skipped="$skipped" ' BEGIN { sum = passed + failed + skipped; if (failed > 0) { smilie = ":-(" } else if (sum == passed) { smilie = ":-)" } else { # we either passed the tests or managed to sneak around them smilie = ";-)" } printf("\n%s %s\n", "SUMMARY", smilie); printf("%-12s %4d = %d%%\n", "Passed", passed, passed/sum*100); printf("%-12s %4d = %d%%\n", "Failed", failed, failed/sum*100); printf("%-12s %4d = %d%%\n", "Skipped", skipped, skipped/sum*100); printf("%-12s %4d\n", "Total", sum); } ' exit `test "$failed" -eq 0` mmh-0.4/INSTALL0000644000000000000000000001533113414435726011701 0ustar rootroot# # INSTALL -- installation instructions # -------------- Installing mmh -------------- Please read all of the following instructions before you begin building mmh. Mmh can be built and installed on POSIX-compliant systems, using an ANSI C compiler. (Check out docs/MACHINES for shortcomings of operating systems.) 0) If you have obtained mmh by checking it out of the version control system, you will need to run the GNU autotools to regenerate some files. (If your directory already contains a file 'config.h.in' then this has already been done and you do not need to do it.) You can regenerate the files by running the command ./autogen.sh (If you're doing mmh development, you should look at docs/README.developers for related information.) 1) From the top-level source directory, run the command: ./configure [options] This will check the configuration of your OS, as well as generate the various Makefiles. The configure script accepts various options. The options of most interest are listed in a section below. To see the list of all available options, you can run: ./configure --help 2) make For less terminal output, use: make -s 3) make install Note that if you have mmh files in the target directories with the same names as the files being installed, the old ones will get overwritten without any warning. The only directory this isn't true for, is the `etc' directory -- in that directory, the distributed files are installed with a `.dist' suffix if they differ from the existing file. Watch for information messages while make is processing that directory to see if you need to merge changes. 4) You may edit the file `mhn.defaults' in mmh's `etc' directory. This file contains the default profile entries for the mmh commands mhlist/mhstore/show. The syntax of this file is described in section 9.4 of the book "MH & xmh: Email for Users and Programmers", 3rd edition, by Jerry Peek, on the Internet at . In most cases you can skip this step. 5) Add the bindir to your PATH variable. If you haven't changed any paths, then the bindir is `/usr/local/mmh/bin'. Adjust your PATH in ~/.profile, ~/.kshrc, ~/.bashrc, or a similar file. Have a look at mmhwrap(1), which allows you to access mmh tools conveniently without changing the PATH variable. ----------------------------------------------- Compiler options, or using a different compiler ----------------------------------------------- By default, configure will use the "gcc" compiler if found. You can use a different compiler, or add unusual options for compiling or linking that the "configure" script does not know about, by either editing the user configuration section of the top level Makefile (after running configure) or giving "configure" initial values for these in its command line or in its environment. For example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix Or on systems that have the "env" program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure If you want to add to, not replace, compile flags, you can use OURDEFS: ./configure OURDEFS='-Wextra -Wno-sign-compare' --------------------------------- Using a different build directory --------------------------------- You can compile mmh in a different directory from the one containing the source code. Doing so allows you to compile it on more than one architecture at the same time. To do this, you must use a version of "make" that supports the "VPATH" variable, such as GNU "make". Change to the directory where you want the object files and executables to go and run the "configure" script. "configure" automatically checks for the source code in the directory that "configure" is in. For example, cd /usr/local/src/mmh # source directory make clean cd /usr/local/solaris/mmh # build directory /usr/local/src/mmh/configure make ---------------------------------------- Building mmh on additional architectures ---------------------------------------- To build mmh on additional architectures, you can do a "make distclean". This should restore the mmh source distribution back to its original state. You can then configure mmh as above on other architectures in which you wish to build mmh. Or alternatively, you can use a different build directory for each architecture. --------------------- Options for configure --------------------- --prefix=DIR (DEFAULT is /usr/local/mmh) This will change the base prefix for the installation location for the various parts of mmh. Unless overridden, mmh is installed in ${prefix}/bin, ${prefix}/etc, ${prefix}/lib, ${prefix}/man. --bindir=DIR (DEFAULT is ${prefix}/bin) mmh's binaries (show, inc, comp, ...) are installed here. You need to have this directory in your PATH variable. --libdir=DIR (DEFAULT is ${prefix}/lib) mmh's test tools (ap, dp, mhtest, ...) are installed here. They are seldom useful to normal users. --sysconfdir=DIR (DEFAULT is ${prefix}/etc) mmh's global config files (mhn.defaults, ...) are installed here. --mandir=DIR (DEFAULT is ${prefix}/man) mmh's man pages are installed here. --enable-debug Add debugging symbols to the binaries. --with-locking=LOCKTYPE (DEFAULT is dot) Specify the locking mechanism when attempting to "inc" a local mail spool. Valid options are "dot", "fcntl", "flock", and "lockf". Of the four, dot-locking requires no special kernel or filesystem support, and simply creates a file called "FILE.lock" to indicate that "FILE" is locked. If LOCKDIR is specified, lock files will be created in that directory. Otherwise, lock files will be created in the directory where the file being locked resides. To configure nmh for kernel locking, use one of the `flock', `lockf' or `fcntl' values, each using the equally named system call to perform the kernel-level locking. In order to be effective, you should contact the site administrator to find out what locking mechanisms other mail delivery and user programs respect. The most common reason not to use dot-locking is if the mail spool directory is not world- or user-writeable, and thus a lock file cannot be created. --with-lockdir=DIR If you have defined "dot" locking, then the default is to place the lock files in the same directory as the file that is to be locked. Alternately, if you use this option, you can specify that all lock files go in the specified directory. Don't define this unless you know you need it. This option is only relevant if "dot" locking is used. In the other cases, it is ignored. mmh-0.4/sbr/0000755000000000000000000000000013414435727011434 5ustar rootrootmmh-0.4/sbr/charset.c0000644000000000000000000000236713414435726013240 0ustar rootroot/* ** charset.c -- routines for character sets ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #ifdef HAVE_LANGINFO_H # include #endif /* ** Get the current character set */ char * get_charset() { char *charset = getenv("MM_CHARSET"); #if defined(HAVE_NL_LANGINFO) && defined(CODESET) if (!charset) { charset = norm_charmap(nl_langinfo(CODESET)); } #endif return charset; } /* ** Check if we can display a given character set natively. */ int is_native_charset(char *str) { char *mm_charset = NULL; if (!(mm_charset = get_charset())) { mm_charset = "US-ASCII"; } if (mh_strcasecmp(str, mm_charset)==0) { return 1; } /* US-ASCII is a subset of the ISO-8859-X and UTF-8 character sets */ if (strncasecmp("ISO-8859-", mm_charset, 9)==0 || mh_strcasecmp("UTF-8", mm_charset)==0) { if (mh_strcasecmp(str, "US-ASCII")==0) { return 1; } } return 0; } /* ** Return the name of the character set we are ** using for 8bit text. */ char * write_charset_8bit(void) { char *mm_charset = NULL; if (!(mm_charset = get_charset())) { mm_charset = "x-unknown"; } return mm_charset; } mmh-0.4/sbr/readconfig.c0000644000000000000000000000412213414435726013677 0ustar rootroot/* ** readconfig.c -- base routine to read nmh configuration files ** -- such as nmh profile, context file, or mhn.defaults. ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include struct procstr { char *procname; char **procnaddr; }; static struct procstr procs[] = { { "attachment-header", &attach_hdr }, { "sign-header", &sign_hdr }, { "enc-header", &enc_hdr }, { "context", &context }, { "mh-sequences", &mh_seq }, { "draft-folder", &draftfolder }, { "listproc", &listproc }, { "sendmail", &sendmail }, { "trash-folder", &trashfolder }, { "whatnowproc", &whatnowproc }, { NULL, NULL } }; static struct node **opp = NULL; void readconfig(struct node **npp, FILE *ib, char *file, int ctx) { enum state state; struct field f = {{0}}; struct node *np; struct procstr *ps; if (npp == NULL && (npp = opp) == NULL) { admonish(NULL, "bug: readconfig called but pump not primed"); return; } for (state = FLD2;;) { switch (state = m_getfld2(state, &f, ib)) { case LENERR2: state = FLD2; /* FALL */ case FLD2: np = mh_xcalloc(1, sizeof(*np)); *npp = np; *(npp = &np->n_next) = NULL; np->n_name = mh_xstrdup(f.name); np->n_field = trimcpy(f.value); np->n_context = ctx; /* ** Now scan the list of `procs' and link in ** the field value to the global variable. */ for (ps = procs; ps->procname; ps++) { if (mh_strcasecmp(np->n_name, ps->procname) == 0) { *ps->procnaddr = np->n_field; break; } } continue; case FMTERR2: advise(NULL, "%s is poorly formatted", file); state = FLD2; continue; case BODY2: adios(EX_CONFIG, NULL, "no blank lines are permitted in %s", file); case FILEEOF2: break; case IOERR2: adios(EX_IOERR, NULL, "m_getfld2", "some error happened"); break; default: adios(EX_CONFIG, NULL, "%s is poorly formatted", file); } break; } opp = npp; } mmh-0.4/sbr/version.c0000644000000000000000000000006013414435726013260 0ustar rootroot#include char *lib_version = VERSION; mmh-0.4/sbr/folder_realloc.c0000644000000000000000000000464313414435726014562 0ustar rootroot/* ** folder_realloc.c -- realloc a folder/msgs structure ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include /* ** Reallocate some of the space in the folder ** structure (currently just message status array). ** ** Return pointer to new folder structure. ** If error, return NULL. */ struct msgs * folder_realloc(struct msgs *mp, int lo, int hi) { int msgnum; /* sanity checks */ if (lo < 1) adios(EX_SOFTWARE, NULL, "BUG: called folder_realloc with lo (%d) < 1", lo); if (hi < 1) adios(EX_SOFTWARE, NULL, "BUG: called folder_realloc with hi (%d) < 1", hi); if (mp->nummsg > 0 && lo > mp->lowmsg) adios(EX_SOFTWARE, NULL, "BUG: called folder_realloc with lo (%d) > mp->lowmsg (%d)", lo, mp->lowmsg); if (mp->nummsg > 0 && hi < mp->hghmsg) adios(EX_SOFTWARE, NULL, "BUG: called folder_realloc with hi (%d) < mp->hghmsg (%d)", hi, mp->hghmsg); /* Check if we really need to reallocate anything */ if (lo == mp->lowoff && hi == mp->hghoff) return mp; if (lo == mp->lowoff) { /* ** We are just extending (or shrinking) the end of message ** status array. So we don't have to move anything and can ** just realloc the message status array. */ mp->msgstats = mh_xrealloc(mp->msgstats, MSGSTATSIZE(mp, lo, hi)); } else { /* ** We are changing the offset of the message status ** array. So we will need to shift everything. */ seqset_t *tmpstats; /* first allocate the new message status space */ tmpstats = mh_xcalloc(MSGSTATSIZE(mp, lo, hi), 1); /* then copy messages status array with shift */ if (mp->nummsg > 0) { for (msgnum=mp->lowmsg; msgnum<=mp->hghmsg; msgnum++) { tmpstats[msgnum - lo] = mp->msgstats[msgnum - mp->lowoff]; } } mh_free0(&(mp->msgstats)); mp->msgstats = tmpstats; } mp->lowoff = lo; mp->hghoff = hi; /* ** Clear all the flags for entries outside ** the current message range for this folder. */ if (mp->nummsg > 0) { for (msgnum = mp->lowoff; msgnum < mp->lowmsg; msgnum++) clear_msg_flags(mp, msgnum); for (msgnum = mp->hghmsg + 1; msgnum <= mp->hghoff; msgnum++) clear_msg_flags(mp, msgnum); } else { /* no messages, so clear entire range */ for (msgnum = mp->lowoff; msgnum <= mp->hghoff; msgnum++) clear_msg_flags(mp, msgnum); } return mp; } mmh-0.4/sbr/fmt_def.c0000644000000000000000000000042513414435726013204 0ustar rootroot/* ** fmt_def.c -- some defines for sbr/fmt_scan.c ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include int fmt_norm = AD_NAME; mmh-0.4/sbr/ambigsw.c0000644000000000000000000000056613414435726013237 0ustar rootroot/* ** ambigsw.c -- report an ambiguous switch ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include void ambigsw(char *arg, struct swit *swp) { advise(NULL, "-%s ambiguous. It matches", arg); print_sw(arg, swp, "-", stderr); } mmh-0.4/sbr/getarguments.c0000644000000000000000000000205313414435726014304 0ustar rootroot/* ** getarguments.c -- Get the argument vector ready to go. ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include char ** getarguments(char *invo_name, int argc, char **argv, int check_context) { char *cp = NULL, **ap = NULL, **bp = NULL, **arguments = NULL; int n = 0; /* ** Check if profile/context specifies any arguments */ if (check_context && (cp = context_find(invo_name))) { cp = mh_xstrdup(cp); /* make copy */ ap = brkstring(cp, " ", "\n"); /* split string */ /* Count number of arguments split */ bp = ap; while (*bp++) n++; } arguments = mh_xcalloc(argc + n, sizeof(*arguments)); bp = arguments; /* Copy any arguments from profile/context */ if (ap != NULL && n > 0) { while (*ap) *bp++ = *ap++; } /* Copy arguments from command line */ argv++; while (*argv) *bp++ = *argv++; /* Now NULL terminate the array */ *bp = NULL; return arguments; } mmh-0.4/sbr/m_atoi.c0000644000000000000000000000112613414435726013047 0ustar rootroot/* ** m_atoi.c -- Parse a string representation of a message number, and ** -- return the numeric value of the message. If the string ** -- contains any non-digit characters, then return 0. ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include int m_atoi(char *str) { int i; unsigned char *cp; for (i = 0, cp = str; *cp; cp++) { if (!isdigit(*cp)) return 0; i *= 10; i += (*cp - '0'); } return i; } mmh-0.4/sbr/lock_file.c0000644000000000000000000002525113414435726013533 0ustar rootroot/* ** lock.c -- routines to lock/unlock files ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ /* ** Modified by Ruud de Rooij to support Miquel van Smoorenburg's liblockfile ** ** Since liblockfile locking shares most of its code with dot locking, it ** is enabled by defining both DOT_LOCKING and HAVE_LIBLOCKFILE. ** ** Ruud de Rooij Sun, 28 Mar 1999 15:34:03 +0200 */ #include #include #include #include #include #ifdef HAVE_SYS_TIME_H # include #endif #include #include #ifdef HAVE_FCNTL_H # include #else # include #endif #if defined(LOCKF_LOCKING) || defined(FLOCK_LOCKING) # include #endif #include #if defined(HAVE_LIBLOCKFILE) #include #endif #ifdef DOT_LOCKING # ifdef LOCKDIR char *lockdir = LOCKDIR; # endif #endif /* Are we using any kernel locking? */ #if defined (FLOCK_LOCKING) || defined(LOCKF_LOCKING) || defined(FCNTL_LOCKING) # define KERNEL_LOCKING #endif #ifdef DOT_LOCKING /* struct for getting name of lock file to create */ struct lockinfo { char curlock[BUFSIZ]; #if !defined(HAVE_LIBLOCKFILE) char tmplock[BUFSIZ]; #endif }; /* ** Amount of time to wait before ** updating ctime of lock file. */ #define NSECS 20 #if !defined(HAVE_LIBLOCKFILE) /* ** How old does a lock file need to be ** before we remove it. */ #define RSECS 180 #endif /* HAVE_LIBLOCKFILE */ /* struct for recording and updating locks */ struct lock { int l_fd; char *l_lock; struct lock *l_next; }; /* top of list containing all open locks */ static struct lock *l_top = NULL; #endif /* DOT_LOCKING */ /* ** static prototypes */ #ifdef KERNEL_LOCKING static int lkopen_kernel(char *, int, mode_t); #endif #ifdef DOT_LOCKING static int lkopen_dot(char *, int, mode_t); static void lockname(char *, struct lockinfo *, int); static void timerON(char *, int); static void timerOFF(int); static void alrmser(int); #if !defined(HAVE_LIBLOCKFILE) static int lockit(struct lockinfo *); #endif #endif /* ** Base routine to open and lock a file, ** and return a file descriptor. */ int lkopen(char *file, int access, mode_t mode) { #ifdef KERNEL_LOCKING return lkopen_kernel(file, access, mode); #endif #ifdef DOT_LOCKING return lkopen_dot(file, access, mode); #endif } /* ** Base routine to close and unlock a file, ** given a file descriptor. */ int lkclose(int fd, char *file) { #ifdef FCNTL_LOCKING struct flock buf; #endif #ifdef DOT_LOCKING struct lockinfo lkinfo; #endif if (fd == -1) return 0; #ifdef FCNTL_LOCKING buf.l_type = F_UNLCK; buf.l_whence = SEEK_SET; buf.l_start = 0; buf.l_len = 0; fcntl(fd, F_SETLK, &buf); #endif #ifdef FLOCK_LOCKING flock(fd, LOCK_UN); #endif #ifdef LOCKF_LOCKING /* make sure we unlock the whole thing */ lseek(fd, (off_t) 0, SEEK_SET); lockf(fd, F_ULOCK, 0L); #endif #ifdef DOT_LOCKING lockname(file, &lkinfo, 0); /* get name of lock file */ #if !defined(HAVE_LIBLOCKFILE) unlink(lkinfo.curlock); /* remove lock file */ #else lockfile_remove(lkinfo.curlock); #endif /* HAVE_LIBLOCKFILE */ timerOFF(fd); /* turn off lock timer */ #endif /* DOT_LOCKING */ return (close(fd)); } /* ** Base routine to open and lock a file, ** and return a FILE pointer */ FILE * lkfopen(char *file, char *mode) { int fd, access; FILE *fp; if (strcmp(mode, "r") == 0) access = O_RDONLY; else if (strcmp(mode, "r+") == 0) access = O_RDWR; else if (strcmp(mode, "w") == 0) access = O_WRONLY | O_CREAT | O_TRUNC; else if (strcmp(mode, "w+") == 0) access = O_RDWR | O_CREAT | O_TRUNC; else if (strcmp(mode, "a") == 0) access = O_WRONLY | O_CREAT | O_APPEND; else if (strcmp(mode, "a+") == 0) access = O_RDWR | O_CREAT | O_APPEND; else { errno = EINVAL; return NULL; } if ((fd = lkopen(file, access, 0666)) == -1) return NULL; if ((fp = fdopen(fd, mode)) == NULL) { close(fd); return NULL; } return fp; } /* ** Base routine to close and unlock a file, ** given a FILE pointer */ int lkfclose(FILE *fp, char *file) { #ifdef FCNTL_LOCKING struct flock buf; #endif #ifdef DOT_LOCKING struct lockinfo lkinfo; #endif if (fp == NULL) return 0; #ifdef FCNTL_LOCKING buf.l_type = F_UNLCK; buf.l_whence = SEEK_SET; buf.l_start = 0; buf.l_len = 0; fcntl(fileno(fp), F_SETLK, &buf); #endif #ifdef FLOCK_LOCKING flock(fileno(fp), LOCK_UN); #endif #ifdef LOCKF_LOCKING /* make sure we unlock the whole thing */ fseek(fp, 0L, SEEK_SET); lockf(fileno(fp), F_ULOCK, 0L); #endif #ifdef DOT_LOCKING lockname(file, &lkinfo, 0); /* get name of lock file */ #if !defined(HAVE_LIBLOCKFILE) unlink(lkinfo.curlock); /* remove lock file */ #else lockfile_remove(lkinfo.curlock); #endif /* HAVE_LIBLOCKFILE */ timerOFF(fileno(fp)); /* turn off lock timer */ #endif /* DOT_LOCKING */ return (fclose(fp)); } #ifdef KERNEL_LOCKING /* ** open and lock a file, using kernel locking */ static int lkopen_kernel(char *file, int access, mode_t mode) { int fd, i, j; # ifdef FCNTL_LOCKING struct flock buf; # endif /* FCNTL_LOCKING */ for (i = 0; i < 5; i++) { # if defined(LOCKF_LOCKING) || defined(FCNTL_LOCKING) /* remember the original mode */ j = access; /* make sure we open at the beginning */ access &= ~O_APPEND; /* ** We MUST have write permission or ** lockf/fcntl() won't work */ if ((access & 03) == O_RDONLY) { access &= ~O_RDONLY; access |= O_RDWR; } # endif /* LOCKF_LOCKING || FCNTL_LOCKING */ if ((fd = open(file, access | O_NDELAY, mode)) == -1) return -1; # ifdef FCNTL_LOCKING buf.l_type = F_WRLCK; buf.l_whence = SEEK_SET; buf.l_start = 0; buf.l_len = 0; if (fcntl(fd, F_SETLK, &buf) != -1) return fd; # endif # ifdef FLOCK_LOCKING if (flock(fd, (((access & 03) == O_RDONLY) ? LOCK_SH : LOCK_EX) | LOCK_NB) != -1) return fd; # endif # ifdef LOCKF_LOCKING if (lockf(fd, F_TLOCK, 0L) != -1) { /* see if we should be at the end */ if (j & O_APPEND) lseek(fd, (off_t) 0, SEEK_END); return fd; } # endif j = errno; close(fd); sleep(1); } close(fd); errno = j; return -1; } #endif /* KERNEL_LOCKING */ #ifdef DOT_LOCKING /* ** open and lock a file, using dot locking */ static int lkopen_dot(char *file, int access, mode_t mode) { int fd; struct lockinfo lkinfo; /* open the file */ if ((fd = open(file, access, mode)) == -1) return -1; /* ** Get the name of the eventual lock file, as well ** as a name for a temporary lock file. */ lockname(file, &lkinfo, 1); #if !defined(HAVE_LIBLOCKFILE) { int i; for (i = 0;;) { /* attempt to create lock file */ if (lockit(&lkinfo) == 0) { /* if successful, turn on timer and return */ timerON(lkinfo.curlock, fd); return fd; } else { /* ** Abort locking, if we fail to lock after 5 ** attempts and are never able to stat the ** lock file. */ struct stat st; if (stat(lkinfo.curlock, &st) == -1) { if (i++ > 5) return -1; sleep(1); } else { time_t curtime; i = 0; time(&curtime); /* ** check for stale lockfile, ** else sleep */ if (curtime > st.st_ctime + RSECS) unlink(lkinfo.curlock); else sleep(1); } lockname(file, &lkinfo, 1); } } } #else if (lockfile_create(lkinfo.curlock, 5, 0) == L_SUCCESS) { timerON(lkinfo.curlock, fd); return fd; } else { close(fd); return -1; } #endif /* HAVE_LIBLOCKFILE */ } #if !defined(HAVE_LIBLOCKFILE) /* ** Routine that actually tries to create ** the lock file. */ static int lockit(struct lockinfo *li) { int fd; char *curlock, *tmplock; #if 0 char buffer[128]; #endif curlock = li->curlock; tmplock = li->tmplock; if ((fd = mkstemp(tmplock)) == -1) { advise(NULL, "unable to create temporary file in %s", tmplock); return -1; } #if 0 /* write our process id into lock file */ snprintf(buffer, sizeof(buffer), "nmh lock: pid %d\n", (int) getpid()); write(fd, buffer, strlen(buffer) + 1); #endif close(fd); /* ** Now try to create the real lock file ** by linking to the temporary file. */ fd = link(tmplock, curlock); unlink(tmplock); return (fd == -1 ? -1 : 0); } #endif /* HAVE_LIBLOCKFILE */ /* ** Get name of lock file, and temporary lock file */ static void lockname(char *file, struct lockinfo *li, int isnewlock) { int bplen, tmplen; char *bp, *cp; if ((cp = strrchr(file, '/')) == NULL || *++cp == 0) cp = file; bp = li->curlock; bplen = 0; #ifdef LOCKDIR snprintf(bp, sizeof(li->curlock), "%s/", lockdir); tmplen = strlen(bp); bp += tmplen; bplen += tmplen; #else if (cp != file) { snprintf(bp, sizeof(li->curlock), "%.*s", (int)(cp - file), file); tmplen = strlen(bp); bp += tmplen; bplen += tmplen; } #endif snprintf(bp, sizeof(li->curlock) - bplen, "%s.lock", cp); #if !defined(HAVE_LIBLOCKFILE) /* ** If this is for a new lock, create a name for ** the temporary lock file for lockit() */ if (isnewlock) { if ((cp = strrchr(li->curlock, '/')) == NULL || *++cp == 0) strncpy(li->tmplock, ",LCK.XXXXXX", sizeof(li->tmplock)); else snprintf(li->tmplock, sizeof(li->tmplock), "%.*s,LCK.XXXXXX", (int)(cp - li->curlock), li->curlock); } #endif } /* ** Add new lockfile to the list of open lockfiles ** and start the lock file timer. */ static void timerON(char *curlock, int fd) { struct lock *lp; size_t len; lp = mh_xcalloc(1, sizeof(*lp)); len = strlen(curlock) + 1; lp->l_fd = fd; lp->l_lock = mh_xcalloc(len, sizeof(char)); memcpy(lp->l_lock, curlock, len); lp->l_next = l_top; if (!l_top) { /* perhaps SIGT{STP,TIN,TOU} ? */ SIGNAL(SIGALRM, alrmser); alarm(NSECS); } l_top = lp; } /* ** Search through the list of lockfiles for the ** current lockfile, and remove it from the list. */ static void timerOFF(int fd) { struct lock *pp, *lp; alarm(0); if (l_top) { for (pp = lp = l_top; lp; pp = lp, lp = lp->l_next) { if (lp->l_fd == fd) break; } if (lp) { if (lp == l_top) l_top = lp->l_next; else pp->l_next = lp->l_next; mh_free0(&(lp->l_lock)); mh_free0(&lp); } } /* if there are locks left, restart timer */ if (l_top) alarm(NSECS); } /* ** If timer goes off, we update the ctime of all open ** lockfiles, so another command doesn't remove them. */ static void alrmser(int sig) { char *lockfile; struct lock *lp; /* update the ctime of all the lock files */ for (lp = l_top; lp; lp = lp->l_next) { lockfile = lp->l_lock; #if !defined(HAVE_LIBLOCKFILE) { int j; if (*lockfile && (j = creat(lockfile, 0600)) != -1) close(j); } #else lockfile_touch(lockfile); #endif } /* restart the alarm */ alarm(NSECS); } #endif /* DOT_LOCKING */ mmh-0.4/sbr/getanswer.c0000644000000000000000000000073313414435726013601 0ustar rootroot/* ** getanswer.c -- get a yes/no answer from the user ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include int getanswer(char *prompt) { static int interactive = -1; if (interactive < 0) interactive = isatty(fileno(stdin)) ? 1 : 0; return (interactive ? gans(prompt, anoyes) : 1); } mmh-0.4/sbr/cpydata.c0000644000000000000000000000110313414435726013217 0ustar rootroot/* ** cpydata.c -- copy all data from one fd to another ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include void cpydata(int in, int out, char *ifile, char *ofile) { int i; char buffer[BUFSIZ]; while ((i = read(in, buffer, sizeof(buffer))) > 0) { if (write(out, buffer, i) != i) adios(EX_IOERR, ofile, "error writing"); } if (i == -1) adios(EX_IOERR, ifile, "error reading"); } mmh-0.4/sbr/fmt_new.c0000644000000000000000000000436013414435726013241 0ustar rootroot/* ** fmt_new.c -- read format file/string and normalize ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include static char *formats = NULL; /* ** static prototypes */ static void normalize(char *); /* ** Copy first available format string, store in static memory and normalize it. */ char * new_fs(char *form, char *def_form) { struct stat st; FILE *fp; if (formats) { mh_free0(&formats); } if (form) { if (*form == '=') { formats = mh_xstrdup(form+1); } else { if ((fp = fopen(etcpath(form), "r")) == NULL) { adios(EX_IOERR, form, "unable to open format file"); } if (fstat(fileno(fp), &st) == -1) { adios(EX_IOERR, form, "unable to stat format file"); } formats = mh_xcalloc(st.st_size + 1, sizeof(char)); if (read(fileno(fp), formats, (int)st.st_size) != st.st_size) { adios(EX_IOERR, form, "error reading format file"); } formats[st.st_size] = '\0'; fclose(fp); } } else if (def_form) { if (*def_form == '=') { formats = mh_xstrdup(def_form+1); } else { if ((fp = fopen(etcpath(def_form), "r")) == NULL) { adios(EX_IOERR, def_form, "unable to open format file"); } if (fstat(fileno(fp), &st) == -1) { adios(EX_IOERR, def_form, "unable to stat format file"); } formats = mh_xcalloc(st.st_size + 1, sizeof(char)); if (read(fileno(fp), formats, (int)st.st_size) != st.st_size) { adios(EX_IOERR, def_form, "error reading format file"); } formats[st.st_size] = '\0'; fclose(fp); } } normalize(formats); /* expand escapes */ return formats; } /* ** Expand escapes in format strings */ static void normalize(char *cp) { char *dp; for (dp = cp; *cp; cp++) { if (*cp != '\\') { *dp++ = *cp; continue; } switch (*++cp) { case 'b': *dp++ = '\b'; break; case 'f': *dp++ = '\f'; break; case 'n': *dp++ = '\n'; break; case 'r': *dp++ = '\r'; break; case 't': *dp++ = '\t'; break; case '\n': break; case '\0': cp--; /* fall */ default: *dp++ = *cp; break; } } *dp = '\0'; } mmh-0.4/sbr/uprf.c0000644000000000000000000000070513414435726012555 0ustar rootroot/* ** uprf.c -- "unsigned" lexical prefix ** -- Check if `word' starts with `prefix', caseinsensitively. ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include int uprf(char *word, char *prefix) { if (!word || !prefix) { return 0; } return (strncasecmp(word, prefix, strlen(prefix))==0) ? 1 : 0; } mmh-0.4/sbr/pidwait.c0000644000000000000000000000141113414435726013235 0ustar rootroot/* ** pidwait.c -- wait for child to exit ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include int pidwait(pid_t id, int sigsok) { pid_t pid; SIGNAL_HANDLER istat = NULL, qstat = NULL; int status; if (sigsok == -1) { /* ignore a couple of signals */ istat = SIGNAL(SIGINT, SIG_IGN); qstat = SIGNAL(SIGQUIT, SIG_IGN); } while ((pid = waitpid(id, &status, 0)) == -1 && errno == EINTR) ; if (sigsok == -1) { /* reset the signal handlers */ SIGNAL(SIGINT, istat); SIGNAL(SIGQUIT, qstat); } return (pid == -1 ? -1 : status); } mmh-0.4/sbr/print_help.c0000644000000000000000000000126313414435726013745 0ustar rootroot/* ** print_help.c -- print a help message, and possibly the ** -- profile/context entries for this command ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include void print_help(char *str, struct swit *swp, int print_context) { char *s; /* print Usage string */ printf("Usage: %s\n", str); /* print all the switches */ printf(" switches are:\n"); print_sw(ALL, swp, "-", stdout); /* ** check if we should print any profile entries */ if (print_context && (s = context_find(invo_name))) printf("\nProfile: %s\n", s); } mmh-0.4/sbr/trim.c0000644000000000000000000000133013414435726012547 0ustar rootroot/* ** trim.c -- strip leading and trailing whitespace ... inplace! ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include char * trim(unsigned char *cp) { unsigned char *sp; /* skip over leading whitespace */ while (isspace(*cp)) { cp++; } /* start at the end and zap trailing whitespace */ for (sp = cp + strlen(cp) - 1; sp >= cp; sp--) { if (isspace(*sp)) { *sp = '\0'; } else { break; } } return cp; } char * rtrim(char *cp) { char *sp = cp + strlen(cp) - 1; while (sp >= cp && isspace(*sp)) { sp--; } *++sp = '\0'; return cp; } mmh-0.4/sbr/seq_read.c0000644000000000000000000001170713414435726013370 0ustar rootroot/* ** seq_read.c -- read the .mh_sequence file and ** -- initialize sequence information ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include /* ** static prototypes */ static int seq_init(struct msgs *, char *, char *); static void seq_public(struct msgs *); static void seq_private(struct msgs *); /* ** Get the sequence information for this folder from ** .mh_sequences (or equivalent specified in .mh_profile) ** or context file (for private sequences). */ void seq_read(struct msgs *mp) { /* ** Initialize the list of sequence names. Go ahead and ** add the cur sequence to the list of sequences. */ mp->msgattrs[0] = mh_xstrdup(seq_cur); mp->msgattrs[1] = NULL; make_all_public(mp); /* initially, make all public */ /* If folder is empty, don't scan for sequence information */ if (mp->nummsg == 0) return; /* Initialize the public sequences */ seq_public(mp); /* Initialize the private sequences */ seq_private(mp); } /* ** read folder's sequences file for public sequences */ static void seq_public(struct msgs *mp) { enum state state; struct field f = {{0}}; char seqfile[PATH_MAX]; FILE *fp; /* ** If public sequences are disabled (e.g. the user has defined ** an empty `Mh-Sequences' profile entry), then just return. */ if (mh_seq == NULL || *mh_seq == '\0') return; /* get filename of sequence file */ snprintf(seqfile, sizeof(seqfile), "%s/%s", mp->foldpath, mh_seq); if ((fp = lkfopen(seqfile, "r")) == NULL) return; /* Use m_getfld to scan sequence file */ for (state = FLD2;;) { switch (state = m_getfld2(state, &f, fp)) { case LENERR2: state = FLD2; /* FALL */ case FLD2: seq_init(mp, mh_xstrdup(f.name), trimcpy(f.value)); continue; case BODY2: adios(EX_CONFIG, NULL, "no blank lines are permitted in %s", seqfile); /* FALL */ case FILEEOF2: break; default: adios(EX_CONFIG, NULL, "%s is poorly formatted", seqfile); } break; } lkfclose(fp, seqfile); } /* ** Scan profile/context list for private sequences. ** ** We search the context list for all keys that look like ** "atr-seqname-folderpath", and add them as private sequences. */ static void seq_private(struct msgs *mp) { int i, j, alen, plen; char *cp; struct node *np; alen = strlen("atr-"); plen = strlen(mp->foldpath) + 1; for (np = m_defs; np; np = np->n_next) { if (strncmp(np->n_name, "atr-", alen)==0 && (j = strlen(np->n_name) - plen) > alen && *(np->n_name + j) == '-' && strcmp(mp->foldpath, np->n_name + j + 1)==0) { cp = mh_xstrdup(np->n_name + alen); *(cp + j - alen) = '\0'; if ((i = seq_init(mp, cp, mh_xstrdup(np->n_field))) != -1) make_seq_private(mp, i); } } } /* ** Add the name of sequence to the list of folder sequences. ** Then parse the list of message ranges for this ** sequence, and setup the various bit flags for each ** message in the sequence. ** ** Return internal index for the sequence if successful. ** Return -1 on error. */ static int seq_init(struct msgs *mp, char *name, char *field) { unsigned int i; int j, k, is_current; char *cp, **ap; /* ** Check if this is the cur sequence, ** so we can do some special things. */ is_current = (strcmp(seq_cur, name)==0); /* ** Search for this sequence name to see if we've seen ** it already. If we've seen this sequence before, ** then clear the bit for this sequence from all the ** mesages in this folder. */ for (i = 0; mp->msgattrs[i]; i++) { if (strcmp(mp->msgattrs[i], name)==0) { for (j = mp->lowmsg; j <= mp->hghmsg; j++) clear_sequence(mp, i, j); break; } } /* Return error, if too many sequences */ if (i >= NUMATTRS) { mh_free0(&name); mh_free0(&field); return -1; } /* ** If we've already seen this sequence name, just free the ** name string. Else add it to the list of sequence names. */ if (mp->msgattrs[i]) { mh_free0(&name); } else { mp->msgattrs[i] = name; mp->msgattrs[i + 1] = NULL; } /* ** Split up the different message ranges at whitespace */ for (ap = brkstring(field, " ", "\n"); *ap; ap++) { if ((cp = strchr(*ap, '-'))) *cp++ = '\0'; if ((j = m_atoi(*ap)) > 0) { k = cp ? m_atoi(cp) : j; /* ** Keep mp->curmsg and cur sequence in sync. Unlike ** other sequences, this message doesn't need to exist. ** Think about the series of command (rmm; next) to ** understand why this can be the case. But if it does ** exist, we will still set the bit flag for it like ** other sequences. */ if (is_current) mp->curmsg = j; /* ** We iterate through messages in this range ** and flip on bit for this sequence. */ for (; j <= k; j++) { if (j >= mp->lowmsg && j <= mp->hghmsg && does_exist(mp, j)) add_sequence(mp, i, j); } } } mh_free0(&field); /* free string containing message ranges */ return i; } mmh-0.4/sbr/folder_addmsg.c0000644000000000000000000001134613414435726014376 0ustar rootroot/* ** folder_addmsg.c -- Link message into folder ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include /* ** Link message into a folder. Return the new number ** of the message. If an error occurs, return -1. */ int folder_addmsg(struct msgs **mpp, char *msgfile, int selected, int unseen, int preserve, int deleting, char *from_dir) { int infd, outfd, linkerr, msgnum; char *nmsg, newmsg[BUFSIZ]; char oldmsg[BUFSIZ]; struct msgs *mp; struct stat st1, st2; mp = *mpp; /* should we preserve the numbering of the message? */ if (preserve && (msgnum = m_atoi(msgfile)) > 0) { ; } else if (mp->nummsg == 0) { /* check if we are adding to empty folder */ msgnum = 1; } else { /* else use highest message number + 1 */ msgnum = mp->hghmsg + 1; } /* ** We might need to make several attempts ** in order to add the message to the folder. */ for (;; msgnum++) { /* ** See if we need more space. If we need space at the ** end, then we allocate space for an addition 100 messages. ** If we need space at the beginning of the range, then just ** extend message status range to cover this message number. */ if (msgnum > mp->hghoff) { if ((mp = folder_realloc(mp, mp->lowoff, msgnum + 100))) *mpp = mp; else { advise(NULL, "unable to allocate folder storage"); return -1; } } else if (msgnum < mp->lowoff) { if ((mp = folder_realloc(mp, msgnum, mp->hghoff))) *mpp = mp; else { advise(NULL, "unable to allocate folder storage"); return -1; } } /* ** If a message is already in that slot, ** then loop to next available slot. */ if (does_exist(mp, msgnum)) continue; /* setup the bit flags for this message */ clear_msg_flags(mp, msgnum); set_exists(mp, msgnum); /* should we set the SELECT_UNSEEN bit? */ if (unseen) { set_unseen(mp, msgnum); } /* should we set the SELECTED bit? */ if (selected) { set_selected(mp, msgnum); } /* ** check if this is highest or lowest message */ if (mp->nummsg == 0) { mp->lowmsg = msgnum; mp->hghmsg = msgnum; } else { if (msgnum < mp->lowmsg) mp->lowmsg = msgnum; if (msgnum > mp->hghmsg) mp->hghmsg = msgnum; } /* increment message count */ mp->nummsg++; nmsg = m_name(msgnum); snprintf(newmsg, sizeof(newmsg), "%s/%s", mp->foldpath, nmsg); /* ** Now try to link message into folder. Then run the ** external hook on the message if one was specified in ** the context. Run the refile hook if we're moving the ** message from one place to another. We have to construct ** the from path name for this because it's not there. ** Run the add hook if the message is getting copied or ** linked somewhere else. */ if (link(msgfile, newmsg) != -1) { if (deleting) { snprintf(oldmsg, sizeof (oldmsg), "%s/%s", from_dir, msgfile); ext_hook("ref-hook", oldmsg, newmsg); } else ext_hook("add-hook", newmsg, NULL); return msgnum; } else { linkerr = errno; /* ** Check if the file in our desired location is ** the same as the source file. If so, then just ** leave it alone and return. Otherwise, we will ** continue the main loop and try again at another ** slot (hghmsg+1). */ if (linkerr == EEXIST) { if (stat(msgfile, &st2) == 0 && stat(newmsg, &st1) == 0 && st2.st_ino == st1.st_ino) { return msgnum; } else { continue; } } /* ** If link failed because we are trying to link ** across devices, then check if there is a message ** already in the desired location. If so, then return ** error, else just copy the message. */ if (linkerr == EXDEV) { if (stat(newmsg, &st1) == 0) { advise(NULL, "message %s:%s already exists", mp->foldpath, newmsg); return -1; } else { if ((infd = open(msgfile, O_RDONLY)) == -1) { advise(msgfile, "unable to open message %s", msgfile); return -1; } fstat(infd, &st1); if ((outfd = creat(newmsg, (int) st1.st_mode & 0777)) == -1) { advise(newmsg, "unable to create"); close(infd); return -1; } cpydata(infd, outfd, msgfile, newmsg); close(infd); close(outfd); if (deleting) { snprintf(oldmsg, sizeof oldmsg, "%s/%s", from_dir, msgfile); ext_hook("ref-hook", oldmsg, newmsg); } else ext_hook("add-hook", newmsg, NULL); return msgnum; } } /* ** Else, some other type of link error, ** so just return error. */ advise(newmsg, "error linking %s to", msgfile); return -1; } } } mmh-0.4/sbr/seq_setcur.c0000644000000000000000000000064413414435726013760 0ustar rootroot/* ** seq_setcur.c -- set the current message (cur sequence) for a folder ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include void seq_setcur(struct msgs *mp, int msgnum) { /* Just call seq_addmsg() to update the cur sequence. */ seq_addmsg(mp, seq_cur, msgnum, -1, 1); } mmh-0.4/sbr/m_getfld2.c0000644000000000000000000001020213414435726013435 0ustar rootroot/* ** m_getfld2 -- replacement for m_getfld() ** read an RFC 822 message */ #define _WITH_GETLINE #define _POSIX_C_SOURCE 200809L #include #include #include #include enum threestate { B_TRUE = 1, B_FALSE = 0, FAIL = -1, }; /* ** static prototypes */ static enum threestate is_falted(FILE *); static size_t copyname(char *, char *); static boolean is_separator(char *); /* ** FLD2: We read a (complete) header field ** BODY2: We read a body line ** LENERR2: Line is too long (>998, as defined by RFC 822) ** FMTERR2: Header field invalid ** IOERR2: Failure to read ** FILEEOF2: We're at the end of the file ** ** f->name is only filled in FLD2. ** ** In FLD2, f->value contains the field's (complete) value only; ** in BODY2, LENERR2 and FMTERR2 f->value contains the whole line; ** in IOERR2 and FILEEOF2 f->value is not set. */ enum state m_getfld2(enum state s, struct field *f, FILE *msg) { char *tmpline = NULL; size_t len = 0; ssize_t nchars; enum threestate falted = B_FALSE; enum state ret = s; switch (s) { case FLD2: nchars = getline(&tmpline, &len, msg); if (nchars < 1) { free(f->value); *f = (struct field) { "\0", 0, NULL, 0, 0 }; if (feof(msg)) { return FILEEOF2; } else { return IOERR2; } } f->crlf = (nchars > 2 && tmpline[nchars-2] == '\r'); if (nchars > NAMESZ+1 || (!f->crlf && nchars > NAMESZ)) { ret = LENERR2; } if (*(tmpline + nchars - 1) != '\n') { ret = FMTERR2; } if (ret == FLD2 && is_separator(tmpline)) { /* header/body separator found */ free(tmpline); return m_getfld2(BODY2, f, msg); } f->namelen = copyname(f->name, tmpline); if (f->namelen < 1) { *f->name = '\0'; f->namelen = 0; ret = FMTERR2; } /* copy the field's value */ if (f->alloclen <= nchars - f->namelen) { f->value = mh_xrealloc(f->value, f->alloclen + len); f->alloclen += len; } if (f->namelen != 0) { strcpy(f->value, tmpline + f->namelen + 1); f->valuelen = nchars - f->namelen - 1; } else { strcpy(f->value, tmpline); f->valuelen = nchars; } while ((ret == FLD2 || ret == LENERR2) && (falted = is_falted(msg)) == B_TRUE) { nchars = getline(&tmpline, &len, msg); if (nchars <= 0) { free(tmpline); return IOERR2; } if (nchars > NAMESZ+1 || (!f->crlf && nchars > NAMESZ)) { ret = LENERR2; } if (*(tmpline + nchars - 1) != '\n') { ret = FMTERR2; } if (f->alloclen - f->valuelen <= nchars) { f->value = mh_xrealloc(f->value, f->alloclen + len); f->alloclen += len; } strcpy(f->value + f->valuelen, tmpline); f->valuelen += nchars; } if (falted == FAIL) { ret = IOERR2; } free(tmpline); return ret; case BODY2: *f->name = '\0'; f->namelen = 0; nchars = getline(&tmpline, &len, msg); if (nchars < 1) { free(f->value); f->value = NULL; f->valuelen = 0; f->alloclen = 0; if (feof(msg)) { return FILEEOF2; } else { return IOERR2; } } f->crlf = (nchars > 2 && tmpline[nchars-2] == '\r'); free(f->value); f->value = tmpline; f->valuelen = nchars; f->alloclen = len; return ret; default: /* give error states back as received */ return s; } } static enum threestate is_falted(FILE *msg) { enum threestate ret; int c; if ((c = getc(msg)) < 0) { if (feof(msg)) { clearerr(msg); return B_FALSE; } else { return FAIL; } } if (isblank(c)) { ret = B_TRUE; } else { ret = B_FALSE; } if (ungetc(c, msg) != c) { return FAIL; } return ret; } static size_t copyname(char *dst, char *src) { size_t len; char *cp, *sep; if (!(sep = strchr(src, ':'))) { return 0; } /* whitespace is forbidden in name */ for (cp=src; cp= NAMESZ - 1) { return 0; } src[len] = '\0'; strcpy(dst, src); return strlen(dst); } static boolean is_separator(char *line) { /* ** In MH, lines that are consists of dashes only are ** separators as well ... not so in RFC 822. */ while (*line == '-') { line++; } if (strcmp("\n", line) == 0 || strcmp("\r\n", line) == 0 ) { return TRUE; } return FALSE; } mmh-0.4/sbr/concat.c0000644000000000000000000000155213414435726013051 0ustar rootroot/* ** concat.c -- concatenate a variable number (minimum of 1) ** of strings in managed memory ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include static char * copy(char *from, char *to) { while ((*to = *from)) { to++; from++; } return (to); } char * concat(char *s1, ...) { char *cp, *dp, *sp; size_t len; va_list list; len = strlen(s1) + 1; va_start(list, s1); while ((cp = va_arg(list, char *))) len += strlen(cp); va_end(list); dp = sp = mh_xcalloc(len, sizeof(char)); sp = copy(s1, sp); va_start(list, s1); while ((cp = va_arg(list, char *))) sp = copy(cp, sp); va_end(list); return dp; } mmh-0.4/sbr/seq_setunseen.c0000644000000000000000000000303113414435726014455 0ustar rootroot/* ** seq_setunseen.c -- add/delete all messages which have the SELECT_UNSEEN ** -- bit set to/from the Unseen-Sequence ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include /* ** We scan through the folder and act upon all messages ** that are marked with the SELECT_UNSEEN bit. ** ** Either add messages to or (if doadd is false) delete messages from ** the unseen sequence(s). */ void seq_setunseen(struct msgs *mp, int doadd) { int n; char **ap, *cp, *dp; if (mp->lowmsg == 0) { return; } /* ** Get the list of sequences for Unseen-Sequence ** and split them. */ if ((cp = context_find(usequence))) { dp = mh_xstrdup(cp); } else { /* not set in profile, thus use the default */ dp = mh_xstrdup(seq_unseen); } if (!(ap = brkstring(dp, " ", "\n")) || !*ap) { /* contains no sequence name, i.e. we're finished */ mh_free0(&dp); return; } /* ** Now add/delete each message which has the SELECT_UNSEEN ** bit set to/from each of these sequences. */ for (; *ap; ap++) { if (doadd) { for (n = mp->lowmsg; n <= mp->hghmsg; n++) { if (is_unseen(mp, n)) { seq_addmsg(mp, *ap, n, -1, 0); } } } else { /* make sure sequence exists first */ if (seq_getnum(mp, *ap) != -1) { for (n = mp->lowsel; n <= mp->hghsel; n++) { if (is_unseen(mp, n)) { seq_delmsg(mp, *ap, n); } } } } } mh_free0(&dp); } mmh-0.4/sbr/signals.c0000644000000000000000000000331513414435726013241 0ustar rootroot/* ** signals.c -- general signals interface for nmh ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include /* ** A version of the function `signal' that uses reliable ** signals, if the machine supports them. Also, (assuming ** OS support), it restarts interrupted system calls for all ** signals except SIGALRM. ** ** Since we are now assuming POSIX signal support everywhere, we always ** use reliable signals. */ SIGNAL_HANDLER SIGNAL(int sig, SIGNAL_HANDLER func) { struct sigaction act, oact; act.sa_handler = func; sigemptyset(&act.sa_mask); act.sa_flags = 0; if (sig == SIGALRM) { # ifdef SA_INTERRUPT act.sa_flags |= SA_INTERRUPT; /* SunOS */ # endif } else { # ifdef SA_RESTART act.sa_flags |= SA_RESTART; /* SVR4, BSD4.4 */ # endif } if (sigaction(sig, &act, &oact) < 0) return (SIG_ERR); return (oact.sa_handler); } /* ** A version of the function `signal' that will set ** the handler of `sig' to `func' if the signal is ** not currently set to SIG_IGN. Also uses reliable ** signals if available. */ SIGNAL_HANDLER SIGNAL2(int sig, SIGNAL_HANDLER func) { struct sigaction act, oact; if (sigaction(sig, NULL, &oact) < 0) return (SIG_ERR); if (oact.sa_handler != SIG_IGN) { act.sa_handler = func; sigemptyset(&act.sa_mask); act.sa_flags = 0; if (sig == SIGALRM) { # ifdef SA_INTERRUPT act.sa_flags |= SA_INTERRUPT; /* SunOS */ # endif } else { # ifdef SA_RESTART act.sa_flags |= SA_RESTART; /* SVR4, BSD4.4 */ # endif } if (sigaction(sig, &act, &oact) < 0) return (SIG_ERR); } return (oact.sa_handler); } mmh-0.4/sbr/m_gmprot.c0000644000000000000000000000057613414435726013433 0ustar rootroot/* ** m_gmprot.c -- return the msg-protect value ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include int m_gmprot(void) { char *cp; if (!(cp = context_find("msg-protect")) || !*cp) { cp = msgprot; } return strtol(cp, NULL, 8); } mmh-0.4/sbr/seq_save.c0000644000000000000000000000541313414435726013410 0ustar rootroot/* ** seq_save.c -- 1) synchronize sequences ** -- 2) save public sequences ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include /* ** 1. If sequence is public and folder is readonly, ** then change it to be private ** 2a. If sequence is public, then add it to the sequences file ** in folder (name specified by mh-sequences profile entry). ** 2b. If sequence is private, then add it to the ** context file. */ void seq_save(struct msgs *mp) { int i; char flags, *cp, attr[BUFSIZ], seqfile[PATH_MAX]; FILE *fp; sigset_t set, oset; /* check if sequence information has changed */ if (!(mp->msgflags & SEQMOD)) return; mp->msgflags &= ~SEQMOD; fp = NULL; flags = mp->msgflags; /* record folder flags */ /* ** If no mh-sequences file is defined, or if a mh-sequences file ** is defined but empty (*mh_seq == '\0'), then pretend folder ** is readonly. This will force all sequences to be private. */ if (mh_seq == NULL || *mh_seq == '\0') set_readonly(mp); else snprintf(seqfile, sizeof(seqfile), "%s/%s", mp->foldpath, mh_seq); for (i = 0; mp->msgattrs[i]; i++) { snprintf(attr, sizeof(attr), "atr-%s-%s", mp->msgattrs[i], mp->foldpath); /* get space separated list of sequence ranges */ if (!(cp = seq_list(mp, mp->msgattrs[i]))) { context_del(attr); /* delete sequence from context */ continue; } if (is_readonly(mp) || is_seq_private(mp, i)) { priv: /* sequence is private */ context_replace(attr, cp); /* update seq in ctx */ } else { /* sequence is public */ context_del(attr); /* delete sequence from context */ if (!fp) { /* ** Attempt to open file for public sequences. ** If that fails (probably because folder is ** readonly), then make sequence private. */ if ((fp = lkfopen(seqfile, "w")) == NULL && (unlink(seqfile) == -1 || (fp = lkfopen(seqfile, "w")) == NULL)) { admonish(attr, "unable to write"); goto priv; } /* block a few signals */ sigemptyset(&set); sigaddset(&set, SIGHUP); sigaddset(&set, SIGINT); sigaddset(&set, SIGQUIT); sigaddset(&set, SIGTERM); sigprocmask(SIG_BLOCK, &set, &oset); } fprintf(fp, "%s: %s\n", mp->msgattrs[i], cp); } } if (fp) { lkfclose(fp, seqfile); sigprocmask(SIG_SETMASK, &oset, &set); /* reset signal mask */ } else { /* ** If folder is not readonly, and we didn't save any ** public sequences, then remove that file. */ if (!is_readonly(mp)) unlink(seqfile); } /* ** Reset folder flag, since we may be ** pretending that folder is readonly. */ mp->msgflags = flags; } mmh-0.4/sbr/utils.c0000644000000000000000000001054413414435726012743 0ustar rootroot/* ** utils.c -- various utility routines ** ** This code is Copyright (c) 2006, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include /* ** We allocate space for messages (msgs array) ** this number of elements at a time. */ #define MAXMSGS 256 /* ** Safely call realloc */ void * mh_xrealloc(void *ptr, size_t size) { void *memory; /* Some non-POSIX realloc()s don't cope with realloc(NULL,sz) */ if (!ptr) { return mh_xcalloc(1, size); } if (size == 0) { adios(EX_SOFTWARE, NULL, "Tried to realloc 0 bytes"); } memory = realloc(ptr, size); if (!memory) { adios(EX_OSERR, NULL, "Realloc failed"); } return memory; } /* ** Safely call calloc */ void * mh_xcalloc(size_t nmemb, size_t size) { void *memory; if (nmemb == 0 || size == 0) { adios(EX_SOFTWARE, NULL, "Tried to calloc 0 bytes"); } if ((memory = calloc(nmemb, size))) { return memory; } else { adios(EX_OSERR, NULL, "calloc failed"); } } /* ** Free a pointer and set it to NULL. */ void mh_free0(void * ptr) { void ** p; p = ptr; free(*p); *p = NULL; } /* ** Return the present working directory, if the current directory does not ** exist, or is too long, make / the pwd. */ char * pwd(void) { char *cp; static char curwd[PATH_MAX]; if (!getcwd(curwd, PATH_MAX)) { admonish(NULL, "unable to determine working directory"); if (!mypath || !*mypath || (strcpy(curwd, mypath), chdir(curwd)) == -1) { strcpy(curwd, "/"); chdir(curwd); } return curwd; } if ((cp = curwd + strlen(curwd) - 1) > curwd && *cp == '/') { /* strip trailing slash */ *cp = '\0'; } return curwd; } /* ** add -- If "s1" is NULL, this routine just creates a ** -- copy of "s2" into newly malloc'ed memory. ** -- (use mh_xstrdup() instead in this case) ** -- ** -- If "s1" is not NULL, then copy the concatenation ** -- of "s1" and "s2" (note the order) into newly ** -- malloc'ed memory. Then free "s1". */ char * add(const char *s2, char *s1) { char *cp; size_t len1 = 0, len2 = 0; if (s1) { len1 = strlen(s1); } if (s2) { len2 = strlen(s2); } cp = mh_xcalloc(len1 + len2 + 1, sizeof(char)); /* Copy s1 and free it */ if (s1) { memcpy(cp, s1, len1); mh_free0(&s1); } /* Copy s2 */ if (s2) { memcpy(cp + len1, s2, len2); } /* Now NULL terminate the string */ cp[len1 + len2] = '\0'; return cp; } /* ** create_folder ** Check to see if a folder exists, if not, prompt the user to create it. */ void create_folder(char *folder, int autocreate, void (*done_callback)(int)) { struct stat st; extern int errno; char *cp; if (stat(folder, &st) == -1) { if (errno != ENOENT) { adios(EX_IOERR, folder, "error on folder"); } if (autocreate == 0) { /* ask before creating folder */ cp = concat("Create folder \"", folder, "\"? ", NULL); if (!getanswer(cp)) { done_callback(EX_CANTCREAT); } mh_free0(&cp); } else if (autocreate == -1) { /* do not create, so exit */ done_callback(EX_CANTCREAT); } if (!makedir(folder)) { adios(EX_CANTCREAT, NULL, "unable to create folder %s", folder); } } } /* ** num_digits ** Return the number of digits in a nonnegative integer. */ int num_digits(int n) { int ndigits = 0; /* Sanity check */ if (n < 0) { adios(EX_SOFTWARE, NULL, "oops, num_digits called with negative value"); } if (n == 0) { return 1; } while (n) { n /= 10; ndigits++; } return ndigits; } /* ** Append a message arg to an array of them, resizing it if necessary. ** The function is written to suit the arg parsing code it was extracted ** from, and will probably be changed when the other code is cleaned up. */ void app_msgarg(struct msgs_array *msgs, char *cp) { if(msgs->size >= msgs->max) { msgs->msgs = mh_xrealloc(msgs->msgs, (msgs->max+=MAXMSGS)*sizeof(*msgs->msgs)); } msgs->msgs[msgs->size++] = cp; } /* ** mh_xstrdup() is a wrapper of strdup() to replace getcpy(). It returns ** a copy of its argument if this is nonnull; otherwise, it returns a ** string of length 0. */ char * mh_xstrdup(const char * s) { char * tmp; tmp = strdup(s ? s : ""); if (!tmp) { adios(EX_OSERR, "strdup", "can't copy string"); } return tmp; } mmh-0.4/sbr/gans.c0000644000000000000000000000156213414435726012533 0ustar rootroot/* ** gans.c -- get an answer from the user ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include int gans(char *prompt, struct swit *ansp) { int i; char *cp; struct swit *ap; char ansbuf[BUFSIZ]; for (;;) { printf("%s", prompt); fflush(stdout); cp = ansbuf; while ((i = getchar()) != '\n') { if (i == EOF) return 0; if (cp < &ansbuf[sizeof ansbuf - 1]) { *cp++ = tolower(i); } } *cp = '\0'; if (ansbuf[0] == '?' || cp == ansbuf) { printf("Options are:\n"); for (ap = ansp; ap->sw; ap++) printf(" %s\n", ap->sw); continue; } if ((i = smatch(ansbuf, ansp)) < 0) { printf("%s: %s.\n", ansbuf, i == -1 ? "unknown" : "ambiguous"); continue; } return i; } } mmh-0.4/sbr/folder_delmsgs.c0000644000000000000000000000242713414435726014575 0ustar rootroot/* ** folder_delmsgs.c -- remove (= unlink) SELECTED messages from a folder ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include /* ** Unlink the SELECTED messages. ** ** If there is an error, return -1, else return 0. */ int folder_delmsgs(struct msgs *mp, int hook) { int msgnum, retval = 0; char msgpath[BUFSIZ]; for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (!is_selected(mp, msgnum)) { continue; } /* unselect message */ unset_selected(mp, msgnum); snprintf(msgpath, sizeof (msgpath), "%s/%d", mp->foldpath, msgnum); if (hook) { /* Run the external hook on the message. */ ext_hook("del-hook", msgpath, NULL); } /* just unlink the messages */ if (unlink(msgpath) == -1) { admonish(msgpath, "unable to unlink"); retval = -1; continue; } /* If removal was successful, decrement message count */ unset_exists(mp, msgnum); mp->nummsg--; } /* Sanity check */ if (mp->numsel != 0) adios(EX_SOFTWARE, NULL, "oops, mp->numsel should be 0"); /* Mark that the sequence information has changed */ mp->msgflags |= SEQMOD; return retval; } mmh-0.4/sbr/fmt_rfc2047.c0000644000000000000000000002204213414435726013534 0ustar rootroot/* ** fmt_rfc2047.c -- decode RFC-2047 header format ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #ifdef HAVE_ICONV # include # include #endif static signed char hexindex[] = { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1, -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 }; static signed char index_64[128] = { -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63, 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1,-1,-1,-1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14, 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1, -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 }; #define char64(c) (((unsigned char) (c) > 127) ? -1 : index_64[(unsigned char) (c)]) static int unqp(unsigned char byte1, unsigned char byte2) { if (hexindex[byte1] == -1 || hexindex[byte2] == -1) return -1; return (hexindex[byte1] << 4 | hexindex[byte2]); } /* Check if character is linear whitespace */ #define is_lws(c) ((c) == ' ' || (c) == '\t' || (c) == '\n') /* ** Decode the string as a RFC-2047 header field */ /* Add character to the destination buffer, and bomb out if it fills up */ #define ADDCHR(C) do { *q++ = (C); dstlen--; if (!dstlen) goto buffull; } while (0) int decode_rfc2047(char *str, char *dst, size_t dstlen) { char *p, *q, *pp; char *startofmime, *endofmime; int c, quoted_printable; int encoding_found = 0; /* did we decode anything? */ int between_encodings = 0; /* are we between two encodings? */ int equals_pending = 0; /* is there a '=' pending? */ int whitespace = 0; /* how much whitespace between encodings? */ #ifdef HAVE_ICONV int use_iconv = 0; /* are we converting encoding with iconv? */ iconv_t cd = NULL; int fromutf8 = 0; char *saveq, *convbuf = NULL; size_t savedstlen; #endif if (!str) return 0; /* ** Do a quick and dirty check for the '=' character. ** This should quickly eliminate many cases. */ if (!strchr(str, '=')) return 0; for (p = str, q = dst; *p; p++) { /* reset iconv */ #ifdef HAVE_ICONV if (use_iconv) { iconv_close(cd); use_iconv = 0; } #endif /* ** If we had an '=' character pending from ** last iteration, then add it first. */ if (equals_pending) { ADDCHR('='); equals_pending = 0; between_encodings = 0; /* we have added non-whitespace text */ } if (*p != '=') { /* count linear whitespace while between encodings */ if (between_encodings && is_lws(*p)) whitespace++; else between_encodings = 0; /* we have added non-whitespace text */ ADDCHR(*p); continue; } equals_pending = 1; /* we have a '=' pending */ /* Check for initial =? */ if (*p == '=' && p[1] && p[1] == '?' && p[2]) { startofmime = p + 2; /* Scan ahead for the next '?' character */ for (pp = startofmime; *pp && *pp != '?'; pp++) ; if (!*pp) continue; *pp = '\0'; /* Check if character set can be handled natively */ if (!is_native_charset(startofmime)) { #ifdef HAVE_ICONV /* .. it can't. We'll use iconv then. */ cd = iconv_open(get_charset(), startofmime); fromutf8 = !mh_strcasecmp(startofmime, "UTF-8"); *pp = '?'; if (cd == (iconv_t)-1) continue; use_iconv = 1; #else *pp = '?'; continue; #endif } *pp = '?'; startofmime = pp + 1; /* Check for valid encoding type */ if (*startofmime != 'B' && *startofmime != 'b' && *startofmime != 'Q' && *startofmime != 'q') continue; /* Is encoding quoted printable or base64? */ quoted_printable = (*startofmime == 'Q' || *startofmime == 'q'); startofmime++; /* Check for next '?' character */ if (*startofmime != '?') continue; startofmime++; /* ** Scan ahead for the ending ?= ** ** While doing this, we will also check if encoded ** word has any embedded linear whitespace. */ endofmime = NULL; for (pp = startofmime; *pp && *(pp+1); pp++) { if (is_lws(*pp)) { break; } else if (*pp == '?' && pp[1] == '=') { endofmime = pp; break; } } if (is_lws(*pp) || endofmime == NULL) continue; /* ** We've found an encoded word, so we can drop ** the '=' that was pending */ equals_pending = 0; /* ** If we are between two encoded words separated ** only by linear whitespace, then we ignore ** the whitespace. We will roll back the buffer ** the number of whitespace characters we've seen ** since last encoded word. */ if (between_encodings) { q -= whitespace; dstlen += whitespace; } #ifdef HAVE_ICONV /* ** empty encoded text. This ensures that we don't ** malloc 0 bytes but skip on to the end */ if (endofmime == startofmime && use_iconv) { use_iconv = 0; iconv_close(cd); } if (use_iconv) { saveq = q; savedstlen = dstlen; q = convbuf = mh_xcalloc(endofmime - startofmime, sizeof(char)); } /* ** ADDCHR2 is for adding characters when q is or might be convbuf: ** in this case on buffer-full we want to run iconv before returning. ** I apologise for the dreadful name. */ # define ADDCHR2(C) do { *q++ = (C); dstlen--; if (!dstlen) goto iconvbuffull; } while (0) #else # define ADDCHR2(C) ADDCHR(C) #endif /* Now decode the text */ if (quoted_printable) { for (pp = startofmime; pp < endofmime; pp++) { if (*pp == '=') { c = unqp(pp[1], pp[2]); if (c == -1) continue; if (c != 0) *q++ = c; pp += 2; } else if (*pp == '_') { ADDCHR2(' '); } else { ADDCHR2(*pp); } } } else { /* base64 */ int c1, c2, c3, c4; c1 = c2 = c3 = c4 = -1; pp = startofmime; while (pp < endofmime) { /* 6 + 2 bits */ while ((pp < endofmime) && ((c1 = char64(*pp)) == -1)) { pp++; } if (pp < endofmime) { pp++; } while ((pp < endofmime) && ((c2 = char64(*pp)) == -1)) { pp++; } if (pp < endofmime && c1 != -1 && c2 != -1) { ADDCHR2((c1 << 2) | (c2 >> 4)); pp++; } /* 4 + 4 bits */ while ((pp < endofmime) && ((c3 = char64(*pp)) == -1)) { pp++; } if (pp < endofmime && c2 != -1 && c3 != -1) { ADDCHR2(((c2 & 0xF) << 4) | (c3 >> 2)); pp++; } /* 2 + 6 bits */ while ((pp < endofmime) && ((c4 = char64(*pp)) == -1)) { pp++; } if (pp < endofmime && c3 != -1 && c4 != -1) { ADDCHR2(((c3 & 0x3) << 6) | (c4)); pp++; } } } #ifdef HAVE_ICONV iconvbuffull: /* ** NB that the string at convbuf is not necessarily ** NUL terminated here: ** q points to the first byte after the valid part. */ /* Convert to native character set */ if (use_iconv) { size_t inbytes = q - convbuf; ICONV_CONST char *start = convbuf; while (inbytes) { if (iconv(cd, &start, &inbytes, &saveq, &savedstlen) == (size_t)-1) { if (errno != EILSEQ) break; /* ** character couldn't be ** converted. we output a ** `?' and try to carry on ** which won't work if either ** encoding was stateful */ iconv(cd, 0, 0, &saveq, &savedstlen); if (!savedstlen) break; *saveq++ = '?'; savedstlen--; if (!savedstlen) break; /* skip to next input character */ if (fromutf8) { inbytes--; start++; while ((start < q) && ((*start & 192) == 128)) { start++; inbytes--; } } else start++, inbytes--; if (start >= q) break; } } q = saveq; /* ** Stop now if (1) we hit the end of the ** buffer trying to do MIME decoding and ** have just iconv-converted a partial ** string or (2) our iconv-conversion hit ** the end of the buffer. */ if (!dstlen || !savedstlen) goto buffull; dstlen = savedstlen; mh_free0(&convbuf); } #endif /* ** Now that we are done decoding this particular ** encoded word, advance string to trailing '='. */ p = endofmime + 1; encoding_found = 1; /* we found (at least 1) encoded word */ between_encodings = 1; /* we have just decoded something */ whitespace = 0; /* re-initialize amount of whitespace */ } } #ifdef HAVE_ICONV if (use_iconv) iconv_close(cd); #endif /* If an equals was pending at end of string, add it now. */ if (equals_pending) ADDCHR('='); *q = '\0'; return encoding_found; buffull: /* ** q is currently just off the end of the buffer, ** so rewind to NUL terminate */ q--; *q = '\0'; return encoding_found; } mmh-0.4/sbr/seq_bits.c0000644000000000000000000000107113414435726013407 0ustar rootroot/* ** seq_bits.c -- return the snprintb() string for a sequence ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include char * seq_bits(struct msgs *mp) { int i; size_t len; static char buffer[BUFSIZ]; strncpy(buffer, MBITS, sizeof(buffer)); for (i = 0; mp->msgattrs[i]; i++) { len = strlen(buffer); snprintf(buffer + len, sizeof(buffer) - len, "%c%s", FFATTRSLOT + 1 + i, mp->msgattrs[i]); } return buffer; } mmh-0.4/sbr/putenv.c0000644000000000000000000000227113414435726013122 0ustar rootroot/* ** putenv.c -- (un)set an envariable ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include extern char **environ; /* ** prototypes */ int m_putenv(char *, char *); int unputenv(char *); static int nvmatch(char *, char *); int m_putenv(char *name, char *value) { int i; char **ep, **nep, *cp; cp = mh_xcalloc(strlen(name) + strlen(value) + 2, sizeof(char)); sprintf(cp, "%s=%s", name, value); for (ep = environ, i = 0; *ep; ep++, i++) if (nvmatch(name, *ep)) { *ep = cp; return 0; } nep = mh_xcalloc(i + 2, sizeof(*nep)); for (ep = environ, i = 0; *ep; nep[i++] = *ep++) continue; nep[i++] = cp; nep[i] = NULL; environ = nep; return 0; } int unputenv(char *name) { char **ep, **nep; for (ep = environ; *ep; ep++) if (nvmatch(name, *ep)) break; if (*ep == NULL) return 1; for (nep = ep + 1; *nep; nep++) continue; *ep = *--nep; *nep = NULL; return 0; } static int nvmatch(char *s1, char *s2) { while (*s1 == *s2++) if (*s1++ == '=') return 1; return (*s1 == '\0' && *--s2 == '='); } mmh-0.4/sbr/strindex.c0000644000000000000000000000104513414435726013437 0ustar rootroot/* ** strindex.c -- "unsigned" lexical index ** -- Returns the index at which `needle' appears in `haystack' ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include int stringdex(char *needle, char *haystack) { char *p; if (needle == NULL || haystack == NULL) return -1; for (p = haystack; *p; p++) if (strncasecmp(p, needle, strlen(needle))==0) return (p - haystack); return -1; } mmh-0.4/sbr/encode_rfc2047.c0000644000000000000000000003360013414435726014205 0ustar rootroot/* ** Routines to encode message headers using RFC 2047-encoding. ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include /* ** List of headers that contain addresses and as a result require special ** handling */ static char *address_headers[] = { "To", "From", "cc", "Bcc", "Reply-To", "Sender", "Resent-To", "Resent-From", "Resent-cc", "Resent-Bcc", "Resent-Reply-To", "Resent-Sender", NULL, }; /* ** Macros we use for parsing headers ** ** Todo: convert the macros to functions */ #define is_fws(c) (c == '\t' || c == ' ' || c == '\n') #define qphrasevalid(c) ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || \ (c >= 'a' && c <= 'z') || \ c == '!' || c == '*' || c == '+' || c == '-' || \ c == '/' || c == '=' || c == '_') #define qpspecial(c) (c < ' ' || c == '=' || c == '?' || c == '_') #define ENCODELINELIMIT 76 static void unfold_header(char **, int); static int field_encode_address(const char *, char **, const char *); static int field_encode_quoted(const char *, char **, const char *, int, int, int); static int scanstring(const char *, int *, int *, int *); static int utf8len(const char *); /* ** Encode a message header using RFC 2047 encoding. We make the assumption ** that all characters < 128 are ASCII and as a consequence don't need any ** encoding. */ int encode_rfc2047(const char *name, char **value, const char *charset) { int i, asciicount = 0, eightbitcount = 0, qpspecialcount = 0; char *p; /* First, check to see if we even need to encode the header */ for (p = *value; *p != '\0'; p++) { if (isascii((unsigned char) *p)) { asciicount++; if (qpspecial((unsigned char) *p)) { qpspecialcount++; } } else { eightbitcount++; } } if (eightbitcount == 0) { return 0; } /* ** Some rules from RFC 2047: ** ** - Encoded words cannot be more than 75 characters long ** - Multiple "long" encoded words must be on new lines. ** ** Also, we're not permitted to encode email addresses, so ** we need to actually _parse_ email addresses and only encode ** the right bits. */ /* ** If charset was NULL, then get the value from the locale. But ** we reject it if it returns US-ASCII */ if (charset == NULL) { charset = write_charset_8bit(); } if (strcasecmp(charset, "US-ASCII") == 0) { advise(NULL, "Cannot use US-ASCII with 8 bit characters in header"); return 1; } /* ** If we have an address header, then we need to parse the addresses ** and only encode the names or comments. Otherwise, handle it ** normally. */ for (i = 0; address_headers[i]; i++) { if (strcasecmp(name, address_headers[i]) == 0) { return field_encode_address(name, value, charset); } } /* ** On the encoding we choose, and the specifics of encoding: ** ** - If a specified encoding is passed in, we use that. ** - Otherwise, pick which encoding is shorter. ** ** We don't quite handle continuation right here, but it should be ** pretty close. */ unfold_header(value, asciicount + eightbitcount); return field_encode_quoted(name, value, charset, asciicount, eightbitcount + qpspecialcount, 0); } /* ** Encode our specified header (or field) using quoted-printable */ static int field_encode_quoted(const char *name, char **value, const char *charset, int ascii, int encoded, int phraserules) { int prefixlen = name ? strlen(name) + 2: 0; int outlen = 0, column, newline = 1, utf8; int charsetlen = strlen(charset); char *output = NULL, *p, *q = NULL; /* ** Right now we just encode the whole thing. Maybe later on we'll ** only encode things on a per-atom basis. */ p = *value; column = prefixlen + 2; /* Header name plus ": " */ utf8 = strcasecmp(charset, "UTF-8") == 0; while (*p != '\0') { /* Start a new line, if it's time */ if (newline) { int tokenlen; /* ** If it's the start of the header, we don't need ** to pad it ** ** The length of the output string is ... ** =?charset?Q?...?= so that's ** 7+strlen(charset) + 2 for \n NUL ** ** plus 1 for every ASCII character and 3 for ** every eight bit or special character (eight ** bit characters are written as =XX). */ outlen += 9 + charsetlen + ascii + 3 * encoded; if (output) { /* continue the header */ int curlen = q - output, i; outlen += prefixlen + 1; /* Header plus \n ": " */ output = mh_xrealloc(output, outlen); q = output + curlen; *q++ = '?'; *q++ = '='; *q++ = '\n'; for (i = 0; i < prefixlen; i++) { *q++ = ' '; } } else { /* do the initial allocation */ /* ** A bit of a hack here; the header can ** contain multiple spaces (probably at ** least one) until we get to the actual ** text. Copy until we get to a non-space. */ output = mh_xcalloc(outlen, sizeof(char)); q = output; while (is_fws(*p)) { *q++ = *p++; } } tokenlen = snprintf(q, outlen - (q - output), "=?%s?Q?", charset); q += tokenlen; column = prefixlen + tokenlen; newline = 0; } /* ** Process each character, encoding if necessary ** ** Note that we have a different set of rules if we're ** processing RFC 5322 'phrase' (something you'd see in ** an address header). */ column++; if (*p == ' ') { *q++ = '_'; ascii--; } else if (isascii((unsigned char) *p) && (phraserules ? qphrasevalid((unsigned char) *p) : !qpspecial((unsigned char) *p))) { *q++ = *p; ascii--; } else { snprintf(q, outlen - (q - output), "=%02X", (unsigned char) *p); q += 3; column += 2; /* column already incremented by 1 above */ encoded--; } p++; if (prefixlen == 0) { /* ** We haven't been passed in a header name, ** so don't ever wrap the field (we're likely ** doing an address). */ continue; } /* ** We're not allowed more than ENCODELINELIMIT characters ** per line, so reserve some room for the final ?=. */ if (column >= ENCODELINELIMIT - 2) { newline = 1; } else if (utf8) { /* ** Okay, this is a bit weird, but to explain a ** bit more ... ** ** RFC 2047 prohibits the splitting of multibyte ** characters across encoded words. Right now ** we only handle the case of UTF-8, the most ** common multibyte encoding. ** ** p is now pointing at the next input character. ** If we're using UTF-8 _and_ we'd go over ** ENCODELINELIMIT given the length of the ** complete character, then trigger a newline now. ** Note that we check the length * 3 since we ** have to allow for the encoded output. */ if (column + (utf8len(p)*3) > ENCODELINELIMIT - 2) { newline = 1; } } } if (q == NULL) { /* ** This should never happen, but just in case. ** Found by clang static analyzer. */ admonish (NULL, "null output encoding for %s", *value); return 1; } *q++ = '?'; *q++ = '='; if (prefixlen) { *q++ = '\n'; } *q = '\0'; mh_free0(value); *value = output; return 0; } /* ** Calculate the length of a UTF-8 character. ** ** If it's not a UTF-8 character (or we're in the middle of a multibyte ** character) then simply return 0. */ static int utf8len(const char *p) { int len = 1; if (*p == '\0') { return 0; } if (isascii((unsigned char) *p) || (((unsigned char) *p) & 0xc0) == 0x80) { return 0; } p++; while ((((unsigned char) *p++) & 0xc0) == 0x80) { len++; } return len; } /* ** "Unfold" a header, making it a single line (without continuation) ** ** We cheat a bit here; we never make the string longer, so using the ** original length here is fine. */ static void unfold_header(char **value, int len) { char *str = mh_xcalloc(len + 1, sizeof(char)); char *p = str, *q = *value; while (*q != '\0') { if (*q == '\n') { /* ** When we get a newline, skip to the next ** non-whitespace character and add a space to ** replace all of the whitespace ** ** This has the side effect of stripping off the ** final newline for the header; we put it back ** in the encoding routine. */ while (is_fws(*q)) { q++; } if (*q == '\0') { break; } *p++ = ' '; } else { *p++ = *q++; } } *p = '\0'; mh_free0(value); *value = str; } /* ** Decode a header containing addresses. This means we have to parse ** each address and only encode the display-name or comment field. */ static int field_encode_address(const char *name, char **value, const char *charset) { int prefixlen = strlen(name) + 2; int column = prefixlen, groupflag; int asciichars, specialchars, eightbitchars; int reformat = 0, errflag = 0; size_t len; char *mp, *cp = NULL, *output = NULL; char *tmpbuf = NULL; size_t tmpbufsize = 0; struct mailname *mn; char errbuf[BUFSIZ]; /* ** Because these are addresses, we need to handle them individually. ** ** Break them down and process them one by one. This means we ** have to rewrite the whole header, but that's unavoidable. */ /* ** The output headers always have to start with a space first; ** this is just the way the API works right now. */ output = add(" ", output); for (groupflag = 0; (mp = getname(*value)); ) { if ((mn = getm(mp, NULL, 0, AD_HOST, errbuf)) == NULL) { advise(NULL, "%s: %s", errbuf, mp); errflag++; continue; } reformat = 0; /* ** We only care if the phrase (m_pers) or any trailing ** comment (m_note) have 8-bit characters. If doing q-p, ** we also need to encode anything marked as qspecial(). ** Unquote it first so the specialchars count is right. */ if (! mn->m_pers) { goto check_note; } if ((len = strlen(mn->m_pers)) + 1 > tmpbufsize) { tmpbuf = mh_xrealloc(tmpbuf, tmpbufsize = len + 1); } unquote_string(mn->m_pers, tmpbuf); if (scanstring(tmpbuf, &asciichars, &eightbitchars, &specialchars)) { /* ** If we have 8-bit characters, encode it. */ /* ** This is okay, because the output of ** unquote_string will be either equal or shorter ** than the original. */ strcpy(mn->m_pers, tmpbuf); if (field_encode_quoted(NULL, &mn->m_pers, charset, asciichars, eightbitchars + specialchars, 1)) { errflag++; goto out; } reformat++; } check_note: /* ** The "note" field is generally a comment at the end ** of the address, at least as how it's implemented here. ** Notes are always surrounded by parenthesis (since they're ** comments). Strip them out and then put them back when ** we format the final field, but they do not get encoded. */ if (! mn->m_note) { goto do_reformat; } if ((len = strlen(mn->m_note)) + 1 > tmpbufsize) { tmpbuf = mh_xrealloc(tmpbuf, tmpbufsize = len + 1); } if (mn->m_note[0] != '(' || mn->m_note[len - 1] != ')') { advise(NULL, "Internal error: Invalid note field \"%s\"", mn->m_note); errflag++; goto out; } strncpy(tmpbuf, mn->m_note + 1, len - 1); tmpbuf[len - 2] = '\0'; if (scanstring(tmpbuf, &asciichars, &eightbitchars, &specialchars)) { /* ** If we have 8-bit characters, encode it. */ if (field_encode_quoted(NULL, &tmpbuf, charset, asciichars, eightbitchars + specialchars, 1)) { errflag++; goto out; } reformat++; /* ** Make sure the size of tmpbuf is correct (it ** always gets reallocated in the above functions). */ tmpbufsize = strlen(tmpbuf) + 1; /* ** Put the note field back surrounded by ** parenthesis. */ mn->m_note = mh_xrealloc(mn->m_note, tmpbufsize + 2); snprintf(mn->m_note, tmpbufsize + 2, "(%s)", tmpbuf); } do_reformat: /* ** So, some explanation is in order. ** ** We know we need to rewrite at least one address in the ** header, otherwise we wouldn't be here. If we had to ** reformat this particular address, then run it through ** adrformat(). Otherwise we can use m_text directly. */ /* ** If we were in a group but are no longer, make sure we ** add a semicolon (which needs to be FIRST, as it needs ** to be at the end of the last address). */ if (groupflag && ! mn->m_ingrp) { output = add(";", output); column += 1; } groupflag = mn->m_ingrp; if (mn->m_gname) { cp = add(mn->m_gname, NULL); } if (reformat) { cp = add(adrformat(mn), cp); } else { cp = add(mn->m_text, cp); } len = strlen(cp); /* ** If we're not at the beginning of the line, add a ** command and either a space or a newline. */ if (column != prefixlen) { if (len + column + 2 > OUTPUTLINELEN) { if ((size_t) (prefixlen + 3) < tmpbufsize) { tmpbuf = mh_xrealloc(tmpbuf, tmpbufsize = prefixlen + 3); } snprintf(tmpbuf, tmpbufsize, ",\n%*s", column = prefixlen, ""); output = add(tmpbuf, output); } else { output = add(", ", output); column += 2; } } /* ** Finally add the address */ output = add(cp, output); column += len; mh_free0(&cp); } /* ** Just in case we're at the end of a list */ if (groupflag) { output = add(";", output); } output = add("\n", output); mh_free0(value); *value = output; output = NULL; out: if (tmpbuf) { mh_free0(&tmpbuf); } if (output) { mh_free0(&output); } return errflag > 0; } /* ** Scan a string, check for characters that need to be encoded */ static int scanstring(const char *string, int *asciilen, int *eightbitchars, int *specialchars) { *asciilen = 0; *eightbitchars = 0; *specialchars = 0; for (; *string != '\0'; string++) { if ((isascii((unsigned char) *string))) { (*asciilen)++; /* ** So, a space is not a valid phrase character, but ** we're counting an exception here, because in q-p ** a space can be directly encoded as an underscore. */ if (!qphrasevalid((unsigned char) *string) && *string != ' ') { (*specialchars)++; } } else { (*eightbitchars)++; } } return *eightbitchars > 0; } mmh-0.4/sbr/brkstring.c0000644000000000000000000000322613414435726013607 0ustar rootroot/* ** brkstring.c -- (destructively) split a string into ** -- an array of substrings ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include /* allocate this number of pointers at a time */ #define NUMBROKEN 256 static char **broken = NULL; /* array of substring start addresses */ static int len = 0; /* current size of "broken" */ /* ** returns pointer to static memory */ char ** brkstring(char *str, char *brksep, char *brkterm) { int i; char c, *s; /* allocate initial space for pointers on first call */ if (!broken) { len = NUMBROKEN; broken = mh_xcalloc(len, sizeof(*broken)); } /* ** scan string, replacing separators with zeroes ** and enter start addresses in "broken". */ s = str; for (i = 0;; i++) { /* enlarge pointer array, if necessary */ if (i >= len) { len += NUMBROKEN; broken = mh_xrealloc(broken, len * sizeof(*broken)); } /* handle separators */ while ((c=*s) && brksep && strchr(brksep, c)) { *s++ = '\0'; } /* ** we are either at the end of the string, or the ** terminator found has been found, so finish up. */ if (!c || (brkterm && strchr(brkterm, c))) { *s = '\0'; broken[i] = NULL; return broken; } /* set next start addr and walk over word */ broken[i] = s; while ((c = *++s)) { if (brksep && strchr(brksep, c)) { break; } if (brkterm && strchr(brkterm, c)) { break; } } } adios(EX_SOFTWARE, "brkstring()", "reached unreachable point"); } mmh-0.4/sbr/strcasecmp.c0000644000000000000000000000137613414435726013752 0ustar rootroot/* ** strcasecmp.c -- compare strings, ignoring case ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include /* ** Our version of strcasecmp has to deal with NULL strings. ** Once that is fixed in the rest of the code, we can use the ** native version, instead of this one. */ int mh_strcasecmp(const char *s1, const char *s2) { const unsigned char *us1, *us2; us1 = (const unsigned char *) s1, us2 = (const unsigned char *) s2; if (!us1) us1 = ""; if (!us2) us2 = ""; while (tolower(*us1) == tolower(*us2++)) if (*us1++ == '\0') return (0); return (tolower(*us1) - tolower(*--us2)); } mmh-0.4/sbr/fmt_addr.c0000644000000000000000000000556113414435726013366 0ustar rootroot/* ** fmt_addr.c -- format an address field (from fmt_scan) ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include static char *buf; /* our current working buffer */ static char *bufend; /* end of working buffer */ static char *last_dst; /* buf ptr at end of last call */ static unsigned int bufsiz; /* current size of buf */ #define BUFINCR 512 /* how much to expand buf when if fills */ #define CPY(s) { cp = (s); while ((*dst++ = *cp++)) ; --dst; } /* check if there's enough room in buf for str. add more mem if needed */ #define CHECKMEM(str) \ if ((len = strlen(str)) >= bufend - dst) {\ int i = dst - buf;\ int n = last_dst - buf;\ bufsiz += ((dst + len - bufend) / BUFINCR + 1) * BUFINCR;\ buf = mh_xrealloc(buf, bufsiz);\ dst = buf + i;\ last_dst = buf + n;\ bufend = buf + bufsiz;\ } /* ** fmt_scan will call this routine if the user includes the function ** "(formataddr {component})" in a format string. "orig" is the ** original contents of the string register. "str" is the address ** string to be formatted and concatenated onto orig. This routine ** returns a pointer to the concatenated address string. ** ** We try to not do a lot of malloc/copy/free's (which is why we ** don't call "mh_xstrdup") but still place no upper limit on the ** length of the result string. ** ** This routine is placed in a separate library so it can be ** overridden by particular programs (e.g., "replsbr"). */ char * formataddr(char *orig, char *str) { int len; int isgroup; char *dst; char *cp; char *sp; struct mailname *mp = NULL; /* if we don't have a buffer yet, get one */ if (bufsiz == 0) { buf = mh_xcalloc(BUFINCR, sizeof(char)); last_dst = buf; /* XXX */ bufsiz = BUFINCR - 6; /* leave some slop */ bufend = buf + bufsiz; } /* ** If "orig" points to our buffer we can just pick up where we ** left off. Otherwise we have to copy orig into our buffer. */ if (orig == buf) dst = last_dst; else if (!orig || !*orig) { dst = buf; *dst = '\0'; } else { dst = last_dst; /* XXX */ CHECKMEM(orig); CPY(orig); } /* concatenate all the new addresses onto 'buf' */ for (isgroup = 0; (cp = getname(str)); ) { if ((mp = getm(cp, NULL, 0, fmt_norm, NULL)) == NULL) continue; if (isgroup && (mp->m_gname || !mp->m_ingrp)) { *dst++ = ';'; isgroup = 0; } /* if we get here we're going to add an address */ if (dst != buf) { *dst++ = ','; *dst++ = ' '; } if (mp->m_gname) { CHECKMEM(mp->m_gname); CPY(mp->m_gname); isgroup++; } sp = adrformat(mp); CHECKMEM(sp); CPY(sp); mnfree(mp); } if (isgroup) *dst++ = ';'; *dst = '\0'; last_dst = dst; return (buf); } mmh-0.4/sbr/getans.c0000644000000000000000000000255213414435726013064 0ustar rootroot/* ** getans.c -- get an answer from the user and return a string array ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include static char ansbuf[BUFSIZ]; static jmp_buf sigenv; /* ** static prototypes */ static void intrser(int); char ** getans(char *prompt, struct swit *ansp) { int i; SIGNAL_HANDLER istat = NULL; char *cp, **cpp; if (!(setjmp(sigenv))) { istat = SIGNAL(SIGINT, intrser); } else { SIGNAL(SIGINT, istat); return NULL; } for (;;) { printf("%s", prompt); fflush(stdout); cp = ansbuf; while ((i = getchar()) != '\n') { if (i == EOF) longjmp(sigenv, 1); if (cp < &ansbuf[sizeof ansbuf - 1]) *cp++ = i; } *cp = '\0'; if (ansbuf[0] == '?' || cp == ansbuf) { printf("Options are:\n"); print_sw(ALL, ansp, "", stdout); continue; } cpp = brkstring(ansbuf, " ", NULL); switch (smatch(*cpp, ansp)) { case AMBIGSW: ambigsw(*cpp, ansp); continue; case UNKWNSW: printf(" -%s unknown. Hit for help.\n", *cpp); continue; default: SIGNAL(SIGINT, istat); return cpp; } } } static void intrser(int i) { /* ** should this be siglongjmp? */ close(STDIN_FILENO); } mmh-0.4/sbr/folder_read.c0000644000000000000000000000656113414435726014055 0ustar rootroot/* ** folder_read.c -- initialize folder structure and read folder ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include /* We allocate the `mi' array 1024 elements at a time */ #define NUMMSGS 1024 /* ** 1) Create the folder/message structure ** 2) Read the directory (folder) and temporarily ** record the numbers of the messages we have seen. ** 3) Then allocate the array for message attributes and ** set the initial flags for all messages we've seen. ** 4) Read and initialize the sequence information. */ struct msgs * folder_read(char *name) { int msgnum, len, *mi; struct msgs *mp; struct stat st; struct dirent *dp; DIR *dd; name = mh_xstrdup(toabsdir(name)); if (!(dd = opendir(name))) { mh_free0(&name); return NULL; } if (stat(name, &st) == -1) { mh_free0(&name); closedir(dd); return NULL; } /* Allocate the main structure for folder information */ mp = mh_xcalloc(1, sizeof(*mp)); clear_folder_flags(mp); mp->foldpath = name; mp->lowmsg = 0; mp->hghmsg = 0; mp->curmsg = 0; mp->lowsel = 0; mp->hghsel = 0; mp->numsel = 0; mp->nummsg = 0; if (access(name, W_OK) == -1) set_readonly(mp); /* ** Allocate a temporary place to record the ** name of the messages in this folder. */ len = NUMMSGS; mi = mh_xcalloc(len, sizeof(*mi)); while ((dp = readdir(dd))) { if ((msgnum = m_atoi(dp->d_name)) && msgnum > 0) { /* ** Check if we need to allocate more ** temporary elements for message names. */ if (mp->nummsg >= len) { len += NUMMSGS; mi = mh_xrealloc(mi, len * sizeof(*mi)); } /* Check if this is the first message we've seen */ if (mp->nummsg == 0) { mp->lowmsg = msgnum; mp->hghmsg = msgnum; } else { /* ** Check if this is it the highest or ** lowest we've seen? */ if (msgnum < mp->lowmsg) mp->lowmsg = msgnum; if (msgnum > mp->hghmsg) mp->hghmsg = msgnum; } /* ** Now increment count, and record message ** number in a temporary place for now. */ mi[mp->nummsg++] = msgnum; } else { switch (dp->d_name[0]) { case '.': case ',': continue; default: /* ** indicate that there are other ** files in folder */ set_other_files(mp); continue; } } } closedir(dd); mp->lowoff = max(mp->lowmsg, 1); /* Go ahead and allocate space for 100 additional messages. */ mp->hghoff = mp->hghmsg + 100; /* for testing, allocate minimal necessary space */ /* mp->hghoff = max(mp->hghmsg, 1); */ /* Allocate space for status of each message. */ mp->msgstats = mh_xcalloc(MSGSTATSIZE(mp, mp->lowoff, mp->hghoff), 1); /* ** Clear all the flag bits for all the message ** status entries we just allocated. ** TODO: use memset() ? */ for (msgnum = mp->lowoff; msgnum <= mp->hghoff; msgnum++) clear_msg_flags(mp, msgnum); /* ** Scan through the array of messages we've seen and ** setup the initial flags for those messages in the ** newly allocated mp->msgstats area. */ for (msgnum = 0; msgnum < mp->nummsg; msgnum++) set_exists(mp, mi[msgnum]); mh_free0(&mi); /* We don't need this anymore */ /* ** Read and initialize the sequence information. */ seq_read(mp); return mp; } mmh-0.4/sbr/norm_charmap.c0000644000000000000000000000576513414435726014262 0ustar rootroot/* ** The Single Unix Specification function nl_langinfo(CODESET) ** returns the name of the encoding used by the currently selected ** locale: ** ** http://www.opengroup.org/onlinepubs/7908799/xsh/langinfo.h.html ** ** Unfortunately the encoding names are not yet standardized. ** This function knows about the encoding names used on many ** different systems and converts them where possible into ** the corresponding MIME charset name registered in ** ** http://www.iana.org/assignments/character-sets ** ** Please extend it as needed and suggest improvements to the author. ** ** Markus.Kuhn@cl.cam.ac.uk -- 2002-03-11 ** Permission to use, copy, modify, and distribute this software ** for any purpose and without fee is hereby granted. The author ** disclaims all warranties with regard to this software. ** ** Latest version: ** ** http://www.cl.cam.ac.uk/~mgk25/ucs/norm_charmap.c */ #include #define digit(x) ((x) >= '0' && (x) <= '9') static char buf[16]; char * norm_charmap(char *name) { char *p; if (!name) return name; /* ** Many need no remapping, but they are listed here so you ** can see what output to expect, and modify for your needs ** as necessary. */ if (strcmp(name, "UTF-8")==0) return "UTF-8"; if (strcmp(name, "EUC-JP")==0) return "EUC-JP"; if (strcmp(name, "EUC-KR")==0) return "EUC-KR"; if (strcmp(name, "EUC-TW")==0) return "EUC-TW"; if (strcmp(name, "KOI8-R")==0) return "KOI8-R"; if (strcmp(name, "KOI8-U")==0) return "KOI8-U"; if (strcmp(name, "GBK")==0) return "GBK"; if (strcmp(name, "GB2312")==0) return "GB2312"; if (strcmp(name, "GB18030")==0) return "GB18030"; if (strcmp(name, "VSCII")==0) return "VSCII"; /* ASCII comes in many names */ if (strcmp(name, "ASCII")==0 || strcmp(name, "US-ASCII")==0 || strcmp(name, "ANSI_X3.4-1968")==0 || strcmp(name, "646")==0 || strcmp(name, "ISO646")==0 || strcmp(name, "ISO_646.IRV")==0) return "US-ASCII"; /* ISO 8859 will be converted to "ISO-8859-x" */ if ((p = strstr(name, "8859-"))) { memcpy(buf, "ISO-8859-\0\0", 12); p += 5; if (digit(*p)) { buf[9] = *p++; if (digit(*p)) buf[10] = *p++; return buf; } } /* Windows code pages will be converted to "WINDOWS-12xx" */ if ((p = strstr(name, "CP12"))) { memcpy(buf, "WINDOWS-12\0\0", 13); p += 4; if (digit(*p)) { buf[10] = *p++; if (digit(*p)) buf[11] = *p++; return buf; } } /* TIS-620 comes in at least the following two forms */ if (strcmp(name, "TIS-620")==0 || strcmp(name, "TIS620.2533")==0) return "ISO-8859-11"; /* For some, uppercase/lowercase might differ */ if (strcmp(name, "Big5")==0 || strcmp(name, "BIG5")==0) return "Big5"; if (strcmp(name, "Big5HKSCS")==0 || strcmp(name, "BIG5HKSCS")==0) return "Big5HKSCS"; /* ** I don't know of any implementation of nl_langinfo(CODESET) out ** there that returns anything else (and I'm not even certain all of ** the above occur in the wild), but just in case, as a fallback, ** return the unmodified name. */ return name; } mmh-0.4/sbr/folder_free.c0000644000000000000000000000112713414435726014054 0ustar rootroot/* ** folder_free.c -- free a folder/message structure ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include void folder_free(struct msgs *mp) { int i; if (!mp) return; if (mp->foldpath) mh_free0(&(mp->foldpath)); /* free the sequence names */ for (i = 0; mp->msgattrs[i]; i++) mh_free0(&(mp->msgattrs[i])); mh_free0(&(mp->msgstats)); /* free message status area */ mh_free0(&mp); /* free main folder structure */ } mmh-0.4/sbr/dtime.c0000644000000000000000000001661213414435726012707 0ustar rootroot/* ** dtime.c -- time/date routines ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include /* for snprintf() */ #include #if !defined(HAVE_STRUCT_TM_TM_GMTOFF) extern long timezone; #endif /* ** The number of days in the year, accounting for leap years */ #define dysize(y) \ (((y) % 4) ? 365 : (((y) % 100) ? 366 : (((y) % 400) ? 365 : 366))) char *tw_moty[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", NULL }; char *tw_dotw[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", NULL }; char *tw_ldotw[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", NULL }; static int dmsize[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; /* ** Get current time (adjusted for local time ** zone and daylight savings time) expressed ** as nmh "broken-down" time structure. */ struct tws * dlocaltimenow(void) { time_t clock; time(&clock); return dlocaltime(&clock); } /* ** Take clock value and return pointer to nmh time structure ** containing "broken-down" time. The time is adjusted for ** local time zone and daylight savings time. */ struct tws * dlocaltime(time_t *clock) { static struct tws tw; struct tm *tm; if (!clock) return NULL; tm = localtime(clock); tw.tw_sec = tm->tm_sec; tw.tw_min = tm->tm_min; tw.tw_hour = tm->tm_hour; tw.tw_mday = tm->tm_mday; tw.tw_mon = tm->tm_mon; /* tm_year is always "year - 1900". So we correct for this. */ tw.tw_year = tm->tm_year + 1900; tw.tw_wday = tm->tm_wday; tw.tw_yday = tm->tm_yday; tw.tw_flags = TW_NULL; if (tm->tm_isdst) tw.tw_flags |= TW_DST; #ifdef HAVE_STRUCT_TM_TM_GMTOFF tw.tw_zone = tm->tm_gmtoff / 60; if (tm->tm_isdst) /* if DST is in effect */ tw.tw_zone -= 60; /* reset to normal offset */ #else tzset(); tw.tw_zone = -(timezone / 60); #endif tw.tw_flags &= ~TW_SDAY; tw.tw_flags |= TW_SEXP; tw.tw_flags &= ~TW_SZONE; tw.tw_flags |= TW_SZEXP; tw.tw_clock = *clock; return (&tw); } /* ** Take clock value and return pointer to nmh time ** structure containing "broken-down" time. Time is ** expressed in UTC (Coordinated Universal Time). */ struct tws * dgmtime(time_t *clock) { static struct tws tw; struct tm *tm; if (!clock) return NULL; tm = gmtime(clock); tw.tw_sec = tm->tm_sec; tw.tw_min = tm->tm_min; tw.tw_hour = tm->tm_hour; tw.tw_mday = tm->tm_mday; tw.tw_mon = tm->tm_mon; /* tm_year is always "year - 1900". So we correct for this. */ tw.tw_year = tm->tm_year + 1900; tw.tw_wday = tm->tm_wday; tw.tw_yday = tm->tm_yday; tw.tw_flags = TW_NULL; if (tm->tm_isdst) tw.tw_flags |= TW_DST; tw.tw_zone = 0; tw.tw_flags &= ~TW_SDAY; tw.tw_flags |= TW_SEXP; tw.tw_flags &= ~TW_SZONE; tw.tw_flags |= TW_SZEXP; tw.tw_clock = *clock; return (&tw); } /* ** Using a nmh "broken-down" time structure, ** produce a 26-byte date/time string, such as ** ** Tue Jan 14 17:49:03 1992\n\0 */ char * dctime(struct tws *tw) { static char buffer[26]; if (!tw) return NULL; snprintf(buffer, sizeof(buffer), "%.3s %.3s %02d %02d:%02d:%02d %.4d\n", tw_dotw[tw->tw_wday], tw_moty[tw->tw_mon], tw->tw_mday, tw->tw_hour, tw->tw_min, tw->tw_sec, tw->tw_year < 100 ? tw->tw_year + 1900 : tw->tw_year); return buffer; } /* ** Produce a date/time string of the form ** ** Mon, 16 Jun 1992 15:30:48 -0700 ** ** for the current time, as specified by rfc822 and rfc1123. */ char * dtimenow(void) { time_t clock; time(&clock); return dtime(&clock); } /* ** Using a local calendar time value, produce ** a date/time string of the form ** ** Mon, 16 Jun 1992 15:30:48 -0700 ** ** as specified by rfc822 and rfc1123. */ char * dtime(time_t *clock) { return dasctime(dlocaltime(clock)); } /* ** Using a nmh "broken-down" time structure, produce ** a date/time string of the form ** ** Mon, 16 Jun 1992 15:30:48 -0700 ** ** as specified by rfc822 and rfc1123. */ char * dasctime(struct tws *tw) { char buffer[80]; static char result[80]; if (!tw) return NULL; /* Display timezone if known */ if ((tw->tw_flags & TW_SZONE) == TW_SZNIL) result[0] = '\0'; else snprintf(result, sizeof(result), " %s", dtimezone(tw->tw_zone, tw->tw_flags)); snprintf(buffer, sizeof(buffer), "%02d %s %0*d %02d:%02d:%02d%s", tw->tw_mday, tw_moty[tw->tw_mon], tw->tw_year < 100 ? 2 : 4, tw->tw_year, tw->tw_hour, tw->tw_min, tw->tw_sec, result); if ((tw->tw_flags & TW_SDAY) == TW_SEXP) snprintf(result, sizeof(result), "%s, %s", tw_dotw[tw->tw_wday], buffer); else if ((tw->tw_flags & TW_SDAY) == TW_SNIL) strncpy(result, buffer, sizeof(result)); else snprintf(result, sizeof(result), "%s (%s)", buffer, tw_dotw[tw->tw_wday]); return result; } /* ** Get the timezone for given offset as numeric value. */ char * dtimezone(int offset, int flags) { int hours, mins; static char buffer[10]; if (offset < 0) { mins = -((-offset) % 60); hours = -((-offset) / 60); } else { mins = offset % 60; hours = offset / 60; } #ifdef ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST if (flags & TW_DST) hours += 1; #endif /* ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST */ snprintf(buffer, sizeof(buffer), "%s%02d%02d", offset < 0 ? "-" : "+", abs(hours), abs(mins)); return buffer; } /* ** Convert nmh time structure for local "broken-down" ** time to calendar time (clock value). This routine ** is based on the gtime() routine written by Steven Shafer ** at CMU. It was forwarded to MTR by Jay Lepreau at Utah-CS. */ time_t dmktime(struct tws *tw) { int i, sec, min, hour, mday, mon, year; time_t result; if (tw->tw_clock != 0) return tw->tw_clock; if ((sec = tw->tw_sec) < 0 || sec > 61 || (min = tw->tw_min) < 0 || min > 59 || (hour = tw->tw_hour) < 0 || hour > 23 || (mday = tw->tw_mday) < 1 || mday > 31 || (mon = tw->tw_mon + 1) < 1 || mon > 12) return (tw->tw_clock = (time_t) -1); year = tw->tw_year; result = 0; if (year < 1970) year += 1900; if (year < 1970) year += 100; for (i = 1970; i < year; i++) result += dysize(i); if (dysize(year) == 366 && mon >= 3) result++; while (--mon) result += dmsize[mon - 1]; result += mday - 1; result = 24 * result + hour; result = 60 * result + min; result = 60 * result + sec; result -= 60 * tw->tw_zone; if (tw->tw_flags & TW_DST) result -= 60 * 60; return (tw->tw_clock = result); } /* ** Simple calculation of day of the week. Algorithm ** used is Zeller's congruence. We assume that ** if tw->tw_year < 100, then the century = 19. */ void set_dotw(struct tws *tw) { int month, day, year, century; month = tw->tw_mon - 1; day = tw->tw_mday; year = tw->tw_year % 100; century = tw->tw_year < 100 ? 19 : tw->tw_year / 100; if (month <= 0) { month += 12; if (--year < 0) { year += 100; century--; } } tw->tw_wday = ((26 * month - 2) / 10 + day + year + year / 4 - 3 * century / 4 + 1) % 7; if (tw->tw_wday < 0) tw->tw_wday += 7; tw->tw_flags &= ~TW_SDAY, tw->tw_flags |= TW_SIMP; } /* ** Copy nmh time structure */ void twscopy(struct tws *tb, struct tws *tw) { *tb = *tw; /* struct copy */ } /* ** Compare two nmh time structures */ int twsort(struct tws *tw1, struct tws *tw2) { time_t c1, c2; if (tw1->tw_clock == 0) dmktime(tw1); if (tw2->tw_clock == 0) dmktime(tw2); return ((c1 = tw1->tw_clock) > (c2 = tw2->tw_clock) ? 1 : c1 == c2 ? 0 : -1); } mmh-0.4/sbr/parse_msgs.c0000644000000000000000000000150013414435726013736 0ustar rootroot#include #include int parse_msgs(const struct msgs_array *msgs, char *folder, struct msgs_array *files) { int ret = 0; char *msgnam; struct msgs *f; char *path; size_t i; if (folder) { path = toabsdir(folder); } else { path = toabsdir(getcurfol()); } path = mh_xstrdup(path); path = add("/", path); f = folder_read(path); if (f == NULL) { return -1; } for (i = 0; i < msgs->size; i++) { if (*(msgs->msgs[i]) == '.' || *(msgs->msgs[i]) == '/') { app_msgarg(files, msgs->msgs[i]); continue; } if (!m_convert(f, msgs->msgs[i])) { ret++; } } for (i = f->lowsel; f->numsel > 0 && i <= f->hghsel; i++) { if (is_selected(f, i)) { msgnam = mh_xstrdup(path); msgnam = add(m_name(i), msgnam); app_msgarg(files, msgnam); } } folder_free(f); return ret; } mmh-0.4/sbr/sigmsg.awk0000755000000000000000000000650113414435726013435 0ustar rootroot# # sigmsg.awk -- awk/nawk/gawk script to generate sigmsg.h # # provided by Geoff Wing # # On SunOS 4.1.3 - user-functions don't work properly, also \" problems # Without 0 + hacks some nawks compare numbers as strings # /^[\t ]*#[\t ]*define[\t _]*SIG[A-Z][A-Z0-9]*[\t ]*[1-9][0-9]*/ { sigindex = index($0, "SIG") sigtail = substr($0, sigindex, 80) split(sigtail, tmp) signam = substr(tmp[1], 4, 20) signum = tmp[2] if (sig[signum] == "") { sig[signum] = signam if (0 + max < 0 + signum && signum < 60) max = signum if (signam == "ABRT") { msg[signum] = "abort" } if (signam == "ALRM") { msg[signum] = "alarm" } if (signam == "BUS") { msg[signum] = "bus error" } if (signam == "CHLD") { msg[signum] = "death of child" } if (signam == "CLD") { msg[signum] = "death of child" } if (signam == "CONT") { msg[signum] = "continued" } if (signam == "EMT") { msg[signum] = "EMT instruction" } if (signam == "FPE") { msg[signum] = "floating point exception" } if (signam == "HUP") { msg[signum] = "hangup" } if (signam == "ILL") { msg[signum] = "illegal hardware instruction" } if (signam == "INFO") { msg[signum] = "status request from keyboard" } if (signam == "INT") { msg[signum] = "interrupt" } if (signam == "IO") { msg[signum] = "i/o ready" } if (signam == "IOT") { msg[signum] = "IOT instruction" } if (signam == "KILL") { msg[signum] = "killed" } if (signam == "LOST") { msg[signum] = "resource lost" } if (signam == "PIPE") { msg[signum] = "broken pipe" } if (signam == "POLL") { msg[signum] = "pollable event occurred" } if (signam == "PROF") { msg[signum] = "profile signal" } if (signam == "PWR") { msg[signum] = "power fail" } if (signam == "QUIT") { msg[signum] = "quit" } if (signam == "SEGV") { msg[signum] = "segmentation fault" } if (signam == "SYS") { msg[signum] = "invalid system call" } if (signam == "TERM") { msg[signum] = "terminated" } if (signam == "TRAP") { msg[signum] = "trace trap" } if (signam == "URG") { msg[signum] = "urgent condition" } if (signam == "USR1") { msg[signum] = "user-defined signal 1" } if (signam == "USR2") { msg[signum] = "user-defined signal 2" } if (signam == "VTALRM") { msg[signum] = "virtual time alarm" } if (signam == "WINCH") { msg[signum] = "window size changed" } if (signam == "XCPU") { msg[signum] = "cpu limit exceeded" } if (signam == "XFSZ") { msg[signum] = "file size limit exceeded" } } } END { ps = "%s" ifdstr = sprintf("\t%cstopped%s%c,\n", 34, ps, 34) print "\n/*" print " * sigmsg.h -- architecture-customized signal messages for nmh" print " *" print " * automatically generated by sigmsg.awk" print " */\n" printf("%s %d\n\n", "#define SIGCOUNT", max) print "char *sigmsg[SIGCOUNT+2] = {" print "\tNULL," for (i = 1; i <= 0 + max; i++) if (msg[i] == "") { if (sig[i] == "") printf("\tNULL,\n") else if (sig[i] == "STOP") printf ifdstr, " (signal)", " (signal)" else if (sig[i] == "TSTP") printf ifdstr, "", "" else if (sig[i] == "TTIN") printf ifdstr, " (tty input)", " (tty input)" else if (sig[i] == "TTOU") printf ifdstr, " (tty output)", " (tty output)" else printf("\t%cSIG%s%c,\n", 34, sig[i], 34) } else printf("\t%c%s%c,\n", 34, msg[i], 34) print "\tNULL" print "};" } mmh-0.4/sbr/trimcpy.c0000644000000000000000000000150413414435726013266 0ustar rootroot/* ** trimcpy.c -- strip leading and trailing whitespace, ** -- replace internal whitespace with spaces, ** -- then return a copy. ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include char * trimcpy(unsigned char *cp) { unsigned char *sp; /* skip over leading whitespace */ while (isspace(*cp)) cp++; /* start at the end and zap trailing whitespace */ for (sp = cp + strlen(cp) - 1; sp >= cp; sp--) { if (isspace(*sp)) *sp = '\0'; else break; } /* replace remaining whitespace with spaces */ for (sp = cp; *sp; sp++) { if (isspace(*sp)) *sp = ' '; } /* now return a copy */ return mh_xstrdup(cp); } mmh-0.4/sbr/m_name.c0000644000000000000000000000064013414435726013033 0ustar rootroot/* ** m_name.c -- return a message number as a string (in static memory) ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include static char name[BUFSIZ]; char * m_name(int num) { if (num <= 0) { return "?"; } snprintf(name, sizeof(name), "%d", num); return name; } mmh-0.4/sbr/error.c0000644000000000000000000000343313414435726012733 0ustar rootroot/* ** error.c -- main error handling routines ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include /* ** print out error message */ void advise(char *what, char *fmt, ...) { va_list ap; va_start(ap, fmt); advertise(what, NULL, fmt, ap); va_end(ap); } /* ** print out error message and exit */ void adios(int status, char *what, char *fmt, ...) { va_list ap; va_start(ap, fmt); advertise(what, NULL, fmt, ap); va_end(ap); exit(status); } /* ** admonish the user */ void admonish(char *what, char *fmt, ...) { va_list ap; va_start(ap, fmt); advertise(what, "continuing...", fmt, ap); va_end(ap); } /* ** main routine for printing error messages. ** ** Until 2011-11-01, this routine used writev(). In order to remove ** ``sexy'' syscalls, in favor for mainstream programming, I removed ** it. But I want to preserve the following comment: ** ** Use writev() if available, for slightly better performance. ** Why? Well, there are a couple of reasons. Primarily, it ** gives a smoother output... More importantly though, it's a ** sexy syscall()... ** ** advertise() does *not* use writev() anymore, and that's good so. ** -- meillo@marmaro.de */ void advertise(char *what, char *tail, char *fmt, va_list ap) { int eindex = errno; fflush(stdout); if (invo_name && *invo_name) fprintf(stderr, "%s: ", invo_name); vfprintf(stderr, fmt, ap); if (what) { char *s; if (*what) fprintf(stderr, " %s: ", what); if ((s = strerror(eindex))) fprintf(stderr, "%s", s); else fprintf(stderr, "Error %d", eindex); } if (tail) fprintf(stderr, ", %s", tail); fputc('\n', stderr); } mmh-0.4/sbr/mts.c0000644000000000000000000000601313414435726012402 0ustar rootroot/* ** mts.c -- definitions for the mail transport system ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include /* for snprintf() */ #include #include #include #include #include #include #include /* ** static prototypes */ static void getuserinfo(void); /* Cache the username and fullname of the user */ static char username[BUFSIZ]; static char fullname[BUFSIZ]; /* ** Get the fully qualified name of the local host. */ char * LocalName(void) { static char buffer[BUFSIZ] = ""; struct addrinfo hints, *res; /* check if we have cached the local name */ if (buffer[0]) return buffer; memset(buffer, 0, sizeof(buffer)); /* first get our local name */ gethostname(buffer, sizeof(buffer) - 1); /* now fully qualify our name */ memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_CANONNAME; hints.ai_family = PF_UNSPEC; if (getaddrinfo(buffer, NULL, &hints, &res) == 0) { strncpy(buffer, res->ai_canonname, sizeof(buffer) - 1); freeaddrinfo(res); } return buffer; } /* ** Get the username of current user */ char * getusername(void) { if (username[0] == '\0') getuserinfo(); return username; } /* ** Get full name of current user (typically from GECOS ** field of password file). */ char * getfullname(void) { if (username[0] == '\0') getuserinfo(); return fullname; } /* ** Find the user's username and full name, and cache them. */ static void getuserinfo(void) { unsigned char *cp; char *np; struct passwd *pw; int needquotes = 0; char tmp[BUFSIZ]; char *tp; if (!(pw = getpwuid(getuid())) || !pw->pw_name || !*pw->pw_name) { strncpy(username, "unknown", sizeof(username)); snprintf(fullname, sizeof(fullname), "The Unknown User-ID (%d)", (int)getuid()); return; } np = pw->pw_gecos; /* ** Get the user's real name from the GECOS field. Stop once ** we hit a ',', which some OSes use to separate other 'finger' ** information in the GECOS field, like phone number. */ for (cp = tmp; *np != '\0' && *np != ',';) { *cp++ = *np++; } *cp = '\0'; strncpy(username, pw->pw_name, sizeof(username)); /* ** The $SIGNATURE environment variable overrides the GECOS field's ** idea of your real name. */ if ((cp = getenv("SIGNATURE")) && *cp) strncpy(tmp, cp, sizeof(tmp)); /* quote the fullname as needed */ needquotes = 0; for (tp=tmp; *tp; tp++) { switch (*tp) { case '(': case ')': case '<': case '>': case '[': case ']': case ':': case ';': case '@': case '\\': case ',': case '.': case '"': /* cf. RFC 5322 */ break; /* ... the switch */ default: continue; /* ... the loop */ } /* we've found a special char */ needquotes = 1; break; } cp=fullname; if (needquotes) { *cp++ = '"'; } for (tp=tmp; *tp; *cp++=*tp++) { if (*tp == '"') { *cp++ = '\\'; /* prepend backslash */ } } if (needquotes) { *cp++ = '"'; } *cp = '\0'; return; } mmh-0.4/sbr/execprog.c0000644000000000000000000000156713414435726013424 0ustar rootroot/* ** execprog.c -- invoke an external command synchronously ** This is a safer alternative to system(3) */ #include #include #include #include int execprog(char *cmd, char **arg) { pid_t pid; fflush(stdout); switch (pid = fork()) { case -1: /* fork error */ advise("fork", "unable to"); return -1; case 0: /* child */ execvp(cmd, arg); fprintf(stderr, "unable to exec "); perror(cmd); _exit(EX_OSERR); default: /* parent */ return pidXwait(pid, cmd); } return -1; /* NOT REACHED */ } int execprogl(char *cmd, char *arg, ...) { va_list ap; int argc = 0; char *argv[MAXARGS]; char *cp; int ret; argv[argc++] = mhbasename(arg); va_start(ap, arg); while ((cp = va_arg(ap, char *))) { argv[argc++] = cp; } argv[argc] = NULL; ret = execprog(cmd, argv); va_end(ap); return ret; } mmh-0.4/sbr/makedir.c0000644000000000000000000000264413414435726013221 0ustar rootroot/* ** makedir.c -- make a directory ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ /* ** Modified to try recursive create. */ #include #include #include #include #include int makedir(char *dir) { char path[PATH_MAX]; char *cp; int had_an_error = 0; mode_t folder_perms, saved_umask; char* c; context_save(); /* save the context file */ fflush(stdout); if (!(cp = context_find("folder-protect")) || !*cp) { cp = foldprot; } folder_perms = strtoul(cp, NULL, 8); /* ** Folders have definite desired permissions that are set -- we ** don't want to interact with the umask. Clear it temporarily. */ saved_umask = umask(0); c = strncpy(path, dir, sizeof(path)); while (!had_an_error && (c = strchr((c + 1), '/')) != NULL) { *c = '\0'; /* Create an outer directory. */ if (mkdir(path, folder_perms) == -1 && errno != EEXIST) { advise(dir, "unable to create directory"); had_an_error = 1; } *c = '/'; } /* ** Create the innermost nested subdirectory of the ** path we're being asked to create. */ if (!had_an_error && mkdir(dir, folder_perms)==-1) { advise(dir, "unable to create directory"); had_an_error = 1; } umask(saved_umask); /* put the user's umask back */ return (had_an_error) ? 0 : 1; } mmh-0.4/sbr/context_del.c0000644000000000000000000000154113414435726014110 0ustar rootroot/* ** context_del.c -- delete an entry from the context/profile list ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include /* ** Delete a key/value pair from the context/profile list. ** Return 0 if key is found, else return 1. */ int context_del(char *key) { struct node *np, *pp; for (np = m_defs, pp = NULL; np; pp = np, np = np->n_next) { if (!mh_strcasecmp(np->n_name, key)) { if (!np->n_context) admonish(NULL, "bug: context_del(key=\"%s\")", np->n_name); if (pp) pp->n_next = np->n_next; else m_defs = np->n_next; mh_free0(&(np->n_name)); if (np->n_field) mh_free0(&(np->n_field)); mh_free0(&np); ctxflags |= CTXMOD; return 0; } } return 1; } mmh-0.4/sbr/seq_del.c0000644000000000000000000000513713414435726013221 0ustar rootroot/* ** seq_del.c -- delete message(s) from a sequence ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include /* ** Delete all SELECTED messages from sequence ** ** If public == 1, make sequence public. ** If public == 0, make sequence private. ** If public == -1, leave the public/private bit alone for existing ** sequences. For new sequences, set this bit based ** on its readonly status. ** ** If error, return 0, else return 1. */ int seq_delsel(struct msgs *mp, char *cp, int public, int zero) { unsigned int i; int msgnum, new_seq = 1; if (!seq_nameok(cp)) return 0; /* ** Get the number for this sequence */ for (i = 0; mp->msgattrs[i]; i++) { if (strcmp(mp->msgattrs[i], cp)==0) { new_seq = 0; break; } } /* ** If the zero flag is set, first add all existing ** messages in this folder to the sequence. */ if (zero) { /* ** create the sequence, if necessary */ if (new_seq) { if (i >= NUMATTRS) { advise(NULL, "only %d sequences allowed (no room for %s)!", NUMATTRS, cp); return 0; } if (!(mp->msgattrs[i] = strdup(cp))) { advise(NULL, "strdup failed"); return 0; } mp->msgattrs[i + 1] = NULL; } /* ** now add sequence bit to all existing messages */ for (msgnum = mp->lowmsg; msgnum <= mp->hghmsg; msgnum++) { if (does_exist(mp, msgnum)) add_sequence(mp, i, msgnum); else clear_sequence(mp, i, msgnum); } } else { if (new_seq) { advise(NULL, "no such sequence as %s", cp); return 0; } } /* ** Now clear the bit on all selected messages */ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) if (is_selected(mp, msgnum)) clear_sequence(mp, i, msgnum); /* ** Set the public/private bit for this sequence. */ if (public == 1) make_seq_public(mp, i); else if (public == 0) make_seq_private(mp, i); else if (new_seq) { /* ** If public == -1, then only set the ** public/private bit for new sequences. */ if (is_readonly(mp)) make_seq_private(mp, i); else make_seq_public(mp, i); } mp->msgflags |= SEQMOD; return 1; } /* ** Delete message from sequence. ** ** If error, return 0, else return 1. */ int seq_delmsg(struct msgs *mp, char *cp, int msgnum) { int i; if (!seq_nameok(cp)) return 0; for (i = 0; mp->msgattrs[i]; i++) { if (strcmp(mp->msgattrs[i], cp)==0) { clear_sequence(mp, i, msgnum); mp->msgflags |= SEQMOD; return 1; } } advise(NULL, "no such sequence as %s", cp); return 0; } mmh-0.4/sbr/Makefile.in0000644000000000000000000000627013414435726013505 0ustar rootroot# # Makefile for sbr subdirectory # SHELL = /bin/sh top_srcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ VERSION = `$(top_srcdir)/version.sh $(top_srcdir)` prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ etcdir = @sysconfdir@ CC = @CC@ CFLAGS = @CFLAGS@ DEFS = @DEFS@ # add include dir . for sigmsg.h and .. for config.h when building # in different directory INCLUDES = -I$(top_srcdir) -I. -I.. @CPPFLAGS@ LEX = @LEX@ AWK = @AWK@ LORDER = @LORDER@ TSORT = @TSORT@ RANLIB = @RANLIB@ LIBTOOL = @LIBTOOL@ GNU_LIBTOOL = @GNU_LIBTOOL@ LINT = @LINT@ LINTFLAGS = @LINTFLAGS@ COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CFLAGS) LOCALLIBS = ../config/config.o .SUFFIXES: .SUFFIXES: .c .o .c.o: $(COMPILE) $< # this header file is parsed to generate signal messages (sigmsg.h) SIGNAL_H = @SIGNAL_H@ # source for library functions SRCS = addrsbr.c ambigsw.c brkstring.c \ charset.c concat.c context_del.c \ context_find.c context_read.c \ context_replace.c context_save.c \ cpydata.c crawl_folders.c \ dtime.c dtimep.c \ error.c execprog.c ext_hook.c folder_addmsg.c folder_delmsgs.c \ folder_free.c folder_read.c \ folder_realloc.c gans.c getans.c getanswer.c \ getarguments.c \ fmt_addr.c fmt_compile.c fmt_new.c fmt_rfc2047.c \ fmt_scan.c lock_file.c m_atoi.c \ m_convert.c m_draft.c m_getfld2.c m_gmprot.c \ m_name.c \ makedir.c mts.c norm_charmap.c \ path.c pidwait.c pidstatus.c \ print_help.c print_sw.c print_version.c \ putenv.c mhbasename.c \ readconfig.c seq_add.c seq_bits.c \ seq_del.c seq_getnum.c seq_list.c seq_nameok.c \ seq_print.c seq_read.c seq_save.c seq_setcur.c \ seq_setprev.c seq_setunseen.c signals.c \ smatch.c snprintb.c strcasecmp.c \ strindex.c trim.c trimcpy.c uprf.c vfgets.c fmt_def.c \ mf.c utils.c m_mktemp.c seq_msgstats.c \ unquote.c encode_rfc2047.c parse_msgs.c \ getthreadid.c OBJS = $(SRCS:.c=.o) # ========= DEPENDENCIES FOR BUILDING ========== # default target all: libmh.a sigmsg.h: sigmsg.awk $(AWK) -f $(srcdir)/sigmsg.awk $(SIGNAL_H) > $@ lint: sigmsg.h $(LINT) $(LINTFLAGS) $(INCLUDES) $(DEFS) $(SRCS) # Note that not all lexes support -o (it is not POSIX); also # some lexes will only accept '-n -t', not '-nt'. # Also, not all makes accept $< in non-pattern rules, # hence the explicit filenames here. dtimep.c: dtimep.lex $(LEX) -n -t $(srcdir)/dtimep.lex > $@ pidstatus.o: sigmsg.h libmh.a: $(OBJS) $(LOCALLIBS) version.c rm -f $@ $(COMPILE) -DVERSION="\"$(VERSION)\"" -o version.o $(srcdir)/version.c if test x$(LIBTOOL) != x -a x$(GNU_LIBTOOL) = x ; then \ $(LIBTOOL) -static -c -o libmh.a $(OBJS) $(LOCALLIBS) version.o; \ else \ ar cr libmh.a `$(LORDER) $(OBJS) $(LOCALLIBS) version.o | $(TSORT) 2>/dev/null` ; \ $(RANLIB) libmh.a ; \ fi rm -f version.o install: uninstall: # ========== DEPENDENCIES FOR CLEANUP ========== mostlyclean: rm -f *.o *~ clean: mostlyclean rm -f libmh.a sigmsg.h distclean: clean rm -f Makefile dtimep.c realclean: distclean superclean: realclean # ========== DEPENDENCIES FOR MAINTENANCE ========== subdir = sbr Makefile: Makefile.in ../config.status cd .. && ./config.status $(subdir)/$@ mmh-0.4/sbr/vfgets.c0000644000000000000000000000242213414435726013075 0ustar rootroot/* ** vfgets.c -- virtual fgets ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #define QUOTE '\\' int vfgets(FILE *in, char **bp) { int toggle; char *cp, *dp, *ep, *fp; static int len = 0; static char *pp = NULL; if (pp == NULL) pp = mh_xcalloc(len = BUFSIZ, sizeof(char)); for (ep = (cp = pp) + len - 1;;) { if (fgets(cp, ep - cp + 1, in) == NULL) { if (cp != pp) { *bp = pp; return 0; } return (ferror(in) && !feof(in) ? -1 : 1); } if ((dp = cp + strlen(cp) - 2) < cp || *dp != QUOTE) { wrong_guess: if (cp > ++dp) adios(EX_SOFTWARE, NULL, "vfgets() botch -- you lose big"); if (*dp == '\n') { *bp = pp; return 0; } else { cp = ++dp; } } else { for (fp = dp - 1, toggle = 0; fp >= cp; fp--) { if (*fp != QUOTE) break; else toggle = !toggle; } if (toggle) goto wrong_guess; if (*++dp == '\n') { *--dp = 0; cp = dp; } else { cp = ++dp; } } if (cp >= ep) { int curlen = cp - pp; dp = mh_xrealloc(pp, len += BUFSIZ); cp = dp + curlen; ep = (pp = dp) + len - 1; } } } mmh-0.4/sbr/smatch.c0000644000000000000000000000155013414435726013057 0ustar rootroot/* ** smatch.c -- match a switch (option) ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include int smatch(char *string, struct swit *swp) { char *sp, *tcp; int firstone, len; struct swit *tp; firstone = UNKWNSW; if (!string) return firstone; len = strlen(string); for (tp = swp; tp->sw; tp++) { tcp = tp->sw; if (len < abs(tp->minchars)) continue; /* no match */ for (sp = string; *sp == *tcp++;) { if (*sp++ == '\0') return (tp - swp); /* exact match */ } if (*sp) { if (*sp != ' ') continue; /* no match */ if (*--tcp == '\0') return (tp - swp); /* exact match */ } if (firstone == UNKWNSW) firstone = tp - swp; else firstone = AMBIGSW; } return (firstone); } mmh-0.4/sbr/seq_msgstats.c0000644000000000000000000000701713414435726014321 0ustar rootroot/* ** seq_msgstats -- message and sequence manipulation and folder attributes ** ** (These functions had once been macros in h/mh.h) */ #include #include static void assert_msg_range(struct msgs *mp, int msgnum) { if (msgnum < mp->lowoff || msgnum > mp->hghoff) { adios(EX_SOFTWARE, NULL, "Bug: message out of bounds"); } } void add_sequence(struct msgs *mp, int seqnum, int msgnum) { assert_msg_range(mp, msgnum); mp->msgstats[msgnum - mp->lowoff] |= (1 << (FFATTRSLOT + seqnum)); } void clear_msg_flags(struct msgs *mp, int msgnum) { assert_msg_range(mp, msgnum); mp->msgstats[msgnum - mp->lowoff] = 0; } void clear_sequence(struct msgs *mp, int seqnum, int msgnum) { assert_msg_range(mp, msgnum); mp->msgstats[msgnum - mp->lowoff] &= ~(1 << (FFATTRSLOT + seqnum)); } void copy_msg_flags(struct msgs *mp, int dstmsg, int srcmsg) { assert_msg_range(mp, srcmsg); assert_msg_range(mp, dstmsg); mp->msgstats[dstmsg - mp->lowoff] = mp->msgstats[srcmsg - mp->lowoff]; } seqset_t does_exist(struct msgs *mp, int msgnum) { assert_msg_range(mp, msgnum); return mp->msgstats[msgnum - mp->lowoff] & EXISTS; } void get_msg_flags(struct msgs *mp, seqset_t *dst, int msgnum) { assert_msg_range(mp, msgnum); *dst = mp->msgstats[msgnum - mp->lowoff]; } seqset_t in_sequence(struct msgs *mp, int seqnum, int msgnum) { assert_msg_range(mp, msgnum); return mp->msgstats[msgnum - mp->lowoff] & (1 << (FFATTRSLOT + seqnum)); } seqset_t is_selected(struct msgs *mp, int msgnum) { assert_msg_range(mp, msgnum); return mp->msgstats[msgnum - mp->lowoff] & SELECTED; } seqset_t is_unseen(struct msgs *mp, int msgnum) { assert_msg_range(mp, msgnum); return mp->msgstats[msgnum - mp->lowoff] & SELECT_UNSEEN; } void set_exists(struct msgs *mp, int msgnum) { assert_msg_range(mp, msgnum); mp->msgstats[msgnum - mp->lowoff] |= EXISTS; } void set_msg_flags(struct msgs *mp, seqset_t *src, int msgnum) { assert_msg_range(mp, msgnum); mp->msgstats[msgnum - mp->lowoff] = *src; } void set_selected(struct msgs *mp, int msgnum) { assert_msg_range(mp, msgnum); if (is_selected(mp, msgnum)) { return; } mp->msgstats[msgnum - mp->lowoff] |= SELECTED; if (mp->lowsel == 0 || msgnum < mp->lowsel) { mp->lowsel = msgnum; } if (msgnum > mp->hghsel) { mp->hghsel = msgnum; } mp->numsel++; } void set_unseen(struct msgs *mp, int msgnum) { assert_msg_range(mp, msgnum); mp->msgstats[msgnum - mp->lowoff] |= SELECT_UNSEEN; } void unset_exists(struct msgs *mp, int msgnum) { assert_msg_range(mp, msgnum); mp->msgstats[msgnum - mp->lowoff] &= ~EXISTS; } void unset_selected(struct msgs *mp, int msgnum) { assert_msg_range(mp, msgnum); if (!is_selected(mp, msgnum)) { return; } mp->msgstats[msgnum - mp->lowoff] &= ~SELECTED; if (mp->numsel > 0) { mp->numsel--; } } /* ** private/public sequences */ int is_seq_private(struct msgs *mp, int seqnum) { return mp->attrstats & (1 << (FFATTRSLOT + seqnum)); } void make_seq_public(struct msgs *mp, int seqnum) { mp->attrstats &= ~(1 << (FFATTRSLOT + seqnum)); } void make_seq_private(struct msgs *mp, int seqnum) { mp->attrstats |= (1 << (FFATTRSLOT + seqnum)); } void make_all_public(struct msgs *mp) { mp->attrstats = 0; } /* ** folder attributes */ void clear_folder_flags(struct msgs *mp) { mp->msgflags = 0; } int is_readonly(struct msgs *mp) { return mp->msgflags & READONLY; } void set_readonly(struct msgs *mp) { mp->msgflags |= READONLY; } int other_files(struct msgs *mp) { return mp->msgflags & OTHERS; } void set_other_files(struct msgs *mp) { mp->msgflags |= OTHERS; } mmh-0.4/sbr/crawl_folders.c0000644000000000000000000000703213414435726014427 0ustar rootroot/* ** crawl_folders.c -- crawl folder hierarchy ** ** This code is Copyright (c) 2008, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include struct crawl_context { int max; /* ** number of folders we can hold in the folders array; ** increased by CRAWL_NUMFOLDERS at a time */ int total; /* how many `folders' actually has */ char **folders; /* the array of folders */ int start; int foldp; }; /* ** Add the folder name into the ** list in a sorted fashion. */ static void add_folder(char *fold, struct crawl_context *crawl) { int i, j; /* if necessary, reallocate the space for folder names */ if (crawl->foldp >= crawl->max) { crawl->max += CRAWL_NUMFOLDERS; crawl->folders = mh_xrealloc(crawl->folders, crawl->max * sizeof(char *)); } for (i = crawl->start; i < crawl->foldp; i++) if (strcmp(fold, crawl->folders[i]) < 0) { for (j = crawl->foldp - 1; j >= i; j--) crawl->folders[j + 1] = crawl->folders[j]; crawl->foldp++; crawl->folders[i] = fold; return; } crawl->total++; crawl->folders[crawl->foldp++] = fold; } static void add_children(char *name, struct crawl_context *crawl) { char *prefix, *child; struct stat st; struct dirent *dp; DIR * dd; int child_is_folder; if (!(dd = opendir(name))) { admonish(name, "unable to read directory "); return; } if (strcmp(name, ".") == 0) { prefix = mh_xstrdup(""); } else { prefix = concat(name, "/", (void *)NULL); } while ((dp = readdir(dd))) { /* ** If the system supports it, try to skip processing of ** children we know are not directories or symlinks. */ child_is_folder = -1; #if defined(HAVE_STRUCT_DIRENT_D_TYPE) if (dp->d_type == DT_DIR) { child_is_folder = 1; } else if (dp->d_type != DT_LNK && dp->d_type != DT_UNKNOWN) { continue; } #endif if (strcmp(dp->d_name, ".")==0 || strcmp(dp->d_name, "..")==0) { continue; } child = concat(prefix, dp->d_name, (void *)NULL); /* ** If we have no d_type or d_type is DT_LNK or DT_UNKNOWN, ** stat the child to see what it is. */ if (child_is_folder == -1) { child_is_folder = (stat(child, &st) != -1 && S_ISDIR(st.st_mode)); } if (child_is_folder) { /* add_folder saves child in the list, don't free it */ add_folder(child, crawl); } else { mh_free0(&child); } } closedir(dd); mh_free0(&prefix); } static void crawl_folders_body(struct crawl_context *crawl, char *dir, crawl_callback_t *callback, void *baton) { int i; int os = crawl->start; int of = crawl->foldp; crawl->start = crawl->foldp; add_children(dir, crawl); for (i = crawl->start; i < crawl->foldp; i++) { char *fold = crawl->folders[i]; int crawl_children = 1; if (callback != NULL) { crawl_children = callback(fold, baton); } if (crawl_children) { crawl_folders_body(crawl, fold, callback, baton); } } crawl->start = os; crawl->foldp = of; } void crawl_folders(char *dir, crawl_callback_t *callback, void *baton) { struct crawl_context *crawl = mh_xcalloc(1, sizeof(*crawl)); crawl->max = CRAWL_NUMFOLDERS; crawl->total = crawl->start = crawl->foldp = 0; crawl->folders = mh_xcalloc(crawl->max, sizeof(*crawl->folders)); crawl_folders_body(crawl, dir, callback, baton); /* ** Note that we "leak" the folder names, on the assumption that the ** caller is using them. */ mh_free0(&(crawl->folders)); mh_free0(&crawl); } mmh-0.4/sbr/print_sw.c0000644000000000000000000000241613414435726013447 0ustar rootroot/* ** print_sw.c -- print switches ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include void print_sw(char *substr, struct swit *swp, char *prefix, FILE *fp) { int len, optno; int i; char *cp, *cp1, *sp; char buf[128]; len = strlen(substr); for (; swp->sw; swp++) { /* null matches all strings */ if (!*substr || (strncmp(swp->sw, substr, len)==0 && len >= swp->minchars)) { optno = 0; /* next switch */ if ((sp = (&swp[1])->sw)) { if (!*substr && sp[0] == 'n' && sp[1] == 'o' && strcmp(&sp[2], swp->sw) == 0 && ( ((&swp[1])->minchars == 0 && swp->minchars == 0) || ((&swp[1])->minchars == (swp->minchars) + 2))) optno++; } if (swp->minchars > 0) { cp = buf; *cp++ = '('; if (optno) { strcpy(cp, "[no]"); cp += strlen(cp); } for (cp1 = swp->sw, i = 0; i < swp->minchars; i++) *cp++ = *cp1++; *cp++ = ')'; while ((*cp++ = *cp1++)); fprintf(fp, " %s%s\n", prefix, buf); } else { if (!swp->minchars) fprintf(fp, optno ? " %s[no]%s\n" : " %s%s\n", prefix, swp->sw); } if (optno) swp++; /* skip -noswitch */ } } } mmh-0.4/sbr/print_version.c0000644000000000000000000000063713414435726014506 0ustar rootroot/* ** print_version.c -- print a version string ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include void print_version(char *invo_name) { printf("%s -- %s\n", invo_name, version); if (strcmp(version, lib_version)!=0) { printf("libversion: %s\n", lib_version); } } mmh-0.4/sbr/seq_setprev.c0000644000000000000000000000162113414435726014137 0ustar rootroot/* ** seq_setprev.c -- set the Previous-Sequence ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include /* ** Add all the messages currently SELECTED to ** the Previous-Sequence. This way, when the next ** command is given, there is a convenient way to ** selected all the messages used in the previous ** command. */ void seq_setprev(struct msgs *mp) { char **ap, *cp, *dp; /* ** Get the list of sequences for Previous-Sequence ** and split them. */ if ((cp = context_find(psequence))) { dp = mh_xstrdup(cp); if (!(ap = brkstring(dp, " ", "\n")) || !*ap) { mh_free0(&dp); return; } } else { return; } /* Now add all SELECTED messages to each sequence */ for (; *ap; ap++) seq_addsel(mp, *ap, -1, 1); mh_free0(&dp); } mmh-0.4/sbr/pidstatus.c0000644000000000000000000000274113414435726013623 0ustar rootroot/* ** pidstatus.c -- report child's status ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include /* ** auto-generated header */ #include "sigmsg.h" #include #ifndef WTERMSIG # define WTERMSIG(s) ((int)((s) & 0x7F)) #endif #ifndef WCOREDUMP # define WCOREDUMP(s) ((s) & 0x80) #endif int pidstatus(int status, FILE *fp, char *cp) { int signum; /* ** I have no idea what this is for (rc) ** so I'm commenting it out for right now. ** ** if ((status & 0xff00) == 0xff00) ** return status; */ if (WIFEXITED(status)) { /* child process returned normally */ if ((signum = WEXITSTATUS(status))) { if (cp) { fprintf(fp, "%s: ", cp); } fprintf(fp, "exit %d\n", signum); } } else if (WIFSIGNALED(status)) { /* child process terminated due to receipt of a signal */ signum = WTERMSIG(status); if (signum == SIGINT) { return status; } if (cp) { fprintf(fp, "%s: ", cp); } fprintf(fp, "signal %d", signum); if (signum >= 0 && signum < (int)sizeof(sigmsg) && sigmsg[signum] != NULL) { fprintf(fp, " (%s%s)\n", sigmsg[signum], WCOREDUMP(status) ? ", core dumped" : ""); } else { fprintf(fp, "%s\n", WCOREDUMP(status) ? " (core dumped)" : ""); } } return status; } int pidXwait(int pid, char *cp) { return pidstatus(pidwait(pid, -1), stdout, cp); } mmh-0.4/sbr/fmt_scan.c0000644000000000000000000004600313414435726013374 0ustar rootroot/* ** fmt_scan.c -- format string interpretation ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. ** ** This is the engine that processes the format instructions created by ** fmt_compile (found in fmt_compile.c). */ #include #include #include #include #include #include #include #ifdef HAVE_SYS_TIME_H # include #endif #include #ifdef MULTIBYTE_SUPPORT # include # include #endif extern int fmt_norm; /* defined in sbr/fmt_def.c = AD_NAME */ struct mailname fmt_mnull; /* ** static prototypes */ static int match(char *, char *); static char *get_x400_friendly(char *, char *, int); static int get_x400_comp(char *, char *, char *, int); static char *fmt_trim(char *, int); /* ** test if string "sub" appears anywhere in ** string "str" (case insensitive). */ static int match(char *str, char *sub) { int c1, c2; char *s1, *s2; while ((c1 = *sub)) { while ((c2 = *str++) && tolower(c1) != tolower(c2)) ; if (! c2) return 0; s1 = sub + 1; s2 = str; while ((c1 = *s1++) && tolower(c1) == tolower(*s2++)) ; if (! c1) return 1; } return 1; } /* ** copy a number to the destination subject to a maximum width */ static void cpnumber(char **dest, int num, unsigned int wid, char fill, size_t n) { int i, c; char *sp; char *cp = *dest; char *ep = cp + n; if (cp + wid < ep) { if ((i = (num)) < 0) i = -(num); if ((c = (wid)) < 0) c = -c; sp = cp + c; do { *--sp = (i % 10) + '0'; i /= 10; } while (i > 0 && sp > cp); if (i > 0) *sp = '?'; else if ((num) < 0 && sp > cp) *--sp = '-'; while (sp > cp) *--sp = fill; cp += c; } *dest = cp; } /* ** copy string from str to dest padding with the fill character to a size ** of wid characters. if wid is negative, the string is right aligned ** no more than n bytes are copied */ static void cptrimmed(char **dest, char *str, unsigned int wid, char fill, size_t n) { int remaining; /* remaining output width available */ int c, ljust, w; int end; /* number of input bytes remaining in str */ #ifdef MULTIBYTE_SUPPORT int char_len; /* bytes in current character */ wchar_t wide_char; #endif char *sp; /* current position in source string */ char *cp = *dest; /* current position in destination string */ char *ep = cp + n; /* end of destination buffer */ int prevCtrl = 1; /* get alignment */ ljust = 0; if ((remaining = (wid)) < 0) { remaining = -remaining; ljust++; } if ((sp = (str))) { mbtowc(NULL, NULL, 0); /* reset shift state */ end = strlen(str); while (*sp && remaining > 0 && end > 0) { #ifdef MULTIBYTE_SUPPORT char_len = mbtowc(&wide_char, sp, end); if (char_len <= 0 || (cp + char_len > ep)) break; end -= char_len; if (iswcntrl(wide_char) || iswspace(wide_char)) { sp += char_len; #else end--; if (iscntrl(*sp) || isspace(*sp)) { sp++; #endif if (!prevCtrl) { *cp++ = ' '; remaining--; } prevCtrl = 1; continue; } prevCtrl = 0; #ifdef MULTIBYTE_SUPPORT w = wcwidth(wide_char); if (w >= 0 && remaining >= w) { strncpy(cp, sp, char_len); cp += char_len; remaining -= w; } sp += char_len; #else *cp++ = *sp++; remaining--; #endif } } if (ljust) { if (cp + remaining > ep) remaining = ep - cp; ep = cp + remaining; if (remaining > 0) { /* copy string to the right */ while (--cp >= *dest) *(cp + remaining) = *cp; /* add padding at the beginning */ cp += remaining; for (c=remaining; c>0; c--) *cp-- = fill; } *dest = ep; } else { /* pad remaining space */ while (remaining-- > 0 && cp < ep) *cp++ = fill; *dest = cp; } } static void cpstripped(char **start, char *end, char *str) { #ifdef MULTIBYTE_SUPPORT int char_len; /* bytes in current character */ int nbytes; wchar_t wide_char; #else int c; #endif char *s = str; if (!s) return; /* skip any initial control characters or spaces */ #ifdef MULTIBYTE_SUPPORT nbytes = end - *start + 1; mbtowc(NULL, NULL, 0); /* reset shift state */ while ((char_len = mbtowc(&wide_char, s, nbytes)) > 0 && (iswcntrl(wide_char) || iswspace(wide_char))) { s += char_len; nbytes -= char_len; } #else while ((c = (unsigned char) *s) && (iscntrl(c) || isspace(c))) s++; #endif /* compact repeated control characters and spaces into a single space */ #ifdef MULTIBYTE_SUPPORT while ((char_len = mbtowc(&wide_char, s, nbytes)) > 0 && *start < end) { if (!iswcntrl(wide_char) && !iswspace(wide_char)) { strncpy(*start, s, char_len); s += char_len; *start += char_len; nbytes -= char_len; } else { while ((char_len = mbtowc(&wide_char, s, nbytes)) > 0 && (iswcntrl(wide_char) || iswspace(wide_char))) { s += char_len; nbytes -= char_len; } *(*start)++ = ' '; } } #else while((c = (unsigned char) *s++) && *start < end) { if (!iscntrl(c) && !isspace(c)) { *(*start)++ = c; } else { while ((c = (unsigned char) *s) && (iscntrl(c) || isspace(c))) s++; *(*start)++ = ' '; } } #endif } static char *lmonth[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; static char * get_x400_friendly(char *mbox, char *buffer, int buffer_len) { char given[BUFSIZ], surname[BUFSIZ]; if (mbox == NULL) return NULL; if (*mbox == '"') mbox++; if (*mbox != '/') return NULL; if (get_x400_comp(mbox, "/PN=", buffer, buffer_len)) { for (mbox = buffer; (mbox = strchr(mbox, '.')); ) *mbox++ = ' '; return buffer; } if (!get_x400_comp(mbox, "/S=", surname, sizeof(surname))) return NULL; if (get_x400_comp(mbox, "/G=", given, sizeof(given))) snprintf(buffer, buffer_len, "%s %s", given, surname); else snprintf(buffer, buffer_len, "%s", surname); return buffer; } static int get_x400_comp(char *mbox, char *key, char *buffer, int buffer_len) { int idx; char *cp; if ((idx = stringdex(key, mbox)) < 0 || !(cp = strchr(mbox += idx + strlen(key), '/'))) return 0; snprintf(buffer, buffer_len, "%*.*s", (int)(cp - mbox), (int)(cp - mbox), mbox); return 1; } static char * fmt_trim(char *str, int width) { char *xp; int ljust, i; char buffer[BUFSIZ]; char *dst; strncpy(buffer, str, sizeof(buffer)); dst = buffer; dst[sizeof(buffer)-1] = '\0'; while (isspace(*dst)) { dst++; } ljust = 0; if ((i = width) < 0) { i = -i; ljust++; } if (!ljust && i > 0 && (int)strlen(dst) > i) { dst[i] = '\0'; } xp = dst; xp += strlen(dst) - 1; while (xp > dst && isspace(*xp)) { *xp-- = '\0'; } if (ljust && i > 0 && (int)strlen(dst) > i) { dst += strlen(dst) - i; } strncpy(str, dst, strlen(str) + 1); return str; } struct format * fmt_scan(struct format *format, char *scanl, int width, int *dat) { char *cp, *ep; unsigned char *sp; char *savestr = NULL; unsigned char *str = NULL; char buffer[BUFSIZ], buffer2[BUFSIZ]; int i, c, ljust, n; int value = 0; time_t t; struct format *fmt; struct comp *comp; struct tws *tws; struct mailname *mn; cp = scanl; ep = scanl + width - 1; for (fmt = format; fmt->f_type != FT_DONE; fmt++) switch (fmt->f_type) { case FT_PARSEADDR: case FT_PARSEDATE: fmt->f_comp->c_flags &= ~CF_PARSED; break; } fmt = format; while (cp < ep) { switch (fmt->f_type) { case FT_COMP: cpstripped(&cp, ep, fmt->f_comp->c_text); break; case FT_COMPF: cptrimmed(&cp, fmt->f_comp->c_text, fmt->f_width, fmt->f_fill, ep - cp); break; case FT_LIT: sp = fmt->f_text; while( (c = *sp++) && cp < ep) *cp++ = c; break; case FT_LITF: sp = fmt->f_text; ljust = 0; i = fmt->f_width; if (i < 0) { i = -i; ljust++; /* XXX should do something with this */ } while( (c = *sp++) && --i >= 0 && cp < ep) *cp++ = c; while( --i >= 0 && cp < ep) *cp++ = fmt->f_fill; break; case FT_STR: cpstripped(&cp, ep, str); break; case FT_STRF: cptrimmed(&cp, str, fmt->f_width, fmt->f_fill, ep - cp); break; case FT_STRFW: adios(EX_SOFTWARE, NULL, "internal error (FT_STRFW)"); case FT_NUM: n = snprintf(cp, ep - cp + 1, "%d", value); if (n >= 0) { if (n >= ep - cp) { cp = ep; } else cp += n; } break; case FT_NUMF: cpnumber(&cp, value, fmt->f_width, fmt->f_fill, ep - cp); break; case FT_CHAR: *cp++ = fmt->f_char; break; case FT_DONE: goto finished; case FT_IF_S: if (!(value = (str && *str))) { fmt += fmt->f_skip; continue; } break; case FT_IF_S_NULL: if (!(value = (str == NULL || *str == 0))) { fmt += fmt->f_skip; continue; } break; case FT_IF_V_EQ: if (value != fmt->f_value) { fmt += fmt->f_skip; continue; } break; case FT_IF_V_NE: if (value == fmt->f_value) { fmt += fmt->f_skip; continue; } break; case FT_IF_V_GT: if (value <= fmt->f_value) { fmt += fmt->f_skip; continue; } break; case FT_IF_MATCH: if (!(value = (str && match(str, fmt->f_text)))) { fmt += fmt->f_skip; continue; } break; case FT_V_MATCH: if (str) value = match(str, fmt->f_text); else value = 0; break; case FT_IF_AMATCH: if (!(value = (str && uprf(str, fmt->f_text)))) { fmt += fmt->f_skip; continue; } break; case FT_V_AMATCH: value = uprf(str, fmt->f_text); break; case FT_S_NONNULL: value = (str != NULL && *str != 0); break; case FT_S_NULL: value = (str == NULL || *str == 0); break; case FT_V_EQ: value = (fmt->f_value == value); break; case FT_V_NE: value = (fmt->f_value != value); break; case FT_V_GT: value = (fmt->f_value > value); break; case FT_GOTO: fmt += fmt->f_skip; continue; case FT_NOP: break; case FT_LS_COMP: str = fmt->f_comp->c_text; break; case FT_LS_LIT: str = fmt->f_text; break; case FT_LS_GETENV: if (!(str = getenv(fmt->f_text))) str = ""; break; case FT_LS_CFIND: if (!(str = context_find(fmt->f_text))) str = ""; break; case FT_LS_DECODECOMP: if (decode_rfc2047(fmt->f_comp->c_text, buffer2, sizeof(buffer2))) str = buffer2; else str = fmt->f_comp->c_text; break; case FT_LS_DECODE: if (str && decode_rfc2047(str, buffer2, sizeof(buffer2))) str = buffer2; break; case FT_LS_TRIM: if (str) { str = fmt_trim(str, fmt->f_width); } break; case FT_LV_COMPFLAG: value = (fmt->f_comp->c_flags & CF_TRUE) != 0; break; case FT_LV_COMP: value = (comp = fmt->f_comp)->c_text ? atoi(comp->c_text) : 0; break; case FT_LV_LIT: value = fmt->f_value; break; case FT_LV_DAT: value = dat[fmt->f_value]; break; case FT_LV_STRLEN: if (str != NULL) value = strlen(str); else value = 0; break; case FT_LV_CHAR_LEFT: value = width - (cp - scanl); break; case FT_LV_PLUS_L: value += fmt->f_value; break; case FT_LV_MINUS_L: value = fmt->f_value - value; break; case FT_LV_DIVIDE_L: if (fmt->f_value) value = value / fmt->f_value; else value = 0; break; case FT_LV_MODULO_L: if (fmt->f_value) value = value % fmt->f_value; else value = 0; break; case FT_SAVESTR: savestr = str; break; case FT_LV_SEC: value = fmt->f_comp->c_tws->tw_sec; break; case FT_LV_MIN: value = fmt->f_comp->c_tws->tw_min; break; case FT_LV_HOUR: value = fmt->f_comp->c_tws->tw_hour; break; case FT_LV_MDAY: value = fmt->f_comp->c_tws->tw_mday; break; case FT_LV_MON: value = fmt->f_comp->c_tws->tw_mon + 1; break; case FT_LS_MONTH: str = tw_moty[fmt->f_comp->c_tws->tw_mon]; break; case FT_LS_LMONTH: str = lmonth[fmt->f_comp->c_tws->tw_mon]; break; case FT_LS_ZONE: str = dtwszone(fmt->f_comp->c_tws); break; case FT_LV_YEAR: value = fmt->f_comp->c_tws->tw_year; break; case FT_LV_WDAY: if (!(((tws = fmt->f_comp->c_tws)->tw_flags) & (TW_SEXP|TW_SIMP))) set_dotw(tws); value = tws->tw_wday; break; case FT_LS_DAY: if (!(((tws = fmt->f_comp->c_tws)->tw_flags) & (TW_SEXP|TW_SIMP))) set_dotw(tws); str = tw_dotw[tws->tw_wday]; break; case FT_LS_WEEKDAY: if (!(((tws = fmt->f_comp->c_tws)->tw_flags) & (TW_SEXP|TW_SIMP))) set_dotw(tws); str = tw_ldotw[tws->tw_wday]; break; case FT_LV_YDAY: value = fmt->f_comp->c_tws->tw_yday; break; case FT_LV_ZONE: value = fmt->f_comp->c_tws->tw_zone; break; case FT_LV_CLOCK: if ((value = fmt->f_comp->c_tws->tw_clock) == 0) value = dmktime(fmt->f_comp->c_tws); break; case FT_LV_RCLOCK: if ((value = fmt->f_comp->c_tws->tw_clock) == 0) value = dmktime(fmt->f_comp->c_tws); value = time((time_t *) 0) - value; break; case FT_LV_DAYF: if (!(((tws = fmt->f_comp->c_tws)->tw_flags) & (TW_SEXP|TW_SIMP))) set_dotw(tws); switch (fmt->f_comp->c_tws->tw_flags & TW_SDAY) { case TW_SEXP: value = 1; break; case TW_SIMP: value = 0; break; default: value = -1; break; } case FT_LV_ZONEF: if ((fmt->f_comp->c_tws->tw_flags & TW_SZONE) == TW_SZEXP) value = 1; else value = -1; break; case FT_LV_DST: value = fmt->f_comp->c_tws->tw_flags & TW_DST; break; case FT_LS_822DATE: case FT_LS_PRETTY: str = dasctime(fmt->f_comp->c_tws); break; case FT_LS_PERS: str = fmt->f_comp->c_mn->m_pers; break; case FT_LS_MBOX: str = fmt->f_comp->c_mn->m_mbox; break; case FT_LS_HOST: str = fmt->f_comp->c_mn->m_host; break; case FT_LS_PATH: str = fmt->f_comp->c_mn->m_path; break; case FT_LS_GNAME: str = fmt->f_comp->c_mn->m_gname; break; case FT_LS_NOTE: str = fmt->f_comp->c_mn->m_note; break; case FT_LS_822ADDR: str = adrformat( fmt->f_comp->c_mn ); break; case FT_LV_HOSTTYPE: value = fmt->f_comp->c_mn->m_type; break; case FT_LV_INGRPF: value = fmt->f_comp->c_mn->m_ingrp; break; case FT_LV_NOHOSTF: value = fmt->f_comp->c_mn->m_nohost; break; case FT_LS_ADDR: case FT_LS_FRIENDLY: if ((mn = fmt->f_comp->c_mn) == &fmt_mnull) { str = fmt->f_comp->c_text; break; } if (fmt->f_type == FT_LS_ADDR) goto unfriendly; if ((str = mn->m_pers) == NULL) { if ((str = mn->m_note)) { strncpy(buffer, str, sizeof(buffer)); buffer[sizeof(buffer)-1] = '\0'; str = buffer; if (*str == '(') str++; sp = str + strlen(str) - 1; if (*sp == ')') { *sp-- = '\0'; while (sp >= str) if (*sp == ' ') *sp-- = '\0'; else break; } } else if (!(str = get_x400_friendly(mn->m_mbox, buffer, sizeof(buffer)))) { unfriendly: ; switch (mn->m_type) { case LOCALHOST: str = mn->m_mbox; break; default: if (mn->m_mbox) { snprintf(buffer, sizeof(buffer), "%s@%s", mn->m_mbox, mn->m_host); str= buffer; } else str = mn->m_text; break; } } } break; /* UNQUOTEs RFC-2822 quoted-string and quoted-pair */ case FT_LS_UNQUOTE: if (str) { strncpy(buffer, str, sizeof(buffer)); /* strncpy doesn't NUL-terminate if it fills the buffer */ buffer[sizeof(buffer)-1] = '\0'; unquote_string(buffer, buffer2); str = buffer2; } break; case FT_LOCALDATE: comp = fmt->f_comp; if ((t = comp->c_tws->tw_clock) == 0) t = dmktime(comp->c_tws); tws = dlocaltime(&t); *comp->c_tws = *tws; break; case FT_GMTDATE: comp = fmt->f_comp; if ((t = comp->c_tws->tw_clock) == 0) t = dmktime(comp->c_tws); tws = dgmtime(&t); *comp->c_tws = *tws; break; case FT_PARSEDATE: comp = fmt->f_comp; if (comp->c_flags & CF_PARSED) break; if ((sp = comp->c_text) && (tws = dparsetime(sp))) { *comp->c_tws = *tws; comp->c_flags &= ~CF_TRUE; } else if ((comp->c_flags & CF_DATEFAB) == 0) { memset((char *) comp->c_tws, 0, sizeof *comp->c_tws); comp->c_flags = CF_TRUE; } comp->c_flags |= CF_PARSED; break; case FT_FORMATADDR: /* ** hook for custom address list formatting ** (see replsbr.c) */ str = formataddr(savestr, str); break; case FT_PUTADDR: /* ** output the str register as an address component, ** splitting it into multiple lines if necessary. The ** value reg. contains the max line length. The lit. ** field may contain a string to prepend to the result ** (e.g., "To: ") */ { unsigned char *lp; char *lastb; int indent, wid, len; lp = str; wid = value; len = strlen(str); sp = fmt->f_text; indent = strlen(sp); wid -= indent; if (wid <= 0) { adios(EX_SOFTWARE, NULL, "putaddr -- num register (%d) " "must be greater than label " "width (%d)", value, indent); } while( (c = *sp++) && cp < ep) *cp++ = c; while (len > wid) { /* ** try to break at a comma; failing that, ** break at a space. */ lastb = 0; sp = lp + wid; while (sp > lp && (c = *--sp) != ',') { if (! lastb && isspace(c)) lastb = sp - 1; } if (sp == lp) { if (! (sp = lastb)) { sp = lp + wid - 1; while (*sp && *sp != ',' && !isspace(*sp)) sp++; if (*sp != ',') sp--; } } len -= sp - lp + 1; while (cp < ep && lp <= sp) *cp++ = *lp++; while (isspace(*lp)) lp++, len--; if (*lp) { if (cp < ep) *cp++ = '\n'; for (i=indent; cp < ep && i > 0; i--) *cp++ = ' '; } } cpstripped(&cp, ep, lp); } break; case FT_PARSEADDR: comp = fmt->f_comp; if (comp->c_flags & CF_PARSED) break; if (comp->c_mn != &fmt_mnull) mnfree(comp->c_mn); if ((sp = comp->c_text) && (sp = getname(sp)) && (mn = getm(sp, NULL, 0, fmt_norm, NULL))) { comp->c_mn = mn; while (getname("")) ; comp->c_flags |= CF_PARSED; } else { while (getname("")) /* XXX */ ; comp->c_mn = &fmt_mnull; } break; case FT_MYMBOX: /* ** if there's no component, we say true. Otherwise we ** say "true" only if we can parse the address and it ** matches one of our addresses. */ comp = fmt->f_comp; if (comp->c_mn != &fmt_mnull) mnfree(comp->c_mn); if ((sp = comp->c_text) && (sp = getname(sp)) && (mn = getm(sp, NULL, 0, AD_NAME, NULL))) { comp->c_mn = mn; if (ismymbox(mn)) comp->c_flags |= CF_TRUE; else comp->c_flags &= ~CF_TRUE; while ((sp = getname(sp))) if ((comp->c_flags & CF_TRUE) == 0 && (mn = getm(sp, NULL, 0, AD_NAME, NULL))) if (ismymbox(mn)) comp->c_flags |= CF_TRUE; } else { while (getname("")) /* XXX */ ; if (comp->c_text == 0) comp->c_flags |= CF_TRUE; else comp->c_flags &= ~CF_TRUE; comp->c_mn = &fmt_mnull; } break; case FT_LS_UNMAILTO: if (!str) { break; } str = trim(str); if (*str == '<' && str[strlen(str)-1] == '>') { str++; str[strlen(str)-1] = '\0'; } if (strncmp("mailto:", str, 7)==0) { str += 7; } break; } fmt++; } finished:; if (cp[-1] != '\n') *cp++ = '\n'; *cp = '\0'; return ((struct format *)0); } mmh-0.4/sbr/m_convert.c0000644000000000000000000002050413414435726013574 0ustar rootroot/* ** m_convert.c -- parse a message range or sequence and set SELECTED ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ /* FIXME: This code needs rework! Rewrite as a parser? */ #include #include /* ** error codes for sequence ** and message range processing */ #define BADMSG (-2) #define BADRNG (-3) #define BADNEW (-4) #define BADNUM (-5) #define BADLST (-6) #define FIRST 1 #define LAST 2 #define getbeyond(mp) ((mp)->hghmsg + 1) static int convdir; /* convert direction */ static char *delimp; /* delimiter pointer */ /* ** static prototypes */ static int m_conv(struct msgs *, char *, int); static int attr(struct msgs *, char *); int m_convert(struct msgs *mp, char *name) { int first, last, found, range, err; unsigned char *bp; char *cp; /* check if user defined sequence */ err = attr(mp, cp = name); if (err == -1) return 0; else if (err < 0) goto badmsg; else if (err > 0) { /* it had been a user-defined sequence: we're finished */ return 1; } /* ** else err == 0, so continue ** here we know: it is no user-defined seq */ /* ** Handle the special beyond sequence, which is valid only if ** ALLOW_BEYOND is set, and can appear only on its own. ** Also, it is available in any folder. */ if ((mp->msgflags & ALLOW_BEYOND) && strcmp(cp, seq_beyond)==0) { set_selected(mp, getbeyond(mp)); return 1; } /* ** Handle the special all sequence: replace `a' with `f-l' */ if (strcmp(cp, seq_all)==0) { cp = concat(seq_first, "-", seq_last, NULL); } if ((err = first = m_conv(mp, cp, FIRST)) <= 0) goto badmsg; cp = delimp; switch (*cp) { case '-': /* global range */ cp++; if ((err = last = m_conv(mp, cp, LAST)) <= 0) { badmsg: switch (err) { case BADMSG: advise(NULL, "no %s message", cp); break; case BADNUM: advise(NULL, "message %s doesn't exist", cp); break; case BADRNG: advise(NULL, "message %s out of range 1-%d", cp, mp->hghmsg); break; case BADLST: badlist: advise(NULL, "bad message list %s", name); break; case BADNEW: advise(NULL, "folder full, no %s message", name); break; default: advise(NULL, "no messages match specification"); } return 0; } if (last < first) goto badlist; if (*delimp) goto badelim; if (first > mp->hghmsg || last < mp->lowmsg) { rangerr: advise(NULL, "no messages in range %s", name); return 0; } /* tighten the range to search */ if (last > mp->hghmsg) last = mp->hghmsg; if (first < mp->lowmsg) first = mp->lowmsg; break; case ':': /* anchored range */ cp++; if (*cp == '-') { convdir = -1; cp++; } else if (*cp == '+') { convdir = 1; cp++; } if ((range = atoi(bp = cp)) == 0) goto badlist; while (isdigit(*bp)) bp++; if (*bp) goto badelim; if ((convdir > 0 && first > mp->hghmsg) || (convdir < 0 && first < mp->lowmsg)) goto rangerr; /* tighten the range to search */ if (first < mp->lowmsg) first = mp->lowmsg; if (first > mp->hghmsg) first = mp->hghmsg; for (last = first; last >= mp->lowmsg && last <= mp->hghmsg; last += convdir) if (does_exist(mp, last) && (--range <= 0)) break; if (last < mp->lowmsg) last = mp->lowmsg; if (last > mp->hghmsg) last = mp->hghmsg; if (last < first) { range = last; last = first; first = range; } break; case '\0': /* single name */ /* ** AFAICS, the only cases to reach here are: ** f, l, p, n, c, b ** But I'm not sure. --meillo */ /* ** Single Message ** ** Check if message is in-range and exists. */ if (first > mp->hghmsg || first < mp->lowmsg || !does_exist(mp, first)) { if (strcmp(name, seq_cur)==0) advise(NULL, "no current message"); else /* this case seems to never be reached */ advise(NULL, "message %d doesn't exist", first); return 0; } last = first; /* range of 1 */ break; default: badelim: advise(NULL, "illegal argument delimiter: `%c'(0%o)", *delimp, *delimp); return 0; break; } /* Cycle through the range and select the messages that exist. */ for (found=0; first <= last; first++) { if (does_exist(mp, first)) { set_selected(mp, first); found++; } } if (!found) goto rangerr; return 1; } /* ** Convert the various message names to their numeric values. ** ** 42 (any integer) ** p ** n ** f ** l ** c */ static int m_conv(struct msgs *mp, char *str, int call) { int i; unsigned char *cp, *bp; unsigned char buf[16]; /* for reserved sequence name */ convdir = 1; cp = bp = str; /* Handle an integer */ if (isdigit(*cp)) { while (isdigit(*bp)) bp++; delimp = bp; i = atoi(cp); if (i <= mp->hghmsg) return i; else if (*delimp || call == LAST) return mp->hghmsg + 1; else if (mp->msgflags & ALLOW_BEYOND) return BADRNG; else return BADNUM; } for (bp = buf; isalpha(*cp) && (bp - buf < (int)sizeof(buf) - 1); ) { *bp++ = *cp++; } *bp++ = '\0'; delimp = cp; /* Which one of the reserved names is it? */ if (strcmp(buf, seq_first)==0) { return (mp->hghmsg || !(mp->msgflags & ALLOW_BEYOND) ? mp->lowmsg : BADMSG); } else if (strcmp(buf, seq_last)==0) { convdir = -1; return (mp->hghmsg || !(mp->msgflags & ALLOW_BEYOND) ? mp->hghmsg : BADMSG); } else if (strcmp(buf, seq_cur)==0) { return (mp->curmsg > 0 ? mp->curmsg : BADMSG); } else if (strcmp(buf, seq_prev)==0) { convdir = -1; for (i = (mp->curmsg <= mp->hghmsg) ? mp->curmsg - 1 : mp->hghmsg; i >= mp->lowmsg; i--) { if (does_exist(mp, i)) return i; } return BADMSG; } else if (strcmp(buf, seq_next)==0) { for (i = (mp->curmsg >= mp->lowmsg) ? mp->curmsg + 1 : mp->lowmsg; i <= mp->hghmsg; i++) { if (does_exist(mp, i)) return i; } return BADMSG; } else { return BADLST; } } /* ** Handle user defined sequences. ** They can take the following forms: ** ** seq ** seq:p ** seq:n ** seq:f ** seq:l ** seq:+42 ** seq:-42 ** seq:42 ** ** (`42' being an arbitrary integer) */ static int attr(struct msgs *mp, char *cp) { unsigned char *dp; char *bp = NULL; int i, j; int found; int inverted = 0; int range = 0; /* no range */ int first = 0; /* hack for "c-..." */ if (strcmp(cp, seq_cur)==0) return 0; /* "c:..." -- this code need to be rewritten... */ if (strncmp(seq_cur, cp, strlen(seq_cur))==0 && cp[strlen(seq_cur)] == ':') { return 0; } /* Check for sequence negation */ if (!(dp = context_find(nsequence))) { dp = seq_neg; /* use default */ } if (*dp && strncmp(cp, dp, strlen(dp))==0) { inverted = 1; cp += strlen(dp); } convdir = 1; /* convert direction */ for (dp = cp; *dp && isalnum(*dp); dp++) continue; if (*dp == ':') { bp = dp++; range = 1; /* ** seq:p (or) ** seq:n (or) ** seq:f (or) ** seq:l */ if (isalpha(*dp)) { if (strcmp(dp, seq_prev)==0) { convdir = -1; first = (mp->curmsg > 0) && (mp->curmsg <= mp->hghmsg) ? mp->curmsg - 1 : mp->hghmsg; } else if (strcmp(dp, seq_next)==0) { convdir = 1; first = (mp->curmsg >= mp->lowmsg) ? mp->curmsg + 1 : mp->lowmsg; } else if (strcmp(dp, seq_first)==0) { convdir = 1; } else if (strcmp(dp, seq_last)==0) { convdir = -1; } else return BADLST; } else { /* ** seq:42 (or) ** seq:+42 (or) ** seq:-42 */ if (*dp == '+') dp++; else if (*dp == '-') { dp++; convdir = -1; } if ((range = atoi(dp)) == 0) return BADLST; while (isdigit(*dp)) dp++; if (*dp) return BADLST; } *bp = '\0'; /* temporarily terminate sequence name */ } i = seq_getnum(mp, cp); /* get index of sequence */ if (bp) *bp = ':'; /* restore sequence name */ if (i == -1) return 0; found = 0; /* count the number we select for this argument */ for (j = first ? first : (convdir > 0) ? mp->lowmsg : mp->hghmsg; j >= mp->lowmsg && j <= mp->hghmsg; j += convdir) { if (does_exist(mp, j) && inverted ? !in_sequence(mp, i, j) : in_sequence(mp, i, j)) { set_selected(mp, j); found++; /* ** If we have a range, then break out ** once we've found enough. */ if (range && found >= range) break; } } if (found) return found; if (first) return BADMSG; advise(NULL, "sequence %s %s", cp, inverted ? "full" : "empty"); return -1; } mmh-0.4/sbr/snprintb.c0000644000000000000000000000131413414435726013435 0ustar rootroot/* ** snprintb.c -- snprintf a %b string ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include char * snprintb(char *buffer, size_t n, unsigned v, char *bits) { int i, j; char c, *bp; snprintf(buffer, n, bits && *bits == 010 ? "0%o" : "0x%x", v); bp = buffer + strlen(buffer); if (bits && *++bits) { j = 0; *bp++ = '<'; while ((i = *bits++)) if (v & (1 << (i - 1))) { if (j++) *bp++ = ','; for (; (c = *bits) > 32; bits++) *bp++ = c; } else for (; *bits > 32; bits++) continue; *bp++ = '>'; *bp = 0; } return buffer; } mmh-0.4/sbr/getthreadid.c0000644000000000000000000000214013414435726014060 0ustar rootroot#include #include #include static char *threadid(char *, char *); char * getthreadid(const char *path) { char *msgid = NULL; char *referens = NULL; char *ret; struct field f = {{0}}; enum state state = FLD2; FILE *file = fopen(path, "r"); while (state == FLD2 && !msgid && !referens) { switch (state = m_getfld2(state, &f, file)) { case FLD2: if (strncasecmp("message-id", f.name, f.namelen)==0) { msgid = f.value; f.value = NULL; } else if (strncasecmp("references", f.name, f.namelen)==0) { referens = f.value; f.value = NULL; } break; default: fclose(file); break; } } ret = threadid(msgid, referens); mh_free0(&msgid); mh_free0(&referens); return ret; } static char * threadid(char *msgid, char *referens) { char *threadfrom; char *start, *end; char *cp; threadfrom = referens ? referens : msgid; if (!threadfrom) { return NULL; } start = strchr(threadfrom, '<'); end = strchr(start, '>'); if (!(*start) || !(*end)) { return NULL; } *end = '\0'; cp = mh_xstrdup(start + 1); *end = '>'; return cp; } mmh-0.4/sbr/unquote.c0000644000000000000000000000231113414435726013274 0ustar rootroot/* ** unquote.c: Handle quote removal and quoted-pair strings on ** RFC 2822-5322 atoms. ** ** This code is Copyright (c) 2013, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include /* ** Remove quotes and quoted-pair sequences from RFC-5322 atoms. ** ** Currently the actual algorithm is simpler than it technically should ** be: any quotes are simply eaten, unless they're preceded by the escape ** character (\). This seems to be sufficient for our needs for now. ** ** Arguments: ** ** input - The input string ** output - The output string; is assumed to have at least as much ** room as the input string. At worst the output string will ** be the same size as the input string; it might be smaller. */ void unquote_string(const char *input, char *output) { int inpos = 0; int outpos = 0; while (input[inpos] != '\0') { switch (input[inpos]) { case '\\': inpos++; if (input[inpos] != '\0') output[outpos++] = input[inpos++]; break; case '"': inpos++; break; default: output[outpos++] = input[inpos++]; break; } } output[outpos] = '\0'; } mmh-0.4/sbr/seq_print.c0000644000000000000000000000165513414435726013612 0ustar rootroot/* ** seq_print.c -- Routines to print sequence information. ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #define empty(s) ((s) ? (s) : "") /* ** Print all the sequences in a folder */ void seq_printall(struct msgs *mp) { int i; char *list; for (i = 0; mp->msgattrs[i]; i++) { list = seq_list(mp, mp->msgattrs[i]); printf("%s%s: %s\n", mp->msgattrs[i], is_seq_private(mp, i) ? " (private)" : "", empty(list)); } } /* ** Print a particular sequence in a folder */ void seq_print(struct msgs *mp, char *seqname) { int i; char *list; /* get the index of sequence */ i = seq_getnum(mp, seqname); /* get sequence information */ list = seq_list(mp, seqname); printf("%s%s: %s\n", seqname, (i == -1) ? "" : is_seq_private(mp, i) ? " (private)" : "", empty(list)); } mmh-0.4/sbr/m_mktemp.c0000644000000000000000000001003413414435726013406 0ustar rootroot/* ** m_mktemp.c -- Construct a temporary file. ** ** This code is Copyright (c) 2010, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include static char *get_temp_dir(); /* Create a temporary file. If pfx_in is null, the temporary file ** will be created in the temporary directory (more on that later). ** If pfx_in is not null, then the temporary file location will be ** defined by the value pfx_in. ** ** The file created will be at the pathname specified appended with ** 6 random (we hope :) characters. ** ** The return value will be the pathname to the file created. ** ** CAUTION: The return pointer references static data. If ** you need to modify, or save, the return string, make a copy of it ** first. ** ** When pfx_in is null, the temporary directory is determined as ** follows, in order: ** ** MHTMPDIR envvar ** TMPDIR envvar ** TMP envvar ** User's mail directory. ** ** NOTE: One will probably use m_mktemp2() instead of this function. ** For example, if you want to create a temp file in the defined ** temporary directory, but with a custom basename prefix, do ** something like the following: ** ** char *tmp_pathname = m_mktemp2(NULL, "mypre", ...); */ char * m_mktemp( const char *pfx_in, /* Pathname prefix for temporary file. */ int *fd_ret, /* (return,opt.) File descriptor to temp file. */ FILE **fp_ret /* (return,opt.) FILE pointer to temp file. */ ) { static char tmpfil[BUFSIZ]; int fd = -1; int keep_open = 0; mode_t oldmode = umask(077); if (pfx_in == NULL) { snprintf(tmpfil, sizeof(tmpfil), "%s/nmhXXXXXX", get_temp_dir()); } else { snprintf(tmpfil, sizeof(tmpfil), "%sXXXXXX", pfx_in); } fd = mkstemp(tmpfil); if (fd < 0) { umask(oldmode); return NULL; } if (fd_ret != NULL) { *fd_ret = fd; keep_open = 1; } if (fp_ret != NULL) { FILE *fp = fdopen(fd, "w+"); if (fp == NULL) { int olderr = errno; unlink(tmpfil); close(fd); errno = olderr; umask(oldmode); return NULL; } *fp_ret = fp; keep_open = 1; } if (!keep_open) { close(fd); } umask(oldmode); return tmpfil; } /* ** This version allows one to specify the directory the temp file should ** by created based on a given pathname. Although m_mktemp() technically ** supports this, this version is when the directory is defined by ** a separate variable from the prefix, eliminating the caller from having ** to do string manipulation to generate the desired. pathname prefix. ** ** The pfx_in parameter specifies a basename prefix for the file. If dir_in ** is NULL, then the defined temporary directory (see comments to m_mktemp() ** above) is used to create the temp file. */ char * m_mktemp2( const char *dir_in, /* Directory to place temp file. */ const char *pfx_in, /* Basename prefix for temp file. */ int *fd_ret, /* (return,opt.) File descriptor to temp file. */ FILE **fp_ret /* (return,opt.) FILE pointer to temp file. */ ) { static char buffer[BUFSIZ]; char *cp; int n; if (dir_in == NULL) { if (pfx_in == NULL) { return m_mktemp(NULL, fd_ret, fp_ret); } snprintf(buffer, sizeof(buffer), "%s/%s", get_temp_dir(), pfx_in); return m_mktemp(buffer, fd_ret, fp_ret); } if ((cp = mhbasename((char *)dir_in)) == dir_in) { /* No directory component */ return m_mktemp(pfx_in, fd_ret, fp_ret); } n = (int)(cp-dir_in-1); /* Length of dir component */ snprintf(buffer, sizeof(buffer), "%.*s/%s", n, dir_in, pfx_in); return m_mktemp(buffer, fd_ret, fp_ret); } static char * get_temp_dir() { /* Ignore envvars if we are setuid */ if ((getuid()==geteuid()) && (getgid()==getegid())) { char *tmpdir = NULL; tmpdir = getenv("MHTMPDIR"); if (tmpdir != NULL && *tmpdir != '\0') return tmpdir; tmpdir = getenv("TMPDIR"); if (tmpdir != NULL && *tmpdir != '\0') return tmpdir; tmpdir = getenv("TMP"); if (tmpdir != NULL && *tmpdir != '\0') return tmpdir; } return toabsdir("+"); } mmh-0.4/sbr/dtimep.lex0000644000000000000000000002163013414435726013431 0ustar rootroot/* ** dtimep.lex exceeds the default table capacities for some old versions ** of lex (and the minimum defaults as specified by POSIX). The following ** choices meet or exceed the lex defaults for older SunOS4.x, Solaris, ** HPUX, and AIX. */ %e4000 %p7000 %n2500 %a5000 %{ #include #include #include /* ** Since we're looking at a string at a time, don't worry about ** wrapping to the next buffer. */ #define yywrap() 1 #define YY_SKIP_YYWRAP #define YY_NO_INPUT /* ** This is the tricky thing that makes this function cool. We ** replace the traditional int yylex(void) declaration with our ** dparsetime() declaration, essentially piggy-backing off the ** utility of the yylex() function and adding what we need to make ** the parsing function useful to us. */ #define YY_DECL struct tws *dparsetime(char *lexstr) /* ** yyerminate() is called after the input string is matched to ** completion (actually, when the lexer reaches an EOF). The only ** thing that really needs to be in this macro function is the ** return call, which must be substituted inline into dparsetime. */ #define yyterminate() (void)yy_delete_buffer(lexhandle); \ if(!(tw.tw_flags & TW_SUCC)) { \ return (struct tws *)NULL; \ } \ if(tw.tw_year < 1970) \ tw.tw_year += 1900; \ if(tw.tw_year < 1970) \ tw.tw_year += 100; \ return(&tw) /* ** Patchable flag that says how to interpret NN/NN/NN dates. When ** true, we do it European style: DD/MM/YY. When false, we do it ** American style: MM/DD/YY. Of course, these are all non-RFC822 ** compliant. */ int europeandate = 0; static int name2num(char *name, char *names[]) { int i; for (i=0; names[i]; i++) { if (strncasecmp(name, names[i], strlen(names[i]))==0) { return i; } } return 0; } /* ** The SET* macros will parse for the appropriate field, and leave the ** cp pointer at the first character after the desired field. Be ** careful with variable-length fields or alpha-num mixes. ** ** The SKIP* macros skip over characters of a particular class and ** leave cp at the position of the first character that doesn't match ** that class. Correspondingly, SKIPTO* skips until it reaches a ** character of a particular class. */ #define INIT() { cp = yytext;} #define SETWDAY() { tw.tw_wday = name2num(cp, tw_dotw); \ tw.tw_flags &= ~TW_SDAY; tw.tw_flags |= TW_SEXP; SKIPA(); } #define SETMON() { tw.tw_mon = name2num(cp, tw_moty); SKIPA(); } #define SETMON_NUM() { tw.tw_mon = atoi(cp)-1; SKIPD(); } #define SETYEAR() { tw.tw_year = atoi(cp); SKIPD(); } #define SETDAY() { tw.tw_mday = atoi(cp); tw.tw_flags |= TW_YES; SKIPD(); } #define SETTIME() { tw.tw_hour = atoi(cp); cp += 2; SKIPTOD(); \ tw.tw_min = atoi(cp); cp += 2; if(*cp == ':') { \ tw.tw_sec = atoi(++cp); SKIPD(); } } #define SETZONE(x) { tw.tw_zone = ((x)/100)*60+(x)%100; \ tw.tw_flags |= TW_SZEXP; SKIPD(); } #define SETZONEC(h, m) { tw.tw_zone = (h)*60+(m); \ tw.tw_flags |= TW_SZEXP; SKIPD(); } #define SETDST() { tw.tw_flags |= TW_DST; } #define SKIPD() { while ( isdigit(*cp++) ) ; --cp; } #define SKIPTOD() { while ( !isdigit(*cp++) ) ; --cp; } #define SKIPA() { while ( isalpha(*cp++) ) ; --cp; } #define SKIPTOA() { while ( !isalpha(*cp++) ) ; --cp; } #define SKIPSP() { while ( isspace(*cp++) ) ; --cp; } #define SKIPTOSP() { while ( !isspace(*cp++) ) ; --cp; } #ifdef ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST # ifdef HAVE_SYS_TIME_H # include # endif #include static void zonehack (struct tws *tw) { struct tm *tm; if (dmktime (tw) == (time_t) -1) return; tm = localtime (&tw->tw_clock); if (tm->tm_isdst) { tw->tw_flags |= TW_DST; tw->tw_zone -= 60; } } #endif /* ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST */ %} sun ([Ss][Uu][Nn]([Dd][Aa][Yy])?) mon ([Mm][Oo][Nn]([Dd][Aa][Yy])?) tue ([Tt][Uu][Ee]([Ss][Dd][Aa][Yy])?) wed ([Ww][Ee][Dd]([Nn][Ee][Ss][Dd][Aa][Yy])?) thu ([Tt][Hh][Uu]([Rr][Ss][Dd][Aa][Yy])?) fri ([Ff][Rr][Ii]([Dd][Aa][Yy])?) sat ([Ss][Aa][Tt]([Uu][Rr][Dd][Aa][Yy])?) DAY ({sun}|{mon}|{tue}|{wed}|{thu}|{fri}|{sat}) jan ([Jj][Aa][Nn]([Uu][Aa][Rr][Yy])?) feb ([Ff][Ee][Bb]([Rr][Uu][Aa][Rr][Yy])?) mar ([Mm][Aa][Rr]([Cc][Hh])?) apr ([Aa][Pp][Rr]([Ii][Ll])?) may ([Mm][Aa][Yy]) jun ([Jj][Uu][Nn]([Ee])?) jul ([Jj][Uu][Ll]([Yy])?) aug ([Aa][Uu][Gg]([Uu][Ss][Tt])?) sep ([Ss][Ee][Pp]([Tt][Ee][Mm][Bb][Ee][Rr])?) oct ([Oo][Cc][Tt]([Oo][Bb][Ee][Rr])?) nov ([Nn][Oo][Vv]([Ee][Mm][Bb][Ee][Rr])?) dec ([Dd][Ee][Cc]([Ee][Mm][Bb][Ee][Rr])?) MONTH ({jan}|{feb}|{mar}|{apr}|{may}|{jun}|{jul}|{aug}|{sep}|{oct}|{nov}|{dec}) TIME ({D}:{d}{d}(:{d}{d})?) /* ** The year can either be 2 digits, or 4. However, after ** Y2K, we found that some MUA were reporting the year 100, hence ** the middle term here. yyterminate() resolves the actual ** issues with 2-digit years. */ YEAR (({d}{d})|(1{d}{d})|({d}{4})) w ([ \t]*) W ([ \t]+) D ([0-9]?[0-9]) d [0-9] nl [ \t\n()] %% %{ /* ** This section begins the definition of dparsetime(). ** Put here any local variable definitions and initializations */ YY_BUFFER_STATE lexhandle; unsigned char *cp; static struct tws tw; memset(&tw,0,sizeof(struct tws)); lexhandle = yy_scan_string(lexstr); %} {DAY}","?{W}{MONTH}{W}{D}{W}{TIME}{W}{YEAR} { INIT(); SETWDAY(); SKIPTOA(); SETMON(); SKIPTOD(); SETDAY(); SKIPTOD(); SETTIME(); SKIPTOD(); SETYEAR(); } {DAY}","?{W}{D}{W}{MONTH}{W}{YEAR}{W}{TIME} { INIT(); SETWDAY(); SKIPTOD(); SETDAY(); SKIPTOA(); SETMON(); SKIPTOD(); SETYEAR(); SKIPTOD(); SETTIME(); } {D}{W}{MONTH}{W}{YEAR}{W}{TIME} { INIT(); SETDAY(); SKIPTOA(); SETMON(); SKIPTOD(); SETYEAR(); SKIPTOD(); SETTIME(); } {DAY}","?{W}{MONTH}{W}{D}","?{W}{YEAR}","?{W}{TIME} { INIT(); SETWDAY(); SKIPTOA(); SETMON(); SKIPTOD(); SETDAY(); SKIPTOD(); SETYEAR(); SKIPTOD(); SETTIME(); } {DAY}","?{W}{MONTH}{W}{D}","?{W}{YEAR} { INIT(); SETWDAY(); SKIPTOA(); SETMON(); SKIPTOD(); SETDAY(); SKIPTOD(); SETYEAR(); } {MONTH}{W}{D}","?{W}{YEAR}","?{W}{DAY} { INIT(); SETMON(); SKIPTOD(); SETDAY(); SKIPTOD(); SETYEAR(); SKIPTOA(); SETWDAY(); } {MONTH}{W}{D}","?{W}{YEAR} { INIT(); SETMON(); SKIPTOD(); SETDAY(); SKIPTOD(); SETYEAR(); } {d}{4}"-"{d}{2}"-"{d}{2}(" "|"T"){TIME} { INIT(); SETYEAR(); SKIPTOD(); SETMON_NUM(); SKIPTOD(); SETDAY(); SKIPTOD(); SETTIME(); } {d}{4}"-"{d}{2}"-"{d}{2} { INIT(); SETYEAR(); SKIPTOD(); SETMON_NUM(); SKIPTOD(); SETDAY(); } {d}{2}"-"{d}{2}"-"{d}{2} { fprintf(stderr, "the highly ambiguous date format XX-XX-XX..." " is no longer supported\n"); } {D}"/"{D}"/"{YEAR}{W}{TIME} { INIT(); if(europeandate) { /* DD/MM/YY */ SETDAY(); SKIPTOD(); SETMON_NUM(); } else { /* MM/DD/YY */ SETMON_NUM(); SKIPTOD(); SETDAY(); } SKIPTOD(); SETYEAR(); SKIPTOD(); SETTIME(); } {D}"/"{D}"/"{YEAR} { INIT(); if(europeandate) { /* DD/MM/YY */ SETDAY(); SKIPTOD(); SETMON_NUM(); } else { /* MM/DD/YY */ SETMON_NUM(); SKIPTOD(); SETDAY(); } SKIPTOD(); SETYEAR(); } "[Aa][Mm]" "[Pp][Mm]" tw.tw_hour += 12; "+"{D}{d}{d} { INIT(); SKIPTOD(); SETZONE(atoi(cp)); #ifdef ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST zonehack (&tw); #endif /* ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST */ yyterminate(); } "-"{D}{d}{d} { INIT(); SKIPTOD(); SETZONE(-atoi(cp)); #ifdef ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST zonehack (&tw); #endif /* ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST */ yyterminate(); } "+"{d}{d}":"{d}{d} { INIT(); SKIPTOD(); SETZONEC(atoi(cp), atoi(cp+3)); #ifdef ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST zonehack (&tw); #endif /* ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST */ yyterminate(); } "-"{d}{d}":"{d}{d} { INIT(); SKIPTOD(); SETZONEC(-atoi(cp), -atoi(cp+3)); #ifdef ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST zonehack (&tw); #endif /* ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST */ yyterminate(); } {nl}("ut"|"UT") INIT(); SETZONE(0); yyterminate(); {nl}("gmt"|"GMT") INIT(); SETZONE(0); yyterminate(); {nl}("est"|"EST") INIT(); SETZONE(-500); yyterminate(); {nl}("edt"|"EDT") { INIT(); SETDST(); SETZONE(-500); yyterminate(); } {nl}("cst"|"CST") INIT(); SETZONE(-600); yyterminate(); {nl}("cdt"|"CDT") { INIT(); SETDST(); SETZONE(-600); yyterminate(); } {nl}("mst"|"MST") INIT(); SETZONE(-700); yyterminate(); {nl}("mdt"|"MDT") { INIT(); SETDST(); SETZONE(-700); yyterminate(); } {nl}("pst"|"PST") INIT(); SETZONE(-800); yyterminate(); {nl}("pdt"|"PDT") { INIT(); SETDST(); SETZONE(-800); yyterminate(); } {nl}("nst"|"NST") INIT(); SETZONE(-330); yyterminate(); {nl}("ast"|"AST") INIT(); SETZONE(-400); yyterminate(); {nl}("adt"|"ADT") { INIT(); SETDST(); SETZONE(-400); yyterminate(); } {nl}("hst"|"HST") INIT(); SETZONE(-1000); yyterminate(); {nl}("hdt"|"HDT") { INIT(); SETDST(); SETZONE(-1000); yyterminate(); } .|\n %% /* ** This is a portable way to squash a warning about the yyunput() ** function being static but never used. It costs us a tiny amount ** of extra code in the binary but the other options are: ** "%option nounput" which is flex-specific ** makefile hackery just to compile dtimep.c with different flags */ void dtimep_yyunput(int c) { unput(c); } mmh-0.4/sbr/mf.c0000644000000000000000000002744113414435726012211 0ustar rootroot/* ** mf.c -- mail filter subroutines ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include /* ** static prototypes */ static char *getcpy(char *); static int parse_address(void); static int phrase(char *); static int route_addr(char *); static int local_part(char *); static int domain(char *); static int route(char *); static int my_lex(char *); static char * getcpy(char *s) { char *p; if (!s) { /* ** causes compiles to blow up because the symbol _cleanup ** is undefined where did this ever come from? */ /* _cleanup(); */ abort(); for(;;) pause(); } p = mh_xcalloc(strlen(s) + 2, sizeof(char)); strcpy(p, s); return p; } /* ** ** getadrx() implements a partial 822-style address parser. The parser ** is neither complete nor correct. It does however recognize nearly all ** of the 822 address syntax. ** Historically, it handled the majority (and still handles parts) of the ** 733 syntax as well. Most problems arise from trying to accommodate both. ** ** In terms of 822, the route-specification in ** ** "<" [route] local-part "@" domain ">" ** ** is parsed and returned unchanged. Multiple at-signs are compressed ** via source-routing. Recursive groups are not allowed as per the ** standard. ** ** In terms of both the parser will not complain about missing hosts. ** ** ----- ** ** We should not allow addresses like ** ** Marshall T. Rose ** ** but should insist on ** ** "Marshall T. Rose" ** ** Unfortunately, a lot of mailers stupidly let people get away with this. ** ** ----- ** ** We should not allow addresses like ** ** ** ** but should insist on ** ** MRose@UCI ** ** Unfortunately, a lot of mailers stupidly let people's UAs get away with ** this. ** ** ----- ** ** We should not allow addresses like ** ** @UCI:MRose@UCI-750a ** ** but should insist on ** ** Marshall Rose <@UCI:MRose@UCI-750a> ** ** Unfortunately, a lot of mailers stupidly do this. ** */ #define QUOTE '\\' #define LX_END 0 #define LX_ERR 1 #define LX_ATOM 2 #define LX_QSTR 3 #define LX_DLIT 4 #define LX_SEMI 5 #define LX_COMA 6 #define LX_LBRK 7 #define LX_RBRK 8 #define LX_COLN 9 #define LX_DOT 10 #define LX_AT 11 struct specials { char lx_chr; int lx_val; }; static struct specials special[] = { { ';', LX_SEMI }, { ',', LX_COMA }, { '<', LX_LBRK }, { '>', LX_RBRK }, { ':', LX_COLN }, { '.', LX_DOT }, { '@', LX_AT }, { '(', LX_ERR }, { ')', LX_ERR }, { QUOTE, LX_ERR }, { '"', LX_ERR }, { '[', LX_ERR }, { ']', LX_ERR }, { 0, 0 } }; static int glevel = 0; static int ingrp = 0; static int last_lex = LX_END; static char *dp = NULL; static unsigned char *cp = NULL; static unsigned char *ap = NULL; static char *pers = NULL; static char *mbox = NULL; static char *host = NULL; static char *path = NULL; static char *grp = NULL; static char *note = NULL; static char err[BUFSIZ]; static char adr[BUFSIZ]; static struct adrx adrxs2; struct adrx * getadrx(char *addrs) { char *bp; struct adrx *adrxp = &adrxs2; if (pers) mh_free0(&pers); if (mbox) mh_free0(&mbox); if (host) mh_free0(&host); if (path) mh_free0(&path); if (grp) mh_free0(&grp); if (note) mh_free0(¬e); err[0] = 0; if (dp == NULL) { dp = cp = getcpy(addrs ? addrs : ""); glevel = 0; } else if (cp == NULL) { mh_free0(&dp); return NULL; } switch (parse_address()) { case DONE: mh_free0(&dp); cp = NULL; return NULL; case OK: switch (last_lex) { case LX_COMA: case LX_END: break; default: /* catch trailing comments */ bp = cp; my_lex(adr); cp = bp; break; } break; default: break; } if (err[0]) for (;;) { switch (last_lex) { case LX_COMA: case LX_END: break; default: my_lex(adr); continue; } break; } while (isspace(*ap)) ap++; if (cp) sprintf(adr, "%.*s", (int)(cp - ap), ap); else strcpy(adr, ap); bp = adr + strlen(adr) - 1; if (*bp == ',' || *bp == ';' || *bp == '\n') *bp = 0; adrxp->text = adr; adrxp->pers = pers; adrxp->mbox = mbox; adrxp->host = host; adrxp->path = path; adrxp->grp = grp; adrxp->ingrp = ingrp; adrxp->note = note; adrxp->err = err[0] ? err : NULL; return adrxp; } static int parse_address(void) { char buffer[BUFSIZ]; again: ; ap = cp; switch (my_lex(buffer)) { case LX_ATOM: case LX_QSTR: pers = getcpy(buffer); break; case LX_SEMI: if (glevel-- <= 0) { strcpy(err, "extraneous semi-colon"); return NOTOK; } case LX_COMA: if (note) { mh_free0(¬e); } goto again; case LX_END: return DONE; case LX_LBRK: /* sigh (2) */ goto get_addr; case LX_AT: /* sigh (3) */ cp = ap; if (route_addr(buffer) == NOTOK) return NOTOK; return OK; /* why be choosy? */ default: sprintf(err, "illegal address construct (%s)", buffer); return NOTOK; } switch (my_lex(buffer)) { case LX_ATOM: case LX_QSTR: pers = add(buffer, add(" ", pers)); more_phrase: ; /* sigh (1) */ if (phrase(buffer) == NOTOK) return NOTOK; switch (last_lex) { case LX_LBRK: get_addr: ; if (route_addr(buffer) == NOTOK) return NOTOK; if (last_lex == LX_RBRK) return OK; sprintf(err, "missing right-bracket (%s)", buffer); return NOTOK; case LX_COLN: get_group: ; if (glevel++ > 0) { sprintf(err, "nested groups not allowed (%s)", pers); return NOTOK; } grp = add(": ", pers); pers = NULL; { char *pp = cp; for (;;) switch (my_lex(buffer)) { case LX_SEMI: case LX_END: /* tsk, tsk */ glevel--; return OK; case LX_COMA: continue; default: cp = pp; return parse_address(); } } case LX_DOT: /* sigh (1) */ pers = add(".", pers); goto more_phrase; default: sprintf(err, "no mailbox in address, only a phrase (%s%s)", pers, buffer); return NOTOK; } case LX_LBRK: goto get_addr; case LX_COLN: goto get_group; case LX_DOT: mbox = add(buffer, pers); pers = NULL; if (route_addr(buffer) == NOTOK) return NOTOK; goto check_end; case LX_AT: ingrp = glevel; mbox = pers; pers = NULL; if (domain(buffer) == NOTOK) return NOTOK; check_end: ; switch (last_lex) { case LX_SEMI: if (glevel-- <= 0) { strcpy(err, "extraneous semi-colon"); return NOTOK; } case LX_COMA: case LX_END: return OK; default: sprintf(err, "junk after local@domain (%s)", buffer); return NOTOK; } case LX_SEMI: /* no host */ case LX_COMA: case LX_END: ingrp = glevel; if (last_lex == LX_SEMI && glevel-- <= 0) { strcpy(err, "extraneous semi-colon"); return NOTOK; } mbox = pers; pers = NULL; return OK; default: sprintf(err, "missing mailbox (%s)", buffer); return NOTOK; } } static int phrase(char *buffer) { for (;;) switch (my_lex(buffer)) { case LX_ATOM: case LX_QSTR: pers = add(buffer, add(" ", pers)); continue; default: return OK; } } static int route_addr(char *buffer) { char *pp = cp; if (my_lex(buffer) == LX_AT) { if (route(buffer) == NOTOK) return NOTOK; } else cp = pp; if (local_part(buffer) == NOTOK) return NOTOK; switch (last_lex) { case LX_AT: return domain(buffer); case LX_SEMI: /* if in group */ case LX_RBRK: /* no host */ case LX_COMA: case LX_END: return OK; default: sprintf(err, "no at-sign after local-part (%s)", buffer); return NOTOK; } } static int local_part(char *buffer) { ingrp = glevel; for (;;) { switch (my_lex(buffer)) { case LX_ATOM: case LX_QSTR: mbox = add(buffer, mbox); break; default: sprintf(err, "no mailbox in local-part (%s)", buffer); return NOTOK; } switch (my_lex(buffer)) { case LX_DOT: mbox = add(buffer, mbox); continue; default: return OK; } } } static int domain(char *buffer) { for (;;) { switch (my_lex(buffer)) { case LX_ATOM: case LX_DLIT: host = add(buffer, host); break; default: sprintf(err, "no sub-domain in domain-part of address (%s)", buffer); return NOTOK; } switch (my_lex(buffer)) { case LX_DOT: host = add(buffer, host); continue; case LX_AT: /* sigh (0) */ mbox = add(host, add("%", mbox)); mh_free0(&host); continue; default: return OK; } } } static int route(char *buffer) { path = getcpy("@"); for (;;) { switch (my_lex(buffer)) { case LX_ATOM: case LX_DLIT: path = add(buffer, path); break; default: sprintf(err, "no sub-domain in domain-part of address (%s)", buffer); return NOTOK; } switch (my_lex(buffer)) { case LX_COMA: path = add(buffer, path); for (;;) { switch (my_lex(buffer)) { case LX_COMA: continue; case LX_AT: path = add(buffer, path); break; default: sprintf(err, "no at-sign found for next domain in route (%s)", buffer); } break; } continue; case LX_AT: /* XXX */ case LX_DOT: path = add(buffer, path); continue; case LX_COLN: path = add(buffer, path); return OK; default: sprintf(err, "no colon found to terminate route (%s)", buffer); return NOTOK; } } } static int my_lex(char *buffer) { /* buffer should be at least BUFSIZ bytes long */ int i; unsigned char c; char *bp; /* ** Add C to the buffer bp. After use of this macro *bp is guaranteed ** to be within the buffer. */ #define ADDCHR(C) \ do { \ *bp++ = (C); \ if ((bp - buffer) == (BUFSIZ-1)) \ goto my_lex_buffull; \ } while (0) bp = buffer; *bp = 0; if (!cp) return (last_lex = LX_END); c = *cp++; while (isspace(c)) c = *cp++; if (c == 0) { cp = NULL; return (last_lex = LX_END); } if (c == '(') { ADDCHR(c); for (i = 0;;) switch (c = *cp++) { case 0: cp = NULL; return (last_lex = LX_ERR); case QUOTE: ADDCHR(c); if ((c = *cp++) == 0) { cp = NULL; return (last_lex = LX_ERR); } ADDCHR(c); continue; case '(': i++; default: ADDCHR(c); continue; case ')': ADDCHR(c); if (--i < 0) { *bp = 0; note = note ? add(buffer, add(" ", note)) : getcpy(buffer); return my_lex(buffer); } } } if (c == '"') { ADDCHR(c); for (;;) switch (c = *cp++) { case 0: cp = NULL; return (last_lex = LX_ERR); case QUOTE: ADDCHR(c); if ((c = *cp++) == 0) { cp = NULL; return (last_lex = LX_ERR); } default: ADDCHR(c); continue; case '"': ADDCHR(c); *bp = 0; return (last_lex = LX_QSTR); } } if (c == '[') { ADDCHR(c); for (;;) switch (c = *cp++) { case 0: cp = NULL; return (last_lex = LX_ERR); case QUOTE: ADDCHR(c); if ((c = *cp++) == 0) { cp = NULL; return (last_lex = LX_ERR); } default: ADDCHR(c); continue; case ']': ADDCHR(c); *bp = 0; return (last_lex = LX_DLIT); } } ADDCHR(c); *bp = 0; for (i = 0; special[i].lx_chr != 0; i++) if (c == special[i].lx_chr) return (last_lex = special[i].lx_val); if (iscntrl(c)) return (last_lex = LX_ERR); for (;;) { if ((c = *cp++) == 0) break; for (i = 0; special[i].lx_chr != 0; i++) if (c == special[i].lx_chr) goto got_atom; if (iscntrl(c) || isspace(c)) break; ADDCHR(c); } got_atom: ; if (c == 0) cp = NULL; else cp--; *bp = 0; return LX_ATOM; my_lex_buffull: /* Out of buffer space. *bp is the last byte in the buffer */ *bp = 0; return (last_lex = LX_ERR); } char * legal_person(char *p) { int i; char *cp; static char buffer[BUFSIZ]; if (*p == '"') return p; for (cp = p; *cp; cp++) for (i = 0; special[i].lx_chr; i++) if (*cp == special[i].lx_chr) { sprintf(buffer, "\"%s\"", p); return buffer; } return p; } mmh-0.4/sbr/context_find.c0000644000000000000000000000066513414435726014272 0ustar rootroot/* ** context_find.c -- find an entry in the context/profile list ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include char * context_find(char *str) { struct node *np; for (np = m_defs; np; np = np->n_next) if (!mh_strcasecmp(np->n_name, str)) return (np->n_field); return NULL; } mmh-0.4/sbr/context_read.c0000644000000000000000000001370413414435726014263 0ustar rootroot/* ** context_read.c -- find and read profile and context files ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. ** ** This function must be called early on in any nmh utility, and ** may only be called once. It does the following: ** ** o Sets the global variables to absolute paths: ** - "mypath": home directory (HOME) ** - "mmhpath": mmh directory (MMH) ** - "defpath": profile file (MMHP) ** - "ctxpath": context file (MMHC) ** ** o Reads in the profile file. Bails out if it can't. ** ** o Makes sure that the mail directory exists, prompting for ** creation if it doesn't. ** ** o Reads the context file. ** ** You might need to adjust uip/mmh.sh if you make changes here. */ #include /* mh internals */ #include #include /* system call errors */ #include /* structure for getpwuid() results */ #include #include #include void context_read(void) { char buf[BUFSIZ]; /* path name buffer */ char *cp; /* miscellaneous pointer */ char *nd; /* nmh directory pointer */ struct stat st; /* stat() results */ struct passwd *pw; /* getpwuid() results */ FILE *ib; /* profile and context file pointer */ /* ** If this routine _is_ called again (despite the wanings in the ** comments above), return immediately. */ if (m_defs) { return; } /* ** Find user's home directory. Try the HOME environment variable first, ** the home directory field in the password file if that's not found. */ if (!(mypath = getenv("HOME"))) { if (!(pw = getpwuid(getuid())) || !*pw->pw_dir) { adios(EX_OSERR, NULL, "cannot determine your home directory"); } mypath = pw->pw_dir; } /* ** set mmhpath */ if ((cp = getenv("MMH")) && *cp) { mmhpath = mh_xstrdup(expanddir(cp)); /* rel to cwd */ if (stat(mmhpath, &st) != -1 && (st.st_mode & S_IFDIR) == 0) { adios(EX_CONFIG, NULL, "`%s' specified by your MMH environment variable is not a directory", cp); } } else { mmhpath = concat(mypath, "/", mmhdir, NULL); if (stat(mmhpath, &st) == -1 || (st.st_mode & S_IFDIR) == 0) { adios(EX_CONFIG, NULL, "Doesn't look like mmh is set up for your account. Run `mmh' to do so."); } } /* ** Find and read user's profile. Check for the existence of ** a non-empty MMHP environment variable first. Look for the ** profile in the mmh directory otherwise. */ if ((cp = getenv("MMHP")) && *cp) { if (*cp == '/') { defpath = mh_xstrdup(cp); } else { defpath = concat(mmhpath, "/", cp, NULL); } if (stat(defpath, &st) != -1 && (st.st_mode & S_IFREG) == 0) { adios(EX_CONFIG, NULL, "Your profile `%s', specified by the MMHP environment variable, is not a normal file", cp); } if ((ib = fopen(defpath, "r")) == (FILE *)0) { adios(EX_IOERR, NULL, "Unable to read your profile `%s', specified by the MMHP environment variable", defpath); } } else { defpath = concat(mmhpath, "/", profile, NULL); if ((ib = fopen(defpath, "r")) == (FILE *)0) { adios(EX_CONFIG, NULL, "No profile found. Please create `%s' first.", defpath); } cp = profile; } readconfig(&m_defs, ib, cp, 0); fclose(ib); /* ** Find the user's mail storage directory, which is specified by ** the `Path' profile component. Convert a relative path name ** to an absolute one rooted in the home directory. */ if ((cp = context_find("path")) == NULL) { adios(EX_CONFIG, NULL, "Your profile `%s' does not contain the required path entry.", defpath); } if (!*cp) { adios(EX_CONFIG, NULL, "The Path entry of your profile `%s' must be non-empty.", defpath); } if (*cp == '/') { nd = cp; } else { snprintf(nd = buf, sizeof buf, "%s/%s", mypath, cp); } if (stat(nd, &st) == -1) { if (errno != ENOENT) { adios(EX_IOERR, nd, "error opening"); } cp = concat("Your mail storage directory `", nd, "' doesn't exist; Create it? ", NULL); if (!getanswer(cp)) { adios(EX_NOPERM, NULL, "Unable to access the mail storage directory `%s'", nd); } mh_free0(&cp); if (!makedir(nd)) { adios(EX_CANTCREAT, nd, "unable to create"); } } else if ((st.st_mode & S_IFDIR) == 0) { adios(EX_DATAERR, NULL, "Your mail storage `%s' is not a directory", nd); } /* ** Create the default folder (inbox) */ cp = toabsdir(getdeffol()); if (stat(cp, &st) == -1) { if (!makedir(cp)) { adios(EX_CANTCREAT, cp, "Unable to create the default folder"); } } else if ((st.st_mode & S_IFDIR) == 0) { adios(EX_DATAERR, NULL, "The default folder `%s' is not a directory", cp); } /* ** Open and read user's context file. The name of the context ** file comes from the profile unless overridden by the MMHC ** environment variable. */ if (!(cp = getenv("MMHC")) || !*cp) { if (!(cp = context_find("context")) || !*cp) { cp = context; } } /* ** context is NULL if the use of the context was diabled. ** We also support users setting explicitly setting ** MMHC to /dev/null. (If this wasn't special-cased then the ** locking would be liable to fail.) */ if (!context || (strcmp(cp, "/dev/null") == 0)) { ctxpath = NULL; return; } if (*cp == '/') { ctxpath = mh_xstrdup(cp); } else { ctxpath = concat(mmhpath, "/", cp, NULL); } if ((ib = lkfopen(ctxpath, "r"))) { readconfig((struct node **) 0, ib, cp, 1); lkfclose(ib, ctxpath); } /* Set editor */ if (!(cp = getenv("MMHEDITOR")) || !*cp) { if (!(cp = context_find("editor")) || !*cp) { if (!(cp = getenv("VISUAL")) || !*cp) { if (!(cp = getenv("EDITOR")) || !*cp) { cp = defaulteditor; } } } } defaulteditor = cp; /* Set pager */ if (!(cp = getenv("MMHPAGER")) || !*cp) { if (!(cp = context_find("pager")) || !*cp) { if (!(cp = getenv("PAGER")) || !*cp) { cp = defaultpager; } } } defaultpager = cp; } mmh-0.4/sbr/fmt_compile.c0000644000000000000000000004663613414435726014114 0ustar rootroot/* ** fmt_compile.c -- "compile" format strings for fmt_scan ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. ** ** This code compiles the format strings (documented in mh-format(5)) into ** an internal form to be later processed by fmt_scan.c. ** ** What happens here is that the format strings are parsed and an array ** of struct format structures are returned. Each format structure is ** a single operation interpreted by the the routines in fmt_scan.c. ** ** There is a NOT a one-to-one correspondence between format strings and ** format instructions; some functions have side effects that can result ** in multiple instructions being generated. The exact list of instructions ** generated by a format string can be seem with the nmh fmtdump utility. ** ** A list of format instructions can be found in fmt_compile.h. ** ** If you wish to add a new function, you will need to do the following ** things: ** ** - Add a new instruction to the list of instructions in fmt_compile.h. ** Note that test instructions (starting with FT_IF_S_NULL) have special ** handling, so if you are NOT writing a test function then you need ** to insert it into the list before that _and_ bump all of the ** following instruction numbers. ** ** - Add the function name to the functable[] array below, and write any ** special code that your function may require in terms of parsing ** (it very well may not need anything). ** ** - Add the code in fmt_scan.c to handle your new function. ** ** - Document the new function in the mh-format(5) man page. ** */ #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_TIME_H # include #endif #include /* ** hash table for deciding if a component is "interesting" */ struct comp *wantcomp[128]; static struct format *formatvec; /* array to hold formats */ static struct format *next_fp; /* next free format slot */ static struct format *fp; /* current format slot */ static struct comp *cm; /* most recent comp ref */ static struct ftable *ftbl; /* most recent func ref */ static int ncomp; static int infunction; /* function nesting cnt */ extern struct mailname fmt_mnull; /* ftable->type (argument type) */ #define TF_COMP 0 /* component expected */ #define TF_NUM 1 /* number expected */ #define TF_STR 2 /* string expected */ #define TF_EXPR 3 /* component or func. expected */ #define TF_NONE 4 /* no argument */ #define TF_MYBOX 5 /* special - get current user's mbox */ #define TF_NOW 6 /* special - get current unix time */ #define TF_EXPR_SV 7 /* like expr but save current str reg */ #define TF_NOP 8 /* like expr but no result */ /* ftable->flags */ /* ** NB that TFL_PUTS is also used to decide whether the test ** in a "%<(function)..." should be a string or numeric one. */ #define TFL_PUTS 1 /* implicit putstr if top level */ #define TFL_PUTN 2 /* implicit putnum if top level */ /* ** The functable array maps between the text names of format functions and ** the format instructions interpreted by the engine in fmt_scan.c. ** ** The elements of this structure are as follows: ** ** name: The name of the function as seen in the format string. This is ** what maps a particular function name into a format instruction. ** type: The type of argument this function expects. Those types are ** listed above (with the TF_ prefix). This affects what gets ** placed in the format instruction (the f_un union). ** f_type: The instruction corresponding to this function (from the list ** in fmt_compile.h). ** extra: Used by some functions to provide extra data to the compiler. ** Uses include: ** - Providing an alternate instruction to combine a load ** and test operation (see do_if()). ** - Passed in f_value in the format instruction to provide ** extra information for the engine (see FT_LV_DAT handling ** in fmt_scan.c). ** - Provide a hint as to preprocessing that is required for ** this instruction (see do_name()). ** flags: See the definitions for TFL_PUTS & TFL_PUTN above. */ struct ftable { char *name; /* function name */ char type; /* argument type */ char f_type; /* fmt type */ char extra; /* arg. type dependent extra info */ char flags; }; static struct ftable functable[] = { { "nonzero", TF_EXPR, FT_V_NE, FT_IF_V_NE, 0 }, { "zero", TF_EXPR, FT_V_EQ, FT_IF_V_EQ, 0 }, { "eq", TF_NUM, FT_V_EQ, FT_IF_V_EQ, 0 }, { "ne", TF_NUM, FT_V_NE, FT_IF_V_NE, 0 }, { "gt", TF_NUM, FT_V_GT, FT_IF_V_GT, 0 }, { "null", TF_EXPR, FT_S_NULL, FT_IF_S_NULL, 0 }, { "nonnull", TF_EXPR, FT_S_NONNULL, FT_IF_S, 0 }, { "match", TF_STR, FT_V_MATCH, FT_IF_MATCH, 0 }, { "amatch", TF_STR, FT_V_AMATCH, FT_IF_AMATCH, 0 }, { "putstr", TF_EXPR, FT_STR, 0, 0 }, { "putstrf", TF_EXPR, FT_STRF, 0, 0 }, { "putnum", TF_EXPR, FT_NUM, 0, 0 }, { "putnumf", TF_EXPR, FT_NUMF, 0, 0 }, { "putaddr", TF_STR, FT_PUTADDR, 0, 0 }, { "void", TF_NOP, 0, 0, 0 }, { "comp", TF_COMP, FT_LS_COMP, 0, TFL_PUTS }, { "lit", TF_STR, FT_LS_LIT, 0, TFL_PUTS }, { "getenv", TF_STR, FT_LS_GETENV, 0, TFL_PUTS }, { "profile", TF_STR, FT_LS_CFIND, 0, TFL_PUTS }, { "decodecomp", TF_COMP, FT_LS_DECODECOMP, 0, TFL_PUTS }, { "decode", TF_EXPR, FT_LS_DECODE, 0, TFL_PUTS }, { "trim", TF_EXPR, FT_LS_TRIM, 0, 0 }, { "compval", TF_COMP, FT_LV_COMP, 0, TFL_PUTN }, { "compflag", TF_COMP, FT_LV_COMPFLAG, 0, TFL_PUTN }, { "num", TF_NUM, FT_LV_LIT, 0, TFL_PUTN }, { "msg", TF_NONE, FT_LV_DAT, 0, TFL_PUTN }, { "cur", TF_NONE, FT_LV_DAT, 1, TFL_PUTN }, { "size", TF_NONE, FT_LV_DAT, 2, TFL_PUTN }, { "width", TF_NONE, FT_LV_DAT, 3, TFL_PUTN }, { "unseen", TF_NONE, FT_LV_DAT, 4, TFL_PUTN }, { "dat", TF_NUM, FT_LV_DAT, 0, TFL_PUTN }, { "strlen", TF_NONE, FT_LV_STRLEN, 0, TFL_PUTN }, { "me", TF_MYBOX, FT_LS_LIT, 0, TFL_PUTS }, { "plus", TF_NUM, FT_LV_PLUS_L, 0, TFL_PUTN }, { "minus", TF_NUM, FT_LV_MINUS_L, 0, TFL_PUTN }, { "divide", TF_NUM, FT_LV_DIVIDE_L, 0, TFL_PUTN }, { "modulo", TF_NUM, FT_LV_MODULO_L, 0, TFL_PUTN }, { "charleft", TF_NONE, FT_LV_CHAR_LEFT, 0, TFL_PUTN }, { "timenow", TF_NOW, FT_LV_LIT, 0, TFL_PUTN }, { "month", TF_COMP, FT_LS_MONTH, FT_PARSEDATE, TFL_PUTS }, { "lmonth", TF_COMP, FT_LS_LMONTH, FT_PARSEDATE, TFL_PUTS }, { "tzone", TF_COMP, FT_LS_ZONE, FT_PARSEDATE, TFL_PUTS }, { "day", TF_COMP, FT_LS_DAY, FT_PARSEDATE, TFL_PUTS }, { "weekday", TF_COMP, FT_LS_WEEKDAY, FT_PARSEDATE, TFL_PUTS }, { "tws", TF_COMP, FT_LS_822DATE, FT_PARSEDATE, TFL_PUTS }, { "sec", TF_COMP, FT_LV_SEC, FT_PARSEDATE, TFL_PUTN }, { "min", TF_COMP, FT_LV_MIN, FT_PARSEDATE, TFL_PUTN }, { "hour", TF_COMP, FT_LV_HOUR, FT_PARSEDATE, TFL_PUTN }, { "mday", TF_COMP, FT_LV_MDAY, FT_PARSEDATE, TFL_PUTN }, { "mon", TF_COMP, FT_LV_MON, FT_PARSEDATE, TFL_PUTN }, { "year", TF_COMP, FT_LV_YEAR, FT_PARSEDATE, TFL_PUTN }, { "yday", TF_COMP, FT_LV_YDAY, FT_PARSEDATE, TFL_PUTN }, { "wday", TF_COMP, FT_LV_WDAY, FT_PARSEDATE, TFL_PUTN }, { "zone", TF_COMP, FT_LV_ZONE, FT_PARSEDATE, TFL_PUTN }, { "clock", TF_COMP, FT_LV_CLOCK, FT_PARSEDATE, TFL_PUTN }, { "rclock", TF_COMP, FT_LV_RCLOCK, FT_PARSEDATE, TFL_PUTN }, { "sday", TF_COMP, FT_LV_DAYF, FT_PARSEDATE, TFL_PUTN }, { "szone", TF_COMP, FT_LV_ZONEF, FT_PARSEDATE, TFL_PUTN }, { "dst", TF_COMP, FT_LV_DST, FT_PARSEDATE, TFL_PUTN }, { "pretty", TF_COMP, FT_LS_PRETTY, FT_PARSEDATE, TFL_PUTS }, { "nodate", TF_COMP, FT_LV_COMPFLAG, FT_PARSEDATE, TFL_PUTN }, { "date2local", TF_COMP, FT_LOCALDATE, FT_PARSEDATE, 0 }, { "date2gmt", TF_COMP, FT_GMTDATE, FT_PARSEDATE, 0 }, { "pers", TF_COMP, FT_LS_PERS, FT_PARSEADDR, TFL_PUTS }, { "mbox", TF_COMP, FT_LS_MBOX, FT_PARSEADDR, TFL_PUTS }, { "host", TF_COMP, FT_LS_HOST, FT_PARSEADDR, TFL_PUTS }, { "path", TF_COMP, FT_LS_PATH, FT_PARSEADDR, TFL_PUTS }, { "gname", TF_COMP, FT_LS_GNAME, FT_PARSEADDR, TFL_PUTS }, { "note", TF_COMP, FT_LS_NOTE, FT_PARSEADDR, TFL_PUTS }, { "addr", TF_COMP, FT_LS_ADDR, FT_PARSEADDR, TFL_PUTS }, { "proper", TF_COMP, FT_LS_822ADDR, FT_PARSEADDR, TFL_PUTS }, { "type", TF_COMP, FT_LV_HOSTTYPE, FT_PARSEADDR, TFL_PUTN }, { "ingrp", TF_COMP, FT_LV_INGRPF, FT_PARSEADDR, TFL_PUTN }, { "nohost", TF_COMP, FT_LV_NOHOSTF, FT_PARSEADDR, TFL_PUTN }, { "formataddr", TF_EXPR_SV, FT_FORMATADDR, FT_FORMATADDR, 0 }, { "friendly", TF_COMP, FT_LS_FRIENDLY, FT_PARSEADDR, TFL_PUTS }, { "mymbox", TF_COMP, FT_LV_COMPFLAG, FT_MYMBOX, TFL_PUTN }, { "unquote", TF_EXPR, FT_LS_UNQUOTE, 0, TFL_PUTS}, { "unmailto", TF_EXPR, FT_LS_UNMAILTO, 0, TFL_PUTS}, { NULL, 0, 0, 0, 0 } }; /* Add new component to the hash table */ #define NEWCOMP(cm,name) do { \ cm = (mh_xcalloc(1, sizeof (struct comp)));\ cm->c_name = name;\ ncomp++;\ i = CHASH(name);\ cm->c_next = wantcomp[i];\ wantcomp[i] = cm; \ } while (0) #define NEWFMT (next_fp++) #define NEW(type,fill,wid) do {\ fp=NEWFMT; fp->f_type=(type); fp->f_fill=(fill); fp->f_width=(wid); \ } while (0) /* Add (possibly new) component to the hash table */ #define ADDC(name) do { \ FINDCOMP(cm, name);\ if (!cm) {\ NEWCOMP(cm,name);\ }\ fp->f_comp = cm; \ } while (0) #define LV(type, value) do { NEW(type,0,0); fp->f_value = (value); } while (0) #define LS(type, str) do { NEW(type,0,0); fp->f_text = (str); } while (0) #define PUTCOMP(comp) do { NEW(FT_COMP,0,0); ADDC(comp); } while (0) #define PUTLIT(str) do { NEW(FT_LIT,0,0); fp->f_text = (str); } while (0) #define PUTC(c) do { NEW(FT_CHAR,0,0); fp->f_char = (c); } while (0) static char *format_string; static unsigned char *usr_fstring; /* for CERROR */ #define CERROR(str) compile_error(str, cp) /* ** static prototypes */ static struct ftable *lookup(char *); static void compile_error(char *, char *); static char *compile(char *); static char *do_spec(char *); static char *do_name(char *, int); static char *do_func(char *); static char *do_expr(char *, int); static char *do_loop(char *); static char *do_if(char *); /* ** Lookup a function name in the functable */ static struct ftable * lookup(char *name) { struct ftable *t = functable; char *nm; char c = *name; while ((nm = t->name)) { if (*nm == c && strcmp(nm, name) == 0) return (ftbl = t); t++; } return (struct ftable *) 0; } static void compile_error(char *str, char *cp) { int i, errpos, errctx; errpos = cp - format_string; errctx = errpos > 20 ? 20 : errpos; usr_fstring[errpos] = '\0'; for (i = errpos-errctx; i < errpos; i++) { if (iscntrl(usr_fstring[i])) usr_fstring[i] = '_'; } advise(NULL, "\"%s\": format compile error - %s", &usr_fstring[errpos-errctx], str); adios(EX_SOFTWARE, NULL, "%*s", errctx+1, "^"); } /* ** Compile format string "fstring" into format list "fmt". ** Return the number of header components found in the format ** string. */ int fmt_compile(char *fstring, struct format **fmt) { char *cp; size_t i; if (format_string) mh_free0(&format_string); format_string = mh_xstrdup(fstring); usr_fstring = fstring; /* init the component hash table. */ for (i = 0; i < sizeof(wantcomp)/sizeof(wantcomp[0]); i++) wantcomp[i] = 0; memset((char *) &fmt_mnull, 0, sizeof(fmt_mnull)); /* ** it takes at least 4 char to generate one format so we ** allocate a worst-case format array using 1/4 the length ** of the format string. We actually need twice this much ** to handle both pre-processing (e.g., address parsing) and ** normal processing. */ i = strlen(fstring)/2 + 1; if (i == 1) i++; next_fp = formatvec = mh_xcalloc(i, sizeof(struct format)); if (next_fp == NULL) adios(EX_OSERR, NULL, "unable to allocate format storage"); ncomp = 0; infunction = 0; cp = compile(format_string); if (*cp) { CERROR("extra '%>', '%|' or '%?'"); } LV(FT_DONE, 0); /* really done */ *fmt = formatvec; return (ncomp); } static char * compile(char *sp) { char *cp = sp; int c; for (;;) { sp = cp; while ((c = *cp) && c != '%') cp++; *cp = 0; switch (cp-sp) { case 0: break; case 1: PUTC(*sp); break; default: PUTLIT(sp); break; } if (c == 0) return (cp); switch (c = *++cp) { case '%': PUTC(*cp); cp++; break; case '|': case '>': case '?': case ']': return (cp); case '<': cp = do_if(++cp); break; case '[': /* ] */ cp = do_loop(++cp); break; case ';': /* comment line */ cp++; while ((c = *cp++) && c != '\n') continue; break; default: cp = do_spec(cp); break; } } } /* ** Process functions & components (handle field width here as well */ static char * do_spec(char *sp) { char *cp = sp; int c; int ljust = 0; int wid = 0; char fill = ' '; c = *cp++; if (c == '-') { ljust++; c = *cp++; } if (c == '0') { fill = c; c = *cp++; } while (isdigit(c)) { wid = wid*10 + (c - '0'); c = *cp++; } if (c == '{') { cp = do_name(cp, 0); if (! infunction) fp->f_type = wid? FT_COMPF : FT_COMP; } else if (c == '(') { cp = do_func(cp); if (! infunction) { if (ftbl->flags & TFL_PUTS) { LV( wid? FT_STRF : FT_STR, ftbl->extra); } else if (ftbl->flags & TFL_PUTN) { LV( wid? FT_NUMF : FT_NUM, ftbl->extra); } } } else { CERROR("component or function name expected"); } if (ljust) wid = -wid; fp->f_width = wid; fp->f_fill = fill; return (cp); } /* ** Process a component name. Normally this involves generating an FT_COMP ** instruction for the specified component. If preprocess is set, then we ** do some extra processing. */ static char * do_name(char *sp, int preprocess) { char *cp = sp; int c; int i; static int primed = 0; while (isalnum(c = *cp++) || c == '-' || c == '_') ; if (c != '}') { CERROR("'}' expected"); } cp[-1] = '\0'; PUTCOMP(sp); switch (preprocess) { case FT_PARSEDATE: if (cm->c_type & CT_ADDR) { CERROR("component used as both date and address"); } cm->c_tws = mh_xcalloc(1, sizeof(*cm->c_tws)); fp->f_type = preprocess; PUTCOMP(sp); cm->c_type |= CT_DATE; break; case FT_MYMBOX: if (!primed) { ismymbox((struct mailname *) 0); primed++; } /* fall through */ case FT_PARSEADDR: if (cm->c_type & CT_DATE) { CERROR("component used as both date and address"); } cm->c_mn = &fmt_mnull; fp->f_type = preprocess; PUTCOMP(sp); cm->c_type |= CT_ADDR; break; case FT_FORMATADDR: if (cm->c_type & CT_DATE) { CERROR("component used as both date and address"); } cm->c_type |= CT_ADDR; break; } return (cp); } /* ** Generate one or more instructions corresponding to the named function. ** The different type of function arguments are handled here. */ static char * do_func(char *sp) { char *cp = sp; int c; struct ftable *t; int n; int mflag; /* minus sign in NUM */ infunction++; while (isalnum(c = *cp++)) ; if (c != '(' && c != '{' && c != ' ' && c != ')') { CERROR("'(', '{', ' ' or ')' expected"); } cp[-1] = '\0'; if ((t = lookup(sp)) == 0) { CERROR("unknown function"); } if (isspace(c)) c = *cp++; switch (t->type) { case TF_COMP: if (c != '{') { CERROR("component name expected"); } cp = do_name(cp, t->extra); fp->f_type = t->f_type; c = *cp++; break; case TF_NUM: if ((mflag = (c == '-'))) c = *cp++; n = 0; while (isdigit(c)) { n = n*10 + (c - '0'); c = *cp++; } if (mflag) n = (-n); LV(t->f_type,n); break; case TF_STR: sp = cp - 1; while (c && c != ')') c = *cp++; cp[-1] = '\0'; LS(t->f_type,sp); break; case TF_NONE: LV(t->f_type,t->extra); break; case TF_MYBOX: LS(t->f_type, getusername()); break; case TF_NOW: LV(t->f_type, time((time_t *) 0)); break; case TF_EXPR_SV: LV(FT_SAVESTR, 0); /* fall through */ case TF_EXPR: *--cp = c; cp = do_expr(cp, t->extra); LV(t->f_type, 0); c = *cp++; ftbl = t; break; case TF_NOP: *--cp = c; cp = do_expr(cp, t->extra); c = *cp++; ftbl = t; break; } if (c != ')') { CERROR("')' expected"); } --infunction; return (cp); } /* ** Handle an expression as an argument. Basically we call one of do_name(), ** do_func(), or do_if() */ static char * do_expr(char *sp, int preprocess) { char *cp = sp; int c; if ((c = *cp++) == '{') { cp = do_name(cp, preprocess); fp->f_type = FT_LS_COMP; } else if (c == '(') { cp = do_func(cp); } else if (c == ')') { return (--cp); } else if (c == '%' && *cp == '<') { cp = do_if(cp+1); } else { CERROR("'(', '{', '%<' or ')' expected"); } return (cp); } /* ** I am guessing this was for some kind of loop statement, which would have ** looked like %[ .... %]. It looks like the way this would have worked ** is that the format engine would have seen that FT_DONE had a 1 in the ** f_un.f_un_value and then decided whether or not to continue the loop. ** There is no support for this in the format engine, so right now if ** you try using it you will reach the FT_DONE and simply stop. I'm leaving ** this here in case someone wants to continue the work. */ static char * do_loop(char *sp) { char *cp = sp; struct format *floop; floop = next_fp; cp = compile(cp); if (*cp++ != ']') CERROR("']' expected"); LV(FT_DONE, 1); /* not yet done */ LV(FT_GOTO, 0); fp->f_skip = floop - fp; /* skip backwards */ return cp; } /* ** Handle an if-elsif-endif statement. Note here that the branching ** is handled by the f_skip member of the struct format (which is really ** just f_width overloaded). This number controls how far to move forward ** (or back) in the format instruction array. */ static char * do_if(char *sp) { char *cp = sp; struct format *fexpr, *fif = (struct format *)NULL; int c = '<'; for (;;) { if (c == '<') { /* doing an IF */ if ((c = *cp++) == '{') /*}*/{ cp = do_name(cp, 0); fp->f_type = FT_LS_COMP; LV(FT_IF_S, 0); } else if (c == '(') { cp = do_func(cp); /* see if we can merge the load and the "if" */ if (ftbl->f_type >= IF_FUNCS) fp->f_type = ftbl->extra; else { /* ** Put out a string test or a value ** test depending on what this ** function 's return type is. */ if (ftbl->flags & TFL_PUTS) { LV(FT_IF_S, 0); } else { LV(FT_IF_V_NE, 0); } } } else { CERROR("'(' or '{' expected"); /*}*/ } } fexpr = fp; /* loc of [ELS]IF */ cp = compile(cp); /* compile IF TRUE stmts */ if (fif) fif->f_skip = next_fp - fif; if ((c = *cp++) == '|') { /* the last ELSE */ LV(FT_GOTO, 0); fif = fp; /* loc of GOTO */ fexpr->f_skip = next_fp - fexpr; fexpr = (struct format *)NULL;/* no extra ENDIF */ cp = compile(cp); /* compile ELSE stmts */ fif->f_skip = next_fp - fif; c = *cp++; } else if (c == '?') { /* another ELSIF */ LV(FT_GOTO, 0); fif = fp; /* loc of GOTO */ fexpr->f_skip = next_fp - fexpr; c = '<'; /* impersonate an IF */ continue; } break; } if (c != '>') { CERROR("'>' expected."); } if (fexpr) /* IF ... [ELSIF ...] ENDIF */ fexpr->f_skip = next_fp - fexpr; return (cp); } mmh-0.4/sbr/path.c0000644000000000000000000001373013414435726012537 0ustar rootroot/* ** path.c -- return or convert paths ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include /* ** Find the location of a format or configuration ** file, and return its absolute pathname. ** ** 1) If it begins with ~user, then expand it. ** 2) Next, if already absolute pathname, then leave unchanged. ** 3) Next, check in mmh directory. ** 4) Next, check in mmh `etc' directory. ** 5) As fall-back, return `file' unchanged. */ char * etcpath(char *file) { static char epath[PATH_MAX]; char *cp; char *pp; struct passwd *pw; /* XXX: here was: ``context_read();'' -- why? */ if (*file == '~') { /* Expand `~user' */ if ((cp = strchr(pp = file + 1, '/'))) *cp++ = '\0'; if (*pp == '\0') { pp = mypath; } else { if ((pw = getpwnam(pp))) pp = pw->pw_dir; else { if (cp) *--cp = '/'; goto try_it; } } snprintf(epath, sizeof epath, "%s/%s", pp, cp ? cp : ""); if (cp) *--cp = '/'; if (access(epath, R_OK) != NOTOK) return epath; /* else fall */ } try_it: if (*file == '/') { /* absolute pathname, return it */ return file; } /* Check mmh directory */ snprintf(epath, sizeof epath, "%s/%s", mmhpath, file); if (access(epath, R_OK) != NOTOK) return epath; /* Check nmh `etc' directory */ snprintf(epath, sizeof epath, "%s/%s", mhetcdir, file); if (access(epath, R_OK) != NOTOK) return epath; /* The fall-back */ return file; } /* ** Compactify a path name by removing unnecessary parts. ** Removes trailing slashes. Cares to never remove all characters. ** Modifies f (never enlarges it). ** ** FIXME: Cannot use strcpy() as the areas overlap! */ static void packpath(char *f) { char *cp, *dp; int abspath; if (!f || !*f) { return; } abspath = (*f == '/'); for (cp=f; *cp; ) { if (*cp != '/') { /* Skip. Interesting places are only after slashes. */ /* We don't care about "./" beginnings */ cp++; continue; } /* Let's see what follows the slash ... */ switch (*++cp) { case '\0': *--cp = '\0'; continue; /* ... and thus exit the loop */ case '/': /* reduce subsequent slashes to one */ for (dp = cp; *dp == '/'; dp++) { continue; } strcpy(cp, dp); cp--; continue; /* ... at the slash */ case '.': if (cp[1] == '/' || cp[1] == '\0') { /* one-dot element */ strcpy(cp-1, cp+1); cp--; continue; } else if ((strncmp(cp, "../", 3) == 0) || (strcmp(cp, "..") == 0)) { /* dot-dot element */ /* crop out previous path element */ for (dp=cp-2; dp>f && *dp!='/'; dp--) { continue; } if (dp < f) { /* path starts with "/.." */ dp = f; } strcpy(dp, cp+2); cp = dp; continue; } else { /* a normal hidden file */ cp++; continue; } default: /* nothing special */ cp++; continue; } } if (!strlen(f)) { /* We have removed everything, but need something. */ strcpy(f, abspath ? "/" : "."); } } /* ** Get the default folder ** Return the Inbox profile entry or, as fallback, the compile time default ** Returns a pointer to the abs folpath */ char * getdeffol(void) { char *folder = context_find(inbox); if (!folder || !*folder) { folder = defaultfolder; /* the compile time default */ } if (*folder == '+') { folder++; } return folder; } /* ** Get the current folder ** Return the Current-Folder context entry or, as fallback, the default folder ** Returns a pointer to the abs folpath ** ** Equivalent to: expandfol("@") */ char * getcurfol(void) { char *folder = context_find(curfolder); if (!folder || !*folder) { folder = getdeffol(); } return folder; } /* ** Expand folder path ** Convert rel folpaths (@) into abs folpaths ** dir paths are simply passed through ** Returns the abs folpath (without prefix), in static mem ** ** TODO: Always copy into the static buffer, or just return the pointer? */ char * expandfol(char *f) { static char buf[BUFSIZ]; if (*f == '@') { /* f = concat(getcurfol(), "/", f+1, NULL); */ snprintf(buf, sizeof buf, "%s/%s", getcurfol(), f+1); } else if (*f == '+') { strcpy(buf, f+1); } else { strcpy(buf, f); } packpath(buf); return buf; } /* ** Expand directory path ** Convert rel dirpath into abs dirpath ** The argument is assumed to be a dir path relative to the cwd, ** except when beginning with '/' (then it will be passed through). ** Returns the abs dirpath, in static mem ** ** TODO: Always copy into the static buffer, or just return the pointer? */ char * expanddir(char *d) { static char buf[BUFSIZ]; int len; if (*d == '/') { strcpy(buf, d); } else { getcwd(buf, sizeof buf); len = strlen(buf); snprintf(buf+len, sizeof buf - len, "/%s", d); } packpath(buf); return buf; } /* ** Anypath to absolute directory path ** Convert any kind of path into an abs dirpath ** A path without distinguishing prefix is assumed to be an abs folpath ** Abs dirpaths are passed unchanged ** Rel dirpaths ('.') get prefixed with the (abs) cwd ** Return pointer to static memory ** ** To get the dir path of the mail storage root, call: toabsdir("+") ** ** TODO: check lengths for copies */ char * toabsdir(char *path) { static char buf[BUFSIZ]; if (*path == '/') { /* nothing to do */ strncpy(buf, path, sizeof buf); packpath(buf); return buf; } else if (*path == '.') { /* rel dir path */ strncpy(buf, expanddir(path), sizeof buf); return buf; } else { /* folder path */ char *cp=buf, *pp; if (!(pp = context_find("path")) || !*pp) { adios(EX_CONFIG, NULL, "Non-empty profile entry `Path' required"); } if (*pp != '/') { /* Path is relative to $HOME */ snprintf(buf, sizeof buf, "%s/", mypath); cp += strlen(buf); } strcpy(cp, pp); packpath(buf); /* append the mail folder */ cp = buf + strlen(buf); *cp++ = '/'; strcpy(cp, expandfol(path)); return buf; } } mmh-0.4/sbr/mhbasename.c0000644000000000000000000000146713414435726013707 0ustar rootroot/* ** mhbasename.c -- Given a path name, return a pointer to the character ** -- after the last slash. If none present, return the the ** -- beginning of the path. ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include /* ** Note: In contrast to POSIX basename(), we don't handle trailing ** slashes special. If path has a trailing slash, we return a pointer ** to a null byte (i.e. to an empty string). Also different: We don't ** modify the original string neither do we return a pointer to static ** memory. */ char * mhbasename(char *path) { char *cp; if (!path) { return NULL; } cp = strrchr(path, '/'); return (!cp) ? path : ++cp; } mmh-0.4/sbr/context_replace.c0000644000000000000000000000253713414435726014765 0ustar rootroot/* ** context_replace.c -- add/replace an entry in the context/profile list ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include void context_replace(char *key, char *value) { struct node *np; /* ** If list is emtpy, allocate head of profile/context list. */ if (!m_defs) { m_defs = mh_xcalloc(1, sizeof(*np)); np = m_defs; np->n_name = mh_xstrdup(key); np->n_field = mh_xstrdup(value); np->n_context = 1; np->n_next = NULL; ctxflags |= CTXMOD; return; } /* ** Search list of context/profile entries for ** this key, and replace its value if found. */ for (np = m_defs;; np = np->n_next) { if (!mh_strcasecmp(np->n_name, key)) { if (strcmp(value, np->n_field)!=0) { if (!np->n_context) admonish(NULL, "bug: context_replace(key=\"%s\",value=\"%s\")", key, value); if (np->n_field) mh_free0(&(np->n_field)); np->n_field = mh_xstrdup(value); ctxflags |= CTXMOD; } return; } if (!np->n_next) break; } /* ** Else add this new entry at the end */ np->n_next = mh_xcalloc(1, sizeof(*np)); np = np->n_next; np->n_name = mh_xstrdup(key); np->n_field = mh_xstrdup(value); np->n_context = 1; np->n_next = NULL; ctxflags |= CTXMOD; } mmh-0.4/sbr/seq_list.c0000644000000000000000000000453713414435726013433 0ustar rootroot/* ** seq_list.c -- Get all messages in a sequence and return them ** -- as a space separated list of message ranges. ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include /* allocate this much buffer space at a time */ #define MAXBUFFER 1024 /* static buffer to collect the sequence line */ static char *buffer = NULL; static int len = 0; char * seq_list(struct msgs *mp, char *seqname) { int i, j, seqnum; char *bp; /* On first invocation, allocate initial buffer space */ if (!buffer) { len = MAXBUFFER; buffer = mh_xcalloc(len, sizeof(char)); } /* ** Special processing for the cur sequence. We assume that the ** cur sequence and mp->curmsg are in sync (see seq_add.c). ** This is returned, even if message doesn't exist or the ** folder is empty. */ if (strcmp(seq_cur, seqname)==0) { if (mp->curmsg) { sprintf(buffer, "%s", m_name(mp->curmsg)); return (buffer); } else return (NULL); } /* If the folder is empty, just return NULL */ if (mp->nummsg == 0) return NULL; /* Get the index of the sequence */ if ((seqnum = seq_getnum(mp, seqname)) == -1) return NULL; bp = buffer; for (i = mp->lowmsg; i <= mp->hghmsg; ++i) { /* ** If message doesn't exist, or isn't in ** the sequence, then continue. */ if (!does_exist(mp, i) || !in_sequence(mp, seqnum, i)) continue; /* ** See if we need to enlarge buffer. Since we don't know ** exactly how many character this particular message range ** will need, we enlarge the buffer if we are within ** 50 characters of the end. */ if (bp - buffer > len - 50) { char *newbuf; len += MAXBUFFER; newbuf = mh_xrealloc(buffer, len); bp = newbuf + (bp - buffer); buffer = newbuf; } /* ** If this is not the first message range in ** the list, first add a space. */ if (bp > buffer) *bp++ = ' '; sprintf(bp, "%s", m_name(i)); bp += strlen(bp); j = i; /* Remember beginning of message range */ /* ** Scan to the end of this message range */ for (++i; i <= mp->hghmsg && does_exist(mp, i) && in_sequence(mp, seqnum, i); ++i) ; if (i - j > 1) { sprintf(bp, "-%s", m_name(i - 1)); bp += strlen(bp); } } return (bp > buffer? buffer : NULL); } mmh-0.4/sbr/dtimep.c0000644000000000000000000024217713414435727013077 0ustar rootroot #line 3 "" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 6 #define YY_FLEX_SUBMINOR_VERSION 1 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ /* TODO: this is always defined, so inline it */ #define yyconst const #if defined(__GNUC__) && __GNUC__ >= 3 #define yynoreturn __attribute__((__noreturn__)) #else #define yynoreturn #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an unsigned * integer for use as an array index. If the signed char is negative, * we want to instead treat it as an 8-bit unsigned char, hence the * double cast. */ #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart(yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k. * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. * Ditto for the __ia64__ case accordingly. */ #define YY_BUF_SIZE 32768 #else #define YY_BUF_SIZE 16384 #endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ int yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ int yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = NULL; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart (FILE *input_file ); void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); void yy_delete_buffer (YY_BUFFER_STATE b ); void yy_flush_buffer (YY_BUFFER_STATE b ); void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); void yypop_buffer_state (void ); static void yyensure_buffer_stack (void ); static void yy_load_buffer_state (void ); static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); #define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); void *yyalloc (yy_size_t ); void *yyrealloc (void *,yy_size_t ); void yyfree (void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer(yyin,YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ typedef unsigned char YY_CHAR; FILE *yyin = NULL, *yyout = NULL; typedef int yy_state_type; extern int yylineno; int yylineno = 1; extern char *yytext; #ifdef yytext_ptr #undef yytext_ptr #endif #define yytext_ptr yytext static yy_state_type yy_get_previous_state (void ); static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); static int yy_get_next_buffer (void ); static void yynoreturn yy_fatal_error (yyconst char* msg ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (int) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 35 #define YY_END_OF_BUFFER 36 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static yyconst flex_int16_t yy_accept[600] = { 0, 0, 0, 36, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 30, 24, 23, 22, 21, 20, 33, 32, 26, 25, 29, 28, 27, 15, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 10, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 5, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 8, 6, 6, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 2, 4, 1, 1, 0, 8, 6, 0, 0, 0, 1, 0, 0, 1, 2, 4, 0 } ; static yyconst YY_CHAR yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 5, 5, 1, 6, 7, 8, 1, 9, 10, 11, 10, 10, 10, 10, 10, 10, 10, 10, 12, 1, 1, 1, 1, 1, 1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 1, 23, 24, 25, 26, 27, 1, 28, 29, 30, 31, 32, 33, 1, 34, 1, 35, 1, 36, 1, 1, 1, 37, 14, 38, 39, 40, 18, 41, 42, 21, 22, 1, 23, 43, 44, 26, 45, 1, 28, 46, 47, 48, 32, 33, 1, 34, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst YY_CHAR yy_meta[49] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static yyconst flex_uint16_t yy_base[600] = { 0, 0, 0, 1312, 1313, 36, 47, 54, 81, 23, 35, 42, 56, 73, 1285, 51, 81, 75, 71, 87, 80, 86, 87, 1286, 91, 97, 1280, 103, 1278, 62, 85, 88, 1264, 89, 91, 1260, 94, 1258, 128, 131, 141, 136, 184, 1276, 103, 110, 1289, 1281, 111, 127, 128, 124, 1269, 128, 130, 124, 128, 133, 156, 158, 1263, 1254, 1268, 1267, 1266, 1265, 1264, 1263, 1262, 1261, 1260, 1259, 1258, 1257, 1256, 1255, 1313, 1237, 1236, 1235, 1234, 1233, 1232, 1231, 1230, 1229, 1228, 1227, 1226, 1225, 1224, 179, 188, 174, 162, 166, 190, 191, 1244, 192, 191, 200, 202, 204, 214, 221, 222, 230, 238, 239, 242, 246, 245, 249, 257, 263, 253, 264, 270, 286, 287, 297, 303, 1233, 1232, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 1313, 226, 271, 274, 287, 1239, 237, 291, 1252, 267, 291, 148, 1233, 283, 282, 308, 1255, 310, 1255, 329, 1239, 295, 299, 301, 348, 332, 309, 325, 349, 352, 325, 331, 333, 1247, 1232, 320, 342, 319, 347, 358, 1224, 1223, 1313, 370, 1313, 372, 367, 391, 395, 398, 399, 402, 403, 406, 407, 411, 412, 415, 379, 413, 1249, 421, 446, 423, 399, 1242, 405, 450, 410, 423, 432, 446, 451, 1229, 451, 450, 1220, 1225, 466, 1218, 1237, 452, 457, 441, 1216, 458, 458, 447, 1225, 1224, 1313, 1313, 476, 1224, 452, 458, 454, 462, 501, 502, 471, 476, 1232, 490, 506, 510, 423, 512, 522, 507, 527, 523, 498, 1217, 537, 533, 1216, 499, 513, 1229, 520, 521, 350, 1210, 513, 509, 545, 1207, 565, 531, 1212, 545, 1225, 566, 562, 1204, 540, 1194, 1193, 567, 574, 584, 557, 1221, 576, 1206, 588, 1219, 574, 569, 592, 587, 605, 590, 1224, 595, 600, 1203, 1196, 590, 578, 591, 606, 607, 1203, 607, 606, 626, 622, 623, 630, 637, 646, 647, 657, 653, 658, 663, 667, 1200, 672, 1193, 612, 1192, 675, 629, 1189, 1188, 682, 692, 679, 616, 1195, 1188, 661, 1193, 1206, 694, 686, 1313, 689, 705, 715, 706, 709, 1191, 699, 705, 1204, 698, 704, 696, 1185, 691, 646, 735, 1193, 703, 704, 702, 718, 732, 749, 715, 717, 1201, 727, 750, 754, 1186, 761, 1179, 1313, 1313, 760, 762, 772, 1184, 1177, 1182, 773, 749, 1197, 768, 770, 788, 782, 777, 789, 793, 799, 803, 800, 806, 807, 821, 811, 820, 825, 842, 846, 849, 853, 786, 1194, 826, 1179, 860, 1192, 835, 834, 865, 876, 860, 877, 880, 883, 884, 1177, 863, 755, 1176, 1177, 876, 870, 874, 890, 894, 1179, 790, 876, 868, 889, 904, 907, 875, 879, 1187, 893, 919, 923, 930, 934, 903, 1172, 1165, 911, 1170, 1156, 1153, 929, 940, 1148, 935, 1090, 906, 905, 916, 916, 931, 933, 943, 945, 955, 928, 1091, 948, 1061, 961, 1056, 949, 938, 957, 966, 980, 1030, 991, 993, 984, 953, 963, 969, 984, 967, 971, 961, 981, 985, 969, 974, 1001, 1012, 998, 984, 887, 832, 987, 817, 826, 1024, 997, 1035, 1019, 1022, 1015, 1036, 1039, 804, 786, 1038, 782, 1040, 1031, 1039, 741, 1040, 1025, 1039, 1039, 1055, 1050, 1070, 608, 523, 514, 1060, 1046, 1080, 1065, 1077, 1082, 1092, 1102, 1112, 1071, 1087, 1313, 1090, 445, 362, 1069, 274, 1079, 1070, 1081, 1114, 1113, 1126, 1127, 1130, 247, 1125, 1136, 1137, 1110, 221, 1313, 1313, 1120, 1313, 1129, 195, 1128, 208, 1135, 1146, 205, 1141, 1151, 1148, 1313, 1153, 127, 71, 1313, 1134, 1158, 1162, 1164, 1166, 1168, 1170, 1313, 1313, 63, 60, 50, 1172, 1174, 1152, 1313, 1313, 1176, 1178, 1180, 1182, 1184, 1186, 1313, 1313, 1313, 1313 } ; static yyconst flex_int16_t yy_def[600] = { 0, 599, 1, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 0 } ; static yyconst flex_uint16_t yy_nxt[1362] = { 0, 4, 5, 5, 5, 5, 6, 4, 7, 4, 8, 8, 4, 9, 4, 4, 10, 4, 11, 4, 4, 4, 12, 4, 13, 14, 15, 4, 4, 16, 17, 4, 4, 18, 4, 19, 4, 9, 4, 10, 4, 4, 4, 13, 14, 4, 16, 17, 4, 20, 43, 21, 45, 22, 44, 23, 24, 38, 38, 46, 25, 26, 591, 27, 39, 39, 53, 28, 43, 48, 47, 44, 590, 29, 30, 45, 31, 32, 33, 34, 35, 36, 46, 40, 37, 40, 50, 49, 59, 53, 41, 42, 42, 48, 54, 57, 62, 589, 55, 51, 60, 77, 64, 66, 49, 581, 58, 69, 78, 63, 50, 59, 56, 71, 61, 65, 67, 57, 54, 74, 70, 55, 105, 58, 79, 106, 72, 81, 84, 56, 86, 80, 75, 89, 82, 85, 109, 87, 91, 91, 90, 92, 92, 40, 105, 40, 101, 101, 106, 114, 110, 118, 111, 119, 93, 109, 112, 94, 116, 95, 117, 580, 113, 96, 120, 97, 98, 99, 114, 118, 100, 111, 119, 121, 122, 116, 191, 117, 93, 145, 94, 120, 192, 146, 97, 98, 40, 100, 40, 139, 139, 140, 102, 41, 103, 103, 121, 122, 141, 141, 142, 143, 145, 147, 149, 144, 146, 151, 152, 153, 154, 154, 155, 155, 156, 156, 157, 565, 157, 143, 562, 148, 144, 157, 157, 157, 157, 147, 149, 572, 151, 152, 157, 569, 157, 158, 180, 180, 148, 160, 162, 157, 162, 157, 157, 163, 157, 157, 157, 157, 157, 157, 159, 157, 164, 157, 185, 157, 161, 162, 168, 162, 160, 167, 163, 157, 162, 157, 162, 159, 165, 163, 157, 169, 157, 563, 166, 164, 185, 171, 170, 181, 181, 168, 182, 182, 167, 165, 162, 162, 162, 162, 188, 163, 163, 172, 169, 183, 183, 162, 173, 162, 174, 170, 163, 162, 186, 162, 557, 195, 163, 188, 172, 194, 189, 175, 190, 173, 196, 197, 198, 198, 214, 203, 202, 174, 176, 195, 177, 186, 194, 157, 204, 157, 162, 190, 162, 221, 215, 200, 200, 202, 203, 176, 217, 216, 214, 177, 223, 204, 162, 157, 162, 157, 157, 222, 157, 218, 205, 205, 221, 206, 215, 224, 207, 223, 208, 216, 217, 230, 209, 230, 210, 211, 212, 225, 218, 213, 312, 222, 228, 228, 229, 229, 313, 206, 224, 207, 231, 242, 242, 210, 211, 230, 213, 230, 555, 230, 225, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 233, 230, 230, 230, 230, 230, 251, 230, 237, 238, 232, 243, 243, 157, 234, 157, 239, 249, 235, 245, 245, 291, 291, 233, 236, 254, 240, 232, 256, 255, 251, 237, 238, 241, 249, 235, 246, 257, 246, 239, 252, 247, 252, 254, 248, 248, 255, 258, 253, 253, 241, 256, 260, 270, 262, 263, 157, 268, 157, 273, 257, 269, 272, 283, 274, 259, 230, 554, 230, 280, 281, 258, 270, 282, 277, 278, 260, 262, 263, 284, 268, 274, 259, 273, 269, 272, 280, 283, 285, 281, 282, 230, 230, 230, 230, 287, 288, 246, 288, 246, 288, 284, 288, 295, 289, 289, 306, 285, 290, 290, 292, 292, 246, 157, 246, 157, 307, 246, 287, 246, 293, 294, 247, 252, 316, 252, 295, 252, 306, 252, 547, 315, 310, 309, 311, 162, 317, 162, 297, 307, 163, 298, 316, 299, 323, 546, 319, 300, 315, 301, 302, 303, 309, 311, 304, 162, 162, 162, 162, 317, 163, 163, 297, 321, 298, 326, 326, 323, 301, 302, 319, 304, 327, 327, 230, 328, 230, 330, 230, 333, 230, 334, 288, 345, 288, 336, 336, 321, 337, 337, 335, 335, 328, 339, 339, 288, 346, 288, 340, 340, 334, 330, 333, 336, 336, 343, 345, 347, 349, 344, 351, 352, 353, 353, 353, 353, 353, 367, 353, 346, 353, 375, 353, 343, 545, 348, 344, 353, 356, 353, 369, 347, 349, 351, 352, 354, 353, 353, 353, 353, 367, 355, 348, 353, 375, 353, 357, 353, 353, 353, 353, 356, 360, 353, 369, 353, 358, 353, 355, 353, 361, 398, 157, 362, 157, 162, 377, 162, 359, 230, 163, 230, 372, 358, 372, 360, 288, 363, 288, 398, 373, 373, 372, 361, 372, 364, 362, 382, 382, 377, 374, 374, 380, 380, 381, 383, 157, 383, 157, 157, 384, 157, 364, 385, 385, 383, 388, 383, 389, 397, 384, 391, 394, 386, 386, 392, 402, 393, 395, 404, 401, 403, 353, 405, 353, 353, 397, 353, 388, 406, 391, 389, 408, 399, 399, 402, 393, 401, 403, 353, 157, 353, 157, 404, 162, 405, 162, 451, 406, 163, 372, 162, 372, 162, 416, 408, 163, 538, 411, 411, 412, 412, 372, 230, 372, 230, 417, 417, 418, 418, 412, 412, 383, 451, 383, 424, 424, 416, 383, 383, 383, 383, 509, 425, 384, 425, 533, 424, 424, 425, 425, 425, 425, 425, 419, 425, 425, 425, 425, 425, 420, 425, 426, 425, 440, 421, 422, 462, 428, 423, 425, 425, 425, 425, 433, 425, 429, 425, 427, 420, 532, 440, 421, 422, 462, 430, 432, 442, 524, 431, 434, 428, 425, 523, 425, 427, 425, 433, 425, 437, 445, 437, 430, 353, 438, 353, 446, 439, 439, 432, 353, 442, 353, 434, 395, 157, 435, 157, 447, 447, 448, 450, 450, 445, 436, 446, 162, 372, 162, 372, 230, 163, 230, 230, 230, 230, 230, 454, 456, 458, 383, 436, 383, 466, 425, 384, 425, 464, 463, 457, 465, 467, 459, 460, 425, 455, 425, 425, 469, 425, 456, 454, 458, 521, 464, 466, 457, 463, 473, 437, 467, 437, 455, 472, 465, 472, 475, 470, 471, 482, 437, 469, 437, 483, 353, 438, 353, 478, 478, 484, 230, 473, 230, 480, 480, 485, 486, 487, 482, 475, 483, 488, 488, 489, 489, 425, 490, 425, 484, 492, 496, 425, 485, 425, 495, 497, 497, 498, 505, 486, 487, 506, 506, 490, 499, 499, 498, 507, 507, 496, 472, 510, 472, 492, 353, 511, 353, 495, 500, 501, 512, 505, 508, 508, 509, 513, 515, 516, 425, 520, 425, 517, 522, 517, 510, 528, 528, 512, 511, 518, 518, 514, 517, 515, 517, 353, 516, 353, 513, 504, 519, 519, 520, 503, 525, 522, 525, 530, 530, 526, 531, 531, 527, 527, 498, 525, 353, 525, 353, 353, 526, 353, 536, 529, 529, 498, 534, 534, 535, 535, 537, 539, 540, 541, 542, 517, 502, 517, 544, 544, 425, 548, 425, 543, 543, 525, 536, 525, 494, 540, 517, 353, 517, 353, 537, 539, 541, 542, 544, 544, 525, 559, 525, 556, 548, 550, 550, 493, 549, 549, 551, 551, 525, 558, 525, 552, 552, 526, 553, 553, 550, 550, 525, 491, 525, 559, 556, 526, 560, 481, 527, 527, 525, 517, 525, 517, 558, 526, 568, 568, 529, 529, 561, 561, 562, 560, 425, 425, 425, 425, 425, 570, 425, 564, 564, 565, 525, 566, 525, 566, 571, 526, 573, 574, 574, 582, 425, 567, 425, 575, 575, 566, 566, 566, 566, 570, 578, 578, 479, 576, 577, 579, 579, 448, 571, 573, 583, 583, 477, 582, 584, 584, 585, 585, 586, 586, 587, 587, 588, 588, 592, 592, 593, 593, 594, 594, 595, 595, 596, 596, 596, 596, 597, 597, 598, 598, 476, 313, 474, 468, 461, 453, 452, 449, 444, 443, 441, 381, 415, 414, 413, 410, 409, 407, 400, 396, 390, 387, 379, 378, 192, 376, 371, 370, 368, 366, 365, 350, 342, 341, 338, 332, 331, 329, 325, 324, 322, 320, 318, 113, 314, 308, 305, 296, 286, 279, 276, 275, 271, 267, 266, 265, 264, 261, 250, 244, 227, 226, 220, 219, 201, 199, 153, 193, 187, 184, 179, 178, 150, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, 124, 123, 115, 108, 107, 104, 76, 88, 83, 76, 73, 68, 52, 599, 3, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599 } ; static yyconst flex_int16_t yy_chk[1362] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 9, 5, 10, 5, 9, 5, 5, 6, 6, 11, 5, 5, 584, 5, 7, 7, 15, 5, 9, 12, 11, 9, 583, 5, 5, 10, 5, 5, 5, 5, 5, 5, 11, 8, 5, 8, 13, 12, 18, 15, 8, 8, 8, 12, 16, 17, 20, 582, 16, 13, 19, 29, 21, 22, 12, 571, 17, 24, 29, 20, 13, 18, 16, 25, 19, 21, 22, 17, 16, 27, 24, 16, 44, 17, 30, 45, 25, 31, 33, 16, 34, 30, 27, 36, 31, 33, 48, 34, 38, 38, 36, 39, 39, 40, 44, 40, 41, 41, 45, 51, 49, 55, 49, 56, 40, 48, 50, 40, 53, 40, 54, 570, 50, 40, 57, 40, 40, 40, 51, 55, 40, 49, 56, 58, 59, 53, 149, 54, 40, 94, 40, 57, 149, 95, 40, 40, 42, 40, 42, 91, 91, 91, 42, 42, 42, 42, 58, 59, 92, 92, 92, 93, 94, 96, 97, 93, 95, 99, 100, 101, 101, 101, 102, 102, 103, 103, 104, 564, 104, 93, 561, 96, 93, 105, 106, 105, 106, 96, 97, 559, 99, 100, 107, 553, 107, 104, 139, 139, 96, 106, 108, 109, 108, 109, 110, 108, 110, 112, 111, 112, 111, 113, 105, 113, 108, 116, 144, 116, 107, 114, 112, 114, 106, 111, 114, 115, 117, 115, 117, 105, 109, 117, 118, 114, 118, 548, 110, 108, 144, 116, 115, 140, 140, 112, 141, 141, 111, 109, 119, 120, 119, 120, 147, 119, 120, 117, 114, 142, 142, 121, 118, 121, 119, 115, 121, 122, 145, 122, 539, 152, 122, 147, 117, 151, 148, 120, 148, 118, 153, 153, 155, 155, 164, 160, 159, 119, 121, 152, 122, 145, 151, 157, 161, 157, 163, 148, 163, 173, 165, 157, 157, 159, 160, 121, 169, 168, 164, 122, 175, 161, 162, 166, 162, 166, 167, 174, 167, 170, 162, 162, 173, 162, 165, 176, 162, 175, 162, 168, 169, 184, 162, 184, 162, 162, 162, 177, 170, 162, 260, 174, 181, 181, 183, 183, 260, 162, 176, 162, 184, 196, 196, 162, 162, 185, 162, 185, 537, 186, 177, 186, 187, 188, 187, 188, 189, 190, 189, 190, 191, 192, 191, 192, 186, 193, 194, 193, 194, 195, 204, 195, 190, 191, 185, 197, 197, 201, 187, 201, 193, 202, 188, 199, 199, 244, 244, 186, 189, 206, 194, 185, 207, 206, 204, 190, 191, 195, 202, 188, 200, 208, 200, 193, 205, 200, 205, 206, 200, 200, 206, 209, 205, 205, 195, 207, 210, 221, 212, 213, 216, 219, 216, 224, 208, 220, 223, 235, 225, 209, 230, 536, 230, 232, 233, 209, 221, 234, 230, 230, 210, 212, 213, 238, 219, 225, 209, 224, 220, 223, 232, 235, 239, 233, 234, 236, 237, 236, 237, 241, 242, 247, 242, 247, 243, 238, 243, 250, 242, 242, 255, 239, 243, 243, 245, 245, 246, 249, 246, 249, 256, 248, 241, 248, 246, 246, 248, 253, 263, 253, 250, 252, 255, 252, 522, 262, 259, 258, 259, 264, 267, 264, 252, 256, 264, 252, 263, 252, 274, 521, 269, 252, 262, 252, 252, 252, 258, 259, 252, 266, 271, 266, 271, 267, 266, 271, 252, 272, 252, 277, 277, 274, 252, 252, 269, 252, 278, 278, 279, 280, 279, 282, 284, 286, 284, 287, 288, 298, 288, 289, 289, 272, 291, 291, 288, 288, 280, 293, 293, 290, 299, 290, 294, 294, 287, 282, 286, 290, 290, 297, 298, 300, 301, 297, 303, 304, 306, 307, 306, 307, 305, 320, 305, 299, 308, 329, 308, 297, 520, 300, 297, 309, 307, 309, 323, 300, 301, 303, 304, 305, 310, 311, 310, 311, 320, 306, 300, 313, 329, 313, 308, 312, 314, 312, 314, 307, 311, 315, 323, 315, 309, 316, 306, 316, 312, 352, 318, 314, 318, 322, 332, 322, 310, 328, 322, 328, 326, 309, 326, 311, 336, 315, 336, 352, 326, 326, 327, 312, 327, 316, 314, 338, 338, 332, 327, 327, 335, 335, 335, 339, 341, 339, 341, 342, 339, 342, 316, 339, 339, 340, 344, 340, 345, 351, 340, 347, 349, 340, 340, 348, 356, 348, 349, 358, 355, 357, 359, 361, 359, 353, 351, 353, 344, 362, 347, 345, 364, 353, 353, 356, 348, 355, 357, 360, 365, 360, 365, 358, 366, 361, 366, 418, 362, 366, 372, 368, 372, 368, 379, 364, 368, 512, 372, 372, 373, 373, 374, 378, 374, 378, 381, 381, 382, 382, 374, 374, 384, 418, 384, 385, 385, 379, 383, 386, 383, 386, 508, 387, 386, 387, 506, 386, 386, 388, 390, 388, 390, 389, 383, 389, 391, 392, 391, 392, 383, 394, 387, 394, 401, 383, 383, 427, 389, 383, 395, 393, 395, 393, 394, 396, 390, 396, 388, 383, 505, 401, 383, 383, 427, 391, 393, 403, 496, 392, 396, 389, 397, 495, 397, 388, 398, 394, 398, 399, 407, 399, 391, 400, 399, 400, 408, 399, 399, 393, 405, 403, 405, 396, 493, 409, 397, 409, 411, 411, 411, 417, 417, 407, 398, 408, 410, 412, 410, 412, 413, 410, 413, 414, 415, 414, 415, 421, 422, 423, 424, 398, 424, 433, 425, 424, 425, 429, 428, 422, 430, 434, 425, 425, 431, 421, 431, 432, 436, 432, 422, 421, 423, 492, 429, 433, 422, 428, 441, 437, 434, 437, 421, 438, 430, 438, 444, 437, 437, 453, 439, 436, 439, 454, 440, 439, 440, 448, 448, 455, 449, 441, 449, 451, 451, 456, 457, 458, 453, 444, 454, 459, 459, 460, 460, 461, 462, 461, 455, 464, 469, 466, 456, 466, 468, 470, 470, 470, 477, 457, 458, 478, 478, 462, 471, 471, 471, 479, 479, 469, 472, 481, 472, 464, 476, 482, 476, 468, 472, 472, 483, 477, 480, 480, 480, 484, 486, 487, 490, 491, 490, 488, 494, 488, 481, 498, 498, 483, 482, 488, 488, 485, 489, 486, 489, 502, 487, 502, 484, 475, 489, 489, 491, 474, 497, 494, 497, 500, 500, 497, 501, 501, 497, 497, 497, 499, 503, 499, 503, 504, 499, 504, 510, 499, 499, 499, 507, 507, 509, 509, 511, 513, 514, 515, 516, 517, 473, 517, 518, 518, 523, 524, 523, 517, 517, 526, 510, 526, 467, 514, 519, 532, 519, 532, 511, 513, 515, 516, 519, 519, 525, 541, 525, 538, 524, 527, 527, 465, 525, 525, 528, 528, 529, 540, 529, 533, 533, 529, 535, 535, 529, 529, 530, 463, 530, 541, 538, 530, 542, 452, 530, 530, 531, 544, 531, 544, 540, 531, 552, 552, 531, 531, 543, 543, 543, 542, 545, 546, 545, 546, 547, 556, 547, 549, 549, 549, 550, 551, 550, 551, 558, 550, 560, 562, 562, 573, 563, 551, 563, 565, 565, 566, 587, 566, 587, 556, 567, 567, 450, 566, 566, 569, 569, 447, 558, 560, 574, 574, 446, 573, 575, 575, 576, 576, 577, 577, 578, 578, 579, 579, 585, 585, 586, 586, 590, 590, 591, 591, 592, 592, 593, 593, 594, 594, 595, 595, 445, 443, 442, 435, 426, 420, 419, 416, 406, 404, 402, 380, 377, 376, 375, 369, 367, 363, 354, 350, 346, 343, 334, 333, 331, 330, 325, 324, 321, 319, 317, 302, 296, 295, 292, 285, 283, 281, 276, 275, 273, 270, 268, 265, 261, 257, 254, 251, 240, 231, 227, 226, 222, 218, 217, 215, 214, 211, 203, 198, 179, 178, 172, 171, 158, 156, 154, 150, 146, 143, 124, 123, 98, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 52, 47, 46, 43, 37, 35, 32, 28, 26, 23, 14, 3, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599 } ; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 0; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; #line 1 "./dtimep.lex" /* ** dtimep.lex exceeds the default table capacities for some old versions ** of lex (and the minimum defaults as specified by POSIX). The following ** choices meet or exceed the lex defaults for older SunOS4.x, Solaris, ** HPUX, and AIX. */ #line 12 "./dtimep.lex" #include #include #include /* ** Since we're looking at a string at a time, don't worry about ** wrapping to the next buffer. */ #define yywrap() 1 #define YY_SKIP_YYWRAP #define YY_NO_INPUT /* ** This is the tricky thing that makes this function cool. We ** replace the traditional int yylex(void) declaration with our ** dparsetime() declaration, essentially piggy-backing off the ** utility of the yylex() function and adding what we need to make ** the parsing function useful to us. */ #define YY_DECL struct tws *dparsetime(char *lexstr) /* ** yyerminate() is called after the input string is matched to ** completion (actually, when the lexer reaches an EOF). The only ** thing that really needs to be in this macro function is the ** return call, which must be substituted inline into dparsetime. */ #define yyterminate() (void)yy_delete_buffer(lexhandle); \ if(!(tw.tw_flags & TW_SUCC)) { \ return (struct tws *)NULL; \ } \ if(tw.tw_year < 1970) \ tw.tw_year += 1900; \ if(tw.tw_year < 1970) \ tw.tw_year += 100; \ return(&tw) /* ** Patchable flag that says how to interpret NN/NN/NN dates. When ** true, we do it European style: DD/MM/YY. When false, we do it ** American style: MM/DD/YY. Of course, these are all non-RFC822 ** compliant. */ int europeandate = 0; static int name2num(char *name, char *names[]) { int i; for (i=0; names[i]; i++) { if (strncasecmp(name, names[i], strlen(names[i]))==0) { return i; } } return 0; } /* ** The SET* macros will parse for the appropriate field, and leave the ** cp pointer at the first character after the desired field. Be ** careful with variable-length fields or alpha-num mixes. ** ** The SKIP* macros skip over characters of a particular class and ** leave cp at the position of the first character that doesn't match ** that class. Correspondingly, SKIPTO* skips until it reaches a ** character of a particular class. */ #define INIT() { cp = yytext;} #define SETWDAY() { tw.tw_wday = name2num(cp, tw_dotw); \ tw.tw_flags &= ~TW_SDAY; tw.tw_flags |= TW_SEXP; SKIPA(); } #define SETMON() { tw.tw_mon = name2num(cp, tw_moty); SKIPA(); } #define SETMON_NUM() { tw.tw_mon = atoi(cp)-1; SKIPD(); } #define SETYEAR() { tw.tw_year = atoi(cp); SKIPD(); } #define SETDAY() { tw.tw_mday = atoi(cp); tw.tw_flags |= TW_YES; SKIPD(); } #define SETTIME() { tw.tw_hour = atoi(cp); cp += 2; SKIPTOD(); \ tw.tw_min = atoi(cp); cp += 2; if(*cp == ':') { \ tw.tw_sec = atoi(++cp); SKIPD(); } } #define SETZONE(x) { tw.tw_zone = ((x)/100)*60+(x)%100; \ tw.tw_flags |= TW_SZEXP; SKIPD(); } #define SETZONEC(h, m) { tw.tw_zone = (h)*60+(m); \ tw.tw_flags |= TW_SZEXP; SKIPD(); } #define SETDST() { tw.tw_flags |= TW_DST; } #define SKIPD() { while ( isdigit(*cp++) ) ; --cp; } #define SKIPTOD() { while ( !isdigit(*cp++) ) ; --cp; } #define SKIPA() { while ( isalpha(*cp++) ) ; --cp; } #define SKIPTOA() { while ( !isalpha(*cp++) ) ; --cp; } #define SKIPSP() { while ( isspace(*cp++) ) ; --cp; } #define SKIPTOSP() { while ( !isspace(*cp++) ) ; --cp; } #ifdef ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST # ifdef HAVE_SYS_TIME_H # include # endif #include static void zonehack (struct tws *tw) { struct tm *tm; if (dmktime (tw) == (time_t) -1) return; tm = localtime (&tw->tw_clock); if (tm->tm_isdst) { tw->tw_flags |= TW_DST; tw->tw_zone -= 60; } } #endif /* ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST */ /* ** The year can either be 2 digits, or 4. However, after ** Y2K, we found that some MUA were reporting the year 100, hence ** the middle term here. yyterminate() resolves the actual ** issues with 2-digit years. */ #line 1074 "" #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals (void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy (void ); int yyget_debug (void ); void yyset_debug (int debug_flag ); YY_EXTRA_TYPE yyget_extra (void ); void yyset_extra (YY_EXTRA_TYPE user_defined ); FILE *yyget_in (void ); void yyset_in (FILE * _in_str ); FILE *yyget_out (void ); void yyset_out (FILE * _out_str ); int yyget_leng (void ); char *yyget_text (void ); int yyget_lineno (void ); void yyset_lineno (int _line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap (void ); #else extern int yywrap (void ); #endif #endif #ifndef YY_NO_UNPUT static void yyunput (int c,char *buf_ptr ); #endif #ifndef yytext_ptr static void yy_flex_strncpy (char *,yyconst char *,int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void ); #else static int input (void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k */ #define YY_READ_BUF_SIZE 16384 #else #define YY_READ_BUF_SIZE 8192 #endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ size_t n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = (int) fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex (void); #define YY_DECL int yylex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK /*LINTED*/break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { yy_state_type yy_current_state; char *yy_cp, *yy_bp; int yy_act; if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_load_buffer_state( ); } { #line 170 "./dtimep.lex" /* ** This section begins the definition of dparsetime(). ** Put here any local variable definitions and initializations */ YY_BUFFER_STATE lexhandle; unsigned char *cp; static struct tws tw; memset(&tw,0,sizeof(struct tws)); lexhandle = yy_scan_string(lexstr); #line 1309 "" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 600 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 1313 ); yy_find_action: yy_act = yy_accept[yy_current_state]; if ( yy_act == 0 ) { /* have to back up */ yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_act = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: YY_RULE_SETUP #line 186 "./dtimep.lex" { INIT(); SETWDAY(); SKIPTOA(); SETMON(); SKIPTOD(); SETDAY(); SKIPTOD(); SETTIME(); SKIPTOD(); SETYEAR(); } YY_BREAK case 2: YY_RULE_SETUP #line 199 "./dtimep.lex" { INIT(); SETWDAY(); SKIPTOD(); SETDAY(); SKIPTOA(); SETMON(); SKIPTOD(); SETYEAR(); SKIPTOD(); SETTIME(); } YY_BREAK case 3: YY_RULE_SETUP #line 211 "./dtimep.lex" { INIT(); SETDAY(); SKIPTOA(); SETMON(); SKIPTOD(); SETYEAR(); SKIPTOD(); SETTIME(); } YY_BREAK case 4: YY_RULE_SETUP #line 221 "./dtimep.lex" { INIT(); SETWDAY(); SKIPTOA(); SETMON(); SKIPTOD(); SETDAY(); SKIPTOD(); SETYEAR(); SKIPTOD(); SETTIME(); } YY_BREAK case 5: YY_RULE_SETUP #line 233 "./dtimep.lex" { INIT(); SETWDAY(); SKIPTOA(); SETMON(); SKIPTOD(); SETDAY(); SKIPTOD(); SETYEAR(); } YY_BREAK case 6: YY_RULE_SETUP #line 243 "./dtimep.lex" { INIT(); SETMON(); SKIPTOD(); SETDAY(); SKIPTOD(); SETYEAR(); SKIPTOA(); SETWDAY(); } YY_BREAK case 7: YY_RULE_SETUP #line 253 "./dtimep.lex" { INIT(); SETMON(); SKIPTOD(); SETDAY(); SKIPTOD(); SETYEAR(); } YY_BREAK case 8: YY_RULE_SETUP #line 261 "./dtimep.lex" { INIT(); SETYEAR(); SKIPTOD(); SETMON_NUM(); SKIPTOD(); SETDAY(); SKIPTOD(); SETTIME(); } YY_BREAK case 9: YY_RULE_SETUP #line 271 "./dtimep.lex" { INIT(); SETYEAR(); SKIPTOD(); SETMON_NUM(); SKIPTOD(); SETDAY(); } YY_BREAK case 10: YY_RULE_SETUP #line 279 "./dtimep.lex" { fprintf(stderr, "the highly ambiguous date format XX-XX-XX..." " is no longer supported\n"); } YY_BREAK case 11: YY_RULE_SETUP #line 283 "./dtimep.lex" { INIT(); if(europeandate) { /* DD/MM/YY */ SETDAY(); SKIPTOD(); SETMON_NUM(); } else { /* MM/DD/YY */ SETMON_NUM(); SKIPTOD(); SETDAY(); } SKIPTOD(); SETYEAR(); SKIPTOD(); SETTIME(); } YY_BREAK case 12: YY_RULE_SETUP #line 301 "./dtimep.lex" { INIT(); if(europeandate) { /* DD/MM/YY */ SETDAY(); SKIPTOD(); SETMON_NUM(); } else { /* MM/DD/YY */ SETMON_NUM(); SKIPTOD(); SETDAY(); } SKIPTOD(); SETYEAR(); } YY_BREAK case 13: YY_RULE_SETUP #line 318 "./dtimep.lex" YY_BREAK case 14: YY_RULE_SETUP #line 319 "./dtimep.lex" tw.tw_hour += 12; YY_BREAK case 15: YY_RULE_SETUP #line 321 "./dtimep.lex" { INIT(); SKIPTOD(); SETZONE(atoi(cp)); #ifdef ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST zonehack (&tw); #endif /* ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST */ yyterminate(); } YY_BREAK case 16: YY_RULE_SETUP #line 330 "./dtimep.lex" { INIT(); SKIPTOD(); SETZONE(-atoi(cp)); #ifdef ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST zonehack (&tw); #endif /* ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST */ yyterminate(); } YY_BREAK case 17: YY_RULE_SETUP #line 340 "./dtimep.lex" { INIT(); SKIPTOD(); SETZONEC(atoi(cp), atoi(cp+3)); #ifdef ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST zonehack (&tw); #endif /* ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST */ yyterminate(); } YY_BREAK case 18: YY_RULE_SETUP #line 349 "./dtimep.lex" { INIT(); SKIPTOD(); SETZONEC(-atoi(cp), -atoi(cp+3)); #ifdef ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST zonehack (&tw); #endif /* ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST */ yyterminate(); } YY_BREAK case 19: /* rule 19 can match eol */ YY_RULE_SETUP #line 359 "./dtimep.lex" INIT(); SETZONE(0); yyterminate(); YY_BREAK case 20: /* rule 20 can match eol */ YY_RULE_SETUP #line 360 "./dtimep.lex" INIT(); SETZONE(0); yyterminate(); YY_BREAK case 21: /* rule 21 can match eol */ YY_RULE_SETUP #line 361 "./dtimep.lex" INIT(); SETZONE(-500); yyterminate(); YY_BREAK case 22: /* rule 22 can match eol */ YY_RULE_SETUP #line 362 "./dtimep.lex" { INIT(); SETDST(); SETZONE(-500); yyterminate(); } YY_BREAK case 23: /* rule 23 can match eol */ YY_RULE_SETUP #line 363 "./dtimep.lex" INIT(); SETZONE(-600); yyterminate(); YY_BREAK case 24: /* rule 24 can match eol */ YY_RULE_SETUP #line 364 "./dtimep.lex" { INIT(); SETDST(); SETZONE(-600); yyterminate(); } YY_BREAK case 25: /* rule 25 can match eol */ YY_RULE_SETUP #line 365 "./dtimep.lex" INIT(); SETZONE(-700); yyterminate(); YY_BREAK case 26: /* rule 26 can match eol */ YY_RULE_SETUP #line 366 "./dtimep.lex" { INIT(); SETDST(); SETZONE(-700); yyterminate(); } YY_BREAK case 27: /* rule 27 can match eol */ YY_RULE_SETUP #line 367 "./dtimep.lex" INIT(); SETZONE(-800); yyterminate(); YY_BREAK case 28: /* rule 28 can match eol */ YY_RULE_SETUP #line 368 "./dtimep.lex" { INIT(); SETDST(); SETZONE(-800); yyterminate(); } YY_BREAK case 29: /* rule 29 can match eol */ YY_RULE_SETUP #line 369 "./dtimep.lex" INIT(); SETZONE(-330); yyterminate(); YY_BREAK case 30: /* rule 30 can match eol */ YY_RULE_SETUP #line 370 "./dtimep.lex" INIT(); SETZONE(-400); yyterminate(); YY_BREAK case 31: /* rule 31 can match eol */ YY_RULE_SETUP #line 371 "./dtimep.lex" { INIT(); SETDST(); SETZONE(-400); yyterminate(); } YY_BREAK case 32: /* rule 32 can match eol */ YY_RULE_SETUP #line 372 "./dtimep.lex" INIT(); SETZONE(-1000); yyterminate(); YY_BREAK case 33: /* rule 33 can match eol */ YY_RULE_SETUP #line 373 "./dtimep.lex" { INIT(); SETDST(); SETZONE(-1000); yyterminate(); } YY_BREAK case 34: /* rule 34 can match eol */ YY_RULE_SETUP #line 374 "./dtimep.lex" YY_BREAK case 35: YY_RULE_SETUP #line 376 "./dtimep.lex" ECHO; YY_BREAK #line 1709 "" case YY_STATE_EOF(INITIAL): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_c_buf_p); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of user's declarations */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; char *source = (yytext_ptr); int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = NULL; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart(yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { yy_state_type yy_current_state; char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 600 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { int yy_is_jam; char *yy_cp = (yy_c_buf_p); YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 600 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; yy_is_jam = (yy_current_state == 599); return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_UNPUT static void yyunput (int c, char * yy_bp ) { char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ int number_to_move = (yy_n_chars) + 2; char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ int offset = (yy_c_buf_p) - (yytext_ptr); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart(yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer(yyin,YY_BUF_SIZE ); } yy_init_buffer(YY_CURRENT_BUFFER,input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } static void yy_load_buffer_state (void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = (yy_size_t)size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer(b,file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yy_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree((void *) b->yy_ch_buf ); yyfree((void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; yy_flush_buffer(b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yy_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (void) { int num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ yy_size_t grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return NULL; b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = NULL; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer(b ); return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) { return yy_scan_bytes(yystr,(int) strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param yybytes the byte buffer to scan * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = (yy_size_t) (_yybytes_len + 2); buf = (char *) yyalloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer(buf,n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yynoreturn yy_fatal_error (yyconst char* msg ) { (void) fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int yyget_lineno (void) { return yylineno; } /** Get the input stream. * */ FILE *yyget_in (void) { return yyin; } /** Get the output stream. * */ FILE *yyget_out (void) { return yyout; } /** Get the length of the current token. * */ int yyget_leng (void) { return yyleng; } /** Get the current token. * */ char *yyget_text (void) { return yytext; } /** Set the current line number. * @param _line_number line number * */ void yyset_lineno (int _line_number ) { yylineno = _line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param _in_str A readable stream. * * @see yy_switch_to_buffer */ void yyset_in (FILE * _in_str ) { yyin = _in_str ; } void yyset_out (FILE * _out_str ) { yyout = _out_str ; } int yyget_debug (void) { return yy_flex_debug; } void yyset_debug (int _bdebug ) { yy_flex_debug = _bdebug ; } static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ (yy_buffer_stack) = NULL; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = NULL; (yy_init) = 0; (yy_start) = 0; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = NULL; yyout = NULL; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } /* Destroy the stack itself. */ yyfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) { int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (yyconst char * s ) { int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return malloc(size); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return realloc(ptr, size); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 376 "./dtimep.lex" /* ** This is a portable way to squash a warning about the yyunput() ** function being static but never used. It costs us a tiny amount ** of extra code in the binary but the other options are: ** "%option nounput" which is flex-specific ** makefile hackery just to compile dtimep.c with different flags */ void dtimep_yyunput(int c) { unput(c); } mmh-0.4/sbr/m_draft.c0000644000000000000000000000327513414435726013222 0ustar rootroot/* ** m_draft.c -- construct the name of a draft message ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include /* ** `which' should either be the cur sequence to use the current draft ** or the beyond sequence to start with a new draft. */ char * m_draft(char *which) { struct msgs *mp; static char buffer[BUFSIZ]; char *folder; folder = mh_xstrdup(toabsdir(draftfolder)); create_folder(folder, 0, exit); if (!(mp = folder_read(folder))) { adios(EX_IOERR, NULL, "unable to read folder %s", folder); } mh_free0(&folder); /* ** Make sure we have enough message status space for all ** the message numbers from 1 to one beyond last, since we might ** select an empty slot. If we add more space at the ** end, go ahead and add 10 additional slots. */ if (mp->hghmsg >= mp->hghoff) { if (!(mp = folder_realloc(mp, 1, mp->hghmsg + 10))) adios(EX_OSERR, NULL, "unable to allocate folder storage"); } else if (mp->lowoff > 1) { if (!(mp = folder_realloc(mp, 1, mp->hghoff))) adios(EX_OSERR, NULL, "unable to allocate folder storage"); } mp->msgflags |= ALLOW_BEYOND; /* allow the beyond sequence */ /* ** The draft message name to return is defined by `which'. ** Usually it is seq_cur (for the current draft) or seq_beyond ** (to start a new draft). */ if (!m_convert(mp, which)) exit(EX_SOFTWARE); seq_setprev(mp); snprintf(buffer, sizeof(buffer), "%s/%s", mp->foldpath, m_name(mp->lowsel)); seq_setcur(mp, mp->lowsel); seq_save(mp); folder_free(mp); return buffer; } mmh-0.4/sbr/seq_add.c0000644000000000000000000000770213414435726013205 0ustar rootroot/* ** seq_add.c -- add message(s) to a sequence ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include /* ** Add all the SELECTED messages to a (possibly new) sequence. ** ** If public == 1, make sequence public. ** If public == 0, make sequence private. ** If public == -1, leave the public/private bit alone for existing ** sequences. For new sequences, set this bit based ** on its readonly status. ** ** If error, return 0, else return 1. */ int seq_addsel(struct msgs *mp, char *cp, int public, int zero) { unsigned int i; int msgnum, new_seq = 1; if (!seq_nameok(cp)) return 0; /* ** We keep mp->curmsg and cur sequence in sync. ** See seq_list() and seq_init(). */ if (strcmp(seq_cur, cp)==0) mp->curmsg = mp->hghsel; /* ** Get the number for this sequence */ for (i = 0; mp->msgattrs[i]; i++) { if (strcmp(mp->msgattrs[i], cp)==0) { new_seq = 0; break; } } /* ** If this is a new sequence, add a slot for it */ if (new_seq) { if (i >= NUMATTRS) { advise(NULL, "only %d sequences allowed (no room for %s)!", NUMATTRS, cp); return 0; } if (!(mp->msgattrs[i] = strdup(cp))) { advise(NULL, "strdup failed"); return 0; } mp->msgattrs[i + 1] = NULL; } /* ** If sequence is new, or zero flag is set, then first ** clear the bit for this sequence from all messages. */ if (mp->nummsg>0 && (new_seq || zero)) { for (msgnum = mp->lowmsg; msgnum <= mp->hghmsg; msgnum++) clear_sequence(mp, i, msgnum); } /* ** Now flip on the bit for this sequence ** for all selected messages. */ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) if (is_selected(mp, msgnum)) add_sequence(mp, i, msgnum); /* ** Set the public/private bit for this sequence. */ if (public == 1) make_seq_public(mp, i); else if (public == 0) make_seq_private(mp, i); else if (new_seq) { /* ** If public == -1, then only set the ** public/private bit for new sequences. */ if (is_readonly(mp)) make_seq_private(mp, i); else make_seq_public(mp, i); } mp->msgflags |= SEQMOD; return 1; } /* ** Add a message to a (possibly new) sequence. ** ** If public == 1, make sequence public. ** If public == 0, make sequence private. ** If public == -1, leave the public/private bit alone for existing ** sequences. For new sequences, set this bit based ** on its readonly status. ** ** If error, return 0, else return 1. */ int seq_addmsg(struct msgs *mp, char *cp, int msgnum, int public, int zero) { unsigned int i; int j, new_seq = 1; if (!seq_nameok(cp)) return 0; /* ** keep mp->curmsg and msgattrs[] of seq_cur in sync - see seq_list() */ if (strcmp(seq_cur, cp)==0) mp->curmsg = msgnum; /* ** Get the number for this sequence */ for (i = 0; mp->msgattrs[i]; i++) { if (strcmp(mp->msgattrs[i], cp)==0) { new_seq = 0; break; } } if (new_seq) { /* If this is a new sequence, add a slot for it */ if (i >= NUMATTRS) { advise(NULL, "only %d sequences allowed (no room for %s)!", NUMATTRS, cp); return 0; } if (!(mp->msgattrs[i] = strdup(cp))) { advise(NULL, "strdup failed"); return 0; } mp->msgattrs[i + 1] = NULL; } if (mp->nummsg>0 && (new_seq || zero)) { /* Clear the bit for this sequence from all messages. */ for (j = mp->lowmsg; j <= mp->hghmsg; j++) clear_sequence(mp, i, j); } /* Set the bit for this sequence for this particular message. */ add_sequence(mp, i, msgnum); /* Set the public/private bit for this sequence. */ if (public == 1) make_seq_public(mp, i); else if (public == 0) make_seq_private(mp, i); else if (new_seq) { /* ** If public == -1, then only set the ** public/private bit for new sequences. */ if (is_readonly(mp)) make_seq_private(mp, i); else make_seq_public(mp, i); } mp->msgflags |= SEQMOD; return 1; } mmh-0.4/sbr/ext_hook.c0000644000000000000000000000164713414435726013427 0ustar rootroot/* ** ext_hook.c -- Run a program that hooks into some other system. */ #include /* ** The filename arguments are given full path names. ** msg_filename2 might contain a NULL pointer if not needed. ** Look in the context for an error message if something goes wrong; ** there is a built-in message in case one isn't specified. ** Only produces the error message once. */ int ext_hook(char *hook_name, char *msg_filename1, char *msg_filename2) { char *hook; /* hook program from context */ int status; static int did_message = 0; /* we've already output a message */ if (!(hook = context_find(hook_name))) { return (OK); } status = execprogl(mhbasename(hook), mhbasename(hook), msg_filename1, msg_filename2, (char *)NULL); if (status != OK) { if (did_message) { return (NOTOK); } advise(NULL, "external hook (%s) failed.", hook); did_message = 1; return (NOTOK); } else { return (OK); } } mmh-0.4/sbr/context_save.c0000644000000000000000000000227313414435726014305 0ustar rootroot/* ** context_save.c -- write out the updated context file ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ /* * This function used to support setuid/setgid programs by writing * the file as the user. But that code, m_chkids(), was removed * because there no longer are setuid/setgid programs in nmh. */ #include #include #include void context_save(void) { struct node *np; FILE *out; sigset_t set, oset; /* No context in use -- silently ignore any changes! */ if (!ctxpath) return; if (!(ctxflags & CTXMOD)) return; ctxflags &= ~CTXMOD; /* block a few signals */ sigemptyset(&set); sigaddset(&set, SIGHUP); sigaddset(&set, SIGINT); sigaddset(&set, SIGQUIT); sigaddset(&set, SIGTERM); sigprocmask(SIG_BLOCK, &set, &oset); if (!(out = lkfopen(ctxpath, "w"))) adios(EX_IOERR, ctxpath, "unable to write"); for (np = m_defs; np; np = np->n_next) if (np->n_context) fprintf(out, "%s: %s\n", np->n_name, np->n_field); lkfclose(out, ctxpath); sigprocmask(SIG_SETMASK, &oset, &set); /* reset the signal mask */ } mmh-0.4/sbr/addrsbr.c0000644000000000000000000002231113414435726013217 0ustar rootroot/* ** addrsbr.c -- parse addresses 822-style ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include /* ** High level parsing of addresses: ** ** The routines in sbr/mf.c parse the syntactic representations of ** addresses. The routines in sbr/addrsbr.c associate semantics with those ** addresses. ** ** A full 822-style parser is called for syntax recongition. This breaks ** each address into its components. Note however that no semantics are ** assumed about the parts or their totality. This means that implicit ** hostnames aren't made explicit, and explicit hostnames aren't expanded ** to their "official" represenations. ** ** To summarize, when we're all done, here's what MH knows about the address: ** type: local or network ** host: not locally defaulted, not explicitly expanded ** everything else */ static int ingrp = 0; static char *pers = NULL; static char *mbox = NULL; static char *host = NULL; static char *route = NULL; static char *grp = NULL; static char *note = NULL; static char err[BUFSIZ]; static char adr[BUFSIZ]; char * getname(char *addrs) { struct adrx *ap; pers = mbox = host = route = grp = note = NULL; err[0] = '\0'; if ((ap = getadrx(addrs ? addrs : "")) == NULL) return NULL; strncpy(adr, ap->text, sizeof(adr)); pers = ap->pers; mbox = ap->mbox; host = ap->host; route = ap->path; grp = ap->grp; ingrp = ap->ingrp; note = ap->note; if (ap->err && *ap->err) strncpy(err, ap->err, sizeof(err)); return adr; } struct mailname * getm(char *str, char *dfhost, int dftype, int wanthost, char *eresult) { struct mailname *mp; if (err[0]) { if (eresult) strcpy(eresult, err); else if (wanthost == AD_HOST) admonish(NULL, "bad address '%s' - %s", str, err); return NULL; } if (pers == NULL && mbox == NULL && host == NULL && route == NULL && grp == NULL) { if (eresult) strcpy(eresult, "null address"); else if (wanthost == AD_HOST) admonish(NULL, "null address '%s'", str); return NULL; } if (mbox == NULL && grp == NULL) { if (eresult) strcpy(eresult, "no mailbox in address"); else if (wanthost == AD_HOST) admonish(NULL, "no mailbox in address '%s'", str); return NULL; } if (dfhost == NULL) { dfhost = LocalName(); dftype = LOCALHOST; } mp = mh_xcalloc(1, sizeof(*mp)); if (mp == NULL) { if (eresult) strcpy(eresult, "insufficient memory to represent address"); else if (wanthost == AD_HOST) adios(EX_OSERR, NULL, "insufficient memory to represent address"); return NULL; } mp->m_next = NULL; mp->m_text = mh_xstrdup(str); if (pers) mp->m_pers = mh_xstrdup(pers); if (mbox == NULL) { mp->m_type = BADHOST; mp->m_nohost = 1; mp->m_ingrp = ingrp; mp->m_gname = mh_xstrdup(grp); if (note) mp->m_note = mh_xstrdup(note); return mp; } if (host) { mp->m_mbox = mh_xstrdup(mbox); mp->m_host = mh_xstrdup(host); } else { mp->m_nohost = 1; mp->m_mbox = mh_xstrdup(mbox); if (route == NULL && dftype == LOCALHOST) { mp->m_host = NULL; mp->m_type = dftype; } else { mp->m_host = route ? NULL : mh_xstrdup(dfhost); mp->m_type = route ? NETHOST : dftype; } goto got_host; } if (wanthost == AD_NHST) mp->m_type = !mh_strcasecmp(LocalName(), mp->m_host) ? LOCALHOST : NETHOST; else mp->m_type = mh_strcasecmp(LocalName(), mp->m_host) ? NETHOST : LOCALHOST; got_host: ; if (route) mp->m_path = mh_xstrdup(route); mp->m_ingrp = ingrp; if (grp) mp->m_gname = mh_xstrdup(grp); if (note) mp->m_note = mh_xstrdup(note); return mp; } void mnfree(struct mailname *mp) { if (!mp) return; if (mp->m_text) mh_free0(&(mp->m_text)); if (mp->m_pers) mh_free0(&(mp->m_pers)); if (mp->m_mbox) mh_free0(&(mp->m_mbox)); if (mp->m_host) mh_free0(&(mp->m_host)); if (mp->m_path) mh_free0(&(mp->m_path)); if (mp->m_gname) mh_free0(&(mp->m_gname)); if (mp->m_note) mh_free0(&(mp->m_note)); mh_free0(&mp); } #define empty(s) ((s) ? (s) : "") char * adrformat(struct mailname *mp) { static char addr[BUFSIZ]; static char buffer[BUFSIZ]; if (mp->m_nohost) strncpy(addr, mp->m_mbox ? mp->m_mbox : "", sizeof(addr)); else snprintf(addr, sizeof(addr), mp->m_host ? "%s%s@%s" : "%s%s", empty(mp->m_path), empty(mp->m_mbox), mp->m_host); if (mp->m_pers || mp->m_path) { if (mp->m_note) snprintf(buffer, sizeof(buffer), "%s %s <%s>", legal_person(mp->m_pers ? mp->m_pers : mp->m_mbox), mp->m_note, addr); else snprintf(buffer, sizeof(buffer), "%s <%s>", legal_person(mp->m_pers ? mp->m_pers : mp->m_mbox), addr); } else if (mp->m_note) snprintf(buffer, sizeof(buffer), "%s %s", addr, mp->m_note); else strncpy(buffer, addr, sizeof(buffer)); return buffer; } #define W_NIL 0x0000 #define W_MBEG 0x0001 #define W_MEND 0x0002 #define W_MBOX (W_MBEG | W_MEND) #define W_HBEG 0x0004 #define W_HEND 0x0008 #define W_HOST (W_HBEG | W_HEND) #define WBITS "\020\01MBEG\02MEND\03HBEG\04HEND" /* ** Check if this is my address */ int ismymbox(struct mailname *np) { int oops; int len, i; char *cp; char *pp; char buffer[BUFSIZ]; struct mailname *mp; static char *am = NULL; static struct mailname mq; /* ** If this is the first call, initialize ** list of alternate mailboxes. */ if (am == NULL) { mq.m_next = NULL; mq.m_mbox = getusername(); mp = &mq; if ((am = context_find("alternate-mailboxes")) == NULL) { am = getusername(); } else { oops = 0; while ((cp = getname(am))) { if ((mp->m_next = getm(cp, NULL, 0, AD_NAME, NULL)) == NULL) { admonish(NULL, "illegal address: %s", cp); oops++; } else { mp = mp->m_next; mp->m_type = W_NIL; if (*mp->m_mbox == '*') { mp->m_type |= W_MBEG; mp->m_mbox++; } if (*(cp = mp->m_mbox + strlen(mp->m_mbox) - 1) == '*') { mp->m_type |= W_MEND; *cp = '\0'; } if (mp->m_host) { if (*mp->m_host == '*') { mp->m_type |= W_HBEG; mp->m_host++; } if (*(cp = mp->m_host + strlen(mp->m_host) - 1) == '*') { mp->m_type |= W_HEND; *cp = '\0'; } } if ((cp = getenv("MHWDEBUG")) && *cp) { fprintf(stderr, "mbox=\"%s\" host=\"%s\" %s\n", mp->m_mbox, mp->m_host, snprintb(buffer, sizeof(buffer), (unsigned) mp->m_type, WBITS)); } } } if (oops != 0) { advise(NULL, "please fix the profile entry %s", "alternate-mailboxes"); } } if ((cp = context_find("Default-From")) != NULL) { int i = 0; char *cp2; oops = 0; while ((cp2 = getname(cp)) != NULL) { i++; if ((mp->m_next = getm(cp2, NULL, 0, AD_NAME, NULL)) == NULL) { admonish(NULL, "illegal address: %s", cp); oops++; } else { mp = mp->m_next; if ((cp = getenv("MHWDEBUG")) && *cp) { fprintf(stderr, "mbox=\"%s\" host=\"%s\" %s\n", mp->m_mbox, mp->m_host, snprintb(buffer, sizeof(buffer), (unsigned) mp->m_type, WBITS)); } } } if (oops != 0 || i < 1) { advise(NULL, "please fix the profile entry %s", "Default-From"); } } } if (np == NULL) /* XXX */ return 0; switch (np->m_type) { case NETHOST: len = strlen(cp = LocalName()); if (!uprf(np->m_host, cp) || np->m_host[len] != '.') break; goto local_test; case LOCALHOST: local_test: ; if (!mh_strcasecmp(np->m_mbox, mq.m_mbox)) return 1; break; default: break; } /* ** Now scan through list of alternate ** mailboxes, and check for a match. */ for (mp = &mq; mp->m_next;) { mp = mp->m_next; if (!np->m_mbox) continue; if ((len = strlen(cp = np->m_mbox)) < (i = strlen(pp = mp->m_mbox))) continue; switch (mp->m_type & W_MBOX) { case W_NIL: if (mh_strcasecmp(cp, pp)) continue; break; case W_MBEG: if (mh_strcasecmp(cp + len - i, pp)) continue; break; case W_MEND: if (!uprf(cp, pp)) continue; break; case W_MBEG | W_MEND: if (stringdex(pp, cp) < 0) continue; break; } if (mp->m_nohost) return 1; if (np->m_host == NULL) continue; if ((len = strlen(cp = np->m_host)) < (i = strlen(pp = mp->m_host))) continue; switch (mp->m_type & W_HOST) { case W_NIL: if (mh_strcasecmp(cp, pp)) continue; break; case W_HBEG: if (mh_strcasecmp (cp + len - i, pp)) continue; break; case W_HEND: if (!uprf(cp, pp)) continue; break; case W_HBEG | W_HEND: if (stringdex(pp, cp) < 0) continue; break; } return 1; } return 0; } /* * Insert mailname after element and returns the * number of parsed addresses. element is set to * the last parsed addresse. */ ssize_t getmboxes(char *line, struct mailname **element) { struct mailname *mp, *next, *first; char *cp; size_t i = 0; first = *element; next = first->m_next; while ((cp = getname(line))) { mp = getm(cp, NULL, 0, AD_HOST, NULL); if (mp == NULL) { goto error; } (*element)->m_next = mp; *element = mp; i++; } (*element)->m_next = next; return i; error: while (first->m_next != NULL && first->m_next != next) { mp = first->m_next; first->m_next = mp->m_next; mh_free0(&mp); } first->m_next = next; return -1; } mmh-0.4/sbr/seq_nameok.c0000644000000000000000000000251213414435726013721 0ustar rootroot/* ** seq_nameok.c -- check if a name is ok for a user-defined sequence ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include /* ** returns true if it is a valid name for a user-defined sequence */ int seq_nameok(unsigned char *s) { unsigned char *pp; if (s == NULL || *s == '\0') { advise(NULL, "empty sequence name"); return 0; } /* ** Make sure sequence name doesn't clash with one ** of the `reserved' sequence names. ** Note: Accept `cur' here! But why is it treated special? --meillo */ if (strcmp(s, seq_first)==0 || strcmp(s, seq_last)==0 || strcmp(s, seq_prev)==0 || strcmp(s, seq_next)==0 || strcmp(s, seq_all)==0 || strcmp(s, seq_beyond)==0) { advise(NULL, "collision with reserved sequence name: `%s'", s); return 0; } /* ** First character in a sequence name must be ** an alphabetic character ... */ if (!isalpha(*s)) { advise(NULL, "sequence name must start with a letter: %s", s); return 0; } /* ** and can be followed by zero or more alphanumeric characters */ for (pp = s+1; *pp; pp++) { if (!isalnum(*pp)) { advise(NULL, "sequence name must only contain " "letters and digits: %s", s); return 0; } } return 1; } mmh-0.4/sbr/seq_getnum.c0000644000000000000000000000072513414435726013752 0ustar rootroot/* ** seq_getnum.c -- find the index for a sequence ** -- return -1 if sequence doesn't exist ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include int seq_getnum(struct msgs *mp, char *seqname) { int i; for (i = 0; mp->msgattrs[i]; i++) if (strcmp(mp->msgattrs[i], seqname)==0) return i; return -1; } mmh-0.4/man/0000755000000000000000000000000013414435726011420 5ustar rootrootmmh-0.4/man/rmm.man10000644000000000000000000000253413414435726012775 0ustar rootroot.\" .\" %nmhwarning% .\" .TH RMM %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME rmm \- remove messages .SH SYNOPSIS .HP 5 .na .B rmm .RI [ +folder ] .RI [ msgs ] .RB [ \-unlink " | " \-nounlink ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION By default, .B rmm will remove the specified messages by refiling them to the trash folder `+trash'. The contents of this folder will then need to be removed after a certain amount of time. .PP Alternately, if you wish for .B rmm to really remove the files representing these messages, you can use the .B \-unlink switch. But messages removed by this method cannot be later recovered. .PP .RS 5 rmm \-unlink +trash a .RE .PP can be used to expunge deleted messages. .PP The current message is not changed by .BR rmm , so a .B next will advance to the next message in the folder as expected. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Current\-Folder:~^To find the default current folder .fi .SH "SEE ALSO" refile(1), rmf(1) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder" .RB ` msgs "' defaults to the current message" .RB ` \-nounlink ' .fi .SH CONTEXT If a folder is given, it will become the current folder. mmh-0.4/man/pick.man10000644000000000000000000003156713414435726013140 0ustar rootroot.\" .\" %nmhwarning% .\" .TH PICK %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME pick \- select messages by content scan \- produce a one line per message scan listing .SH SYNOPSIS .HP 5 .na .B pick .RI [ +folder ] .RI [ msgs ] .RB [ \-and \&...] .RB [ \-or \&...] .RB [ \-not \&...] .RB [ \-lbrace \&... .BR \-rbrace ] .RB [ \-\|\-component .IR pattern ] .RB [ \-cc .IR pattern ] .RB [ \-date .IR pattern ] .RB [ \-from .IR pattern ] .RB [ \-search .IR pattern ] .RB [ \-subject .IR pattern ] .RB [ \-to .IR pattern ] .RB [ \-after .IR date ] .RB [ \-before .IR date ] .RB [ \-datefield .IR field ] .RB [ \-format .IR formatfile ] .RB [ \-width .IR columns ] .RB [ \-thread .RI [ +folder ] messages "|" files ] .RB [ \-file .IR mboxfilename ] .RB [ \-sequence .I name \&...] .RB [ \-public " | " \-nopublic ] .RB [ \-zero " | " \-nozero ] .RB [ \-list " | " \-nolist ] .RB [ \-Version ] .RB [ \-help ] .PP .HP 5 .B scan is equivalent to .B pick -format scan.default .ad .PP typical usage: .PP .RS 5 .nf scan\0\-from\0jones` pick\0\-to\0holloway\0\-sequence\0select show\0`pick\0\-before\0friday` .fi .RE .ad .SH DESCRIPTION .B Pick searches within a folder for messages with the specified contents, and then identifies those messages. Two types of search primitives are available: pattern matching and date constraint operations. .PP The default .BR regex (7) is used to perform the matching, so the full regular expression facility is available within .IR pattern. With .BR \-search , .I pattern is used directly, but only for the body of the Mail. With the others, .B pick compares the header field name case insensitive and the tries to match the field body with the .IR patern. .PP With .BR --componend you can sepcify the exact header field name you are looking for. It is used to pick a component which is not one of `To:', `Cc:', `Date:', `From:', or `Subject:'. An example is .RB ` "pick\0\-\|\-reply\-to\0pooh" '. .PP Pattern matching is performed on a per\-header-field basis. Within the header of the message, each field is treated as one long line, but in the body, each line is separate. The .IR patern will match any case. .PP Note that since the .B \-date switch is a pattern matching operation (as described above), to find messages sent on a certain date the pattern string must match the text of the `Date:' field of the message. .PP Independent of any pattern matching operations requested, the switches .B \-after .I date or .B \-before .I date may also be used to introduce date/time constraints on all of the messages. By default, the `Date:' field is consulted, but if another date yielding field (such as `BB\-Posted:' or `Delivery\-Date:') should be used, the .B \-datefield .I field switch may be used. .PP With .B \-before and .BR \-after , .B pick will actually parse the date fields in each of the messages specified in `msgs' and compare them to the date/time specified. If .B \-after is given, then only those messages whose `Date:' field value is chronologically after the date specified will be considered. The .B \-before switch specifies the complimentary action. .PP Both the .B \-after and .B \-before switches take legal 822\-style date specifications as arguments. .B Pick will default certain missing fields so that the entire date need not be specified. These fields are (in order of defaulting): timezone, time and timezone, date, date and timezone. All defaults are taken from the current date, time, and timezone. .PP In addition to 822\-style dates, .B pick will also recognize any of the days of the week (`sunday', `monday', and so on), and the special dates `today', `yesterday' (24 hours ago), and `tomorrow' (24 hours from now). All days of the week are judged to refer to a day in the past (e.g., telling \fIpick\fR `saturday' on a `tuesday' means `last\ saturday' not `this\ saturday'). Further more, dates in a simplified ISO 8601/RFC 3339 style (e.g. `YYYY-MM-DD' or `YYYY-MM-DD hh:mm:ss') are accepted. Finally, in addition to these special specifications, .B pick will also honor a date specification of the form `\-\fIddd\fR', which means `\fIddd\fR days ago'. For example, .PP .RS 5 .nf pick\0\-after\0\-30 .fi .RE .PP identifies the messages of the last thirty days. .PP .B Pick supports complex boolean operations on the searching primitives with the .BR \-and , .BR \-or , .BR \-not , and .B \-lbrace .B \&... .B \-rbrace switches. For example, .PP .RS 5 .nf pick\0\-after\0yesterday\0\-and \-lbrace\0\-from\0freida\0\-or\0\-from\0fear\0\-rbrace .fi .RE .PP identifies messages recently sent by `frieda' or `fear'. .PP The matching primitives take precedence over the .B \-not switch, which in turn takes precedence over .B \-and which in turn takes precedence over .BR \-or . To override the default precedence, the .B \-lbrace and .B \-rbrace switches are provided, which act just like opening and closing parentheses in logical expressions. .PP If no search criteria are given, all the messages specified on the command line are selected (this defaults to `a'). .PP Once the search has been performed, if the .B \-list switch is given, the message numbers of the selected messages are written to the standard output separated by newlines. This is .B extremely useful for quickly generating arguments for other .B mmh programs by using the `backquoting' syntax of the shell. For example, the command .PP .RS 5 show\0`pick\0+todo\0\-after\0`31 Mar 83 0123 PST'` .RE .PP says to .B show those messages in the indicated folder which meet the appropriate criterion. Note that since .BR pick 's context changes are written out prior to .BR show 's invocation, you need not give the folder argument to .B show as well. .PP The .B \-sequence .I name switch may be given once for each sequence the user wishes to define. For each sequence named, that sequence will be defined to mean exactly those messages selected by .BR pick . For example, .PP .RS 5 pick\0\-from\0frated\0\-seq\0fred .RE .PP defines a new message sequence for the current folder called `fred' which contains exactly those messages that were selected. .PP By default, .B pick will zero the sequence before adding it. This action can be disabled with the .B \-nozero switch, which means that the messages selected by .B pick will be added to the sequence, if it already exists, and any messages already a part of that sequence will remain so. .PP The .B \-public and .B \-nopublic switches are used by .B pick in the same way .B mark uses them. .B Scan and .B pick produces a one\-line\-per\-message listing of the specified and selected folder or messages. The default format is for .B pick is to print the message number for each message. The default .B Scan line contains the message number (name), the date, the `From:' field and the `Subject' field. The folowing example shows the default output of .B scan .PP .RS 5 .nf .ta \w'15+- 'u +\w'07/\|05x 'u +\w'Dcrocker 'u 15+ 10/\|05 crocker nned 16\- 10/\|05 crocker message id format 18 10/\|06 brien Re: Exit status from mkdir 19 10/\|07*brien `scan' listing format in mmh .fi .RE .PP The `+' on message 15 indicates that it is the current message. The `\-' on message 16 indicates that it has been replied to, as indicated by a `Replied:' component (produced by the .B \-annotate switch to the .B repl command). The `*' on message 19 indicates that no `Date:' header was present. The time of last modification of the message is given instead. .B Scan actually reads each of the specified messages and parses them to extract the desired fields. During parsing, appropriate error messages will be produced if there are format errors in any of the messages. .PP By default, .B scan will decode RFC-2047 (MIME) encoding in these scan listings. .B Scan will only decode these fields if your terminal can natively display the character set used in the encoding. You should set the MM_CHARSET environment variable to your native character set, if it is not US-ASCII. See the mh-profile(5) man page for details about this environment variable. .PP The .B \-file .I filename switch allows the user to obtain a .B scan listing of a maildrop file as produced by .BR packf . This listing includes every message in the file (you can't scan individual messages). .PP The switch .B \-width .I columns may be used to specify the width of the scan line. The default is to use the width of the terminal. .PP The command: .PP .RS 5 (scan | pr ; show a \-showproc pr) | lpr .RE .PP produces a scan listing of the current folder, followed by a formatted listing of all messages in the folder, one per page. Omitting .RB ` "\-showproc\ pr" ' will cause the messages to be concatenated, separated by a one\-line header and two blank lines. .PP To override the output format used by .BR scan , the .B \-form .I file switch is used. This permits individual fields of the scan listing to be extracted with ease. .I file is either the name of a format file or a format string directly, if prepended with an equal sign `='. See .BR mh\-format (5) for the details. .PP In addition to the standard .BR mh\-format (5) escapes, .B scan also recognizes the following additional .I component escapes: .PP .RS 5 .nf .ta \w'Dtimenow 'u +\w'Returns 'u .I "Escape Returns Description dtimenow date the current date folder string the name of the current folder .fi .RE .PP If no date header is present in the message, the .I function escapes which operate on .RB { date } will return values for the date of last modification of the message file itself. This feature is handy for scanning a draft folder, as message drafts usually aren't allowed to have dates in them. .PP .B scan will update the .B mmh context prior to starting the listing, so interrupting a long .B scan listing preserves the new context. .B nmh purists hate this idea. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Alternate\-Mailboxes:~^To determine the user's mailboxes ^Current\-Folder:~^To find the default current folder .fi .SH "SEE ALSO" mark(1) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder" .RB ` msgs "' defaults to all messages" .RB ` "\-datefield date" ' .RB ` \-zero ' .RB ` \-list "' is the default if no `\-sequence', `\-nolist' otherwise" .RB ` "\-format pick\.default" "' if the programm is called with scan `scan.default' is used .fi .SH CONTEXT If a folder is given, it will become the current folder. .SH HISTORY In previous versions of .BR MH , the .B pick command would .BR show , .BR scan , or .B refile the selected messages. This was rather `inverted logic' from the UNIX point of view, so .B pick was changed to define sequences and output those sequences. Hence, .B pick can be used to generate the arguments for all other .B MH commands, instead of giving .B pick endless switches for invoking those commands itself. .PP Also, previous versions of .B pick balked if you didn't specify a search string or a date/time constraint. The current version does not, and merely matches the messages you specify. This lets you type something like: .PP .RS 5 show\0`pick\0l:20\0\-seq\0fear` .RE .PP instead of typing .PP .RS 5 .nf mark\0\-add\0\-nozero\0\-seq\0fear\0l:20 show\0fear .fi .RE .PP Also, timezones used to be ignored when comparing dates: they aren't any more. .PP In .B MH , .B nmh and old .B mmh versions scan and pick where two diffrent tools. So instand of typing .PP .RS 5 .nf scan\0\-from\0philipp .fi .RE .PP you had typed .PP .RS 5 .nf scan\0`pick\0\-from\0philipp` .fi .RE .PP With the default config the old style usage is still supported, so you can write scripts for both mmh and nmh. .SH "HELPFUL HINTS" Use .RB ` "pick sequence \-list" ' to enumerate the messages in a sequence (such as for use by a shell script). .SH BUGS Any occurrence of .B \-datefield must occur prior to the .B \-after or .B \-before switch it applies to. .PP If .B pick is used in a back\-quoted operation, such as .PP .RS 5 scan\0`pick\0\-from\0jones` .RE .PP and .B pick selects no messages (e.g., no messages are from `jones'), then the shell will still run the outer command (e.g., .BR scan ). Since no messages were matched, .B pick produced no output, and the argument given to the outer command as a result of backquoting .B pick is empty. In the case of .B mmh programs, the outer command now acts as if the default `msg' or `msgs' should be used (e.g., `all' in the case of .BR scan ). To prevent this unexpected behavior, if .B \-list was given, and if its standard output is not a tty, then .B pick outputs the illegal message number `0' when it fails. This lets the outer command fail gracefully as well. .PP To account for this case when combining .B pick with regular shell tools, filter out the message number `0'. For example, do .PP .RS 5 pick\0...\0|\0fgrep\0-vx\0\&0\0|\0wc\0-l .RE .PP to count the number of messages picked. .PP The pattern syntax `[l-r]' is not supported; each letter to be matched must be included within the square brackets. mmh-0.4/man/send.man10000644000000000000000000001417713414435726013141 0ustar rootroot.\" .\" %nmhwarning% .\" .TH SEND %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME send \- send a message .SH SYNOPSIS .HP 5 .na .B send .RI [ +folder ] .RI [ msgs ] .RB [ \-verbose " | " \-noverbose ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Send will cause each of the specified messages to be delivered to each of the destinations in the `To:', `Cc:', `Bcc:', `Dcc:', and `Fcc:' fields of the message. If .B send is re\-distributing a message, as invoked from .BR dist , then the corresponding `Resent\-xxx' fields are examined instead. .PP .B send uses the program .B spost to do the actual delivery of the messages. Most of the features attributed to .B send are actually performed by .BR spost . .PP Unless a .I MIME-Version header is already present, the message is converted to a MIME message. In this process, the draft is scanned for attachment header fields. Their name defaults to ``Attach'', but may be changed by the value of the .I Attachment-Header profile entry. If such header fields are found, the body of each is interpreted as a file name (or a message specification), and each of these files or messages is included as a separate part in the MIME message. (The first part of the MIME message is the draft body.) .PP .PP The MIME type of each file is determined by the MIME type query program, as defined by the .I Mime-Type-Query profile entry. Mmh distributes the program .BR print-mimetype , in case no better alternative is available on the system. .PP The last component of the path name is taken as the name of the MIME parts. A message part header for an attachment might be: .PP .nf Content-Type: text/plain; name="README"; charset="us-ascii" Content-Description: README Content-Disposition: attachment; filename="README" .fi .PP This conversion occurs before all other processing. .PP If, however, a .I MIME-Version header field is already present in the draft, no such conversion will be done. This way, it is possible to access the full capabilities of .B mhbuild to create elaborate MIME structures, which reach way beyond the attachment system's capabilities. If .B mhbuild was invoked on the draft beforehand (e.g. at the Whatnow prompt), then .B send will use this already MIMEified draft as is. .PP As a second conversion step, .B send searches for .I Sign and .I Enc header fields, and if found, invokes .B mhsign to sign and encrypt the message. Signing and encrypting is done independently of the MIME conversion. .PP If .B \-verbose is specified, .B send will request verbose information of the transport system. .PP .B Send with no .I +folder and .I msgs arguments will send the current message in the draft folder. .B Send sends messages from the draft folder, unless .I +folder is given. Consult the .BR mh-draft (7) man page for more information. .PP Once the transport system has successfully accepted custody of the message, the message will be moved into the trash folder. If there are errors in the formatting of the message, .B send will abort with a (hopefully) helpful error message. .PP If a `Bcc:' field is encountered, its addresses will be used for delivery, and the `Bcc:' field will be removed from the message sent to sighted recipients. The blind recipients will receive an entirely new message with a minimal set of headers. Included in the body of the message will be a copy of the message sent to the sighted recipients. .PP If a `Dcc:' field is encountered, its addresses will be used for delivery, and the `Dcc:' field will be removed from the message. The blind recipients will receive the same message sent to the sighted recipients. *WARNING* Recipients listed in the `Dcc:' field receive no explicit indication that they have received a `blind copy'. This can cause blind recipients to inadvertently reply to all of the sighted recipients of the original message, revealing that they received a blind copy. On the other hand, since a normal reply to a message sent via a `Bcc:' field will generate a reply only to the sender of the original message, it takes extra effort in most mailers to reply to the included message, and so would usually only be done deliberately, rather than by accident. .PP Prior to sending the message, the fields `From:\ user@local', and `Date:\ now' will be appended to the headers in the message. If the environment variable .B $SIGNATURE is set, then its value is used as your personal name when constructing the `From:' line of the message. If this environment variable is not set, then .B send will consult the profile entry `Signature' for this information. .PP If .B send is re\-distributing a message (when invoked by .BR dist ), then `Resent\-' will be prepended to each of these fields: `From:', `Date:', and `Message\-ID:'. If the message already contains a `From:' field, then a `Sender: user@local' field will be added as well. (An already existing `Sender:' field is an error!) .PP If an `Fcc:\ folder' is encountered, the message will be copied to the specified folder for the sender in the format in which it will appear to any non\-Bcc receivers of the message. That is, it will have the appended fields and field reformatting. The `Fcc:' fields will be removed from all outgoing copies of the message. .PP The files specified by the profile entry `Aliasfile:' will be read. See .BR mh\-alias (5) for more information. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile ^+drafts~^The draft folder .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Draft\-Folder:~^To set the default draft\-folder ^Aliasfile:~^For a default alias file ^Signature:~^To determine the user's mail signature ^Attachment\-Header:~^The name of the attachment header field ^Sign\-Header:~^The name of the sign request header field ^Enc\-Header:~^The name of the encryption request header field ^Mime\-Type\-Query:~^Program to determine the MIME types of files .fi .SH "SEE ALSO" comp(1), dist(1), forw(1), repl(1), mh\-alias(5), mhbuild(1), mhsign(1), spost(8) .SH DEFAULTS .nf .RB ` msgs "' defaults to the current message" .RB ` +folder "' defaults to the draft folder" .RB ` \-noverbose ' .fi .SH CONTEXT None .SH BUGS None mmh-0.4/man/ap.man80000644000000000000000000000367713414435726012622 0ustar rootroot.\" .\" %nmhwarning% .\" .TH AP %manext8% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME ap \- parse addresses 822-style .SH SYNOPSIS .HP 5 .na .B %libdir%/ap .RB [ \-form .IR formatfile ] .RB [ \-normalize " | " \-nonormalize ] .RB [ \-Version ] .RB [ \-help ] .I addrs \&... .ad .SH DESCRIPTION .B Ap is a program that parses addresses according to the ARPA Internet standard. It also understands many non\-standard formats. It is useful for seeing how .B mmh will interpret an address. .PP The .B ap program treats each argument as one or more addresses, and prints those addresses out in the official 822\-format. Hence, it is usually best to enclose each argument in double\-quotes for the shell. .PP To override the output format used by .BR ap , the .B \-form .I file switch is used. This permits individual fields of the address to be extracted with ease. The .I file is either the name of a format file or it may be a format string directly, if prepended with an equal sign `='. See .BR mh\-format (5) for the details. .PP In addition to the standard escapes, .B ap also recognizes the following additional escape: .PP .RS 5 .nf .ta \w'Escape 'u +\w'Returns 'u .I "Escape Returns Description error string A diagnostic if the parse failed .RE .fi .PP If the .B \-normalize switch is given, .B ap will try to track down the official hostname of the address. .PP Here is the default format string used by .BR ap : .PP .RS 5 .nf %<{error}%{error}: %{text}%|%(putstr(proper{text}))%> .fi .RE .PP which says that if an error was detected, print the error, a `:', and the address in error. Otherwise, output the 822\-proper format of the address. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" None .SH "SEE ALSO" dp(8), .I "Standard for the Format of ARPA Internet Text Messages" (RFC\-822) .SH DEFAULTS .nf .RB ` \-form "' defaults as described above" .RB ` \-normalize ' .fi .SH CONTEXT None mmh-0.4/man/mh-format.man50000644000000000000000000004361513414435726014105 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MH-FORMAT %manext5% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mh-format \- format file for mh message system .SH DESCRIPTION Several .B mmh commands utilize either a .I format string or a .I format file during their execution. For example, .B scan uses a format string which directs it how to generate the scan listing for each message; .B repl uses a format file which directs it how to generate the reply to a message, and so on. .PP There are a few alternate scan listing formats available, e.g. .IR scan.nmh , .IR scan.mailx , and .IR scan.timely . Look in .I %etcdir% for other .B scan and .B repl format files. .PP This manual section explains how to write and modify format commands. Note: familiarity with the C .B printf routine is assumed. .PP A format string consists of ordinary text, and special multi-character escape sequences which begin with `%'. When specifying a format string, the usual C backslash characters are honored: `\\b', `\\f', `\\n', `\\r', and `\\t'. Continuation lines in format files end with `\\' followed by the newline character. .\" TALK ABOUT SYNTAX FIRST, THEN SEMANTICS .SS SYNTAX Format strings are built around .IR "escape sequences" . There are four types of escape sequences: .PP .RS 5 .nf .ta +\w'name of escape class xxxxxxx'u .RI "1) header components %{" component } .RI "2) built-in functions %(" "function arg" ) .RI "3) flow control %< ... %? ... %| ... %> .RI "4) comments %; ... .fi .RE .PP Comments may be inserted in most places where no function argument is expected. A comment begins with `%;' and ends with a (non-escaped) newline. .PP A .I component escape is specified as .RI `%{ component }', and exists for each header found in the message being processed. For example .RI `%{ date }' refers to the `Date:' field of the appropriate message. All component escapes have a string value. Normally, component values are compressed by converting any control characters (tab and newline included) to spaces, then eliding any leading or multiple spaces. However, commands may give different interpretations to some component escapes; be sure to refer to each command's manual entry for complete details. .PP A .I function escape is specified as .RI `%( function )'. All functions are built-in, and most have a string or numeric value. A function escape may have an .IR argument . The argument follows the function escape: separating whitespace is discarded: .RI `%( function " " argument )'. .PP In addition to literal numbers or strings, the argument to a function escape can be another function, a component, or a control escape. When the argument is a function or a component, they are listed without a leading `%'. When control escapes are used as function arguments, they written as normally, with a leading `%'. .SS "Control escapes" .PP A .I control escape is one of: `%<', `%?', `%|', or `%>'. These are combined into the conditional execution construct: .PP .RS 5 .nf .RI "%< " condition " " "format-text" .RI "%? " condition " " "format-text" \&... .RI "%| " "format-text" %> .fi .RE .PP (Extra white space is shown here only for clarity.) These constructs may be nested without ambiguity. They form a general .B if\-elseif\-else\-endif block where only one of the format-texts is interpreted. In other words, `%<' is like the "if", `%?' is like the "elseif", `%|' is like "else", and `%>' is like "endif". .PP A `%<' or `%?' control escape causes its condition to be evaluated. This condition is a .I component or .IR function . For integer valued functions or components, the condition is true if the function return or component value is non-zero, and false if zero. For string valued functions or components, the condition is true if the function return or component value is a non-empty string, and false for an empty string. .PP The `%?' control escape is optional, and there may be more than one `%?' control escape in a conditional block. The `%|' control escape is also optional, but may be included at most once. .SS "Function escapes" Functions expecting an argument generally require an argument of a particular type. In addition to the number and string types, these include: .PP .RS 5 .nf .ta +\w'Argument 'u +\w'An optional component, 'u .I "Argument Description Example Syntax literal A literal number %(\fIfunc\fR 1234) or string %(\fIfunc\fR text string) comp Any component %(\fIfunc\fR\^{\fIin-reply-to\fR\^}) date A date component %(\fIfunc\fR\^{\fIdate\fR\^}) addr An address component %(\fIfunc\fR\^{\fIfrom\fR\^}) expr Nothing %(\fIfunc\fR) or a subexpression %(\fIfunc\fR\^(\fIfunc2\fR\^)) or control escape %(\fIfunc\fR %<{\fIreply-to\fR\^}%|%{\fIfrom\fR\^}%>) .fi .RE .PP The types .I date and .I addr have the same syntax as .IR comp , but require that the header component be a date string, or address string, respectively. .PP Most arguments not of type .IR expr are required. When escapes are nested (via expr arguments), evaluation is done from inner-most to outer-most. As noted above, for the expr argument type, functions and components are written without a leading `%'. Control escape arguments must use a leading `%', preceded by a space. .PP For example, .PP .RS 5 .nf %<(mymbox{from}) To: %{to}%> .fi .RE .PP writes the value of the header component `From:' to the internal register named str; then (\fImymbox\fR\^) reads str and writes its result to the internal register named .IR num ; then the control escape evaluates .IR num . If .IR num is non-zero, the string `To:' is printed followed by the value of the header component `To:'. .SS Evaluation The evaluation of format strings is performed by a small virtual machine. The machine is capable of evaluating nested expressions as described above, and in addition has an integer register .IR num , and a text string register .IR str . When a function escape that accepts an optional argument is processed, and the argument is not present, the current value of either .I num or .I str is used as the argument: which register is used depends on the function, as listed below. .\" What is the difference between these two lines: .\" %(void{comp})%(trim)%(putstr) .\" %(putstr(trim{comp})) .\" The latter can be used as a single expression for %<. .\" It does make a difference for (decode) because in the former .\" way, wrapping (decode) with (void) can be necessary. .\" What is the preferred way? .PP Component escapes write the value of their message header in .IR str . Function escapes write their return value in .I num for functions returning integer or boolean values, and in .I str for functions returning string values. (The boolean type is a subset of integers with usual values 0=false and 1=true.) Control escapes return a boolean value, setting .I num to 1 if the last explicit condition evaluated by a `%<' or `%?' control succeeded, and 0 otherwise. .PP All component escapes, and those function escapes which return an integer or string value, evaluate to their value as well as setting .I str or .IR num . Outermost escape expressions in these forms will print their value, but outermost escapes which return a boolean value do not result in printed output. .SS Functions The function escapes may be roughly grouped into a few categories. .PP .RS 5 .nf .ta \w'Fformataddr 'u +\w'Aboolean 'u +\w'Rboolean 'u .I "Function Argument Result Description msg integer message number cur integer message is current (0 or 1) unseen integer message is unseen (0 or 1) size integer size of message strlen integer length of \fIstr\fR width integer output buffer size in bytes charleft integer bytes left in output buffer timenow integer seconds since the UNIX epoch me string the user's mailbox eq literal boolean \fInum\fR == \fIarg\fR ne literal boolean \fInum\fR != \fIarg\fR gt literal boolean \fInum\fR > \fIarg\fR match literal boolean \fIstr\fR contains \fIarg\fR amatch literal boolean \fIstr\fR starts with \fIarg\fR plus literal integer \fIarg\fR plus \fInum\fR minus literal integer \fIarg\fR minus \fInum\fR divide literal integer \fInum\fR divided by \fIarg\fR modulo literal integer \fInum\fR modulo \fIarg\fR num literal integer Set \fInum\fR to \fIarg\fR. num integer Set \fInum\fR to zero. lit literal string Set \fIstr\fR to \fIarg\fR. lit string Clear \fIstr\fR. getenv literal string Set \fIstr\fR to environment value of \fIarg\fR profile literal string Set \fIstr\fR to profile component \fIarg\fR value .\" dat literal int return value of dat[arg] nonzero expr boolean \fInum\fR is non-zero zero expr boolean \fInum\fR is zero null expr boolean \fIstr\fR is empty nonnull expr boolean \fIstr\fR is non-empty void expr Set \fIstr\fR or \fInum\fR comp comp string Set \fIstr\fR to component text compval comp integer Set \fInum\fR to `\fBatoi\fR(\fIcomp\fR\^)' .\" compflag comp integer Set \fInum\fR to component flags bits (internal) .\" decodecomp comp string Set \fIstr\fR to RFC-2047 decoded component text decode expr string decode \fIstr\fR as RFC-2047 (MIME-encoded) component and print it unquote expr string remove RFC-2822 quotes from \fIstr\fR unmailto expr string remove `mailto:' and < > from \fIstr\fR trim expr trim white-space from \fIstr\fR putstr expr print \fIstr\fR putstrf expr print \fIstr\fR in a fixed width putnum expr print \fInum\fR putnumf expr print \fInum\fR in a fixed width nodate string integer Argument not a date string (0 or 1) formataddr expr append \fIarg\fR to \fIstr\fR as a (comma separated) address list putaddr literal print \fIstr\fR address list with \fIarg\fR as optional label; get line width from \fInum\fR .fi .RE .PP The following functions require a date component as an argument: .PP .RS 5 .nf .ta \w'Fformataddr 'u +\w'Aboolean 'u +\w'Rboolean 'u .I "Function Argument Return Description sec date integer seconds of the minute min date integer minutes of the hour hour date integer hours of the day (0-23) wday date integer day of the week (Sun=0) day date string day of the week (abbrev.) weekday date string day of the week sday date integer day of the week known? (1=explicit,0=implicit,\-1=unknown) mday date integer day of the month yday date integer day of the year mon date integer month of the year month date string month of the year (abbrev.) lmonth date string month of the year year date integer year (may be > 100) zone date integer timezone in hours tzone date string timezone string szone date integer timezone explicit? (1=explicit,0=implicit,\-1=unknown) date2local date coerce date to local timezone date2gmt date coerce date to GMT dst date integer daylight savings in effect? (0 or 1) clock date integer seconds since the UNIX epoch rclock date integer seconds prior to current time tws date string official RFC-822 rendering pretty date string user-friendly rendering .fi .RE .PP These functions require an address component as an argument. The return value of functions noted with `*' is computed from the first address present in the header component. .PP .RS 5 .nf .ta \w'Fformataddr 'u +\w'Aboolean 'u +\w'Rboolean 'u .I "Function Argument Return Description proper addr string official RFC-822 rendering friendly addr string user-friendly rendering addr addr string mbox@host or host!mbox rendering* pers addr string the personal name* note addr string commentary text* mbox addr string the local mailbox* mymbox addr integer List has the user's address? (0 or 1) host addr string the host domain* nohost addr integer no host was present (0 or 1)* type addr integer host type* (0=local,1=network, \-1=uucp,2=unknown) path addr string any leading host route* ingrp addr integer address was inside a group (0 or 1)* gname addr string name of group* .fi .RE .PP (A clarification on (\fImymbox\fR\^{\fIcomp\fR\^}) is in order. This function checks each of the addresses in the header component `\fIcomp\fR' against the user's mailbox name and any .RI ` Alternate-Mailboxes '. It returns true if any address matches, however, it also returns true if the `\fIcomp\fR' header is not present in the message. If needed, the (\fInull\fR\^) function can be used to explicitly test for this case.) .SS Formatting When a function or component escape is interpreted and the result will be immediately printed, an optional field width can be specified to print the field in exactly a given number of characters. For example, a numeric escape like %4(\fIsize\fR\^) will print at most 4 digits of the message size; overflow will be indicated by a `?' in the first position (like `?234'). A string escape like %4(\fIme\fR\^) will print the first 4 characters and truncate at the end. Short fields are padded at the right with the fill character (normally, a blank). If the field width argument begins with a leading zero, then the fill character is set to a zero. .PP The functions (\fIputnumf\fR\^) and (\fIputstrf\fR\^) print their result in exactly the number of characters specified by their leading field width argument. For example, %06(\fIputnumf\fR\^(\fIsize\fR\^)) will print the message size in a field six characters wide filled with leading zeros; %14(\fIputstrf\^\fR{\fIfrom\^\fR}) will print the `From:' header component in fourteen characters with trailing spaces added as needed. For \fIputstrf\fR, using a negative value for the field width causes right-justification of the string within the field, with padding on the left up to the field width. The functions (\fIputnum\fR\^) and (\fIputstr\fR\^) are somewhat special: they print their result in the minimum number of characters required, and ignore any leading field width argument. .PP The available output width is kept in an internal register; any output past this width will be truncated. .SS Examples With all this in mind, here's a format string for .BR scan . It's been divided into several pieces for readability. The first part is: .PP .RS .nf %4(msg)%<(cur)+%| %>%<{replied}\-%| %> .fi .RE .PP which says that the message number should be printed in four digits. If the message is the current message then a `+' else a space should be printed; if a `Replied:' field is present then a `\-' else a space should be printed. Next: .PP .RS .nf %02(mon{date})/%02(mday{date}) .fi .RE .PP the month and date are printed in two digits (zero filled) separated by a slash. Next, .PP .RS 5 .nf %<{date} %|*%> .fi .RE .PP If a `Date:' field was present, then a space is printed, otherwise a `*'. Next, .PP .RS 5 .nf %<(mymbox{from})%<{to}To:%14(decode(friendly{to}))%>%> .fi .RE .PP if the message is from me, and there is a `To:' header, print `To:' followed by a `user-friendly' rendering of the first address in the `To:' field; any MIME-encoded characters are decoded into the actual characters. Continuing, .PP .RS 5 .nf %<(zero)%17(decode(friendly{from}))%> .fi .RE .PP if either of the above two tests failed, then the `From:' address is printed in a mime-decoded, `user-friendly' format. And finally, .PP .RS 5 .nf %(decode{subject}) .fi .RE .PP the mime-decoded subject is printed. .PP For a more complicated example, next consider a possible .I replcomps format file. .PP .RS 5 .nf %(lit)%(formataddr %<{reply-to} .fi .RE .PP This clears .I str and formats the `Reply-To:' header if present. If not present, the else-if clause is executed. .PP .RS 5 .nf %?{from}%?{sender}%?{return-path}%>)\\ .fi .RE .PP This formats the `From:', `Sender:' or `Return-Path:' headers, stopping as soon as one of them is present. Next: .PP .RS 5 .nf %<(nonnull)%(void(width))%(putaddr To: )\\n%>\\ .fi .RE .PP If the \fIformataddr\fR result is non-null, it is printed as an address (with line folding if needed) in a field \fIwidth\fR wide with a leading label of `To:'. .PP .RS 5 .nf %(lit)%(formataddr{to})%(formataddr{cc})%(formataddr(me))\\ .fi .RE .PP .I str is cleared, and the `To:' and `Cc:' headers, along with the user's address (depending on what was specified with the `\-cc' switch to \fIrepl\fR\^) are formatted. .PP .RS 5 .nf %<(nonnull)%(void(width))%(putaddr cc: )\\n%>\\ .fi .RE .PP If the result is non-null, it is printed as above with a leading label of `Cc:'. .PP .RS 5 .nf %<{subject}Subject: Re: %(decode{subject})\\n%>\\ .fi .RE .PP If a subject component was present, a suitable reply subject is output. .PP .RS 5 .nf %<{message-id}In-Reply-To: %{message-id}\\n%>\\ %<{message-id}References: %<{references} %{references}%>\\ %{message-id}\\n%> \-\-\-\-\-\-\-\- .fi .RE .PP If a message-id component was present, an `In-Reply-To:' header is output including the message-id, followed by a `References:' header with references, if present, and the message-id. As with all plain-text, the row of dashes are output as-is. .PP This last part is a good example for a little more elaboration. Here's that part again in pseudo-code: .PP .RS 5 .nf .ta .5i 1i 1.5i 2i if (comp_exists(message-id)) then print("In-reply-to: ") print(message-id.value) print("\\n") endif if (comp_exists(message-id)) then print("References: ") if (comp_exists(references)) then print(references.value); endif print(message-id.value) print("\\n") endif .fi .RE .PP .\" (Note that this pseudocode begs the question ``why not just .\" support this syntax?'' MH has been hacked on for a long time...) .\".PP One more example: .B Mmh supports very large message numbers, and it is not uncommon for a folder to have far more than 10000 messages. .\" (Indeed, the original MH .\" tutorial document by Rose and Romine is entitled "How to .\" process 200 messages a day and still get some real work .\" done." The authors apparently only planned to get .\" real work done for about 50 days per folder.) Nonetheless several scan format strings are inherited from older MH versions, and are generally hard-coded to 4 digits of message number before formatting problems start to occur. The mh format strings can be modified to behave more sensibly with larger message numbers: .PP .RS .nf %(void(msg))%<(gt 9999)%(msg)%|%4(msg)%> .fi .RE .PP The current message number is placed in \fInum\fP. (Note that .RI ( msg ) is an int function, not a component.) The .RI ( gt ) conditional is used to test whether the message number has 5 or more digits. If so, it is printed at full width: otherwise at 4 digits. .SH "SEE ALSO" scan(1), repl(1), ap(8), dp(8) .SH CONTEXT None mmh-0.4/man/mmhwrap.man10000644000000000000000000000237513414435726013660 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MMHWRAP %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mmhwrap \- invoke mmh commands if they are not in $PATH .SH SYNOPSIS .HP 5 .na .B mmhwrap .I command .RI [ options ...] .ad .SH DESCRIPTION .PP Use .B mmhwrap if you want to invoke mmh programs without adding the mmh bindir into $PATH, or if you want to install .B nmh and .B mmh both. As their tools are equally named (but incompatibe) you can only have one of both tool chests accessible through $PATH. Use the wrapper to access .B mmh tools, if you have the .B nmh tools in your $PATH (first). .PP Copy .B mmhwrap into a directory that's part of $PATH, likely $HOME/bin or /usr/local/bin. You likely want to rename .B mmhwrap to something shorter, like `m' for instance: .PP .RS 5 .nf cp %libdir%/mmhwrap $HOME/bin/m chmod +x $HOME/bin/m .fi .RE .PP Then use it this way: .PP .RS 5 .nf % m folder inbox+ has 162 messages (1\-177); cur=131; (others). % m scan \-help Usage: scan [+folder] [msgs] [switches] switches are: \-form formatfile \-width columns \-(file) file \-Version \-help % m scan f 1 2012\-02\-13 To: meillo laber blubb % m refile l +foo .fi .RE .SH FILES None .SH "PROFILE COMPONENTS" None .SH CONTEXT None .SH "SEE ALSO" mmh\-intro(7) mmh-0.4/man/sortm.man10000644000000000000000000000662613414435726013354 0ustar rootroot.\" .\" %nmhwarning% .\" .TH SORTM %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME sortm \- sort messages .SH SYNOPSIS .HP 5 .na .B sortm .RI [ +folder ] .RI [ msgs ] .RB [ \-datefield .IR field ] .RB [ \-textfield .IR field ] .RB [ \-notextfield ] .RB [ \-limit .IR days ] .RB [ \-nolimit ] .RB [ \-verbose " | " \-noverbose ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Sortm sorts the specified messages in the named folder according to the chronological order of the `Date:' field of each message. .PP The .B \-verbose switch directs .B sortm to tell the user the general actions that it is taking to place the folder in sorted order. .PP The .B \-datefield .I field switch tells .B sortm the name of the field to use when making the date comparison. If the user has a special field in each message, such as `BB\-Posted:' or `Delivery\-Date:', then the .B \-datefield switch can be used to direct .B sortm which field to examine. .PP The .B \-textfield .I field switch causes .B sortm to sort messages by the specified text field. If this field is `subject', any leading "re:" is stripped off. In any case, all characters except letters and numbers are stripped and the resulting strings are sorted datefield\-major, textfield\-minor, using a case insensitive comparison. .PP With .B \-textfield .IR field , if .B \-limit .I days is specified, messages with similar textfields that are dated within `days' of each other appear together. Specifying .B \-nolimit makes the limit infinity. With .B \-limit .IR 0 , the sort is instead made textfield\-major, date\-minor. .PP For example, to order a folder by date-major, subject-minor, use: .PP .RS 5 sortm \-textfield subject +folder .RE .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Current\-Folder:~^To find the default current folder .fi .SH "SEE ALSO" folder(1) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder" .RB ` msgs"' defaults to all" .RB ` \-datefield "' defaults to date" .RB ` \-notextfield ' .RB ` \-noverbose ' .RB ` \-nolimit ' .fi .SH CONTEXT If a folder is given, it will become the current folder. If the current message is moved, .B sortm will preserve its status as current. .SH HISTORY Timezones used to be ignored when comparing dates: they aren't any more. .PP Messages which were in the folder, but not specified by `msgs', used to be moved to the end of the folder; now such messages are left untouched. .PP .B Sortm sometimes did not preserve the message numbering in a folder (e.g., messages 1, 3, and 5, might have been renumbered to 1, 2, 3 after sorting). This was a bug, and has been fixed. To compress the message numbering in a folder, use .RB ` "folder\ \-pack" ' as always. .SH BUGS If .B sortm encounters a message without a date\-field, or if the message has a date\-field that .B sortm cannot parse, then .B sortm attempts to keep the message in the same relative position. This does not always work. For instance, if the first message encountered lacks a date which can be parsed, then it will usually be placed at the end of the messages being sorted. .PP When .B sortm complains about a message which it can't temporally order, it complains about the message number .B prior to sorting. It should indicate what the message number will be .B after sorting. mmh-0.4/man/mh-chart-gen.sh0000755000000000000000000000074613414435726014240 0ustar rootroot#! /bin/sh # # Generates mh-chart man page from other man page source files that have a # SYNOPSIS section. cat <\-next: ' names an alternate editor .TP \w'refilezzzzfolderz'u .B edit invoke for further editing .TP \w'refilezzzzfolderz'u .B list list the draft on the terminal .TP \w'refilezzzzfolderz'u .B display list the message being distributed/replied\-to on the terminal .TP \w'refilezzzzfolderz'u .B whom list the recipients of the message .TP \w'refilezzzzfolderz'u .B send send the message .TP \w'refilezzzzfolderz'u .B refile +folder refile the draft into the given folder .TP \w'refilezzzzfolderz'u .B delete delete the draft and exit .TP \w'refilezzzzfolderz'u .B quit preserve the draft and exit .TP \w'refilezzzzfolderz'u .B cd directory use the directory when interpreting attachment file names .TP \w'refilezzzzfolderz'u .B pwd print the working directory for attachment files .TP \w'refilezzzzfolderz'u .B ls [ls-options] list files in the attachment working directory using the ls command .TP \w'refilezzzzfolderz'u .B attach files add the named files to the draft as MIME attachments .TP \w'refilezzzzfolderz'u .B alist list the MIME attachments .TP \w'refilezzzzfolderz'u .B detach numbers remove MIME attachments by number .RE .PP When entering your response, you need only type enough characters to uniquely identify the response. .PP For the .B edit response, any valid switch to the editor is valid. .PP For the .B send response, any valid switch to .BR send (1) is valid. .PP For the .B refile response, any valid switch to .B refile is valid. .PP See .BR mh\-profile (5) for further information about how editors are used by .BR mmh . It also discusses how environment variables can be used to direct .BR whatnow 's actions in complex ways. .PP If the initial edit fails, no new draft is created, but any existing re-used draft is preserved. Failures of later edits are ignored and another prompt is printed. .PP The .B \-prompt .I string switch sets the prompting string for .BR whatnow . .PP Consult the .BR mh-draft (7) man page for more information. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile ^+drafts~^The draft folder .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Draft\-Folder:~^To set the default draft\-folder ^Editor:~^To override the default editor ^\-next:~^To name an editor to be used after exit ^~^from ^listproc:~^Program to list the contents of a message .fi .SH "SEE ALSO" send(1), whatnow2(1) .SH DEFAULTS .nf .RB ` \-prompt "' defaults to `What\ Now?\ '" .fi .SH "BUGS" .B whatnow is deprecated an will be removed in the next release. Consider switching to whatnow2(1). .SH CONTEXT None mmh-0.4/man/slocal.man10000644000000000000000000002562413414435726013464 0ustar rootroot.\" .\" %nmhwarning% .\" .TH SLOCAL %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME slocal \- asynchronously filter and deliver new mail .SH SYNOPSIS .HP 5 .na .B slocal [address\ info\ sender] .RB [ \-addr .IR address ] .RB [ \-info .IR data ] .RB [ \-sender .IR sender ] .RB [ \-user .IR username ] .RB [ \-mailbox .IR mbox ] .\" \%[\-home\ homedir] .RB [ \-file .IR file ] .RB [ \-maildelivery .IR deliveryfile ] .RB [ \-verbose " | " \-noverbose ] .RB [ \-debug ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Slocal is a program designed to allow you to have your inbound mail processed according to a complex set of selection criteria. You do not normally invoke .B slocal yourself, rather .B slocal is invoked on your behalf by your system's Message Transfer Agent (such as .BR sendmail ) when the message arrives. .PP The message selection criteria used by .B slocal is specified in the file .RI ` \&.maildelivery ' in the user's home directory. You can specify an alternate file with the .B \-maildelivery .I file option. The syntax of this file is specified below. .PP The message delivery address and message sender are determined from the Message Transfer Agent envelope information, if possible. Under .BR sendmail , the sender will obtained from the mbox `From ' line, if present. The user may override these values with command line arguments, or arguments to the .B \-addr and .B \-sender switches. .PP The message is normally read from the standard input. The .B \-file switch sets the name of the file from which the message should be read, instead of reading stdin. This is useful when debugging a .RI ` \&.maildelivery ' file. .PP The .B \-user switch tells .B slocal the name of the user for whom it is delivering mail. The .B \-mailbox switch tells .B slocal the name of the user's maildrop file. .PP The .B \-info switch may be used to pass an arbitrary argument to sub-processes which .B slocal may invoke on your behalf. .PP The .B \-verbose switch causes .B slocal to give information on stdout about its progress. The .B \-debug switch produces more verbose debugging output on stderr. These flags are useful when creating and debugging your .RI ` \&.maildelivery ' file, as they allow you to see the decisions and actions that .B slocal is taking, as well as check for syntax errors in your .RI ` \&.maildelivery ' file. .SS "Message Transfer Agents" Most modern MTAs including .BR sendmail , .BR postfix and .BR exim support a \&.forward file for directing incoming mail. You should include the line .PP .RS 5 `|\ %bindir%/slocal\ \-user\ username' .RE .PP in your \&.forward file in your home directory. This will cause your MTA to invoke .B slocal on your behalf when a message arrives. .SS "The Maildelivery File" The .RI ` \&.maildelivery ' file controls how .B slocal filters and delivers incoming mail. Each line of this file consists of five fields, separated by white-space or comma. Since double-quotes are honored, these characters may be included in a single argument by enclosing the entire argument in double-quotes. A double-quote can be included by preceding it with a backslash. Lines beginning with `#' and blank lines are ignored. .PP The format of each line in the .RI ` \&.maildelivery ' file is: .PP .RS 5 .B "header pattern action result string .RE .PP .BR header : .RS 5 The name of a header field (such as To, Cc, or From) that is to be searched for a pattern. This is any field in the headers of the message that might be present. .PP The following special fields are also defined: .TP \w'defaultrrr'u .I source the out-of-band sender information .TP \w'defaultrrr'u .I addr the address that was used to cause delivery to the recipient .TP \w'defaultrrr'u .I default this matches .B only if the message hasn't been delivered yet .TP \w'defaultrrr'u .I * this always matches .RE .PP .BR pattern : .RS 5 The sequence of characters to match in the specified header field. Matching is case-insensitive, but does not use regular expressions. .RE .PP .BR action : .RS 5 The action to take to deliver the message. When a message is delivered, a `Delivery\-Date:\ date' header is added which indicates the date and time that message was delivered. .TP 4 .I destroy This action always succeeds. .TP 4 .IR file ", " mbox ", or " > Append the message to the mbox file named by .IR string . This is handled by piping the message to the .B mmh program .BR rcvpack . If .B rcvpack returned successful, then this action succeeds. .TP 4 .IR pipe " or " | Pipe the message as the standard input to the command named by .IR string , using the Bourne shell .B sh to interpret the string. Prior to giving the string to the shell, it is expanded with the following built-in variables: .RS .TP \w'zzreplyztozaaa'u $(sender) the out-of-band sender information .TP \w'zzreplyztozaaa'u $(address) the address that was used to cause delivery to the recipient .TP \w'zzreplyztozaaa'u $(size) the size of the message in bytes .TP \w'zzreplyztozaaa'u $(reply\-to) either the `Reply\-To:' or `From:' field of the message .TP \w'zzreplyztozaaa'u $(info) the out-of-band information specified .RE .TP 4 .IR qpipe " or " ^ Similar to .IR pipe , but executes the command directly, after built-in variable expansion, without assistance from the shell. This action can be used to avoid quoting special characters which your shell might interpret. .TP 4 .IR folder " or " + Store the message in the .B mh folder named by .IR string . This is handled by piping the message to the .B mmh program .BR rcvstore . If .B rcvstore returned successful, then this action succeeds. .RE .PP .BR result : .RS 5 Indicates how the action should be performed: .TP \w'Azzz'u .I A Perform the action. If the action succeeds, then the message is considered delivered. .TP \w'Azzz'u .I R Perform the action. Regardless of the outcome of the action, the message is not considered delivered. .TP \w'Azzz'u .I ? Perform the action only if the message has not been delivered. If the action succeeds, then the message is considered delivered. .TP \w'Azzz'u .I N Perform the action only if the message has not been delivered and the previous action succeeded. If this action succeeds, then the message is considered delivered. .PP The delivery file is always read completely, so that several matches can be made and several actions can be taken. .RE .SS "Security of Delivery Files" In order to prevent security problems, the .RI ` \&.maildelivery ' file must be owned either by the user or by root, and must be writable only by the owner. If this is not the case, the file is not read. .PP If the .RI ` \&.maildelivery ' file cannot be found, or does not perform an action which delivers the message, then .B slocal will check for a global delivery file at .IR %etcdir%/maildelivery . This file is read according to the same rules. This file must be owned by the root and must be writable only by the root. .PP If a global delivery file cannot be found or does not perform an action which delivers the message, then standard delivery to the user's maildrop is performed. .SS "Example Delivery File" To summarize, here's an example delivery file: .PP .nf .ta \w'default 'u +\w'mh-workersxx 'uC +\w'destroy 'uC +\w'result 'u # # .maildelivery file for mmh's slocal # # Blank lines and lines beginning with a '#' are ignored # # FIELD PATTERN ACTION RESULT STRING # # File mail with foobar in the `To:' line into file foobar.log To foobar file A foobar.log # Pipe messages from coleman to the program message-archive From coleman pipe A /bin/message-archive # Anything to the `nmh-workers' mailing list is put in # its own folder, if not filed already To nmh-workers folder ? nmh-workers # Anything with Unix in the subject is put into # the file unix-mail Subject unix file A unix-mail # I don't want to read mail from Steve, so destroy it From steve destroy A \- # Put anything not matched yet into mailbox default \- file ? mailbox .fi .SS "Sub-process environment" When a process is invoked, its environment is: the user/group-ids are set to recipient's ids; the working directory is the recipient's home directory; the umask is 0077; the process has no /dev/tty; the standard input is set to the message; the standard output and diagnostic output are set to /dev/null; all other file-descriptors are closed; the environment variables .BR $USER , .BR $HOME , .B $SHELL are set appropriately, .B $PATH is preserved, but no other environment variables exist. .PP The process is given a certain amount of time to execute. If the process does not exit within this limit, the process will be terminated with extreme prejudice. The amount of time is calculated as ((size / 60) + 300) seconds, where size is the number of bytes in the message (with 30 minutes the maximum time allowed). .PP The exit status of the process is consulted in determining the success of the action. An exit status of zero means that the action succeeded. Any other exit status (or abnormal termination) means that the action failed. .PP In order to avoid any time limitations, you might implement a process that began by .BR fork ()-ing. The parent would return the appropriate value immediately, and the child could continue on, doing whatever it wanted for as long as it wanted. This approach is somewhat risky if the parent is going to return an exit status of zero. If the parent is going to return a non-zero exit status, then this approach can lead to quicker delivery into your maildrop. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/\&.maildelivery~^The file controlling local delivery ^%etcdir%/maildelivery~^Rather than the standard file ^%mailspool%/$USER~^The default maildrop .fi .SH "SEE ALSO" rcvdist(1), rcvpack(1), rcvstore(1), mh\-format(5) .SH DEFAULTS .nf .RB ` \-noverbose ' .RB ` \-maildelivery "' defaults to $HOME/\&.maildelivery" .RB ` \-mailbox "' deaults to %mailspool%/$USER" .RB ` \-file "' defaults to stdin" .RB ` \-user "' defaults to the current user" .fi .SH CONTEXT .B slocal does neither read nor change the context. Nor does it read the user profile. .SH HISTORY .B Slocal was originally designed to be backward-compatible with the .B maildelivery facility provided by .BR MMDF-II . Thus, the .RI ` \&.maildelivery ' file syntax is somewhat limited. But .B slocal has been modified and extended, so that is it no longer compatible with .BR MMDF-II . .PP In addition to an exit status of zero, the .B MMDF values .B RP_MOK (32) and .B RP_OK (9) mean that the message has been fully delivered. Any other non-zero exit status, including abnormal termination, is interpreted as the .B MMDF value .B RP_MECH (200), which means `use an alternate route' (deliver the message to the maildrop). .PP The `suppress duplicates' function had been removed from slocal for simplicity reasons. .SH BUGS Only two return codes are meaningful, others should be. .PP .B Slocal was originally designed to be backwards-compatible with the .B maildelivery functionality provided by .BR MMDF-II . mmh-0.4/man/mh-alias.man50000644000000000000000000001412213414435726013675 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MH-ALIAS %manext5% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mh-alias \- alias file for mh message system .SH DESCRIPTION This describes .B mh personal alias files. It does .B not describe aliases files used by the message transport system. .PP Each line of the alias file has the format: .PP .RS 5 .I alias .B : .I address\-group .RE or .RS 5 .I alias .B ; .I address\-group .RE or .RS 5 .B < .I alias\-file .RE or .RS 5 .B ; .I comment .RE .PP where: .PP .RS 5 .nf .IR address\-group " := " address\-list .RI " | < " file .RI " | = " UNIX\-group .RI " | + " UNIX\-group | * .IR address\-list " := " address .RI " | " address\-list ", " address .fi .RE .PP Continuation lines in alias files end with `\\' followed by the newline character. .PP .RI ` Alias\-file ' and .RI ` file ' are UNIX file names. .I UNIX\-group is a group name (or number) from .IR /etc/group . An address is a `simple' Internet\-style address. Throughout this file, case is ignored, except for file names. .PP If the line starts with a `<', then the file named after the `<' is read for more alias definitions. The reading is done recursively, so a `<' may occur in the beginning of an alias file with the expected results. .PP If the .I address\-group starts with a `<', then the file named after the `<' is read and its contents are added to the .I address\-list for the alias. .PP If the .I address\-group starts with an `=', then the file .I /etc/group is consulted for the UNIX\-group named after the `='. Each login name occurring as a member of the group is added to the .I address\-list for the alias. .PP In contrast, if the .I address\-group starts with a `+', then the file .I /etc/group is consulted to determine the group\-id of the UNIX\-group named after the `+'. Each login name occurring in the .I /etc/passwd file whose group\-id is indicated by this group is added to the .I address\-list for the alias. I.e. only those users that have this group as their initial login group are added. .PP In match, a trailing `*' on an alias will match just about anything appropriate. (See example below.) .PP An approximation of the way aliases are resolved at posting time is (it's not really done this way): .PP .RS 2 .IP 1) 3 Build a list of all addresses from the message to be delivered, eliminating duplicate addresses. .PP .IP 2) 3 If this draft originated on the local host, then for those addresses in the message that have no host specified, perform alias resolution. .PP .IP 3) 3 For each line in the alias file, compare `alias' against all of the existing addresses. If a match, remove the matched `alias' from the address list, and add each new address in the address\-group to the address list if it is not already on the list. The alias itself is not usually output, rather the address\-group that the alias maps to is output instead. If `alias' is terminated with a `;' instead of a `:', then both the `alias' and the address are output in the correct format. (This makes replies possible since personal .B mh aliases are unknown to the mail transport system.) .RE .PP Since the alias file is read line by line, forward references work, but backward references are not recognized, thus, there is no recursion. .PP Example Alias File: .PP .RS 5 .nf <%etcdir%/MoreAliases sgroup: fred, fear, freida b-people: Blind List: bill, betty fred: frated@UCI UNIX\-committee: ' are defined to be `news'. .PP The key thing to understand about aliasing in .B mh is that aliases in .B mh alias files are expanded into the headers of messages posted. This aliasing occurs first, at posting time, without the knowledge of the message transport system. In contrast, once the message transport system is given a message to deliver to a list of addresses, for each address that appears to be local, a system\-wide alias file is consulted. These aliases are .B NOT expanded into the headers of messages delivered. .SH "HELPFUL HINTS" To use aliasing in .B mmh quickly, do the following: .PP .RS 2 .IP 1) 3 In your .IR .mmh/profile , choose a name for your alias file, say .RI ` aliases ', and add the line: .PP .RS 5 .nf Aliasfile: aliases .fi .RE .PP .IP 2) 3 Create the file .RI ` aliases ' in your .B mmh directory. .PP .IP 3) 3 Start adding aliases to your .RI ` aliases ' file as appropriate. .RE .PP Earlier versions of this man page showed a semicolon at the end of the blind list example. That caused the preceeding alias to not be expanded. There must not be a semicolon at the end of, or within, the address group of a blind list. .B post will append the semicolon to the blind list name. .SH FILES None .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Aliasfile:~^For a default alias file .fi .SH "SEE ALSO" ali(1), send(1), group(5), passwd(5), post(8) .SH CONTEXT None .SH HISTORY An address group named `*', meaning everyone on the system, had been supported in nmh. It is not anymore in mmh. .SH BUGS Although the forward-referencing semantics of .B mh\-alias files prevent recursion, the .RI `< " alias\-file" ' command may defeat this. Since the number of file descriptors is finite (and very limited), such infinite recursion will terminate with a meaningless diagnostic when all the fds are used up. mmh-0.4/man/folder.man10000644000000000000000000001543313414435726013457 0ustar rootroot.\" .\" %nmhwarning% .\" .TH FOLDER %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME folder, folders \- set/list current folder/message .SH SYNOPSIS .HP 5 .na .B folder .RI [ +folder ] .RI [ msg ] .RB [ \-all " | " \-noall ] .RB [ \-create " | " \-nocreate ] .RB [ \-fast " | " \-nofast ] .RB [ \-recurse " | " \-norecurse ] .RB [ \-total " | " \-nototal ] .RB [ \-list " | " \-nolist ] .RB [ \-push " | " \-pop ] .RB [ \-pack " | " \-nopack ] .RB [ \-print ] .RB [ \-verbose " | " \-noverbose ] .RB [ \-Version ] .RB [ \-help ] .PP .HP 5 .B folders is equivalent to .B folder .B \-all .ad .SH DESCRIPTION Since the .B mmh environment is the shell, it is easy to lose track of the current folder from day to day. When .B folder is given the .B \-print switch (the default), .B folder will list the current folder, the number of messages in it, the range of the messages (low\-high), and the current message within the folder, and will flag extra files if they exist. An example of this summary is: .PP .RS 5 .nf .ta \w'/rnd/phyl/Mail/EP 'u +\w'has ddd messages 'u +\w'(ddd\-ddd); 'u inbox+ has \016 messages (\0\03\-\022); cur=\0\05 .fi .RE .PP If a .I +folder and/or .I msg are specified, they will become the current folder and/or message. By comparison, when a .I +folder argument is given, this corresponds to a `cd' operation in the shell; when no .I +folder argument is given, this corresponds roughly to a `pwd' operation in the shell. .PP If the specified (or default) folder doesn't exist, the default action is to query the user as to whether the folder should be created; when standard input is not a tty, the answer to the query is assumed to be `yes'. .PP Specifying .B \-create will cause .B folder to create new folders without any query. (This is the easy way to create an empty folder for use later.) Specifying .B \-nocreate will cause .B folder to exit without creating a non-existant folder. .\" .\" note - this doesn't work at present .\" If `\-noprint' is specified, .\" a `+folder' and/or `msg' may still be specified .\" to set the current folder and/or message, .\" but the folder summary will not be printed. .SS "Multiple Folders" Specifying .B \-all will produce a summary line for each top-level folder in the user's mmh directory, sorted alphabetically. (If .B folder is invoked by a name ending with `s' (e.g. .BR folders ), .B \-all is assumed). Specifying .B \-recurse with .B \-all will also produce a line for all sub-folders. These folders are all preceded by the read\-only folders, which occur as .RI ` atr\-cur\- ' entries in the user's .B mmh context. For example: .PP .RS 5 .nf .ta \w'/rnd/phyl/Mail/EP 'u +\w'has ddd messages 'u +\w'(ddd\-ddd); 'u FOLDER \0\0\0\0\0\0# MESSAGES RANGE CUR (OTHERS) /var/work/folder has \035 messages (\01\-\035); cur=23 /usr/bugs/Mail has \082 messages (\01\-108); cur=82 ff has \0no messages inbox+ has \016 messages (\03\-\022); cur=\05 mh has \076 messages (15\-\076); cur=70 notes has \0\02 messages (\01\-\0\02); cur=\01 ucom has 124 messages (\01\-124); cur=\06; (others) .ta \w'/rnd/phyl/Mail/EP has 'u TOTAL = 339 messages in 7 folders .fi .RE .PP The `+' after .I inbox indicates that it is the current folder. The `(others)' indicates that the folder .I ucom has files which aren't messages. These files may either be sub\-folders, or files that don't belong under the mh file naming scheme. .PP The folder and message totals are output if either a .B \-all or a .B \-total switch is specified. It is suppressed by .BR \-nototal . .PP If .B \-fast is given, only the folder name (or names in the case of .BR \-all ) will be listed. (This is faster because the folders need not be read.) .PP If a .I +folder is given along with the .B \-all switch, .B folder will, in addition to setting the current folder, list the top\-level subfolders for the current folder (with .BR \-norecurse ) or list all sub-folders under the current folder recursively (with .BR \-recurse ). .PP If .I msg is supplied, together with .IR +folder or without .BR \-all , it will become the current message of .IR +folder (if it had been supplied) or the current folder. .PP The .B \-recurse switch lists each folder recursively, so use of this option effectively defeats the speed enhancement of the .B \-fast option, since each folder must be searched for subfolders. Nevertheless, the combination of these options is useful. .PP .SS "Compacting a Folder" The .B \-pack switch will compress the message names in the designated folders, removing holes in message numbering. The .B \-verbose switch directs .B folder to tell the user the general actions that it is taking to compress the folder. .PP .SS "The Folder Stack" The .B \-push switch directs .B folder to push the current folder onto the .IR folder\-stack , and make the .I +folder argument the current folder. If .I +folder is not given, the current folder and the top of the .I folder\-stack are exchanged. This corresponds to the `pushd' operation in the shell. .PP The .B \-pop switch directs .B folder to discard the top of the .IR folder\-stack , after setting the current folder to that value. No .I +folder argument is allowed. This corresponds to the `popd' operation in the shell. The .B \-push switch and the .B \-pop switch are mutually exclusive: the last occurrence of either one overrides any previous occurrence of the other. Both of these switches also set .B \-list by default. .PP The .B \-list switch directs .B folder to list the contents of the .IR folder\-stack . No .I +folder argument is allowed. After a successful .B \-push or .BR \-pop , the .B \-list action is taken, unless a .B \-nolist switch follows them on the command line. This corresponds to the `dirs' operation in the shell. The .BR \-push , .BR \-pop , and .B \-list switches turn off .BR \-print . .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Current\-Folder:~^To find the default current folder ^Folder\-Protect:~^To set mode when creating a new folder ^Folder\-Stack:~^To determine the folder stack .\" ^lsproc:~^Program to list the contents of a folder .fi .SH "SEE ALSO" refile(1), mhpath(1) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder" .RB ` msg "' defaults to none" .RB ` \-nofast ' .RB ` \-nototal ' .RB ` \-nopack ' .RB ` \-norecurse ' .RB ` \-noverbose ' .RB ` \-print "' is the default if no " \-list ", " \-push ", or " \-pop " is specified" .RB ` \-list "' is the default if " \-push ", or " \-pop " is specified" .fi .SH CONTEXT If .I +folder and/or .I msg are given, they will become the current folder and/or message. .SH BUGS There is no way to restore the default behavior (to ask the user whether to create a non-existant folder) after .B \-create or .B \-nocreate is given. mmh-0.4/man/rcvdist.man10000644000000000000000000000303113414435726013651 0ustar rootroot.\" .\" %nmhwarning% .\" .TH RCVDIST %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME rcvdist \- asynchronously redistribute new mail .SH SYNOPSIS .HP 5 .na .B rcvdist .RB [ \-form .IR formfile ] [switches\ for .BR spost ] .IR RECIPIENT ... .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION The .B rcvdist program will accept a message on its standard input and resend a copy of this message to all of the addresses listed on its command line. .PP When a message is redistributed with the .B rcvdist command, the format of the Resent-xxx header fields is controlled by the forms files .RI ` rcvdistcomps '. If a file named .RI ` rcvdistcomps ' exists in the user's mmh directory, it will be used instead of the default one. You may specify an alternate forms file with the switch .B \-form .IR formfile . .PP The .RI ` rcvdistcomps ' file uses the format string facility described in .BR mh\-format (5). In addition to the standard format escapes, .B rcvdist also recognizes the following additional .I component escape: .PP .RS 5 .nf .ta \w'Dtimenow 'u +\w'Returns 'u .I "Escape Returns Description addresses string the addresses to distribute to .fi .RE .PP .B rcvdist uses the program .B spost to do the actual delivery of the message. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^%etcdir%/rcvdistcomps~^Default message skeleton ^or $HOME/.mmh/rcvdistcomps~^Rather than standard message skeleton .fi .SH "SEE ALSO" rcvpack(1), rcvstore(1), mh\-format(5), slocal(1) .SH BUGS Only two return codes are meaningful, others should be. mmh-0.4/man/mh-sequence.man70000644000000000000000000002202113414435726014413 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MH-SEQUENCE %manext7% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mh-sequence \- sequence specification for mh message system .SH DESCRIPTION A sequence (or sequence set) is a symbolic name representing a message or collection of messages. .B mmh has several internally defined sequences, as well as allowing users to define their own sequences. .SS "Message Specification and Pre\-Defined Message Sequences" Most .B mmh commands accept a `msg' or `msgs' specification, where `msg' indicates one message and `msgs' indicates one or more messages. To designate a message, you may use either its number (e.g., 1, 10, 234) or one of these `reserved' message names: .PP .RS 5 .nf .ta +\w'\fIName\fP 'u .I "Name Description f the first message in the folder p the message numerically preceding `c' c the most recently accessed message n the message numerically following `c' l the last message in the folder .fi .RE .PP In commands that take a `msg' argument, the default is `c'. .PP For example: In a folder containing five messages numbered 5, 10, 94, 177 and 325, `f' is 5 and `l' is 325. If `c' is 94, then `p' is 10 and `n' is 177. .PP The word `msgs' indicates that one or more messages may be specified. Such a specification consists of one message designation or of several message designations separated by spaces. A message designation consists either of a message name as defined above, or a message range. .PP A message range is specified as `name1\-name2' or `name:i', where `name', `name1' and `name2' are message names, and `i' is an integer. .PP The specification `name1\-name2' designates all currently existing messages from `name1' to `name2' inclusive. The `reserved' message name `a' (``all'') is a shorthand for the message range `f\-l'. .PP .RS 5 .nf .ta +\w'\fIName\fP 'u .I "Name Description a all messages in the folder (i.e. `f\-l') .fi .RE .PP The specification `name:i' designates up to `i' messages. These messages start with `name' if `name' is a message number or one of the reserved names `f' `c', or `n', The messages end with `name' if `name' is `p' or `l'. The interpretation of `i' may be overridden by preceding `i' with a plus or minus sign; `+i' always means up to `i' messages starting with `name', and `\-i' always means up to `i' messages ending with `name'. .PP In commands which accept a `msgs' argument, the default is either `c' or `a', depending on which makes more sense for each command (see the individual man pages for details). .PP Repeated specifications of the same message have the same effect as a single specification of the message. .PP There is also a special `reserved' message name `b' (``beyond'') which can be used with the .B mhpath command. It refers to the next (not yet used) message number after `l'. .PP .RS 5 .nf .ta +\w'\fIName\fP 'u .I "Name Description b the next message number beyond `l' .fi .RE .SS "User\-Defined Message Sequences" In addition to the `reserved' (pre-defined) message names given above, .B mmh supports user-defined sequence names. User-defined sequences allow the .B mmh user a tremendous amount of power in dealing with groups of messages in the same folder by allowing the user to bind a group of messages to a meaningful symbolic name. .PP The name used to denote a message sequence must consist of an alphabetic character followed by zero or more alphanumeric characters, and can not be one of the `reserved' message names above. After defining a sequence, it can be used wherever an .B mmh command expects a `msg' or `msgs' argument. .PP Some forms of message ranges are allowed with user-defined sequences. The specification `name:i' may be used, and it designates up to the first `i' messages (or last `i' messages for `\-i') which are elements of the user-defined sequence `name'. .PP The specifications `name:n' and `name:p' may also be used, and they designate the next or previous message (relative to the current message) which is an element of the user-defined sequence `name'. The specifications `name:f' and `name:l' are equivalent to `name:1' and `name:\-1', respectively. The specification `name:c' is not allowed (use just `c' instead). Note: The syntax of these message range specifications is subject to change in the future. .PP User-defined sequence names are specific to each folder. They are defined using the .B pick and .B mark commands. .SS "Public and Private User-Defined Sequences" There are two varieties of user-defined sequences: public and private. Public sequences of a folder are accessible to any .B mmh user that can read that folder. They are kept in each folder in the file determined by the `Mh\-Sequences' profile entry (default is .IR \&.mh_sequences ). Private sequences are accessible only to the .B mmh user that defined those sequences and are kept in the user's .B mh context file. .PP In general, the commands that create sequences (such as .B pick and .BR mark ) will create public sequences if the folder for which the sequences are being defined is writable by the .B mmh user. For most commands, this can be overridden by using the switches .B \-public and .BR \-private . But if the folder is read\-only, or if the `Mh\-Sequences' profile entry is defined but empty, then \fIprivate\fR sequences will be created instead. .SS "Sequence Negation" .B Mmh provides the ability to select all messages .B not elements of a user-defined sequence. A special string is used to preface an existing user-defined sequence name. This specification then refers to those messages not elements of the specified sequence name. The default negation prefix is the exlamation mark `!', but it may be change to any string, by defining the entry `Sequence\-Negation' in the .B mmh profile file. For example, if the profile entry is: .PP .RS 5 Sequence\-Negation: not .RE .PP then anytime an .B mmh command is given `notfoo' as a `msg' or `msgs' argument, it would substitute all messages that are not elements of the sequence `foo'. .PP Obviously, the user should beware of defining sequences with names that begin with the value of the `Sequence\-Negation' profile entry. The default value `!' was chosen due to its similar meaning in the C programming language, and because it cannot be part of a user-defined sequence. But if your shell provides history expansion, you might need to quote the exlamation mark (prefix it with a backslash). .PP To deactivate the negation mechanism, define Sequence\-Negation in your profile to an empty value. .SS "The Previous Sequence" .B Mmh provides the ability to remember the `msgs' or `msg' argument last given to an .B mmh command. The entry `Previous\-Sequence' should be defined in the .B mmh profile; its value should be a sequence name or multiple sequence names separated by spaces. If this entry is defined, when an .B mmh command finishes, it will define the sequence(s) named in the value of this entry to be those messages that were specified to the command. Hence, a profile entry of .PP .RS 5 Previous\-Sequence: pseq .RE .PP directs any .B mmh command that accepts a `msg' or `msgs' argument to define the sequence `pseq' as those messages when it finishes. .PP .BR Note : there can be a performance penalty in using the `Previous\-Sequence' facility. If it is used, .B all .B mmh programs have to write the sequence information to the .I \&.mh_sequences file for the folder each time they run. If the `Previous\-Sequence' profile entry is not included, only .B pick and .B mark will write to the .B \&.mh_sequences file. .SS "The Unseen Sequence" Finally, the unseen sequence indicates which messages have not been previously seen by the user. The commands .BR inc , .BR rcvstore , .BR show , and .B flist honor the sequence. Whenever new messages are placed in a folder (using .B inc or .BR rcvstore ), the new messages will also be added to the unseen sequence. .RE .PP .BR inc , for example, adds new messages to the unseen sequence. Unlike the behavior of the previous sequence, however, the unseen sequence will .B not be zeroed by .BR inc . .PP Similarly, whenever .BR show , .BR next , or .B prev display a message, that message will be removed from the unseen sequence. .PP The default unseen sequence is named `u'. To change, define a `Unseen\-Sequence' entry in your profile. It may also contain multiple sequence names, separated by spaces. In this case, anything that applied to a single unseen sequence, applies to multiple ones, too. .PP The unseen sequence mechanism is automatically activated. To deactivate it, define the `Unseen\-Sequence' entry in your profile with an empty value. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile ^$HOME/.mmh/context~^The user context ^/\&.mh_sequences~^File for public sequences .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Mh-Sequences:~^Name of file to store public sequences ^Sequence\-Negation:~^To designate messages not in a sequence ^Previous\-Sequence:~^The last message specification given ^Unseen\-Sequence:~^Those messages not yet seen by the user .fi .SH "SEE ALSO" flist(1), mark(1), pick(1), mh-profile(5) .SH DEFAULTS None mmh-0.4/man/anno.man10000644000000000000000000001110013414435726013122 0ustar rootroot.\" .\" %nmhwarning% .\" .TH ANNO %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME anno \- annotate messages .SH SYNOPSIS .HP 5 .na .B anno .RI [ +folder ] .RI [ msgs ] .RB [ \-component .IR field ] .RB [ \-text .IR body ] .RB [ \-append ] .RB [ \-date " | " \-nodate ] .RB [ \-preserve " | " \-nopreserve ] .RB [ \-Version ] .RB [ \-help ] .HP .B anno .B \-delete .RI [ +folder ] .RI [ msgs ] .RB [ \-component .IR field ] .RB [ \-text .IR body ] .RB [ \-number .IR num " | all ] .RB [ \-preserve " | " \-nopreserve ] .RB [ \-Version ] .RB [ \-help ] .HP .B anno .B \-list .RI [ +folder ] .RI [ msgs ] .RB [ \-component .IR field ] .RB [ \-number ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Anno manipulates header fields or .I annotations in messages. Header fields consist of a field name and an optional field body as defined by RFC-2822. The field name may consist of alphanumerics and dashes only. The field body may consist of arbitrary text. .PP Usually, annotation is performed by the commands .BR dist , .BR forw , and .BR repl , if they are given the .B \-anno switch. This allows you to keep track of your redistribution of, forwarding of, and replies to a message. The .B whatnow shell uses annoations to manage attachments, too. .PP By using .BR anno manually, you can perform arbitrary annotations of your own. .PP .B Anno has three operation modes: Adding, deleting and listing of header lines. .SS "Add mode .PP This is the default mode. Historically, it had been the only mode available. .PP Each message selected will be annotated with the lines .PP .RS 5 .nf field:\ date field:\ body .fi .RE .PP The .B \-component switch specifies the field name. If no .B \-component .I field is specified, .B anno will prompt the user for a field name. .PP The .B \-text switch specifies the field body. If it is missing, only the date annotation will be added. The .B \-nodate switch inhibits the date annotation, leaving only the body annotation. .PP By default, .B anno prepends the annotations to the message. Annotations are instead appended if the .B \-append switch is specified. .PP .B Anno always does the annotation in place in order to preserve any links to the message. .PP By default, .B anno changes the last-accessed and last-modified times on annotated messages to the time of the annotation. .B Anno preserves the original times if the .B \-preserve switch is used. .SS "Delete mode .PP The .B \-delete mode removes header fields from messages. By default, the first header field whose name matches the component is deleted. .PP The .B \-component switch specifies the field name of headers to delete. If no .B \-component .I field is specified, .B anno will prompt the user for the name. .PP If the .B \-text switch is used, the first header field whose name matches the component and whose body matches the text is deleted. The text is treated as if it was a path name; if it begins with a slash, the entire field body must match the text, otherwise just the last path name component of the field body must match. .PP If the .B \-number switch is used, the .IR n th header field whose name matches the component is deleted. The numbers are the same as those produced in .B \-list mode. The special value `all' can be used for the number, and causes all components that match the name to be deleted. .PP Either .B \-text or .B \-number may be specified, but not both at the same time. .SS "List mode .PP The .B \-list mode produces a listing of the field bodies for header fields with matching component names, one per line. Trailing whitespace in the field body does not get printed. If the .B \-number switch is also used, the listing is numbered, starting at 1. .PP The .B \-component switch specifies the field name of headers to list. If no .B \-component .I field is specified, .B anno will prompt the user for the name. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Current\-Folder:~^To find the default current folder .fi .SH "SEE ALSO" dist(1), forw(1), repl(1) .SH DEFAULTS .nf .RI ` +folder "' defaults to the current folder" .RI ` msgs "' defaults to the current message" .RB ` \-date ' .RB ` \-nopreserve ' .fi .SH CONTEXT If a folder is given, it will become the current folder. The first message annotated will become the current message. .SH BUGS .PP The .B \-number switch must appear after either the .B \-list or the .B \-delete mode switch, on the command line. Otherwise it is not possible to determine if it takes an argument. mmh-0.4/man/new.man10000644000000000000000000000412613414435726012772 0ustar rootroot.\" .\" %nmhwarning% .\" .TH NEW %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME new \- report on folders with new messages .PP fnext \- set current folder to next folder with new messages .PP fprev \- set current folder to previous folder with new messages .PP unseen \- scan new messages in all folders with new messages .SH SYNOPSIS .HP 5 .na .B new .RI [ sequences ] .RB [ \-mode .IR mode ] .RB [ \-folders .IR foldersfile ] .RB [ \-Version ] .RB [ \-help ] .PP .HP 5 .B fnext is equivalent to .B new \-mode fnext .PP .HP 5 .B fprev is equivalent to .B new \-mode fprev .PP .HP 5 .B unseen is equivalent to .B new \-mode unseen .ad .SH DESCRIPTION .B New in its default mode produces a one\-line\-per\-folder listing of all folders containing messages in the listed .IR sequences or in the sequences listed in the profile entry .RI ` Unseen-Sequence '. Each line contains the folder, the number of messages in the desired sequences, and the message lists from the .mh_sequences file. For example: .PP .RS 5 .nf foo 11.* 40\-50 bar 380. 760\-772 824\-828 total 391. .fi .RE .PP The `*' on foo indicates that it is the current folder. The last line shows the total number of messages in the desired sequences. .PP .B New crawls the folder hierarchy recursively to find all folders, and prints them in lexicographic order. Override this behavior by providing .IR foldersfile containing the pre-sorted list of folders .B new should check, one per line. .PP In .B fnext and .B fprev modes, .B new instead changes to the next or previous matching folder, respectively. .PP In .B unseen mode, .B new executes .B scan sequences for each matching folder. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Current\-Folder:~^To find the default current folder ^Unseen-Sequence:~^The name of the unseen message sequence .fi .SH "SEE ALSO" scan(1), mh\-format(5) .SH HISTORY Based on Luke Mewburn's new (http://www.mewburn.net/luke/src/new). mmh-0.4/man/fnext.man10000644000000000000000000000001713414435726013320 0ustar rootroot.so man1/new.1 mmh-0.4/man/unseen.man10000644000000000000000000000001713414435726013471 0ustar rootroot.so man1/new.1 mmh-0.4/man/whom.man10000644000000000000000000000342213414435726013151 0ustar rootroot.\" .\" %nmhwarning% .\" .TH WHOM %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME whom \- report to whom a message would go .SH SYNOPSIS .HP 5 .na .B whom .RB [ \-tocc " | " \-notocc ] .RB [ \-dcc " | " \-nodcc ] .RB [ \-bcc " | " \-nobcc ] .RB [ \-alias " | " \-noalias ] .RB [ \-Version ] .RB [ \-help ] .IR file ... .ad .SH DESCRIPTION .B Whom is used to list the recipient addresses in the headers of a message. .PP Per default, .B whom lists sighted and hidden recipients. The .BR \-notocc option suppresses the listing of sighted recipients (To and Cc). The .BR \-nodcc option suppresses the listing of hidden DCC recipients. The .BR \-nobcc option suppresses the listing of hidden BCC recipients. If the printing of multiple kinds of recipients is requested and hidden ones are present, they are separated by a line similar to ``\0==DCC=='' or ``\0==BCC==''. The actual separator may change, but the regular expression /^[\0\\t].*[DB]CC/ should always match. No separator is printed if only one kind of recipients is requested for printing, or if multiple are requested but no hidden recipients are present. .PP With .BR \-alias , aliases for all recipients are expanded, according to the alias files given by the `Aliasfile:' profile entry. This is somehow similar to running: .RS 5 .nf ali `whom /path/to/msg` .fi .RE .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Aliasfile:~^For default alias files .fi .SH "SEE ALSO" mh\-alias(5), spost(8) .SH DEFAULTS .nf .RB ` \-tocc ' .RB ` \-dcc ' .RB ` \-bcc ' .RB ` \-alias ' .fi .SH CONTEXT None .SH BUGS .B whom does not (yet) accept .I msg and .I +folder arguments. mmh-0.4/man/packf.man10000644000000000000000000000252313414435726013264 0ustar rootroot.\" .\" %nmhwarning% .\" .TH PACKF %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME packf \- pack messages in mh folder into a single mbox file .SH SYNOPSIS .HP 5 .na .B packf .RI [ +folder ] .RI [ msgs ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Packf will pack copies of messages from a folder, into mbox format and print it to the standard output. .PP .B packf makes an mbox-style delimiter by examining the first line of the message. If the first line is a `Return-Path' field, its address and the current date and time are used. Otherwise, if the first line has an `X-Envelope-From' field, its contents (which should already be in the correct format) are used. Otherwise, a dummy address and the current date and time are used. .PP Messages that are packed by .B packf can be unpacked using .BR inc . .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Current\-Folder:~^To find the default current folder .fi .SH "SEE ALSO" inc(1) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder" .RB ` msgs "' defaults to all" .fi .SH CONTEXT If a folder is given, it will become the current folder. The first message packed will become the current message. mmh-0.4/man/rcvstore.man10000644000000000000000000000663613414435726014060 0ustar rootroot.\" .\" %nmhwarning% .\" .TH RCVSTORE %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME rcvstore \- asynchronously incorporate mail into a folder .SH SYNOPSIS .HP 5 .na .B rcvstore .RI [ +folder ] .RB [ \-create " | " \-nocreate ] .RB [ \-unseen " | " \-nounseen ] .RB [ \-zero " | " \-nozero ] .RB [ \-sequence .I name \&...] .RB [ \-public " | " \-nopublic ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Rcvstore incorporates a message from the standard input into an .B mh folder. This command is typically used in conjunction with mail filtering programs such as .B slocal and .BR procmail , to filter your mail into different folders. .PP You may specify which folder to use with .IR +folder . If no folder is specified, .B rcvstore will use the folder given by a non\-empty `Inbox:' entry in the user's profile, else it will use the folder named `inbox'. .PP If the switch .B \-create is given (it is the default) and if the specified (or default) folder does not exist, then it will be created. You may disable this with the .B \-nocreate option. In this case .B rcvstore will exit if the specified folder does not exist. .PP When the new message is incorporated into the folder, it is assigned the next highest number for that folder. .PP .B Rcvstore will incorporate anything except zero length messages into the user's .B mh folder. It will not change the message in any way. .PP If the user's profile contains a `Msg\-Protect: nnn' entry, it will be used as the protection on the newly created message, otherwise the .B mmh default of 0644 will be used. For all subsequent operations on this message, this initially assigned protection will be preserved. .PP If the switch .B \-unseen is given (it is on by default), and if the profile entry `Unseen\-Sequence' is present and non\-empty, then .B rcvstore will add the newly incorporated message to each sequence named by this profile entry. You may use the switch .B \-nounseen to disable this. These sequences will not be zero'ed by .B rcvstore prior to adding the new message. .PP Furthermore, the incoming message may be added to additional sequences as they arrive by the use of the .B \-sequence switch. As with the commands .B pick and .BR mark , you may also use the switches .B \-zero and .B \-nozero to specify whether to zero old sequences or not. Similarly, use of the .B \-public and .B \-nopublic switches may be used to force these sequences to be public or private sequences. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Folder\-Protect:~^To set mode when creating a new folder ^Inbox:~^To find the default inbox ^Msg\-Protect:~^To set mode when creating a new message ^Unseen\-Sequence:~^To name sequences denoting unseen messages .fi .SH "SEE ALSO" rcvdist(1), rcvpack(1), mh\-sequence(7) .SH DEFAULTS .nf .RB ` +folder "' defaults to `Inbox' profile entry" .RB ` \-create ' .RB ` \-unseen ' .RB ` \-nozero ' .fi .SH CONTEXT No context changes will be attempted, with the exception of sequence manipulation. .SH BUGS If you use the `Unseen\-Sequence' profile entry, .B rcvstore could try to update the context while another .B mmh process is also trying to do so. This can cause the context to become corrupted. To avoid this, do not use .B rcvstore if you use the `Unseen\-Sequence' profile entry. mmh-0.4/man/mhstore.man10000644000000000000000000002314113414435726013660 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MHSTORE %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mhstore \- store contents of MIME messages into files .SH SYNOPSIS .HP 5 .na .B mhstore .RI [ +folder ] .RI [ msgs ] .RB [ \-file .IR file ] .RB [ \-part .IR number ] \&... .RB [ \-type .IR content ] \&... .RB [ \-auto " | " \-noauto ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION The .B mhstore command allows you to store the contents of a collection of MIME (multi-media) messages into files or other messages. .PP .B mhstore manipulates multi-media messages as specified in RFC\-2045 thru RFC\-2049. .PP By default, .B mhstore will store all the parts of each message. Each part will be store in a separate file. The header fields of the message are not stored. By using the .B \-part and .B \-type switches, you may limit the scope of .B mhstore to particular subparts (of a multipart content) and/or particular content types. .PP The option .B \-file .I file directs .B mhstore to use the specified file as the source message, rather than a message from a folder. If you specify this file as `-', then .B mhstore will accept the source message on the standard input. Note that the file, or input from standard input should be a validly formatted message, just like any other .B mh message. It should .B NOT be in mail drop format (to convert a file in mail drop format to a folder of .B mh messages, see .BR inc (1)). .PP A part specification consists of a series of numbers separated by dots. For example, in a multipart content containing three parts, these would be named as 1, 2, and 3, respectively. If part 2 was also a multipart content containing two parts, these would be named as 2.1 and 2.2, respectively. Note that the .B \-part switch is effective for only messages containing a multipart content. If a message has some other kind of content, or if the part is itself another multipart content, the .B \-part switch will not prevent the content from being acted upon. .PP A content specification consists of a content type and a subtype. The initial list of `standard' content types and subtypes can be found in RFC\-2046. .PP A list of commonly used contents is briefly reproduced here: .PP .RS 5 .nf .ta \w'application 'u Type Subtypes ---- -------- text plain, enriched multipart mixed, alternative, digest, parallel message rfc822, partial, external-body application octet-stream, postscript image jpeg, gif, png audio basic video mpeg .fi .RE .PP A legal MIME message must contain a subtype specification. .PP To specify a content, regardless of its subtype, just use the name of the content, e.g., `audio'. To specify a specific subtype, separate the two with a slash, e.g., `audio/basic'. Note that regardless of the values given to the .B \-type switch, a multipart content (of any subtype listed above) is always acted upon. .SS "Storing the Contents" The .B mhstore will store the contents of the named messages in `native' (decoded) format. Two things must be determined: the directory to store the content, and the filenames. .PP By default (or if the .B \-auto switch is given), .B mhstore uses filename information, contained in the message, if available. (This information should be specified as the attribute `name=filename' in the `Content-Type' header for the content you are storing.) Only the basename of this filename is considered. If it begins with the character '.', '|', or '!', or if it contains the character '%', automatic naming won't happen for security reasons. (See below for the fall-back.) .PP Files are written in the directory given by the `nmh-storage' profile entry, e.g., .PP .RS 5 nmh-storage: /tmp .RE .PP (Note that `nmh-storage' is relative to the folder that contains the message.) If this entry isn't present, the current working directory is used. Attachments will get stored in either the `nmh-storage' or the current working directory \(en in no case elsewhere. Existing files get silently overwritten. .PP If the .B \-noauto switch is given (or a filename is being ignored for security reasons) then .B mhstore will look in the user's profile for a `formatting string' to determine how the different contents should be stored. First, .B mhstore will look for an entry of the form: .PP .RS 5 mhstore-store-/ .RE .PP to determine the formatting string. If this isn't found, .B mhstore will look for an entry of the form: .PP .RS 5 mhstore-store- .RE .PP to determine the formatting string. .PP If the formatting string starts with a `+' character, then content is stored in the named folder. A formatting string consisting solely of a `+' character is interpreted to be the current folder. .PP If the formatting string consists solely of a `\-' character, then the content is sent to the standard output. .PP If the formatting string starts with a '|', then the display string will represent a command for .B mhstore to execute which should ultimately store the content. The content will be passed to the standard input of the command. Before the command is executed, .B mhstore will change to the appropriate directory, and any escapes (given below) in the display string will be expanded. .PP Otherwise the formatting string will represent a pathname in which to store the content. If the formatting string starts with a '/', then the content will be stored in the full path given, else the file name will be relative to either the value of `nmh-storage', if set, or the current working directory. Existing files get silently overwritten. .PP A command or pathname formatting string may contain the following escapes. If the content isn't part of a multipart (of any subtype listed above) content, the p-escapes are ignored. .PP .RS 5 .nf .ta \w'%P 'u %a Parameters from Content-type (only valid with command) %m Insert message number %P Insert part number with leading dot %p Insert part number without leading dot %t Insert content type %s Insert content subtype %% Insert character % .fi .RE .PP If no formatting string is found, .B mhstore will check to see if the content is a message. If so, .B mhstore will use the value `+'. As a last resort, .B mhstore will use the value `%m%P.%s'. .PP Example profile entries might be: .PP .RS 5 .nf mhstore-store-text: %m%P.txt mhstore-store-text: +inbox mhstore-store-message/partial: + mhstore-store-audio/basic: | raw2audio \-e ulaw \-s 8000 \-c 1 > %m%P.au mhstore-store-image/jpeg: %m%P.jpg mhstore-store-application/PostScript: %m%P.ps .fi .RE .PP .SS "Reassembling Messages of Type message/partial" .B mhstore is also able to reassemble messages that have been split into multiple messages of type `message/partial'. .PP When asked to store a content containing a partial message, .B mhstore will try to locate all of the portions and combine them accordingly. The default is to store the combined parts as a new message in the current folder, although this can be changed using formatting strings as discussed above. Thus, if someone has sent you a message in several parts (such as the output from .BR sendfiles ), you can easily reassemble them all into a single message in the following fashion: .PP .RS 5 .nf % mhlist 5-8 msg part type/subtype size description 5 message/partial 47K part 1 of 4 6 message/partial 47K part 2 of 4 7 message/partial 47K part 3 of 4 8 message/partial 18K part 4 of 4 % mhstore 5-8 reassembling partials 5,6,7,8 to folder inbox as message 9 % mhlist 9 msg part type/subtype size description 9 application/octet-stream 118K (extract with uncompress | tar xvpf -) type=tar conversions=compress .fi .RE .PP This will store exactly one message, containing the sum of the parts. It doesn't matter whether the partials are specified in order, since .B mhstore will sort the partials, so that they are combined in the correct order. But if .B mhstore can not locate every partial necessary to reassemble the message, it will not store anything. .RE .SS "External Access" .B Mhstore does not automatically retrieve message/external-body parts (anymore), but prints the relevant information to enable the user to retrieve the files manually. .SS "User Environment" Because the display environment in which .B mhstore operates may vary for different machines, .B mhstore will look for the environment variable .BR $MHSTORE . If present, this specifies the name of an additional user profile which should be read. Hence, when a user logs in on a particular machine, this environment variable should be set to refer to a file containing definitions useful for that machine. Finally, .B mhstore will attempt to consult one other additional user profile, e.g., .PP .RS 5 %etcdir%/mhn.defaults .RE .PP which is created automatically during .B mmh installation. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile ^$MHSTORE~^Additional profile entries ^%etcdir%/mhn.defaults~^System default MIME profile entries .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Current\-Folder:~^To find the default current folder ^nmh-storage~^Directory to store contents ^mhstore-store-*~^Template for storing contents .fi .SH "SEE ALSO" mhbuild(1), mhlist(1), show(1), sendfiles(1) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder" .RB ` msgs "' defaults to the current message" .RB ` \-auto ' .SH CONTEXT If a folder is given, it will become the current folder. The last message selected will become the current message. .SH BUGS Partial messages contained within a multipart content are not reassembled. .PP Existing files get silently overwritten. mmh-0.4/man/show.man10000644000000000000000000002627213414435726013167 0ustar rootroot.\" .\" %nmhwarning% .\" .TH SHOW %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME show \- display (MIME) messages .PP next \- show the next message .PP prev \- show the previous message .SH SYNOPSIS .HP 5 .na .B show .RI [ +folder ] .RI [ msgs ] .RB [ \-file .IR file ] .RB [ \-part .IR number ] \&... .RB [ \-type .IR content ] \&... .RB [ \-form .IR formfile ] .RB [ \-Version ] .RB [ \-help ] .PP .HP 5 .B next is equivalent to .B show n .PP .HP 5 .B prev is equivalent to .B show p .ad .SH NOTE This (i.e. mmh's) version of .B show is a modified version of nmh's .B mhshow program. The old (non-MIME) .B show program was removed from mmh. .SH DESCRIPTION The .B show command display contents of a MIME (multi-media) message or collection of messages. .B Next and .B prev perform a .B show on the next or previous message in the specified (or current) folder, respectively. .PP .B show manipulates multi-media messages as specified in RFC\-2045 thru RFC\-2049. Currently .B show only supports encodings in message bodies, and does not support the encoding of message headers as specified in RFC\-2047. .PP By default .B show will display all parts of a multipart message. By using the .B \-part and .B \-type switches, you may limit the scope of .B show to particular subparts (of a multipart content) and/or particular content types. .PP The option .B \-file .I file directs .B show to use the specified file as the source message, rather than a message from a folder. If you specify this file as `-', then .B show will accept the source message on the standard input. Note that the file, or input from standard input should be a validly formatted message, just like any other .B mh message. It should .B NOT be in mail drop format (to convert a file in mail drop format to a folder of .B mh messages, see .BR inc (1)). .PP When displaying multiple messages, .B show prepends each of them with a `>>> Message nnn' header, and separates the messages with two lines of space. This is similar to the way .B mhl acts on multiple files. .PP A part specification consists of a series of numbers separated by dots. For example, in a multipart content containing three parts, these would be named as 1, 2, and 3, respectively. If part 2 was also a multipart content containing two parts, these would be named as 2.1 and 2.2, respectively. Note that the .B \-part switch is effective for only messages containing a multipart content. If a message has some other kind of content, or if the part is itself another multipart content, the .B \-part switch will not prevent the content from being acted upon. .PP A content specification consists of a content type and a subtype. The initial list of `standard' content types and subtypes can be found in RFC\-2046. .PP A list of commonly used contents is briefly reproduced here: .PP .RS 5 .nf .ta \w'application 'u Type Subtypes ---- -------- text plain, enriched multipart mixed, alternative, digest, parallel message rfc822, partial, external-body application octet-stream, postscript image jpeg, gif, png audio basic video mpeg .fi .RE .PP A legal MIME message must contain a subtype specification. .PP To specify a content, regardless of its subtype, just use the name of the content, e.g., `audio'. To specify a specific subtype, separate the two with a slash, e.g., `audio/basic'. Note that regardless of the values given to the `\-type' switch, a multipart content (of any subtype listed above) is always acted upon. .SS "Unseen Sequence" If the profile entry `Unseen\-Sequence' is present and non\-empty, then .B show will remove each of the messages shown from each sequence named by the profile entry. .SS "Showing the Contents" .B Mhshow prints messages in a convenient representation. If .B show is outputting to a terminal, then a pager will be placed between the terminal and .BR show . .PP The headers of each message are displayed with .B mhl using the standard format file .IR mhl.headers . You may specify an alternate format file with the .B \-form .I formfile switch. If the format file .I mhl.null is specified, then the display of the message headers is suppressed. .PP Next, the contents are extracted from the message and are stored in a temporary file. Usually, the name of the temporary file is the word `show' followed by a string of characters. Occasionally, the method used to display a content (described next), requires that the file end in a specific suffix. For example, the .B soffice command (part of the StarOffice package) can be used to display Microsoft Word content, but it uses the suffix to determine how to display the file. If no suffix is present, the file is not correctly loaded. Similarly, older versions of the .B gs command append a `.ps' suffix to the filename if one was missing. As a result, these cannot be used to read the default temporary file. .PP To get around this, your profile can contain lines of the forms: .PP .RS 5 .nf mhshow-suffix-/: mhshow-suffix-: .fi .RE .PP to specify a suffix which can be automatically added to the temporary file created for a specific content type. For example, the following lines might appear in your profile: .PP .RS 5 .nf mhshow-suffix-text: .txt mhshow-suffix-application/msword: .doc mhshow-suffix-application/PostScript: .ps .fi .RE .PP to automatically append a suffix to the temporary files. .PP The method used to display the different contents in the messages bodies will be determined by a `display string'. To find the display string, .B show will first search your profile for an entry of the form: .PP .RS 5 mhshow-show-/ .RE .PP to determine the display string. If this isn't found, .B show will search for an entry of the form: .PP .RS 5 mhshow-show- .RE .PP to determine the display string. .PP If a display string is found, any escapes (given below) will be expanded. The result will be executed under `/bin/sh', with the standard input set to the content. .PP The display string may contain the following escapes: .PP .RS 5 .nf .ta \w'%F 'u %l Display listing prior to displaying content %f Insert filename containing content %F %f, but stdin is terminal not content %a Insert parameters from Content-Type field %s Insert content subtype %c Insert foreign charset %d Insert content description %% The character % .fi .RE .PP .B Mhshow processes the MIME parts serially, i.e. the next display process is executed after the previous one has terminated. .PP Further, when .B show is display a content, typing QUIT (usually control-\\) will tell .B show to wrap things up immediately. .PP Note that if the content being displayed is multipart, but not one of the subtypes listed above, then the f- and F-escapes expand to multiple filenames, one for each subordinate content. Further, stdin is not redirected from the terminal to the content. .PP If a display string is not found, .B show has the following default values: .PP .RS 5 .nf mhshow-show-text/plain: %liconv \-f mhshow-show-message/rfc822: %lshow \-file %F .fi .RE .PP If a subtype of type text doesn't have a profile entry, it will be treated as text/plain. .PP .B show has default methods for handling multipart messages of subtype mixed, alternative, parallel, and digest. Any unknown subtype of type multipart (without a profile entry), will be treated as multipart/mixed. .PP If none of these apply, then .B show will complain. .PP Example entries might be: .PP .RS 5 .nf mhshow-show-audio/basic: raw2audio 2>/dev/null | play mhshow-show-image: xv %f mhshow-show-application/PostScript: lpr \-Pps .fi .RE .PP When expanding %f and %F escapes, the file names get wrapped in single-quotes automatically. .PP Finally, .B show will process each message serially \- it won't start showing the next message until all the commands executed to display the current message have terminated. Although a multipart content may contain advice to display the parts in parallel, .B show will never do so. .SS "Showing Alternate Character Sets" Because a content of type text might be in a non-ASCII character set, when .B show encounters a `charset' parameter for this content, it checks if your terminal can display this character set natively. .B show checks this by first examining the the environment variable .B $MM_CHARSET and if not set, taking the character encoding of the current locale. .PP If the character set of text/plain cannot be displayed natively, then the default display method converts the content automatically by piping it through: .PP .RS 5 iconv \-f '' .RE .PP Note that if you have a custom `mhshow-show-*' display string, you need to care yourself for converting the encodings. (The foreign charset is available through the %c escape.) .PP The tool .B iconv needs to be available. .PP `mhshow-charset-*' profile entries are not supported anymore. .SS "Messages of Type message/partial" .B show cannot directly display messages of type partial. You must reassemble them first into a normal message using .BR mhstore . Check the man page for .BR mhstore (1) for details. .SS "External Access" .B Mhshow does not automatically retrieve message/external-body parts (anymore), but prints the relevant information to enable the user to retrieve the files manually. .SS "User Environment" Because the display environment in which .B show operates may vary for different machines, .B show will look for the environment variable .BR $MHSHOW . If present, this specifies the name of an additional user profile which should be read. Hence, when a user logs in on a particular display device, this environment variable should be set to refer to a file containing definitions useful for the given display device. Normally, only entries that deal with the methods to display different content type and subtypes .PP .RS 5 .nf mhshow-show-/ mhshow-show- .fi .RE .PP need be present in this additional profile. Finally, .B show will attempt to consult one other additional user profile, e.g., .PP .RS 5 %etcdir%/mhn.defaults .RE .PP which is created automatically during .B mmh installation. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile ^$MHSHOW~^Additional profile entries ^%etcdir%/mhn.defaults~^System default MIME profile entries ^%etcdir%/mhl.headers~^The headers template .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Current\-Folder:~^To find the default current folder ^Unseen\-Sequence:~^To name sequences denoting unseen messages ^mhshow-show-*~^Template for displaying contents ^Pager:~^Program to use as interactive front\-end .fi .SH "SEE ALSO" mhbuild(1), mhl(1), mhlist(1), mhstore(1), sendfiles(1) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder" .RB ` msgs "' defaults to the current message" .RB ` \-form \ mhl.headers' .RB ` \-noverbose ' .fi .SH CONTEXT If a folder is given, it will become the current folder. The last message selected will become the current message. .SH BUGS .B Next and .B prev are really links to the .B show program. As a result, if you make a link to .B next or .B prev and that link is not called .B next or .BR prev , your link will act like .B show instead. To circumvent this, add a profile\-entry for the link to your .B mmh profile and add the argument .I n or .I p to the entry. mmh-0.4/man/mhpgp.man10000644000000000000000000000260713414435726013316 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MHPGP %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mhpgp \- verify and decrypt a message with gnupg .SH SYNOPSIS .HP 5 .na .B mhpgp .RB [ \-write ] .RB [ \-Version ] .RB [ \-help ] .RI [ +folder ] .RI [ msg ] .ad .SH DESCRIPTION .B mhpgp is a script to simplify verifying and decrypting PGP messages, using gnupg. .PP .B mhpgp can handle signatures and encryption in MIME and plain (non-MIME) format. Signed messages are verified. Encrypted messages are displayed with .B show in decrypted form, the signature is verified as well. .PP With the .B \-write switch, the decrypted message is stored into the current folder. .PP If no .I msg is given, the current message is used. .PP Trailing blanks are stripped from the lines before signature verification, because non are expected to be present as RFC 3156 requests: .PP .RS 5 [...] implementations MUST make sure that no trailing whitespace is present after the MIME encoding has been applied. .RE .PP If there is trailing whitespace, it was likely added mistakenly during mail transfer. .SH FILES None .SH "PROFILE COMPONENTS" None .SH "SEE ALSO" mhsign(1), gpg(1) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder" .RB ` msg "' defaults to the current message" .fi .SH CONTEXT None .SH BUGS The order of the command line arguments is relevant: The options must come first, the message specification last. mmh-0.4/man/mhparam.man10000644000000000000000000000440413414435726013625 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MHPARAM %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mhparam \- print mmh profile and context components .SH SYNOPSIS .HP 5 .na .B mhparam .RI [ components ] .RB [ \-all ] .RB [ \-component " | " \-nocomponent ] .RB [ \-debug ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B mhparam writes the value of the specified profile component to the standard output separated by newlines. If the profile component is not present, the default value (or nothing if there is no default) is printed. .PP If the switch .B \-component is given, then the component name is displayed along with the profile components value. This can be disabled with the switch .BR \-nocomponent . .PP If more than one component is specified in the .I components list, then the switch .B \-component is on by default. If only one component is specified, then the switch .B \-nocomponent is on by default. .PP If .B \-all is specified, then all components in the mmh profile and context (including comments) are displayed and other arguments are ignored. .PP If .B \-debug is specified, then a defined set of internal profile entries are displayed. .PP Examples: .PP .RS 5 .nf .ta \w'LongEntry:'u+2n % mhparam path Mail % mhparam editor vi % mhparam \-component Path Path: Mail % mhparam AliasFile sendmail AliasFile: aliases sendmail: /usr/sbin/sendmail % mhparam \-nocomponent AliasFile sendmail aliases /usr/sbin/sendmail % mhparam path nonexistent context Path: Mail context: context .fi .RE .PP .B mhparam is also useful in back\-quoted operations: .PP .RS 5 .nf % fgrep cornell.edu `mhpath +`/`mhparam aliasfile` .fi .SH "EXIT STATUS" .B mhparam returns the number of components that were not found. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile ^or $MMHP~^Rather than the standard profile ^$HOME/.mmh/context~^The user context ^or $MMHC~^Rather than the standard context .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Context:~^To determine the context file .fi .SH "SEE ALSO" mh-profile(5) .SH DEFAULTS .nf .RB ` \-nocomponent "' if only one component is specified" .RB ` \-component "' if more than one component is specified" .RB ` components "' defaults to none" .fi .SH CONTEXT None mmh-0.4/man/mhbuild.man10000644000000000000000000003373613414435726013636 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MHBUILD %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mhbuild \- translate MIME composition draft .SH SYNOPSIS .na .HP 5 .B mhbuild .I file .RB [ \-verbose " | " \-noverbose ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION The .B mhbuild command will translate a MIME composition draft into a valid MIME message. .PP .B mhbuild creates multi-media messages as specified in RFC\-2045 thru RFC\-2049. Currently .B mhbuild only supports encodings in message bodies, and does support the encoding of message headers as specified in RFC\-2047. .PP If you specify the name of the composition file as `-', then .B mhbuild will accept the composition draft on the standard input. If the translation of this input is successful, .B mhbuild will output the new MIME message to the standard output. This argument must be the last argument on the command line. .PP Otherwise if the file argument to .B mhbuild is the name of a valid composition file, and the translation is successful, .B mhbuild will replace the original file with the new MIME message. It will preserve the original file under the same name with `.orig' appended. E.g., if you are editing the file `draft', its original contents it will be preserved as `draft.orig'. This allows you to easily recover the .B mhbuild input file. .SS "Translating the Composition File" .B mhbuild is essentially a filter to aid in the composition of MIME messages. .B mhbuild will convert an .B mhbuild `composition file' into a valid MIME message. A .B mhbuild `composition file' is just a file containing plain text that is interspersed with various .B mhbuild directives. When this file is processed by .BR mhbuild , the various directives will be expanded to the appropriate content, and will be encoded according to the MIME standards. The resulting MIME message can then be sent by electronic mail. .PP The formal syntax for a .B mhbuild composition file is defined at the end of this document, but the ideas behind this format are not complex. Basically, the body contains one or more contents. A content consists of either a directive, indicated with a `#' as the first character of a line; or, plaintext (one or more lines of text). The continuation character, `\\`, may be used to enter a single directive on more than one line, e.g., .PP .RS 5 .nf #image/png \\ /home/foobar/junk/picture.png .fi .RE .PP There are three kinds of directives: `type', `message' (#forw), and `begin' (#begin). .PP .B "(1) The `type' directive is used to directly specify the type and subtype of a content. You may only specify discrete types in this manner (can't specify the types multipart or message with this directive). You may optionally specify the name of a file containing the contents in `native' (decoded) format. If this filename starts with the `|' character, then it represents a command to execute whose output is captured accordingly. For example, .PP .RS 5 .nf #audio/basic |raw2audio \-F < /usr/lib/sound/giggle.au .fi .RE .PP If a filename is not given, .B mhbuild will look for information in the user's profile to determine how the different contents should be composed. This is accomplished by consulting a composition string, and executing it under .BR /bin/sh , with the standard output set to the content. If the .B \-verbose switch is given, .B mhbuild will echo any commands that are used to create contents in this way. .PP The composition string may contain the following escapes: .PP .RS 5 .nf .ta \w'%P 'u %a Insert parameters from directive %f Insert filename containing content %F %f, and stdout is not re-directed %s Insert content subtype %% Insert character % .fi .RE .PP First, .B mhbuild will look for an entry of the form: .PP .RS 5 mhbuild-compose-/ .RE .PP to determine the command to use to compose the content. If this isn't found, .B mhbuild will look for an entry of the form: .PP .RS 5 mhbuild-compose- .RE .PP to determine the composition command. If this isn't found, .B mhbuild will complain. .PP An example entry might be: .PP .RS 5 mhbuild-compose-audio/basic: record | raw2audio \-F .RE .PP Because commands like these will vary, depending on the display environment used for login, composition strings for different contents should probably be put in the file specified by the .B $MHBUILD environment variable, instead of directly in your user profile. .PP .B "(2) The `message' directive (#forw) is used to specify a message or group of messages to include. You may optionally specify the name of the folder and which messages are to be forwarded. If a folder is not given, it defaults to the current folder. Similarly, if a message is not given, it defaults to the current message. The message directive is used by .BR forw . .PP For example, .PP .RS 5 .nf #forw +inbox 42 43 99 .fi .RE .PP If you include a single message, it will be included directly as a content of type `message/rfc822'. If you include more than one message, then .B mhbuild will add a content of type `multipart/digest' and include each message as a subpart of this content. .PP .B "(3) The `begin' directive is used to create a multipart content. When using the `begin' directive, you must specify at least one content between the begin and end pairs. .PP .RS 5 .nf #begin This will be a multipart with only one part. #end .fi .RE .PP If you use multiple directives in a composition draft, .B mhbuild will automatically encapsulate them inside a multipart content. Therefore the `begin' directive is only necessary if you wish to use nested multiparts, or create a multipart message containing only one part. .PP For all of these directives, the user may include a brief description of the content between the `[' character and the `]' character. This description will be copied into the `Content-Description' header when the directive is processed. .PP .RS 5 .nf #forw [important mail from Bob] +bob 1 2 3 4 5 .fi .RE .PP Similarly, a disposition string may optionally be provided between `{' and `}' characters; it will be copied into the `Content-Disposition' header when the directive is processed. If a disposition string is provided that does not contain a filename parameter, and a filename is provided in the directive, it will be added to the `Content-Disposition' header. For example, the following directive: .PP .RS 5 .nf #text/plain; charset=iso-8859-1 <>{attachment} /tmp/summary.txt .fi .RE .PP creates these message part headers: .PP .RS 5 .nf Content-Type: text/plain; charset="iso-8859-1" Content-Disposition: attachment; filename="summary.txt" .fi .RE .PP By default, .B mhbuild will generate a unique `Content-ID:' for each directive, corresponding to each message part; however, the user may override this by defining the ID using the `<' and `>' characters. .PP In addition to the various directives, plaintext can be present. Plaintext is gathered, until a directive is found or the draft is exhausted, and this is made to form a text content. If the plaintext must contain a `#' at the beginning of a line, simply double it, e.g., .PP .RS 5 ##when sent, this line will start with only one # .RE .PP If you want to end the plaintext prior to a directive, e.g., to have two plaintext contents adjacent, simply insert a line containing a single `#' character, e.g., .PP .RS 5 .nf this is the first content # and this is the second .fi .RE .PP Finally, if the plaintext starts with a line of the form: .PP .RS 5 Content-Description: text .RE .PP then this will be used to describe the plaintext content. You MUST follow this line with a blank line before starting your text. .PP By default, plaintext is captured as a text/plain content. You can override this by starting the plaintext with `#<' followed by a content-type specification. For example, e.g., .PP .RS 5 .nf #" ] [ "[" description "]" ] [ "{" disposition "}" ] [ filename ] EOL | "#forw" [ "<" id ">" ] [ "[" description "]" ] [ "{" disposition "}" ] [ "+"folder ] [ 0*msg ] EOL | "#begin" [ "<" id ">" ] [ "[" description "]" ] [ "{" disposition "}" ] [ "alternative" | "parallel" | something-else ] EOL 1*body "#end" EOL plaintext ::= [ "Content-Description:" description EOL EOL ] 1*line [ "#" EOL ] | "#<" type "/" subtype 0*(";" attribute "=" value) [ "(" comment ")" ] [ "[" description "]" ] [ "{" disposition "}" ] EOL 1*line [ "#" EOL ] line ::= "##" text EOL -- interpreted as "#"text EOL | text EOL .fi .RE .PP .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile ^$MHBUILD~^Additional profile entries ^%etcdir%/mhn.defaults~^System default MIME profile entries .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Current\-Folder:~^To find the default current folder ^mhbuild-compose-*~^Template for composing contents .fi .SH "SEE ALSO" mhlist(1), show(1), mhstore(1), forw(1), .br .I "Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies" (RFC\-2045), .br .I "Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types" (RFC\-2046), .br .I "Multipurpose Internet Mail Extensions (MIME) Part Three: Message Header Extensions for Non-ASCII Text" (RFC\-2047), .br .I "Multipurpose Internet Mail Extensions (MIME) Part Four: Registration Procedures" (RFC\-2048), .br .I "Multipurpose Internet Mail Extensions (MIME) Part Five: Conformance Criteria and Examples" (RFC\-2049) .SH DEFAULTS .nf .RB ` \-noverbose ' .fi .SH CONTEXT If a folder is given, it will become the current folder. The last message selected will become the current message. .SH BUGS Outlook 2002 won't display attachments that have a Content-ID header. This is a bug in Outlook 2002, not in .BR mhbuild . To workaround it, invoke \fIe mhbuild\fP manually at the Whatnow prompt and edit the draft again thereafter, removing the Content-ID headers. Then send it. There used to be a .B \-nocontentid switch to prevent Content-ID headers to be inserted, but as it was considered wrong to complicate all other MUAs instead of forcing the developers and users of broken MUAs to fix or change their software, it was removed. mmh-0.4/man/flist.man10000644000000000000000000001225013414435726013317 0ustar rootroot.\" .\" %nmhwarning% .\" .TH FLIST %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME flist, flists \- list folders with messages in given sequence(s) .SH SYNOPSIS .HP 5 .na .B flist .RI [ +folder1 .RI [ +folder2 \&...]] .RB [ \-sequence .I name1 .RB [ \-sequence .I name2 \&...]] .RB [ \-all " | " \-noall ] .RB [ \-showzero " | " \-noshowzero ] .RB [ \-recurse " | " \-norecurse ] .RB [ \-fast " | " \-nofast ] .RB [ \-alpha " | " \-noalpha ] .RB [ \-Version ] .RB [ \-help ] .PP .HP 5 .B flists is equivalent to .B flist .B \-all .ad .SH DESCRIPTION .B Flist is used to search a list of folders and display the number of messages in these folders that are in a given sequence or set of sequences (for example the .RI ` unseen ' sequence). This is especially useful if you use some mechanism such as .B slocal or .B procmail (typically in conjunction with .BR rcvstore ) to pre-sort your mail into different folders before you view it. .PP By default, the command .B flist will search the current folder for the given sequence or sequences (usually .RI ` unseen '). If (possibly multiple) folders are specified on the command line with .IR +folder , then all these folders are searched for the given sequence(s). .B Flist will display for each folder searched, the number of messages in each of the specified sequences, and the total number of messages. .PP The option .B \-sequence is used to specify the name of a sequence in which to search for. This option may be used multiple times to specify multiple sequences. If this is not given, then the default is to search for all the sequences specified by the .RI ` Unseen-Sequence ' profile component. For more details about sequences, read the .BR mh\-sequence (7) man page. .PP Typically, .B flist will produce a line for each sequence, for every folder that is searched, even those which do not contain any messages in the given sequence. Specifying .B \-noshowzero will cause .B flist to print only those folder/sequence combinations such the folder has a non-zero number of messages in the given specified sequence. .PP If .B \-recurse is given, then for each folder that is search, .B flist will also recursively descend into those folders to search subfolders for the given sequence. .PP If .B \-fast is given, only the names of the folders searched will be displayed, and .B flist will suppress all other output. If this option is used in conjunction with .BR \-noshowzero , then .B flist will only print the names of those folders searched that contain messages in in at least one of the specified sequences. .SS "Multiple Folders" If the option .B \-all is given (and no folders are specified with .IR +folder ), then .B flist will search all the folders in the top level of the users mmh directory. These folders are all preceded by the read\-only folders, which occur as .RI ` atr\-cur\- ' entries in the user's .B mmh context. .PP An example of the output of .B flist .B \-all is: .PP .RS 5 .nf /work/Mail has 5 in sequence unseen (private); out of 46 inbox+ has 10 in sequence unseen ; out of 153 junklist has 0 in sequence unseen ; out of 63 postmaster has 1 in sequence unseen ; out of 3 .fi .RE .PP The `+' after .I inbox indicates that it is the current folder. .PP The `private' flag indicates that the given sequence for that folder is private. See the .BR mh\-sequence (7) man page for details about private sequences. .PP If the option .B \-all and .I +folder are both specified, then .B flist will search this folder, and all its first level subfolders for the given sequence. You may specify multiple folders in this way. .PP If .B flist is invoked by a name ending with `s' (e.g. .BR flists ), then the switch .B \-all is assumed by default. .PP The sorting order for the listing is alphabetical (with .BR \-alpha ), or in a priority order defined by the .RI ` Flist-Order ' profile entry (with .BR \-noalpha ). Each item in the .RI ` Flist-Order ' is a folder name or a folder name pattern that uses * to match zero or more characters. Longer matching patterns have precedence over shorter matching patterns. For example: .PP .RS 5 .nf Flist-Order: personal petproject mh* * admin *junk .fi .RE .PP This order puts a few interesting folders first, such as those with mail addressed to you personally, those about a pet project, and those about mh-related things. It places uninteresting folders at the end, and it puts everything else in the middle in alphabetical order. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Mh-Sequences:~^File that contains public sequences ^Unseen-Sequence:~^The name of the unseen message sequence ^Flist-Order:~^To sort folders by priority .fi .SH "SEE ALSO" folder(1), rcvstore(1), slocal(1), mh\-sequence(7) .SH DEFAULTS .nf .RB ` -sequence "' defaults to Unseen-Sequence profile entry" .RB ` \-showzero ' .RB ` \-noall ' .RB ` \-norecurse ' .RB ` \-noalpha ' .RB ` \-nofast ' .fi .SH CONTEXT If .I +folder is given, it will become the current folder. If multiple folders are given, the last one specified will become the current folder. mmh-0.4/man/next.man10000644000000000000000000000002013414435726013144 0ustar rootroot.so man1/show.1 mmh-0.4/man/burst.man10000644000000000000000000000473613414435726013347 0ustar rootroot.\" .\" %nmhwarning% .\" .TH BURST %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME burst \- explode digests into messages .SH SYNOPSIS .HP 5 .na .B burst .RI [ +folder ] .RI [ msgs ] .RB [ \-verbose " | " \-noverbose ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Burst considers the specified messages in the named folder to be Internet digests, and explodes them in that folder. .PP The messages contained within the digest are placed at the end of the folder. The digest is preserved. No other messages are tampered with in any way. .PP The .B \-verbose switch directs .B burst to tell the user the general actions that it is taking to explode the digest. .PP It turns out that .B burst works equally well on forwarded messages and blind\-carbon\-copies as on Internet digests, provided that they use RFC 934 message encapsulation. .PP To extract messages encapsulated with MIME, use .BR mhstore (1). .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Current\-Folder:~^To find the default current folder ^Msg\-Protect:~^To set mode when creating a new message .fi .SH "SEE ALSO" mhstore(1), .I "Proposed Standard for Message Encapsulation" (RFC\-934) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder" .RB ` msgs "' defaults to the current message" .RB ` \-noverbose ' .fi .SH CONTEXT If a folder is given, it will become the current folder. The first message extracted from the first digest burst becomes the current message. .SH BUGS The .B burst program enforces a limit on the number of messages which may be .B burst from a single message. This number is on the order of 1000 messages. There is usually no limit on the number of messages which may reside in the folder after the .BR burst ing. .PP Although .B burst uses a sophisticated algorithm to determine where one encapsulated message ends and another begins, not all digestifying programs use an encapsulation algorithm. In degenerate cases, this usually results in .B burst finding an encapsulation boundary prematurely and splitting a single encapsulated message into two or more messages. These erroneous digestifying programs should be fixed. .PP Any text which appears after the last encapsulated message is not placed in a separate message by .BR burst . In the case of digestified messages, this text is usually an `End of digest' string. mmh-0.4/man/scan.man10000644000000000000000000000002013414435726013112 0ustar rootroot.so man1/pick.1 mmh-0.4/man/mhl.man10000644000000000000000000001570413414435726012765 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MHL %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mhl \- produce formatted listings of mh messages .SH SYNOPSIS .HP 5 .na .B mhl .RB [ \-form .IR formfile ] .RB [ \-width .IR columns ] .RI [ files .IR \&... ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Mhl is an .B mmh command for filtering and/or displaying text messages. It is the default method of displaying text messages for .B mmh (it is the default .IR showproc ). .PP The .B \-width .I width switch sets the screen width. This defaults to the value indicated by .BR $TERMCAP , if appropriate, otherwise it defaults to 80. .PP The default format file used by .B mhl is called .RI ` mhl.format '. .B mhl will first search for this file in the user's .B mmh directory, and will then search in the directory .IR %etcdir% . This default can be changed by using the .B \-form .I formatfile switch. Note: In contrast to any other .B mmh tool, the .B \-form switch does only take file names, but no format strings with a prepended equal sign `='. .PP .B Mhl operates in two phases: 1) read and parse the format file, and 2) process each message (file). During phase 1, an internal description of the format is produced as a structured list. In phase 2, this list is walked for each message, outputting message information under the format constraints from the format file. .PP The format file can contain information controlling screen size, wrap\-around control, transparent text, component ordering, and component formatting. Also, a list of components to ignore may be specified, and a couple of `special' components are defined to provide added functionality. Message output will be in the order specified by the order in the format file. .PP Each line of a format file has one of the following forms: .PP .RS 5 .nf ;comment :cleartext variable[,variable...] component:[variable,...] .fi .RE .PP .IP \(bu 4 A line beginning with a `;' is a comment, and is ignored. .IP \(bu 4 A line beginning with a `:' is clear text, and is output exactly as is. .IP \(bu 4 A line containing only a `:' produces a blank line in the output. .IP \(bu 4 A line beginning with `component:' defines the format for the specified component, .IP \(bu 4 Remaining lines define the global environment. .PP For example, the line: .PP .RS 5 width=80,overflowtext="***",overflowoffset=5 .RE .PP defines the screen size to be 80 columns by 40 rows, specifies that the overflow indentation is 5, and that overflow text should be flagged with `***'. .PP Following are all of the current variables and their arguments. If they follow a component, they apply only to that component, otherwise, their affect is global. Since the whole format is parsed before any output processing, the last global switch setting for a variable applies to the whole message if that variable is used in a global context (i.e., width). .PP .RS 5 .nf .ta \w'xxxxxxxxxxxxx 'u +\w'integer/G 'u .I "variable type semantics width integer screen width or component width length integer component length offset integer positions to indent `component: ' overflowtext string text to use at the beginning of an overflow line overflowoffset integer positions to indent overflow lines compwidth integer positions to indent component text after the first line is output uppercase flag output text of this component in all upper case nouppercase flag don't uppercase component string/L name to use instead of `component' for this component nocomponent flag don't output `component: ' for this component center flag center component on line (works for one\-line components only) nocenter flag don't center leftadjust flag strip off leading whitespace on each line of text noleftadjust flag don't leftadjust compress flag change newlines in text to spaces nocompress flag don't compress rtrim flag trim whitespace at end of text lines nortrim flag retain whitespace at end of text lines (default) split flag don't combine multiple fields into a single field nosplit flag combine multiple fields into a single field newline flag print newline at end of components (this is the default) nonewline flag don't print newline at end of components formatfield string format string for this component (see below) decode flag decode text as RFC-2047 encoded header field addrfield flag field contains addresses datefield flag field contains dates .fi .RE .PP To specify the value of integer\-valued and string\-valued variables, follow their name with an equals\-sign and the value. Integer\-valued variables are given decimal values, while string\-valued variables are given arbitrary text bracketed by double\-quotes. If a value is suffixed by `/G' or `/L', then its value is useful in a global\-only or local\-only context (respectively). .PP A line of the form: .PP .RS 5 ignores=component,... .RE .PP specifies a list of components which are never output. This option supports some simple globbing, so a '*' at the end of a component will match for all components which start wich the string. When you want to match a component which ends with a '*', you can escape the '*' with a '\\'. .PP The component `MessageName' (case\-insensitive) will output the message file name as a one-line header, similar to .BR show . E.g. ``(Message 42)'' .PP The component `Extras' will output all of the components of the message which were not matched by explicit components, or included in the ignore list. If this component is not specified, an ignore list is not needed since all non\-specified components will be ignored. .PP If `nocomponent' is NOT specified, then the component name will be output as it appears in the format file. .PP The default format file is: .PP .RS 5 .nf %mhl_format% .fi .RE .PP The variable `formatfield' specifies a format string (see .BR mh\-format (5)). The flag variables `addrfield' and `datefield' (which are mutually exclusive), tell .B mhl to interpret the escapes in the format string as either addresses or dates, respectively. .PP By default, .B mhl does not apply any formatting string to fields containing address or dates (see .BR mh\-mail (5) for a list of these fields). Note that this results in faster operation since .B mhl must parse both addresses and dates in order to apply a format string to them. If desired, .B mhl can be given a default format string for either address or date fields (but not both). To do this, on a global line specify: either the flag addrfield or datefield, along with the appropriate formatfield variable string. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^%etcdir%/mhl.format~^The message template ^or $HOME/.mmh/mhl.format~^Rather than the standard template ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" none .SH "SEE ALSO" show(1), ap(8), dp(8) .SH DEFAULTS .nf .RB ` \-width \ 80' .fi .SH CONTEXT None .SH BUGS In contrast to any other .B mmh tool, the .B \-form switch does only take file names, but no format strings with a prepended equal sign `='. .PP The `nonewline' option interacts badly with `compress' and `split'. mmh-0.4/man/mh-profile.man50000644000000000000000000004362613414435726014257 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MH-PROFILE %manext5% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mh-profile \- user customization for the mmh message handler .SH DESCRIPTION Each user of .B mmh is expected to have a file named .I $HOME/.mmh/profile in his or her home directory. This file contains a set of user parameters used by some or all of the .B mmh family of programs. Each entry in the file is of the format .PP .RS 5 .IR Profile\-Component ": " value .RE .PP If the text of profile entry is long, you may extend it across several real lines by indenting the continuation lines with leading spaces or tabs. .SS "Standard Profile Entries" The possible profile components are exemplified below. The only mandatory entry is `Path:'. The others are optional; some have default values if they are not present. In the notation used below, (profile, default) indicates whether the information is kept in the user's .B mmh profile or .B mmh context, and indicates what the default value is. .PP .BR Path : Mail .RS 5 Sets the user's mail storage to `Mail'. This is the only mandatory profile entry. (profile, no default) .RE .PP .BR Context : context .RS 5 Declares the location of the .B mmh context file. This is overridden by the environment variable .BR $MMHC . See the .B HISTORY section below. (profile, default: $HOME/.mmh/context) .RE .PP .BR Current\-Folder : inbox .RS 5 Keeps track of the current open folder. (context, default: folder specified by `Inbox') .RE .PP .BR Inbox : inbox .RS 5 Defines the name of your default inbox. (profile, default: inbox) .RE .PP .BR Previous\-Sequence : .I pseq .RS 5 Names the sequence or sequences which should be defined as the `msgs' or `msg' argument given to any .B mmh command. If not present or empty, no such sequences are defined. Otherwise, for each name given, the sequence is first zero'd and then each message is added to the sequence. Read the .BR mh\-sequence (7) man page for the details about this sequence. (profile, no default) .RE .PP .BR Sequence\-Negation : \&! .RS 5 Defines the string which, when prefixed to a sequence name, negates that sequence. Hence, `!foo' means all those messages that are not a member of the sequence `foo'. To deactivate this mechanism, define Sequence\-Negation to an empty value. Read the .BR mh\-sequence (7) man page for the details. (profile, default: !) .RE .PP .BR Unseen\-Sequence : u .RS 5 Names the sequence or sequences which shall contain any unread messages. The commands .BR inc , .BR rcvstore , and .B show will add or remove messages from these sequences when they are incorporated or read. If defined with an empty value, no such sequences are defined. Otherwise, each message is added to, or removed from, each sequence name given. Read the .BR mh\-sequence (7) man page for the details about this sequence. (profile, default: u) .RE .PP .BR Mh\-Sequences : \&.mh_sequences .RS 5 The name of the file in each folder which defines public sequences. To disable the use of public sequences, leave the value portion of this entry blank. (profile, default: \&.mh_sequences) .RE .PP .BI atr\- seq \- folder : 172\0178\-181\0212 .RS 5 Keeps track of the private sequence called `seq' in the specified folder. Private sequences are generally used for read\-only folders. See the .BR mh\-sequence (7) man page for details about private sequences. (context, no default) .RE .PP .BR Editor : vi .RS 5 Defines the editor to be used by the commands .BR comp , .BR dist , .BR forw , and .BR repl . This profile entry overrides the $VISUAL and $EDITOR environment variables, but gets overridden by the $MMHEDITOR environment variabel. (profile, default: vi) .RE .PP .BR Pager : more .RS 5 This is the program used by .B mhl to page the .B mhl formatted message when displaying to a terminal. It is also the default program used by .B show to display message bodies (or message parts) of type text/plain. This profile entry overrides the $PAGER environment variable, but gets overridden by the $MMHPAGER environment variable. (profile, default: more) .RE .PP .BR Sendmail : /usr/sbin/sendmail .RS 5 The path name to the .B sendmail program, used by .BR spost to send mail. (profile, default: %sendmailpath%) .RE .PP .BR Attachment-Header : Attach .RS 5 The (pseudo) header in draft messages, that contains files to be attached to the message on sending. If you like to type a lot, name it `X-MH-Attachment'. (profile, default: `Attach') .RE .PP .BR Sign-Header : Sign .RS 5 The (pseudo) header in draft messages, that requests the message to be signed automatically by .BR send , using .BR mhsign . If you like to type a lot, name it `X-MH-Sign-This-Message'. (profile, default: `Sign') .RE .PP .BR Enc-Header : Enc .RS 5 The (pseudo) header in draft messages, that requests the message to be signed and encrypted by .BR send , using .BR mhsign . If you like to type a lot, name it `X-MH-Encrypt-This-Message'. (profile, default: `Enc') .RE .PP .BR Mime-Type-Query : file \-b \-\-mime .RS 5 A command that prints the MIME type of a given file. The file name is appended to the command line. Note: Older versions of file(1) won't generate the desired output. file-4.26, for instance, omits a required semicolon. file-5.04 is known to work. Alternatively, you can use .BR print\-mimetype , which is part of mmh, but guesses MIME types by file name extensions only. .RE .PP .BR Msg\-Protect : 0644 .RS 5 An octal number which defines the permission bits for new message files. See .BR chmod (1) for an explanation of the octal number. (profile, default: 0600) .RE .PP .BR Folder\-Protect : 0750 .RS 5 An octal number which defines the permission bits for new folder directories. See .BR chmod (1) for an explanation of the octal number. (profile, default: 0700) .RE .PP .IR program : .I default switches .RS 5 Sets default switches to be used whenever the mmh program .I program is invoked. For example, one could override the `Editor:' profile component when replying to messages by adding a component such as: .PP .RS 5 repl: \-editor /bin/ed .RE .PP (profile, no defaults) .RE .PP .IB lasteditor "-next:" .I nexteditor .RS 5 Names `nexteditor' to be the default editor after using `lasteditor'. This takes effect at `What now?' prompt in .BR comp , .BR dist , .BR forw , and .BR repl . After editing the draft with `lasteditor', the default editor is set to be `nexteditor'. If the user types `edit' without any arguments to `What now?', then `nexteditor' is used. (profile, no default) .RE .PP .BR Folder\-Stack : .I folders .RS 5 The contents of the folder-stack for the .B folder command. (context, no default) .RE .PP .BR Alternate\-Mailboxes : mh@uci\-750a, bug-mh* .RS 5 Tells .B repl and .B scan which addresses are really yours. In this way, .B repl knows which addresses should be included in the reply, and scan knows if the message really originated from you. Addresses must be separated by a comma, and the hostnames listed should be the `official' hostnames for the mailboxes you indicate, as local nicknames for hosts are not replaced with their official site names. For each address, if a host is not given, then that address on any host is considered to be you. In addition, an asterisk (`*') may appear at either or both ends of the mailbox and host to indicate wild-card matching. (profile, default: your user-id) .RE .PP .BR Default-From : Philipp Takacs .RS 5 Tells .B spost which address to use, if the draft dosn't contain a .RI ` From ' Header or the draft is not from the user. (profile, no default) .RE .PP .BR Aliasfile : aliases .I other-alias .RS 5 Indicates aliases files for .BR ali , .BR send . and .BR spost . (profile, no default) .RE .PP .BR Draft\-Folder : drafts .RS 5 Changes the default draft folder. Read the .BR mh\-draft (7) man page for details. (profile, default: +drafts) .RE .PP .BR Trash\-Folder : trash .RS 5 Changes the default folder for removed messages. Read the .BR rmm (1) man page for details. (profile, default: +trash) .RE .PP .BI digest\-issue\- list : 1 .RS 5 Tells .B forw the last issue of the last volume sent for the digest .IR list . (context, no default) .RE .PP .BI digest\-volume\- list : 1 .RS 5 Tells .B forw the last volume sent for the digest .IR list . (context, no default) .RE .PP .BR MailDrop : \&.mail .RS 5 Tells .B inc your maildrop, if different from the default. This is superseded by the environment variable .BR $MAILDROP . (profile, default: %mailspool%/$USER) .RE .PP .BR Signature : RAND MH System (agent: Marshall Rose) .RS 5 Tells .B send your mail signature. This is superseded by the environment variable .BR $SIGNATURE . If .B $SIGNATURE is not set and this profile entry is not present, the `gcos' field of the \fI/etc/passwd\fP file will be used. Your signature will be added to the address .B send puts in the `From:' header; do not include an address in the signature text. (profile, no default) .RE .PP .BR Metafile-Extention : \&.meta .RS 5 This extions will be used to store meta information about a mail or a draft. Currently only implemented by whatnow2. (profile, no default) .RE .SS "Process Profile Entries" The following profile elements are used whenever an .B mmh program invokes some other program such as .BR more . The profile can be used to select alternate programs if the user wishes. The default values are given in the examples. .RE .PP .BR listproc : show .RS 5 This program is used to list the contents of a message in response to the .B list and .B display directive at the `What now?' prompt. The absolute pathname of the message to list will be appended to the command line given. .RE .PP .BR whatnowproc : %bindir%/whatnow .RS 5 This is the program invoked by .BR comp , .BR forw , .BR dist , and .B repl to query about the disposition of a composed draft message. .RE .SS "Environment Variables" The operation of .B mmh and its commands it also controlled by the presence of certain environment variables. .PP Many of these environment variables are used internally by the `What now?' interface. It's amazing all the information that has to get passed via environment variables to make the `What now?' interface look squeaky clean to the .B mmh user, isn't it? The reason for all this is that the .B mmh user can select .B any program as the .IR whatnowproc , including one of the standard shells. As a result, it's not possible to pass information via an argument list. The convention is that environment variables whose names are all upper-case are user-settable; those whose names are lower-case only are used internally by mmh and should not generally be set by the user. .PP If the .B WHATNOW option was set during .B mmh configuration, and if this environment variable is set, then if the commands .BR refile\ , .BR send or .BR show are not given any `msgs' arguments, then they will default to using the file indicated by .BR mh\-draft (7). This is useful for getting the default behavior supplied by the default .IR whatnowproc . .PP .B $MMH .RS 5 With this environment variable, you can specify an alternative mmh directory. Personal mmh configuration files are located relative to the mmh directory. Non-absolute values are relative to the home directory. This is one of the very few exceptions in .B mmh where non-absolute pathnames are not considered relative to the user's mmh directory. .RE .PP .B $MMHP .RS 5 With this environment variable, you can specify a profile other than .I $HOME/.mmh/profile to be read by the .B mmh programs that you invoke. If the value of .B $MMHP is not absolute, it will be presumed to start from the mmh directory. .RE .PP .B $MMHC .RS 5 With this environment variable, you can specify a context other than the normal context file (as specified in the profile). As always, unless the value of .B $MMHC is absolute, it will be presumed to start from your mmh directory. .RE .PP .B $MM_CHARSET .RS 5 With this environment variable, you can specify the native character set you are using. You must be able to display this character set on your terminal. .PP This variable is checked to see if a RFC-2047 header field should be decoded (in .BR inc , .BR scan , .BR mhl ). This variable is checked by .B show to see if the .I showproc or .I showmimeproc should be called, since showmimeproc will be called if a text message uses a character set that doesn't match .BR $MM_CHARSET . This variable is checked by .B show for matches against the charset parameter of text contents to decide it the text content can be displayed without modifications to your terminal. This variable is checked by .B mhbuild to decide what character set to specify in the charset parameter of text contents containing 8\-bit characters. .PP When decoding text in such an alternate character set, .B mmh must be able to determine which characters are alphabetic, which are control characters, etc. For many operating systems, this will require enabling the support for locales (such as setting the environment variable .B $LC_CTYPE to iso_8859_1). .RE .PP .B $MAILDROP .RS 5 This variable tells .B inc the default maildrop. This supersedes the `MailDrop' profile entry. .RE .PP .B $SIGNATURE .RS 5 This variable tells .B send and .B post your mail signature. This supersedes the `Signature' profile entry. .RE .PP .B $HOME .RS 5 This variable tells all .B mmh programs your home directory .RE .PP .B $SHELL .RS 5 This variable tells .B bbl the default shell to run .RE .PP .B $MMHEDITOR .br .B $VISUAL .br .B $EDITOR .RS 5 These variables (in descending priority) define the default editor to use. .RE .PP .B $MMHPAGER .br .B $PAGER .RS 5 These variables (in descending priority) define the default pager to use. .RE .PP .B $TERM .RS 5 This variable tells .B mmh your terminal type. .PP The environment variable .B $TERMCAP is also consulted. In particular, these tell .B scan and .B mhl how many columns wide your terminal is. They also tell .B mhl how many lines long your terminal screen is. .RE .PP .B $mhdraft .RS 5 This is the path to the working draft. .PP This is set by .BR comp , .BR dist , .BR forw , and .B repl to tell the .I whatnowproc which file to ask `What now?' questions about. .RE .PP .B $mhaltmsg .RS 5 .B dist and .B repl set .B $mhaltmsg to tell the .I whatnowproc about an alternate message associated with the draft (the message being distributed or replied to). It is also set during edit sessions so you can peruse the message being distributed or replied to. This variable replaces the older .B $editalt variable. There used to be a link named `@' in the working directory, pointing to the alternate message, there is no such link anymore. .RE .PP .B $mhdist .RS 5 .B dist sets .B $mhdist to tell the .I whatnowproc that message re-distribution is occurring. .RE .PP .B $mheditor .RS 5 This is set by .BR comp , .BR repl , .BR forw , and .B dist to tell the .I whatnowproc the user's choice of editor (unless overridden by .BR \-noedit ). .RE .PP .B $mhuse .RS 5 This may be set by .BR comp . .RE .PP .B $mhmessages .RS 5 This is set by .BR dist , .BR forw , and .B repl if annotations are to occur. .RE .PP .B $mhannotate .RS 5 This is set by .BR dist , .BR forw , and .B repl if annotations are to occur. .RE .PP .B $mhfolder .RS 5 This is the folder containing the alternate message. .PP This is set by .B dist and .B repl during edit sessions so you can peruse other messages in the current folder besides the one being distributed or replied to. .RE .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh~^The user's mmh directory ^or $MMH~^Rather than the standard mmh directory .sp ^$HOME/.mmh/profile~^The user's profile ^or $MMHP~^Rather than the standard profile .sp ^$HOME/.mmh/context~^The user's context ^or $MMHC~^Rather than the standard context .sp ^/.mh_sequences~^Public sequences for .fi .SH "SEE ALSO" nmh(1), environ(5), mh-sequence(7) .SH HISTORY The .I $HOME/.mmh/profile contains only static information, which .B mmh programs will .B NOT update. Changes in context are made to the .I $HOME/.mmh/context file. This includes, but is not limited to: the `Current\-Folder' entry and all private sequence information. Public sequence information is kept in each folder in the file determined by the `Mh\-Sequences' profile entry (default is .IR \&.mh_sequences ). .PP The profile may override the path of the .I context file, by specifying a `Context' entry. As a result, you can actually have more than one set of private sequences by using different context files. .SH BUGS The shell quoting conventions are not available in the profile. Each token is separated by whitespace. .PP There is some question as to what kind of arguments should be placed in the profile as options. In order to provide a clear answer, recall command line semantics of all .B mmh programs: conflicting switches (e.g. .B \-header and .BR \-noheader ) may occur more than one time on the command line, with the last switch taking effect. Other arguments, such as message sequences, filenames and folders, are always remembered on the invocation line and are not superseded by following arguments of the same type. Hence, it is safe to place only switches (and their arguments) in the profile. .PP If one finds that an .B mmh program is being invoked again and again with the same arguments, and those arguments aren't switches, then there are a few possible solutions to this problem. The first is to create a (soft) link in your .I $HOME/bin directory to the .B mmh program of your choice. By giving this link a different name, you can create a new entry in your profile and use an alternate set of defaults for the .B mmh command. Similarly, you could create a small shell script which called the .B mmh program of your choice with an alternate set of invocation line switches (using links and an alternate profile entry is preferable to this solution). .PP Finally, the .B csh user could create an alias for the command of the form: .PP .RS 5 alias cmd 'cmd arg1 arg2 ...' .RE .PP In this way, the user can avoid lengthy type-in to the shell, and still give .B mmh commands safely. (Recall that some .B mmh commands invoke others, and that in all cases, the profile is read, meaning that aliases are disregarded beyond an initial command invocation) mmh-0.4/man/fprev.man10000644000000000000000000000001713414435726013316 0ustar rootroot.so man1/new.1 mmh-0.4/man/mmh.man10000644000000000000000000000311313414435726012755 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MMH %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mmh \- initialize the mmh environment .SH SYNOPSIS .HP 5 .na .B mmh .RB [ \-check ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .PP The command .B mmh creates the initial setup for a first\-time .B mmh user. .PP .B (For an introduction to the mmh system, see mmh\-intro(7).) .PP First, the mmh directory .I $HOME/.mmh is created. .PP Then the user is asked to name a directory that will be designated as the user's mail storage. If this directory does not exist, the user is asked if it should be created. Normally, this directory should be under the user's home directory. The default is \fI$HOME/Mail\fP. .PP Afterwards, .B mmh writes an initial .I $HOME/.mmh/profile for the user, containing only the path to the mail storage. If the profile is already present, the user is asked to edit it. .PP The \fB\-c\fP option can be used to check whether or not mmh has been installed. This can be used by other programs without having knowledge about the internals of mmh. .SH "ENVIRONMENT VARIABLES" .fc ^ ~ .nf .ta \w'VeryLongName 'u ^$MMH~^Overrides the user's mmh directory path ^$MMHP~^Overrides the user's profile path .fi .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh~^The user's mmh directory ^$HOME/.mmh/profile~^The user's profile ^$HOME/.mmh/context~^The user's context ^$HOME/Mail~^The user's mail storage .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To set the user's mail storage .fi .SH CONTEXT None .SH "SEE ALSO" mmh\-intro(7) mmh-0.4/man/sendfiles.man10000644000000000000000000000231413414435726014152 0ustar rootroot.\" .\" %nmhwarning% .\" .TH SENDFILES %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME sendfiles \- send multiple files in a MIME message .SH SYNOPSIS .HP 5 .na .B sendfiles .I recipient .I subject .IR file ... .ad .SH DESCRIPTION The program .BR sendfiles , is used to send a collection of files via electronic mail. .B sendfiles will mail the files in one message with the given `subject' to the `recipient'. Take care not to generate too large messages, as there usually are size limits enforced by the MTAs. .PP To extract received files, use .B mhstore . .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/FileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" None .SH "SEE ALSO" send(1), mhlist(1), mhstore(1). .SH CONTEXT None .SH HISTORY .PP This is a new and simpler version of .B sendfiles , which directly invokes .B send . The old one had invoked .B viamail . The old version had been able to send whole directories, by automatically tarballing them. This new version is not able to do so. The old man page had described some kind of automatical splitting of large content into `message/partial' parts. However, it appears as if this had been removed earlier, only its documentation remained. mmh-0.4/man/Makefile.in0000644000000000000000000001227613414435726013475 0ustar rootroot# # Makefile for man subdirectory # DATE = @DATE@ SHELL = /bin/sh top_srcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ VERSION = `$(top_srcdir)/version.sh $(top_srcdir)` prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ etcdir = @sysconfdir@ datarootdir = @datarootdir@ mandir = @mandir@ manext1 = 1 manext5 = 5 manext7 = 7 manext8 = 8 mailspool = @mailspool@ sendmailpath = @sendmailpath@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ SED = sed SEDMAN = $(SED) -f man.sed $< > $@ .SUFFIXES: .SUFFIXES: .man1 .man5 .man7 .man8 \ .$(manext1) .$(manext5) .$(manext7) .$(manext8) .man1.$(manext1): $(SEDMAN) .man5.$(manext5): $(SEDMAN) .man7.$(manext7): $(SEDMAN) .man8.$(manext8): $(SEDMAN) # man pages to install in $(mandir)/$(manext1) MAN1SRC = ali. anno. burst. comp. dist. flist. flists. folder. folders. \ forw. inc. mark. mhbuild. mhl. mhlist. mhsign. mhpgp. mmh. mmhwrap. \ mhmail. mhparam. mhpath. mhstore. new. fnext. \ fprev. unseen. next. packf. pick. prev. prompter. rcvdist. rcvpack. \ rcvstore. refile. repl. rmf. rmm. scan. send. sendfiles. \ show. slocal. sortm. whatnow. whom. whatnow2. MAN5SRC = mh-alias. mh-format. mh-mail. mh-profile. MAN7SRC = mmh-intro. mh-chart. mh-draft. mh-sequence. MAN8SRC = spost. ap. dp. fmtdump. MAN1 = $(MAN1SRC:.=.$(manext1)) MAN5 = $(MAN5SRC:.=.$(manext5)) MAN7 = $(MAN7SRC:.=.$(manext7)) MAN8 = $(MAN8SRC:.=.$(manext8)) ALLPROGS = $(MAN1) $(MAN8) # ========= DEFAULT TARGET ========== all: $(MAN1) $(MAN5) $(MAN7) $(MAN8) mh-chart.man7: $(ALLPROGS) $(srcdir)/mh-chart-gen.sh $(ALLPROGS) >$@ titles: $(srcdir)/gettitles.sh $(srcdir) 1 >titles1.temp $(srcdir)/gettitles.sh $(srcdir) 5 >titles5.temp $(srcdir)/gettitles.sh $(srcdir) 7 >titles7.temp $(srcdir)/gettitles.sh $(srcdir) 8 >titles8.temp $(MAN1) $(MAN5) $(MAN7) $(MAN8): man.sed # create the sed file for building man pages man.sed: Makefile titles @echo 's,%nmhwarning%,THIS FILE HAS BEEN AUTOMATICALLY GENERATED. DO NOT EDIT.,g' > $@ @echo 's,%nmhversion%,'$(VERSION)',g' >> $@ @echo 's,%nmhdate%,$(DATE),g' >> $@ @echo 's,%bindir%,$(bindir),g' >> $@ @echo 's,%etcdir%,$(etcdir),g' >> $@ @echo 's,%libdir%,$(libdir),g' >> $@ @echo 's,%mandir%,$(mandir),g' >> $@ @echo 's,%mailspool%,$(mailspool),g' >> $@ @echo 's,%sendmailpath%,$(sendmailpath),g' >> $@ @echo 's,%manext1%,$(manext1),g' >> $@ @echo 's,%manext5%,$(manext5),g' >> $@ @echo 's,%manext7%,$(manext7),g' >> $@ @echo 's,%manext8%,$(manext8),g' >> $@ @echo '/%components%/r $(top_srcdir)/etc/components' >> $@ @echo ' s,%components%,,g' >> $@ @echo '/%distcomps%/r $(top_srcdir)/etc/distcomps' >> $@ @echo ' s,%distcomps%,,g' >> $@ @echo '/%forwcomps%/r $(top_srcdir)/etc/forwcomps' >> $@ @echo ' s,%forwcomps%,,g' >> $@ @echo '/%mhl_forward%/r $(top_srcdir)/etc/mhl.forward' >> $@ @echo ' s,%mhl_forward%,,g' >> $@ @echo '/%mhl_format%/r $(top_srcdir)/etc/mhl.format' >> $@ @echo ' s,%mhl_format%,,g' >> $@ @echo '/%mhl_reply%/r $(top_srcdir)/etc/mhl.reply' >> $@ @echo ' s,%mhl_reply%,,g' >> $@ @echo '/^%titles1%$$/r titles1.temp' >> $@ @echo '/^%titles5%$$/r titles5.temp' >> $@ @echo '/^%titles7%$$/r titles7.temp' >> $@ @echo '/^%titles8%$$/r titles8.temp' >> $@ @echo '/^%titles[0-9]%$$/d' >> $@ # ========= INSTALL TARGETS ========= install: install-man1 install-man5 install-man7 install-man8 # install the man pages in man1 install-man1: mkdir -p $(DESTDIR)$(mandir)/man$(manext1) for file in $(MAN1); do \ $(INSTALL_DATA) $$file $(DESTDIR)$(mandir)/man$(manext1) ; \ done # install the man pages in man5 install-man5: mkdir -p $(DESTDIR)$(mandir)/man$(manext5) for file in $(MAN5); do \ $(INSTALL_DATA) $$file $(DESTDIR)$(mandir)/man$(manext5) ; \ done # install the man pages in man7 install-man7: mkdir -p $(DESTDIR)$(mandir)/man$(manext7) for file in $(MAN7); do \ $(INSTALL_DATA) $$file $(DESTDIR)$(mandir)/man$(manext7) ; \ done # install the man pages in man8 install-man8: mkdir -p $(DESTDIR)$(mandir)/man$(manext8) for file in $(MAN8); do \ $(INSTALL_DATA) $$file $(DESTDIR)$(mandir)/man$(manext8) ; \ done # ========= UNINSTALL TARGETS ========= uninstall: uninstall-man1 uninstall-man5 uninstall-man7 uninstall-man8 # uninstall the man pages in man1 uninstall-man1: for file in $(MAN1); do \ rm -f $(DESTDIR)$(mandir)/man$(manext1)/$$file; \ done # uninstall the man pages in man5 uninstall-man5: for file in $(MAN5); do \ rm -f $(DESTDIR)$(mandir)/man$(manext5)/$$file; \ done # uninstall the man pages in man7 uninstall-man7: for file in $(MAN7); do \ rm -f $(DESTDIR)$(mandir)/man$(manext7)/$$file; \ done # uninstall the man pages in man8 uninstall-man8: for file in $(MAN8); do \ rm -f $(DESTDIR)$(mandir)/man$(manext8)/$$file; \ done # ========== DEPENDENCIES FOR CLEANUP ========== mostlyclean: rm -f *~ clean: mostlyclean rm -f $(MAN1) $(MAN5) $(MAN7) $(MAN8) rm -f man.sed mh-chart.man7 rm -f titles[0-9].temp distclean: clean rm -f Makefile realclean: distclean superclean: realclean lint: # ========== DEPENDENCIES FOR MAINTENANCE ========== subdir = man Makefile: Makefile.in ../config.status cd .. && ./config.status $(subdir)/$@ mmh-0.4/man/inc.man10000644000000000000000000001152713414435726012755 0ustar rootroot.\" .\" %nmhwarning% .\" .TH INC %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME inc \- incorporate new mail .SH SYNOPSIS .HP 5 .na .B inc .RI [ +folder ] .RB [ \-audit .IR audit\-file ] .RB [ \-noaudit ] .RB [ \-changecur " | " \-nochangecur ] .RB [ \-form .IR formfile ] .RB [ \-file .IR name ] .RB [ \-silent " | " \-nosilent ] .RB [ \-truncate " | " \-notruncate ] .RB [ \-width .IR columns ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Inc incorporates mail from the user's incoming mail drop into an .B mh folder. .PP You may specify which folder to use with .IR +folder . If no folder is specified, then .B inc will use either the folder given by a (non\-empty) .RI ` Inbox ' entry in the user's profile, or the folder named .RI ` inbox '. If the specified (or default) folder doesn't exist, the user will (in .B \-nosilent mode) be queried prior to its creation. .PP When the new messages are incorporated into the folder, they are assigned numbers starting with the next highest number for the folder. As the messages are processed, a .B scan listing of the new mail is produced. .PP If the user's profile contains a .RI ` "Msg\-Protect: nnn" ' entry, it will be used as the protection on the newly created messages, otherwise the .B mmh default of 0644 will be used. For all subsequent operations on these messages, this initially assigned protection will be preserved. .PP If the switch .B \-audit .I audit\-file is specified (usually as a default switch in the profile), then .B inc will append a header line and a line per message to the end of the specified audit\-file with the format: .PP .RS 5 .nf <> date .fi .RE .PP This is useful for keeping track of volume and source of incoming mail. Eventually, .BR repl , .BR forw , .BR comp , and .B dist may also produce audits to this (or another) file, perhaps with .RI ` Message\-Id ' information to keep an exact correspondence history. .RI ` Audit\-file ' will be in the current directory unless a full path is specified. .PP .B Inc will incorporate even improperly formatted messages into the user's mh folder, inserting a blank line prior to the offending component and printing a comment identifying the bad message. .PP In all cases, the user's mail drop will be zeroed, unless the .B \-notruncate switch is given. .PP If the profile entry .RI ` Unseen\-Sequence ' is present and non\-empty, then .B inc will add each of the newly incorporated messages to each sequence named by the profile entry. .B Inc will not zero each sequence prior to adding messages. .PP The interpretation of the .B \-form .IR formatfile , and .B \-width .I columns switches is the same as in .BR scan . .PP By using the .B \-file .I name switch, one can direct .B inc to incorporate messages from a file other than the user's maildrop. In particular, if .I name is .RI ` - ' then .B inc will read messages from standard input. Note that the named file will NOT be zeroed, unless the .B \-truncate switch is given. .PP If the environment variable .B $MAILDROP is set, then .B inc uses it as the location of the user's maildrop instead of the default (the .B -file .I name switch still overrides this, however). If this environment variable is not set, then .B inc will consult the profile entry .RI ` MailDrop ' for this information. If the value found is not absolute, then it is interpreted relative to the user's .B mh directory. If the value is not found, then .B inc will look in the standard system location for the user's maildrop. .PP The .B \-silent switch directs .B inc to be quiet and not ask any questions at all. This is useful for putting .B inc in the background and going on to other things. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile ^%mailspool%/$USER~^Location of mail drop .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Alternate\-Mailboxes:~^To determine the user's mailboxes ^Inbox:~^To determine the inbox, default `inbox' ^Folder\-Protect:~^To set mode when creating a new folder ^Msg\-Protect:~^To set mode when creating a new message and audit\-file ^Unseen\-Sequence:~^To name sequences denoting unseen messages .fi .SH "SEE ALSO" scan(1), mh\-mail(5) .SH DEFAULTS .nf .RB ` +folder "' defaulted by `Inbox' above" .RB ` \-noaudit ' .RB ` \-changecur ' .RB ` \-form "' defaulted as described above" .RB ` \-nosilent ' .RB ` \-truncate "' if `" \-file " name' not given, `" \-notruncate "' otherwise" .RB ` \-width "' defaulted to the width of the terminal" .fi .SH CONTEXT The folder into which messages are being incorporated will become the current folder. The first message incorporated will become the current message, unless the .B \-nochangecur option is specified. This leaves the context ready for a .B show of the first new message. mmh-0.4/man/refile.man10000644000000000000000000000664113414435726013453 0ustar rootroot.\" .\" %nmhwarning% .\" .TH REFILE %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME refile \- file messages in other folders .SH SYNOPSIS .HP 5 .na .B refile .RI [ msgs ] .RB [ \-link " | " \-nolink ] .RB [ \-src .IR +folder ] .RB [ \-file .IR file ] .I +folder1 \&... .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Refile moves (see .BR mv (1)) or links (see .BR ln (1)) messages from a source folder into one or more destination folders. .PP If you think of a message as a sheet of paper, this operation is not unlike filing the sheet of paper (or copies) in file cabinet folders. When a message is filed, it is linked into the destination folder(s) if possible, and is copied otherwise. As long as the destination folders are all on the same file system, multiple filing causes little storage overhead. This facility provides a good way to cross\-file or multiply\-index messages. For example, if a message is received from Jones about the ARPA Map Project, the command .PP .RS 5 refile\0c\0+jones\0+Map .RE .PP would allow the message to be found in either of the two folders `jones' or `Map'. .PP You may specify the source folder using .B \-src .IR +folder . If this is not given, the current folder is used by default. If no message is specified, then the current message is used by default. .PP The option .B \-file .I file directs .B refile to use the specified file as the source message to be filed, rather than a message from a folder. Note that the file should be a validly formatted message, just like any other .B mh message. It should .B NOT be in mail drop format (to convert a file in mail drop format to a folder of .B mh messages, see .BR inc (1)). .PP If a destination folder doesn't exist, .B refile will ask if you want to create it. A negative response will abort the file operation. If the standard input for .B refile is .B not a tty, then .B refile will not ask any questions and will proceed as if the user answered `yes' to all questions. .PP The option .B \-link preserves the source folder copy of the message (i.e., it does a .BR ln (1) rather than a .BR mv (1)), whereas, .B \-nolink (the default) deletes the filed messages from the source folder. No backups are kept, because the contents don't vanish. They are only moved to a new location. To restore: refile the other way. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Current\-Folder:~^To find the default current folder ^Folder\-Protect:~^To set mode when creating a new folder .fi .SH "SEE ALSO" folder(1), rmf(1), rmm(1) .SH DEFAULTS .nf .RB ` "\-src\ \fI+folder\fP" "' defaults to the current folder" .RB ` msgs "' defaults to the current message" .RB ` \-nolink ' .fi .SH CONTEXT If .B \-link is specified, the current message in the source folder will be set to the last message specified; otherwise, the current message won't be changed. .PP If the `Previous\-Sequence' profile entry is set, in addition to defining the named sequences from the source folder, .B refile will also define those sequences for the destination folders. See .B mh\-sequence (7) for information concerning the previous sequence. .SH HISTORY Since mmh-0.3, .B refile does never change the current folder. (It used to change it when .BI \-src\ +folder was given, but this behavior had usability disadvantages.) mmh-0.4/man/dp.man80000644000000000000000000000312613414435726012612 0ustar rootroot.\" .\" %nmhwarning% .\" .TH DP %manext8% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME dp \- parse dates 822-style .SH SYNOPSIS .HP 5 .na .B %libdir%/dp .RB [ \-form .IR formatfile ] .RB [ \-Version ] .RB [ \-help ] .I dates \&... .ad .SH DESCRIPTION .B Dp is a program that parses dates according to the ARPA Internet standard. It also understands many non\-standard formats, such as those produced by TOPS\-20 sites and some UNIX sites using .BR ctime (3). It is useful for seeing how .B mmh will interpret a date. .PP The .B dp program treats each argument as a single date, and prints the date out in the official 822\-format. Hence, it is usually best to enclose each argument in double\-quotes for the shell. .PP To override the output format used by .BR dp , the .B \-form .I file switch is used. This permits individual fields of the address to be extracted with ease. The .I file is either the name of a format file or a format string directly, if prepended with an equal sign `='. See .BR mh\-format (5) for the details. .PP Here is the default format string used by .BR dp : .PP .RS 5 .nf %<(nodate{text})error: %{text}%|%(putstr(pretty{text}))%> .fi .RE .PP which says that if an error was detected, print the error, a `:', and the date in error. Otherwise, output the 822\-proper format of the date. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" None .SH "SEE ALSO" ap(8), .I "Standard for the Format of ARPA Internet Text Messages" (RFC\-822) .SH DEFAULTS .nf .RB ` \-form "' default as described above" .fi .SH CONTEXT None mmh-0.4/man/whatnow2.man10000644000000000000000000000550313414435726013752 0ustar rootroot.\" .\" %nmhwarning% .\" .TH WHATNOW %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME whatnow2 \- front-end for handling drafts .SH SYNOPSIS .HP 5 .na .B whatnow .RI [ command .RB | \-Version ] .RB | \-help ] .ad .SH DESCRIPTION .B Whatnow is the default program that queries the user about the disposition of a composed draft. It is normally automatically invoked by one of the .B mmh commands .BR comp , .BR dist , .BR forw , or .B repl after the initial edit. .PP When started, the editor is started on the draft. Then, .B whatnow can called with one of the commands. .PP .RS 5 .TP \w'refilezzzzfolderz'u .B edit re\-edit using the same editor that was used on the preceding round unless a profile entry `\-next: ' names an alternate editor .TP \w'refilezzzzfolderz'u .B edit invoke for further editing .TP \w'refilezzzzfolderz'u .B list list the draft on the terminal .TP \w'refilezzzzfolderz'u .B display list the message being distributed/replied\-to on the terminal .TP \w'refilezzzzfolderz'u .B whom list the recipients of the message .TP \w'refilezzzzfolderz'u .B send send the message .TP \w'refilezzzzfolderz'u .B refile +folder refile the draft into the given folder .TP \w'refilezzzzfolderz'u .B delete delete the draft and exit .TP \w'refilezzzzfolderz'u .B attach files add the named files to the draft as MIME attachments .TP \w'refilezzzzfolderz'u .B alist list the MIME attachments .TP \w'refilezzzzfolderz'u .B detach numbers remove MIME attachments by number .RE .PP When entering your response, you need only type enough characters to uniquely identify the response. .PP For the .B edit response, any valid switch to the editor is valid. .PP For the .B send response, any valid switch to .BR send (1) is valid. .PP For the .B refile response, any valid switch to .B refile is valid. .PP See .BR mh\-profile (5) for further information about how editors are used by .BR mmh . It also discusses how environment variables can be used to direct .BR whatnow 's actions in complex ways. .PP If the initial edit fails, no new draft is created, but any existing re-used draft is preserved. Failures of later edits are ignored and another prompt is printed. .PP Consult the .BR mh-draft (7) man page for more information. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile ^+drafts~^The draft folder .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Draft\-Folder:~^To set the default draft\-folder ^Editor:~^To override the default editor ^Metafile\-Extension:~^The optional extion for meta information like lasteditor ^\-next:~^To name an editor to be used after exit ^~^from ^listproc:~^Program to list the contents of a message .fi .SH "SEE ALSO" send(1) .SH CONTEXT None mmh-0.4/man/mhlist.man10000644000000000000000000000734613414435726013510 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MHLIST %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mhlist \- list information about MIME messages .SH SYNOPSIS .HP 5 .na .B mhlist .RI [ +folder ] .RI [ msgs ] .RB [ \-file .IR file ] .RB [ \-part .IR number ] \&... .RB [ \-type .IR content ] \&... .RB [ \-verbose " | " \-noverbose ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION The .B mhlist command allows you to list information (essentially a table of contents) about the various parts of a collection of MIME (multi-media) messages. .PP .B mhlist manipulates MIME (multi-media messages) as specified in RFC\-2045 thru RFC\-2049 (See .BR mhbuild (1)). .PP A one-line banner is displayed above the listing. The size of the `native' (decoded) format of each content is evaluated. This provides an accurate count at the expense of a small delay. If the .B \-verbose switch is present, then the listing will show any `extra' information that is present in the message, such as comments in the `Content-Type' header. .PP The option .B \-file .I file directs .B mhlist to use the specified file as the source message, rather than a message from a folder. If you specify this file as `-', then .B mhlist will accept the source message on the standard input. Note that the file, or input from standard input should be a validly formatted message, just like any other .B mh message. It should .B NOT be in mail drop format (to convert a file in mail drop format to a folder of .B mh messages, see .BR inc (1)). .PP By default, .B mhlist will list information about the entire message (all of its parts). By using the .B \-part and .B \-type switches, you may limit the scope of this command to particular subparts (of a multipart content) and/or particular content types. .PP A part specification consists of a series of numbers separated by dots. For example, in a multipart content containing three parts, these would be named as 1, 2, and 3, respectively. If part 2 was also a multipart content containing two parts, these would be named as 2.1 and 2.2, respectively. Note that the .B \-part switch is effective for only messages containing a multipart content. If a message has some other kind of content, or if the part is itself another multipart content, the .B \-part switch will not prevent the content from being acted upon. .PP A content specification consists of a content type and a subtype. The initial list of `standard' content types and subtypes can be found in RFC\-2046. .PP A list of commonly used contents is briefly reproduced here: .PP .RS 5 .nf .ta \w'application 'u Type Subtypes ---- -------- text plain, enriched multipart mixed, alternative, digest, parallel message rfc822, partial, external-body application octet-stream, postscript image jpeg, gif, png audio basic video mpeg .fi .RE .PP A legal MIME message must contain a subtype specification. .PP To specify a content, regardless of its subtype, just use the name of the content, e.g., `audio'. To specify a specific subtype, separate the two with a slash, e.g., `audio/basic'. Note that regardless of the values given to the .B \-type switch, a multipart content (of any subtype listed above) is always acted upon. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Current\-Folder:~^To find the default current folder .fi .SH "SEE ALSO" mhbuild(1), show(1), mhstore(1), sendfiles(1) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder" .RB ` msgs "' defaults to the current message" .RB ` \-noverbose ' .fi .SH CONTEXT If a folder is given, it will become the current folder. The last message selected will become the current message. mmh-0.4/man/rcvpack.man10000644000000000000000000000220713414435726013630 0ustar rootroot.\" .\" %nmhwarning% .\" .TH RCVPACK %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME rcvpack \- asynchronously append message to mbox file .SH SYNOPSIS .HP 5 .na .B rcvpack .RI [ file ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION The .B rcvpack program will read a message on standard in, convert it and append it to the mbox file listed on the command line. .PP The RFC 822 message is converted to the mbox format. This is the format used by most mail clients (elm, mailx, etc.). For the nitpickers: It's the mboxo format. .PP .B rcvpack will correctly lock and unlock the file to serialize access to the file, when running multiple copies of .B rcvpack . .PP If no .I file argument is given, the converted message is printed to standard out. No locking will be done in this case. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u .fi .SH "SEE ALSO" rcvdist(1), rcvstore(1), slocal(1), packf(1) .SH HISTORY Some people say that this tool would be obsoleted by the .B file action of .BR slocal , although it might still have occasional uses in various shell scripts. .SH BUGS Only two return codes are meaningful, others should be. mmh-0.4/man/mhpath.man10000644000000000000000000000605713414435726013467 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MHPATH %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mhpath \- print full pathnames of mh messages and folders .SH SYNOPSIS .HP 5 .na .B mhpath .RI [ +folder ] .RI [ msgs ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B mhpath expands and sorts the message list `msgs' and writes the full pathnames of the messages to the standard output separated by newlines. If no `msgs' are specified, .B mhpath outputs the current mail folder's pathname instead. If the only argument is `+', your mail storage location (`Path') is output; this can be useful in shell scripts. .PP Contrasted with other .B mmh commands, a message argument to .B mhpath may often be intended for writing. Because of this: .PP .IP 1) 4 the name `b' has been added to .BR mhpath 's list of reserved message names (the others are `f', `l', `p', `n', `c', and `a'). The `b' (beyond) message is equivalent to the message after the last message in a folder (and equivalent to 1 in a folder without messages). The `b' message may not be used as part of a message range. .IP 2) 4 Within a message list, the following designations may refer to messages that do not exist: a single numeric message name, the single message name `c', and (obviously) the single message name `b'. All other message designations must refer to at least one existing message, if the folder contains messages. .IP 3) 4 An empty folder is not in itself an error. .PP Message numbers greater than the highest existing message in a folder as part of a range designation are replaced with the next free message number. .PP Examples: The current folder foo contains messages 3 5 6. Cur is 4. .PP .RS 5 .nf % mhpath /r/phyl/Mail/foo % mhpath a /r/phyl/Mail/foo/3 /r/phyl/Mail/foo/5 /r/phyl/Mail/foo/6 % mhpath 2001 /r/phyl/Mail/foo/7 % mhpath 1\-2001 /r/phyl/Mail/foo/3 /r/phyl/Mail/foo/5 /r/phyl/Mail/foo/6 % mhpath b /r/phyl/Mail/foo/7 % mhpath l b /r/phyl/Mail/foo/6 /r/phyl/Mail/foo/7 % mhpath l\-b bad message list `l\-b'. % mhpath c /r/phyl/Mail/foo/4 % mhpath 1\-2 no messages in range `1\-2'. % mhpath f:2 /r/phyl/Mail/foo/3 /r/phyl/Mail/foo/5 % mhpath 1 2 /r/phyl/Mail/foo/1 /r/phyl/Mail/foo/2 .fi .RE .PP .B mhpath is also useful in back\-quoted operations: .PP .RS 5 .nf % cd `mhpath +inbox` % echo `mhpath +` /r/phyl/Mail .fi .RE .PP .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Current\-Folder:~^To find the default current folder .fi .SH "SEE ALSO" folder(1) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder" .RB ` msgs "' defaults to none" .fi .SH CONTEXT None .SH BUGS Like all .B mmh commands, .B mhpath expands and sorts .RI [ msgs ]. So don't expect .PP .RS 5 .nf mv `mhpath 501 500` .fi .RE .PP to move 501 to 500. Quite the reverse. But .PP .RS 5 .nf mv `mhpath 501` `mhpath 500` .fi .RE .PP will do the trick. .PP Out of range message 0 is treated far more severely than large out of range message numbers. mmh-0.4/man/rmf.man10000644000000000000000000000467713414435726013000 0ustar rootroot.\" .\" %nmhwarning% .\" .TH RMF %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME rmf \- remove an mh folder .SH SYNOPSIS .HP 5 .na .B rmf .RI [ +folder ] .RB [ \-interactive " | " \-nointeractive ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Rmf removes all of the messages (files) within the specified (or default) folder, and then removes the folder (directory) itself. .PP If there are any files within the folder which are not a part of .BR mmh , they will .B not be removed, and an error will be produced. If the folder is given explicitly or the .B \-nointeractive option is given, then the folder will be removed without confirmation. Otherwise, the user will be asked for confirmation. If .B rmf can't find the current folder, for some reason, the folder to be removed defaults to `+inbox' (unless overridden by user's profile entry `Inbox') with confirmation. .PP If the folder being removed is a subfolder, the parent folder will become the new current folder, and .B rmf will produce a message telling the user this has happened. This provides an easy mechanism for selecting a set of messages, operating on the list, then removing the list and returning to the current folder from which the list was extracted. .PP If .B rmf s used on a read\-only folder, it will delete all the (private) sequences (i.e., .RI `atr\- seq \- folder ' entries) for this folder from your context without affecting the folder itself. .PP .B Rmf irreversibly deletes messages that don't have other links, so use it with caution. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Current\-Folder:~^To find the default current folder ^Inbox:~^To find the default inbox .fi .SH "SEE ALSO" rmm(1) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder, usually with confirmation" .RB ` \-interactive "' if +folder' not given, `\-nointeractive' otherwise" .fi .SH CONTEXT .B Rmf will set the current folder to the parent folder if a subfolder is removed; or if the current folder is removed, it will make `inbox' current. Otherwise, it doesn't change the current folder or message. .SH BUGS Although intuitively one would suspect that .B rmf works recursively, it does not. Hence if you have a sub\-folder within a folder, in order to .B rmf the parent, you must first .B rmf each of the children. mmh-0.4/man/repl.man10000644000000000000000000002350413414435726013144 0ustar rootroot.\" .\" %nmhwarning% .\" .TH REPL %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME repl \- reply to a message .SH SYNOPSIS .HP 5 .na .B repl .RI [ +folder ] .RI [ msgs ] .RB [ \-annotate " | " \-noannotate ] .RB [ \-group " | " \-nogroup ] .RB [ \-cc all/to/cc/me] .RB [ \-nocc all/to/cc/me] .RB [ \-query " | " \-noquery ] .RB [ \-form .IR formfile ] .RB [ \-filter .IR filterfile .RB " | " \-nofilter ] .RB [ \-mime " | " \-nomime ] .RB [ \-editor .IR editor ] .RB [ \-whatnowproc .IR program ] .RB [ \-build ] .RB [ \-file .IR msgfile ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Repl may be used to produce a reply to an existing message. .PP In its simplest form (with no arguments), .B repl will set up a message\-form skeleton in reply to the current message in the current folder, and invoke the whatnow shell. .PP In order to construct the message draft of the reply, .B repl uses a reply template to guide its actions. A reply template is simply a .B mhl format file (see .BR mh\-format (5) for details). .PP If the switch .B \-nogroup is given (it is on by default), then .B repl will use the standard forms file `replcomps'. This will construct a draft message that is intended to be sent only to the author of the message to which you are replying. If a file named `replcomps' exists in the user's .B mmh directory, it will be used instead of this default forms file. .PP The default reply template `replcomps' will direct .B repl to construct the reply message draft as follows: .PP .RS 5 .nf To: or or Cc: and and Fcc: +sent Subject: Re: In\-Reply\-To: References: Comments: In\-Reply\-To or or .ti +3 message dated -------- .fi .RE .PP where field names enclosed in angle brackets (<\ >) indicate the contents of the named field from the message to which the reply is being made. .PP By default, the `Cc:' field is empty. You may selectively add addresses to this default with the .B \-cc .I type switch. This switch takes an argument ( .IR all / to / cc / me ) which specifies who gets added to the default `Cc:' list of the reply. You may give this switch multiple times (with different arguments) if you wish to add multiple types of addresses. .PP If the switch .B \-group is given, then .B repl will use the the standard forms file `replgroupcomps'. This will construct a draft message that is intended as a group or followup reply. If a file named `replgroupcomps' exists in the user's mmh directory, it will be used instead of this default forms file. .PP The default group reply template `replgroupcomps' will direct .B repl to construct the reply message draft as follows: .PP .RS 5 .nf To: Subject: Re: In\-Reply\-To: Message from of . .ti +\w'In\-Reply\-To: 'u -------- .fi .RE .PP or if the field is not available: .PP .RS 5 .nf To: or or Cc: and and Subject: Re: In\-Reply\-To: Message from of . .ti +\w'In\-Reply\-To: 'u -------- .fi .RE .PP By default, the `Cc:' contains all the addresses shown. You may selectively remove addresses from this default with the .B \-nocc .I type switch. This switch takes an argument ( .IR all / to / cc / me ) which specifies who gets removed from the default `Cc:' list of the reply. You may give this switch multiple times (with different arguments) if you wish to remove multiple types of addresses. .PP In any case, you may specify an alternate forms file with the switch .B \-form .IR formfile . .PP The .B \-query switch modifies the action of .B \-nocc .I type switch by interactively asking you if each address that normally would be placed in the `To:' and `Cc:' list should actually be sent a copy. This is useful for special\-purpose replies. Note that the position of the .B \-cc and .B \-nocc switches, like all other switches which take a positive and negative form, is important. .PP Lines beginning with the fields `To:', `Cc:', and `Bcc:' will be standardized and have duplicate addresses removed. In addition, these fields will be wrapped at a reasonable length. .PP See .BR comp (1) for a description of the .B \-editor switch. Note that while in the editor, the actual pathname of the message being replied to is stored in the environment variable .BR $mhaltmsg , and the pathname of the folder containing the message is stored in the environment variable .BR $mhfolder . .PP Although .B repl uses a forms file to direct it how to construct the beginning of the draft, it uses a message filter file to direct it as to how the message to which you are replying should be filtered (re\-formatted) in the body of the draft. The filter file for .B repl should be a standard form file for .BR mhl , as .B repl will invoke .B mhl to format the message to which you are replying. .PP By default, the original message gets filtered through a default message filter file and then included into the draft body as quotation. This should be adequate for most users. This default filter .RI ` mhl.reply ' is: .PP .RS 5 .nf %mhl_reply% .fi .RE .PP which outputs each line of the body of the message prefaced with the `>' character and a space. If a file named .RI ` mhl.reply ' exists in the user's .B mmh directory, it will be used instead of this form. .PP You may specify an alternate message filter file with the switch .B \-filter .IR filterfile . .PP Other reply filters are commonly used, such as: .PP .RS 5 .nf : body:nocomponent,compwidth=9,offset=9 .fi .RE .PP which says to output a blank line and then the body of the message being replied\-to, indented by one tab\-stop. Another popular format is: .PP .RS 5 .nf message-id:nocomponent,\|nonewline,\\ formatfield=`In message %{text},\ ' from:nocomponent,\|formatfield=`%(decode(friendly{text})) writes:' body:component=`>',\|overflowtext=`>',\|overflowoffset=0 .fi .RE .PP This message filter file cites the Message-ID and author of the message being replied\-to, and then outputs each line of the body prefaced with the `>' character. .PP If the switch .B \-nofilter is given, then the message to which you are replying will not be formatted and thus not included in the body of the draft. (It may be added as MIME attachment with .B \-mime though.) .PP To MIME-attach the original message, specify the .B \-mime switch. Note: In mmh, the \-mime switch is unrelated to the \-filter and \-nofilter switches. It is therefore possible to have the original message quoted in the body .B and attached as MIME part. However, using the \-mime switch is discouraged. It may get removed in the future. .PP If the .B \-annotate switch is given, the message being replied\-to will be annotated with the line: .PP .RS 5 .nf Replied:\ date .fi .RE .PP The annotation will be done only if the message is sent directly from .BR repl . If the message is not sent immediately from .BR repl , .RB ` "comp\ \-use" ' may be used to re\-edit and send the constructed message, but the annotations won't take place. Annotations are always done inplace in order to preserve any links to the message. .PP The default template specifies that a copy of the reply will be put in the folder 'sent'. .PP To avoid reiteration, .B repl strips any leading `Re: ' strings from the .I subject component. .PP Consult the .BR mh-draft (7) man page for more information. .PP Upon exiting from the editor, .B repl will invoke the .B whatnow program. See .BR whatnow (1) for a discussion of available options. .PP The .B \-build switch is intended to be used by the Emacs mh-e interface to .BR nmh . It causes a file .I reply (in the mail storage root) to be created, containing the draft message that would normally be presented to the user for editing. No .B whatnow program is invoked. No mail is actually sent. .PP The .B \-file .I msgfile switch specifies the message to be replied to as an exact filename rather than as an .B mh folder and message number. It is intended to be used by the .B msh interface to .BR nmh . The same caveats apply to this option as to the .B \-build switch. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^%etcdir%/replcomps~^The standard reply template ^or $HOME/.mmh/replcomps~^Rather than the standard template ^%etcdir%/replgroupcomps~^The standard `reply \-group' template ^or $HOME/.mmh/replgroupcomps~^Rather than the standard template ^%etcdir%/mhl.reply~^The standard message filter ^or $HOME/.mmh/mhl.reply~^Rather than the standard filter ^$HOME/.mmh/profile~^The user profile ^+drafts~^The draft folder .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Alternate\-Mailboxes:~^To determine the user's mailboxes ^Current\-Folder:~^To find the default current folder ^Draft\-Folder:~^To set the default draft\-folder ^Editor:~^To override the default editor ^Msg\-Protect:~^To set mode when creating a new message (draft) ^whatnowproc:~^Program to ask the `What now?' questions .fi .SH "SEE ALSO" mhbuild(1), comp(1), forw(1), send(1), whatnow(1), mh\-format(5) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder" .RB ` msg "' defaults to the current message" .RB ` \-nogroup ' .RB ` "\-nocc\ all" "' with `\-nogroup', `\-cc\ all' with `\-group'" .RB ` \-noannotate ' .RB ` \-nomime ' .RB ` \-noquery ' .fi .SH CONTEXT If a folder is given, it will become the current folder. The message replied\-to will become the current message. .SH BUGS If any addresses occur in the reply template, addresses in the template that do not contain hosts are defaulted incorrectly. Instead of using the localhost for the default, .B repl uses the sender's host. Moral of the story: if you're going to include addresses in a reply template, include the host portion of the address. .PP The quotation of the original message does not get transfer-decoded, yet. mmh-0.4/man/folders.man10000644000000000000000000000002213414435726013626 0ustar rootroot.so man1/folder.1 mmh-0.4/man/mhmail.man10000644000000000000000000000515113414435726013447 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MHMAIL %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mhmail \- send mail (mailx replacement) .SH SYNOPSIS .HP 5 .na .B mhmail .IR addrs ... .RB [ \-cc .IR addrs ...] .RB [ \-from .IR addr ] .RB [ \-subject .IR subject ] .RB [ \-bodytext .IR text ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B mhmail is inspired by the standard Berkeley mail program .RB ( mail or .BR mailx ). It should not be seen as a drop-in replacement for these programs, but rather as a more convenient alternative to .B comp for non-interactive use. For interactive use, .B comp and .B send are recommended over .BR mhmail . .PP When one or more addresses are specified, a message is read from the standard input and spooled to a temporary file. .B mhmail then invokes .B spost to deliver the message. .PP .B mhmail can not be used for mal reading. Use .BR inc , .BR scan , .B show instead. .PP The .B \-subject .I subject switch can be used to specify the `Subject:' field of the message. .PP By default, .B mhmail will read the message to be sent from the standard input. The message is terminated by either end-of-file or by a single period alone on a line. This is compatible to .B mail and .BR mailx . Alternatively, you can specify the text of the message at the command line with the .B \-bodytext .I text switch. .PP If the standard input has zero length, .B mhmail will not send the message. You can use .B \-bodytext "" to force an empty message. .PP Normally, addresses appearing as arguments are put in the `To:' field. If the .B \-cc switch is used, all addresses following it are placed in the `Cc:' field. .PP By using .B \-from .IR addr , you can specify the `From:' header of the draft. Naturally, .B post will fill\-in the `Sender:' header correctly. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/BigFileName 'u ^/tmp/mhmail*~^Temporary copy of message .fi .SH "SEE ALSO" inc(1), scan(1), show(1), post(8) .SH DEFAULTS None .SH CONTEXT None .SH HISTORY .B mhmail was intended as a replacement for the standard Berkeley mail program .RB ( mail or .BR mailx ), which is compatible with .BR mmh . This program was intended for the use of programs such as .BR cron , which expect to send mail automatically to various addresses. It was also used by various .B mmh commands to mail various error notifications. .PP When invoked without arguments, it had once simply invoked .B inc to incorporate new messages from the user's maildrop. It does this no longer. .SH BUGS .B mhmail should no longer try to replace .BR mailx , but become a mail sending front-end to .B comp or .BR send , which is more convenient in some situations. mmh-0.4/man/mh-draft.man70000644000000000000000000000462613414435726013716 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MH-DRAFT %manext7% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mh-draft \- draft folder facility for mmh .SH DESCRIPTION There are a number of interesting advanced facilities for the composition of outgoing mail. .PP .SS "The Draft Folder" The .BR comp , .BR dist , .BR forw , and .B repl commands allow you to manipulate various draft messages simultanely .PP Draft messages are created in the draft folder. (The .RI ` Draft\-Folder ' profile entry may be used to change the default draft folder. .PP New drafts are created unless the user invokes .B comp with .BR \-use , in which case the current draft is used. .PP The last draft message the user was composing is the current message in the draft folder. .PP The user can send off whatever drafts desired from the shell using the standard .B mmh `msgs' convention to the .B send command: .PP .RS .nf send f .fi .RE .PP If no `msgs' are given, the current message is used. .PP To make all this a bit more clear, here are some examples: .RE .PP Any of the commands .PP .RS 5 .nf comp dist forw repl .fi .RE .PP constructs the message draft in the draft folder using the `b' message number. Furthermore, they each define `c' in this folder to be that message draft. If the user were to use the .B quit option at `What now?' level, then later on, if no other draft composition was done, the draft could be sent with simply .PP .RS 5 .nf send .fi .RE .PP Or, if more editing was required, the draft could be edited with .PP .RS 5 .nf comp \-use .fi .RE .PP Instead, if other drafts had been composed in the meantime, so that this message draft was no longer known as `c' in the `draft' folder, then the user could .B scan the folder to see which message draft in the folder should be used for editing or sending. Clever users could even employ a back-quoted .B pick to do the work: .PP .RS 5 .nf comp \-use `pick +drafts \-to nmh-workers` .fi .RE .PP or .PP .RS 5 .nf send `pick +drafts \-to nmh-workers` .fi .RE .PP Note that in the .B comp example, the output from .B pick must resolve to a single message draft (it makes no sense to talk about composing two or more drafts with one invocation of .BR comp ). In contrast, in the .B send example, as many message drafts as desired can appear, since .B send doesn't mind sending more than one draft at a time. .PP It is important to realize that .B mmh treats the draft folder like a standard .B MH folder. .SH CONTEXT None mmh-0.4/man/dist.man10000644000000000000000000000733213414435726013146 0ustar rootroot.\" .\" %nmhwarning% .\" .TH DIST %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME dist \- redistribute a message to additional addresses .SH SYNOPSIS .HP 5 .na .B dist .RI [ +folder ] .RI [ msgs ] .RB [ \-form .IR formfile ] .RB [ \-annotate " | " \-noannotate ] .RB [ \-editor .IR editor ] .RB [ \-whatnowproc .IR program ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Dist is similar to .BR forw . It prepares the specified message for redistribution to addresses that (presumably) are not on the original address list. .PP The default message form contains the following elements: .PP .RS 5 .nf %distcomps% .fi .RE .PP If a file named .RI ` distcomps ' exists in the user's mmh directory, it will be used instead of this default form. You may specify an alternate forms file with the switch .B \-form .IR formfile . The form used will be prepended to the message being resent. .PP Only those addresses in .RI ` Resent\-To: ', .RI ` Resent\-Cc: ', and .RI ` Resent\-Bcc: ' will be sent. Also, a .RI ` "Resent\-Fcc: folder" ' will be honored (see .BR send (1)). Note that with .BR dist , the draft should contain only .RI ` Resent\-xxx: ' fields and no body. The headers and the body of the original message are copied to the draft when the message is sent. Use care in constructing the headers for the redistribution. .PP If the .B \-annotate switch is given, the message being distributed will be annotated with the line: Resent:\ date This annotation will be done only if the message is sent directly from .BR dist . If the message is not sent immediately from .BR dist , .RB ` comp .BR \-use ' may be used to re\-edit and send the constructed message, but the annotations won't take place. Annotations are always done inplace in order to preserve any links to the message. .PP See .BR comp (1) for a description of the .B \-editor switch. Note that while in the editor, the actual pathname of the message being resent is stored in the environment variable .BR $mhaltmsg , and the pathname of the folder containing the message is stored in the environment variable .BR $mhfolder . .PP Consult the .BR mh-draft (7) man page for more information. .PP Upon exiting from the editor, .B dist will invoke the .B whatnow program. See .BR whatnow (1) for a discussion of available options. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^%etcdir%/distcomps~^The standard message skeleton ^or $HOME/.mmh/distcomps~^Rather than the standard skeleton ^$HOME/.mmh/profile~^The user profile ^+drafts~^The draft folder .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Current\-Folder:~^To find the default current folder ^Draft\-Folder:~^To set the default draft\-folder ^Editor:~^To override the default editor ^whatnowproc:~^Program to ask the `What now?' questions .fi .SH "SEE ALSO" comp(1), forw(1), repl(1), send(1), whatnow(1) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder" .RB ` msg "' defaults to the current message" .RB ` \-noannotate ' .fi .SH CONTEXT If a folder is given, it will become the current folder. The message distributed will become the current message. .SH HISTORY .B Dist originally used headers of the form .RI ` Distribute\-xxx: ' instead of .RI ` Resent\-xxx: '. In order to conform with the ARPA Internet standard, RFC\-822, the .RI ` Resent\-xxx: ' form is now used. Since .B mmh .B dist will no longer recognize and convert .RI ` Distribute\-xxx: ' type headers. .SH BUGS .B Dist does not rigorously check the message being distributed for adherence to the transport standard, but .B post called by .B send does. The .B post program will balk (and rightly so) at poorly formatted messages, and .B dist won't correct things for you. mmh-0.4/man/mmh-intro.man70000644000000000000000000001264613414435726014127 0ustar rootroot.\" .\" %nmhwarning% .\" .TH NMH %manext7% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mmh \- Introduction to the Modern MH message system .SH DESCRIPTION .B mmh is a powerful message handling system, based on .BR nmh , which in turn bases on MH, the Rand Corporation's Message Handler. .PP Rather than being a single comprehensive program, .B mmh consists of a collection of fairly simple single-purpose programs to send, retrieve, organize, and manipulate messages. .PP Unlike most other mail clients, .B mmh is not a closed system which must be explicitly run, then exited when you wish to return to the shell. Instead, you may freely intersperse .B mmh commands with other shell commands, allowing you to read and answer your mail while you search for a file or run programs as needed to find the answer to someone's question before answering their mail. .PP The rest of this manual entry is a quick tutorial which will teach you the basics of .BR mmh . You should read the manual entries for the individual programs for complete documentation. .PP To get started using .BR mmh , put the directory .I %bindir% on your .BR $PATH . This is best done in one of the files: .IR \&.profile , .IR \&.login , .IR \&.bashrc , or .I \&.cshrc in your home directory. (Check the manual entry for the shell you use, in case you don't know how to do this.) Then run the .B mmh command. If you've never used .B mmh before, it will create the necessary default files and directories after asking you if you wish it to do so. .PP .B inc moves mail from your system maildrop into your .B mmh `+inbox' folder, converting it to the MH format (one file per message). It prints one line for each message it processes, containing the date, from and subject fields. It leaves the first message it processes as your current message. You'll need to run .B inc each time you wish to incorporate new mail into your .B mmh mail storage. .PP .B scan prints a list of the messages in your current folder. .PP The commands: .BR show , .BR next , and .B prev are used to read specific messages from the current folder. .B show displays the current message, or a specific message, which may be specified by its number, which you pass as an argument to .BR show . .B next and .B prev display, respectively, the message numerically after or before the current message. In all cases, the message displayed becomes the current message. If there is no current message, .B show may be called with an argument, or .B next may be used to advance to the first message. .PP .B rmm (remove message) deletes the current message. It may be called with message numbers passed as arguments, to delete specific messages. .PP .B repl is used to respond to the current message (by default). It places you in the editor with a prototype response form. After completing your response, type .B li to .B list (review) it, or .B s to .B send it. .PP .B comp allows you to compose a fresh message by putting you in the editor on a prototype message form, and then lets you send it. .PP All the .B mmh commands may be run with the single argument: .BR \-help , which causes them to print a list of the arguments they may be invoked with and then exit. .PP Commands which take a message number as an argument .RB ( scan , .BR show , .BR repl , \&...) also take one of the letters: `f', `p', `c', `n', or `l' to indicate (respectively) the first, previous, current, next, or last message in the current folder (assuming they are defined). Commands which take a range of message numbers .RB ( rmm , .BR scan , .BR show , \&...) also take any of the abbreviations: .PP .RS 5 .IP \fI\fR\-\fI\fR 15 Indicates all messages in the range to , inclusive. The range must be nonempty. .IP \fI\fR:+\fIN\fR 15 .IP \fI\fR:\-\fIN\fR 15 Up to .I N messages beginning with (or ending with) message .IR num . .I Num may be any of the pre-defined symbols: .IR f , .IR p , .IR c , .I n or .IR l . .IP f:\fIN\fR 15 .IP p:\fIN\fR 15 .IP n:\fIN\fR 15 .IP l:\fIN\fR 15 The first, previous, next or last messages, if they exist. .RE .PP There are many other possibilities such as creating multiple folders for different topics, and automatically refiling messages according to subject, source, destination, or content. These are beyond the scope of this manual entry. .PP Following is a list of all the .B mmh commands: .PP .RS 5 .fc ^ ~ .nf .ta 1.7i %titles1% .sp %titles8% .fi .RE .PP The following man pages describe file formats and concepts: .PP .RS 5 .fc ^ ~ .nf .ta 1.7i %titles5% .sp %titles7% .RE .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/FileName 'u ^%bindir%~^contains \fImmh\fR commands ^%etcdir%~^contains \fImmh\fR format files ^%libdir%~^contains \fImmh\fR library commands ^$HOME/.mmh~^The user's mmh directory ^$HOME/.mmh/profile~^The user's profile ^$HOME/.mmh/context~^The user's context ^$HOME/Mail~^Default location of the user's mail storage .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'LongName 'u ^Path:~^Location of the user's mail storage .fi .SH HISTORY .B mmh is an experimental version of .BR nmh , the New Mail Handler. Its name ``mmh'' stands for ``meillo's mail handler''. .SH BUGS If you encounter problems with an .B mmh program, please report them. When doing this, include the version information, which you can obtain by invoking the program with the .B \-Version switch. .PP Send bug reports, comments, and suggestions to .I or to .IR "markus schnalke " . .SH "SEE ALSO" mmh(1) mh-chart(1) mmh-0.4/man/mhsign.man10000644000000000000000000000540713414435726013471 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MHSIGN %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mhsign \- sign or encrypt a message with gnupg .SH SYNOPSIS .HP 5 .na .B mhsign .RB [ \-encrypt ] .RB [ \-mime ] .RB [ \-Version ] .RB [ \-help ] .I file .ad .SH DESCRIPTION .B mhsign is a script to simplify signing and encrypting, using gnupg. .PP .B mhsign is normally invoked automatically by .BR send . When used directly, the source file, typically an MH draft file, is replaced by the signed or encrypted message. To permit recovery from mistakes, a backup copy of the original file is saved, under the same name with `.orig' appended. .PP The following options are recognized: .TP .B \-encrypt Encrypt to recipients, in addition to signing. The message will also be encrypted to the signing key. .TP .B \-mime Use the PGP/MIME standard for signing and encrypting. This is automatic if the message is already a multipart MIME message. Otherwise the default is to sign/encrypt in the old-fashioned non-MIME manner, for compatibility with older software. When a message is signed but not encrypted, using the PGP/MIME formatting, any line beginning with ``From '' will be indented, and any trailing spaces will be removed from lines in the message body. This is to ensure maximum compatibility. Where trailing blanks are important (sending patches, for example), it would be wise to use quoted-printable or other MIME encoding for that component. .PP The signing key is automatically determinded by gnupg, unless the the profile entry .IR Pgpkey defines it. The environment variable .IR MMHPGPKEY has highest precedence and can be used to overrule the key uid temporarily. .PP For encryption, the public keys of the recipients are taken from the gnupg keyring. To handle exceptions, e.g. recipient addresses that do not match the key uid in the keyring, a file named .I pgpkeys may be used. It should be located either in the gnupg directory (normally $HOME/.gnupg) or in the mmh directory (normally $HOME/.mmh). If both files exist, the one in the gnupg directory takes precedence. .PP A sample .I pgpkeys file: .sp .RS 5 .nf 0x88888888 john@nowhere.example.org e5fda812 meillo@marmaro.de .fi .RE .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.gnupg/pgpkeys~^Pubkey exceptions for encrypting ^$HOME/.mmh/pgpkeys~^... alternative location .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Pgpkey:~^To determine the user's signing key .fi .SH "SEE ALSO" whom(1), send(1), mhpgp(1), gpg(1), hostname(1) .SH DEFAULTS None .SH CONTEXT None .SH BUGS The order of the command line arguments is relevant: Options must come first, the file must be last. .PP This script uses .B hostname to get the hostname if it isn't in the address, though .B hostname isn't specified by POSIX. mmh-0.4/man/gettitles.sh0000755000000000000000000000032613414435726013764 0ustar rootroot#!/bin/sh cd $1 || exit 1 shift for i in *.man"$1" ; do sed -n ' /^.SH NAME/{ n s/^/^/ s/\([^ ]*\) \\-/\1('"$1"')~^\\-/ s/\([^ ]*\), \([^ ]*\)/\1('"$1"'),\n.br\n^ \2/ p q } ' "$i" done mmh-0.4/man/mh-mail.man50000644000000000000000000001421613414435726013532 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MH-MAIL %manext5% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mh-mail \- message format for mh message system .SH DESCRIPTION .B mmh processes messages in a particular format. It should be noted that although neither Bell nor Berkeley mailers produce message files in the format that .B mmh prefers, .B mmh can read message files in that antiquated format. .PP Each user possesses a system maildrop box which initially receives all messages delivered by the MTA. .B Inc will read from that maildrop and incorporate the new messages found there into the user's own mail folders (typically .RI ` +inbox '). .PP Messages are expected to consist of lines of text. Graphics and binary data are not directly handled. No data compression is accepted. All text is clear ASCII 7-bit data. .PP The general `memo' framework of RFC\-822 is used. A message consists of a block of information in a rigid format, followed by general text with no specified format. The rigidly formatted first part of a message is called the header, and the free-format portion is called the body. The header must always exist, but the body is optional. These parts are separated by an empty line, i.e., two consecutive newline characters. Within .B mmh , the header and body may be separated by a line consisting of dashes: .PP .RS 5 .nf %components% .fi .RE .PP The header is composed of one or more header items. Each header item can be viewed as a single logical line of ASCII characters. If the text of a header item extends across several real lines, the continuation lines are indicated by leading spaces or tabs. .PP Each header item is called a component and is composed of a keyword or name, along with associated text. The keyword begins at the left margin, may NOT contain spaces or tabs, may not exceed 63 characters (as specified by RFC\-822), and is terminated by a colon (`:'). Certain components (as identified by their keywords) must follow rigidly defined formats in their text portions. .PP The text for most formatted components (e.g., `Date:' and `Message\-Id:') is produced automatically. The only ones entered by the user are address fields such as `To:', `Cc:', etc. Internet addresses are assigned mailbox names and host computer specifications. The rough format is `local@domain', such as `bob@example.org'. Multiple addresses are separated by commas. A missing host/domain is assumed to be the local host/domain. .PP As mentioned above, a blank line (or a line of dashes) signals that all following text up to the end of the file is the body. No formatting is expected or enforced within the body. .PP Following is a list of header components that are considered meaningful to various .B mmh programs. .PP .BR Date : .RS 5 Added by .BR spost . Contains date and time of the message's entry into the mail transport system. .RE .PP .BR From : .RS 5 Added by .BR spost . Contains the address of the author or authors (may be more than one if a `Sender:' field is present). For a standard reply (using .BR repl , the reply address is constructed by checking the following headers (in this order): `Mail-Reply\-To:', `Reply\-To:', `From:', `Sender:'. .RE .PP .BR Mail\-Reply\-To : .RS 5 For a standard reply (using .BR repl ), the reply address is constructed by checking the following headers (in this order): `Mail-Reply\-To:', `Reply\-To:', `From:', `Sender:'. .RE .PP .BR Mail\-Followup\-To : .RS 5 When making a `group' reply (using .B repl .BR \-group ), any addresses in this field will take precedence, and no other reply address will be added to the draft. If this header is not available, then the return addresses will be constructed from the `Mail-Reply\-To:', or `Reply\-To:', or `From:', along with adding the addresses from the headers `To:', `Cc:', as well as adding your personal address. .RE .PP .BR Reply\-To : .RS 5 For a standard reply (using .BR repl ), the reply address is constructed by checking the following headers (in this order): `Mail-Reply\-To:', `Reply\-To:', `From:', `Sender:'. .RE .PP .BR Sender : .RS 5 Added by .B spost in the event that the message already has a `From:' line. This line contains the address of the actual sender. .RE .PP .BR To : .RS 5 Contains addresses of primary recipients. .RE .PP .BR Cc : .RS 5 Contains addresses of secondary recipients. .RE .PP .BR Bcc : .RS 5 Still more recipients. However, the `Bcc:' line is not copied onto the message as delivered, so these recipients are not listed. .B mmh uses an encapsulation method for blind copies, see .BR send (1) or .BR spost (8). .RE .PP .BR Fcc : .RS 5 Causes .B spost to copy the message into the specified folder for the sender, if the message was successfully given to the transport system. .RE .PP .BR Message\-ID : .RS 5 A unique message identifier added by the MTA. .RE .PP .BR Subject : .RS 5 Sender's commentary. It is displayed by .BR scan . .RE .PP .BR In\-Reply\-To : .RS 5 A commentary line added by .B repl when replying to a message. .RE .PP .BR Resent\-Date : .RS 5 Added when redistributing a message by .BR spost . .RE .PP .BR Resent\-From : .RS 5 Added when redistributing a message by .BR spost . .RE .PP .BR Resent\-To: .RS 5 New recipients for a message resent by .BR dist . .RE .PP .BR Resent\-Cc : .RS 5 Still more recipients. See `Cc:' and `Resent\-To:'. .RE .PP .BR Resent\-Bcc : .RS 5 Even more recipients. See `Bcc:' and `Resent\-To:'. .RE .PP .BR Resent\-Fcc : .RS 5 Copy resent message into a folder. See `Fcc:' and `Resent\-To:'. .RE .PP .BR Resent\-Message\-Id : .RS 5 A unique identifier glued on by the MTA. See `Message\-Id:' and `Resent\-To:'. .RE .PP The following non-standard header components are also meaningful to .B mmh tools: .PP .BR Attach : .RS 5 Annotation for .B send to attach the given file to the message being sent. .RE .PP .BR Replied : .RS 5 Annotation for .B repl under the .B \-annotate option. .RE .PP .BR Forwarded : .RS 5 Annotation for .B forw under the .B \-annotate option. .RE .PP .BR Resent : .RS 5 Annotation for .B dist under the .B \-annotate option. .RE .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^%mailspool%/$USER~^Location of mail drop .fi .SH "SEE ALSO" .I "Standard for the Format of ARPA Internet Text Messages (RFC\-822) .SH CONTEXT None mmh-0.4/man/fmtdump.man80000644000000000000000000000173113414435726013663 0ustar rootroot.\" .\" %nmhwarning% .\" .TH FMTDUMP %manext8% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME fmtdump \- decode mh format files .SH SYNOPSIS .HP 5 .na .B %libdir%/fmtdump .RB [ \-form .IR formatfile ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Fmtdump is a program that parses an .B mh format file and produces a pseudo-language listing of the how .B mmh interprets the file. This is useful when debugging a complicated format file. .PP The .B \-form .I formatfile switch may be used to specify a format file to read. It may also be a format string directly, if prepended with an equal sign `='. See .BR mh-format (5) for the details. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile ^%etcdir%/scan.default~^The default format file .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage .fi .SH "SEE ALSO" mh-format(5), mh-sequence(7) .SH CONTEXT None mmh-0.4/man/mark.man10000644000000000000000000001274713414435726013143 0ustar rootroot.\" .\" %nmhwarning% .\" .TH MARK %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME mark \- manipulate message sequences .SH SYNOPSIS .HP 5 .na .B mark .RI [ +folder ] .RI [ msgs ] .RB [ \-sequence .I name \&...] .RB [ \-add " | " \-delete ] .RB [ \-list ] .RB [ \-public " | " \-nopublic ] .RB [ \-zero " | " \-nozero ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION The .B mark command manipulates message sequences by adding or deleting message numbers from folder\-specific message sequences, or by listing those sequences and messages. .PP A message sequence is a keyword, just like one of the `reserved' message names, such as `f' or `n' (see mh-sequence(7)). Unlike the `reserved' message names, which have a fixed semantics on a per\-folder basis, the semantics of a message sequence may be defined, modified, and removed by the user. Message sequences are folder\-specific, e.g., the sequence name `seen' in the context of folder .RI ` +inbox ' need not have any relation whatsoever to the sequence of the same name in a folder of a different name. .PP Three action switches direct the operation of .BR mark . These switches are mutually exclusive: the last occurrence of any of them overrides any previous occurrence of the other two. .PP The .B \-add switch tells .B mark to add messages to sequences or to create a new sequence. For each sequence named via the .B \-sequence .I name argument (which must occur at least once) the messages named via .I msgs (which defaults to `c' if no .I msgs are given), are added to the sequence. The messages to be added need not be absent from the sequence. If the .B \-zero switch is specified, the sequence will be emptied prior to adding the messages. Hence, .B \-add .B \-zero means that each sequence should be initialized to the indicated messages, while .B \-add .B \-nozero means that each sequence should be appended to by the indicated messages. .PP The .B \-delete switch tells .B mark to delete messages from sequences, and is the dual of .BR \-add . For each of the named sequences, the named messages are removed from the sequence. These messages need not be already present in the sequence. If the .B \-zero switch is specified, then all messages in the folder are added to the sequence (first creating the sequence, if necessary) before removing the messages. Hence, .B \-delete .B \-zero means that each sequence should contain all messages except those indicated, while .B \-delete .B \-nozero means that only the indicated messages should be removed from each sequence. As expected, the command .RB ` mark .B \-sequence .I foo .B \-delete all' deletes the sequence `foo' from the current folder. .PP When creating or modifying sequences, you can specify the switches .B \-public or .B \-nopublic to force the new or modified sequences to be `public' or `private'. The switch .B \-public indicates that the sequences should be made `public'. These sequences will then be readable by all .B mmh users with permission to read the relevant folders. In contrast, the .B \-nopublic switch indicates that the sequences should be made `private', and will only be accessible by you. If neither of these switches is specified, then existing sequences will maintain their current status, and new sequences will default to `public' if you have write permission for the relevant folder. Check the .BR mh\-sequence (7) man page for more details about the difference between `public' and `private' sequences. .PP The .B \-list switch tells .B mark to list both the sequences defined for the folder and the messages associated with those sequences. .B Mark will list the name of each sequence given by .B \-sequence .I name and the messages associated with that sequence. If the sequence is private, this will also be indicated. If no sequence is specified by the .B \-sequence switch, then all sequences for this folder will be listed. The .B \-zero switch does not affect the operation of .BR \-list . .PP The current restrictions on sequences are: .PP .IP \(bu 2 The name used to denote a message sequence must consist of an alphabetic character followed by zero or more alphanumeric characters, and cannot be one of the (reserved) message names `c', `f', `l', `a', `n', `p', or `b'. .PP .IP \(bu 2 Only a certain number of sequences may be defined for a given folder. This number is usually limited to 29 (13 on small systems). (The +internal implementation relies on bitmasks, with some bits set aside +for internal use.) .PP .IP \(bu 2 Message ranges with user\-defined sequence names are restricted to the form `name:n', `name:+n', or `name:-n', and refer to the first or last `n' messages of the sequence `name', respectively. Constructs of the form `name1\-name2' are forbidden for user defined sequences. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Current\-Folder:~^To find the default current folder .fi .SH "SEE ALSO" flist(1), pick(1), mh-sequence(7) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder" .RB ` \-add "' if " \-sequence " is specified, " \-list " otherwise" .RB ` msgs "' defaults to `c' (or `a' if " \-list " is specified)" .RB ` \-nozero ' .SH CONTEXT If a folder is given, it will become the current folder. .SH "HELPFUL HINTS" Use .B flist to find folders with a given sequence, and .RB ` pick .I sequence .BR \-list ' to enumerate those messages in the sequence (such as for use by a shell script). mmh-0.4/man/forw.man10000644000000000000000000001113313414435726013152 0ustar rootroot.\" .\" %nmhwarning% .\" .TH FORW %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME forw \- forward messages .SH SYNOPSIS .HP 5 .na .B forw .RI [ +folder ] .RI [ msgs ] .RB [ \-annotate " | " \-noannotate ] .RB [ \-form .IR formfile ] .RB [ \-editor .IR editor ] .RB [ \-whatnowproc .IR program ] .RB [ \-build ] .RB [ \-Version ] .RB [ \-help ] .PP .HP 5 .B forw .RI [ +folder ] .RI [ msgs ] .RB [ \-digest .IR list ] .RB [ \-issue .IR number ] .RB [ \-volume .IR number ] [other\ switches\ for .BR forw ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Forw may be used to prepare a message containing other messages. .PP It constructs the new message from a forms (components) file, with a body composed of the message(s) to be forwarded. An editor is invoked as in .BR comp , and after editing is complete, the user is prompted before the message is sent. .PP The default message form contains the following elements: .PP .RS 5 .nf %forwcomps% .fi .RE .PP If a file named .RI ` forwcomps ' exists in the user's mmh directory, it will be used instead of this default form. You may also specify an alternate forms file with the switch .B \-form .IR formfile . .PP If the .B \-annotate switch is given, each message being forwarded will be annotated with the line: .PP .RS 5 .nf Forwarded:\ date .fi .RE .PP This annotation will be done only if the message is sent directly from .BR forw . If the message is not sent immediately from .BR forw , .RB ` comp .BR \-use ' may be used to re\-edit and send the constructed message, but the annotations won't take place. Annotations are always done inplace in order to preserve any links to the message. .PP See .BR comp (1) for a description of the .B \-editor switch. .PP .B Forw generates an attachment header field for the messages to be forwarded. .B Send will care to encapsulate them using MIME rules. .PP To send non-MIME forwarded messages, compose a new message (e.g. with .B comp ) and read in the output of: .PP .RS 5 mhl \-forwall \-form mhl.forward `mhpath .I MSGS... ` .RE .PP The .B \-editor .I editor switch indicates the editor to use for the initial edit. Upon exiting from the editor, .B comp will invoke the .B whatnow program. See .BR whatnow (1) for a discussion of available options. .PP The .B \-build switch is intended to be used by the Emacs mh-e interface to .BR nmh . It causes a file `draft' in the mail storage root to be created, containing the draft message that would normally be presented to the user for editing. No .B whatnow program is invoked. No mail is actually sent. .PP The .B \-digest .IR list , .B \-issue .IR number , and .B \-volume .I number switches implement a digest facility for .BR mmh . Specifying these switches enables and/or overloads the following escapes: .PP .RS 5 .nf .ta \w'Component 'u +\w'Escape 'u +\w'Returns 'u .I "Type Escape Returns Description component digest string Argument to `\-digest' function cur integer Argument to `\-volume' function msg integer Argument to `\-issue' .fi .RE .PP Consult the .I "Advanced Features" section of the .B nmh User's Manual for more information on making digests. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^%etcdir%/forwcomps~^The standard message skeleton ^or $HOME/.mmh/forwcomps~^Rather than the standard skeleton ^%etcdir%/digestcomps~^The message skeleton if `\-digest' is given ^or $HOME/.mmh/digestcomps~^Rather than the standard skeleton ^$HOME/.mmh/profile~^The user profile ^+drafts~^The draft folder .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Current\-Folder:~^To find the default current folder ^Draft\-Folder:~^To set the default draft\-folder ^Editor:~^To override the default editor ^Msg\-Protect:~^To set mode when creating a new message (draft) ^whatnowproc:~^Program to ask the `What now?' questions .fi .SH "SEE ALSO" mhbuild(1), comp(1), repl(1), send(1), whatnow(1), mh\-format(5), .I "Proposed Standard for Message Encapsulation" (RFC\-934) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder" .RB ` msgs "' defaults to the current message" .RB ` \-noannotate ' .fi .SH CONTEXT If a folder is given, it will become the current folder. The first message forwarded will become the current message. .SH BUGS When .B forw is told to annotate the messages it forwards, it doesn't actually annotate them until the draft is successfully sent. If from the .IR whatnowproc , you .B push instead of .BR send , it's possible to confuse .B forw by re\-ordering the file (e.g. by using .RB ` folder .BR \-pack ') before the message is successfully sent. .B Dist and .B repl don't have this problem. mmh-0.4/man/prompter.man10000644000000000000000000001123713414435726014052 0ustar rootroot.\" .\" %nmhwarning% .\" .TH PROMPTER %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME prompter \- prompting editor front-end for mmh .SH SYNOPSIS .HP 5 .na .B prompter .RB [ \-prepend " | " \-noprepend ] .RB [ \-rapid " | " \-norapid ] .RB [ \-body " | " \-nobody ] .I file .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Prompter is an editor front-end for .B mmh which allows rapid composition of messages. This program is not normally invoked directly by users but takes the place of an editor and acts as an editor front-end. It operates on an RFC-822 style message draft skeleton specified by .IR file , normally provided by the .B mmh commands .BR comp , .BR dist , .BR forw , or .BR repl . .PP .B Prompter is particularly useful when composing messages over slow network or modem lines. It is hardly invoked directly by the user. The commands .BR comp , .BR dist , .BR forw , and .B repl invoke .B prompter as an editor, either when invoked with .B \-editor .IR prompter , or by the profile entry `Editor:\ prompter', or when given the command .B edit prompter at the `What now?' prompt. .PP For each empty component .B prompter finds in the draft, the user is prompted for a response. An empty response will cause the whole component to be left out. Otherwise, a `\\' preceding the Newline will continue the response on the next line, allowing for multiline components. Continuation lines .B must begin with a space or tab. .PP Each non-empty component is copied to the draft and displayed on the terminal. .PP The start of the message body is denoted by a blank line or a line of dashes. Unless .B \-nobody is specified, the user is queried to enter the message body. If the body of the draft is non-empty, the typed-in text will be prepended or appended to the existing body, depending on the .B \-prepend and .B \-noprepend switches. In these cases, the prompt (which isn't written to the file) is .PP .RS 5 \-\-\-\-\-\-\-\-Enter additional text .RE .PP or (if .B \-prepend was given) .PP .RS 5 \-\-\-\-\-\-\-\-Enter initial text .RE .PP Message-body typing is terminated with an end-of-file (usually CTRL-D). At this point control is returned to the calling program, where the user is asked `What now?'. See .B whatnow (1) for the valid options to this query. .PP By using the .B \-nobody switch, the user is only queried to fill in header fields, but not to enter any body text. Note, that the .BR \-body and \-nobody switches had already existed already in .B nmh in undocumented/hidden form, but with a slightly different meaning. Back then, .B "prompter \-nobody would change the draft to have an empty body, by ignoring any existing body and not querying the user for body text. .PP By using the .B \-prepend switch, the user can add type-in to the beginning of the message body and have the rest of the body follow. With .B \-noprepend the typed-in text is appended to the message body. .PP By using the .B \-rapid switch, if the draft already contains text in the message-body, it is not displayed on the user's terminal. This is useful for low-speed terminals. .PP An interrupt (usually CTRL-C) during component typing will abort .B prompter and the .B mmh command that invoked it. An interrupt during message-body typing is equivalent to CTRL-D, for historical reasons and to avoid losing the typed-in message text. This means that .B prompter should finish up and exit, usually putting the user back to the Whatnow prompt. .PP The first non-flag argument to .B prompter is taken as the name of the draft file, and subsequent non-flag arguments are ignored. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile ^/tmp/prompter*~^Temporary copy of message .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u prompter\-next: The editor to be used on exit from \fBprompter\fP ^Msg\-Protect:~^To set mode when creating a new draft .fi .SH "SEE ALSO" comp(1), dist(1), forw(1), repl(1), whatnow(1) .SH DEFAULTS .nf .RB ` \-body ' .RB ` \-prepend ' .RB ` \-norapid ' .fi .SH CONTEXT None .SH "HELPFUL HINTS" The .B \-noprepend switch is particularly useful with .B comp .BR \-use . .PP The user may wish to link .B prompter under several names (e.g., `rapid') and give appropriate switches in the profile entries under these names (e.g., `rapid: \-rapid'). This facilitates invoking prompter differently for different .B mmh commands (e.g., `forw: \-editor rapid'). .PP Former .B mutt users might find it useful to create a shell script .B hprompter containing: .PP .RS 5 .nf prompter \-nobody \-rapid "$1" vi "$1" .fi .RE .LP and use that as the default editor for .B comp by adding a profile entry like: .PP .RS 5 .nf comp: \-editor hprompter .fi .RE mmh-0.4/man/flists.man10000644000000000000000000000002113414435726013473 0ustar rootroot.so man1/flist.1 mmh-0.4/man/comp.man10000644000000000000000000000634113414435726013140 0ustar rootroot.\" .\" %nmhwarning% .\" .TH COMP %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME comp \- compose a message .SH SYNOPSIS .HP 5 .na .B comp .RI [ +folder ] .RI [ msgs ] .RB [ \-form .IR formfile ] .RB [ \-use " | " \-nouse ] .RB [ \-editor .IR editor ] .RB [ \-whatnowproc .IR program ] .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Comp is used to create a new message to be mailed. It copies a message form to the draft being composed and then invokes an editor on the draft (unless the .B \-editor switch with an empty string argument is given, in which case the initial edit is suppressed). .PP The default message form contains the following elements: .PP .RS 5 .nf %components% .fi .RE .PP If a file named .RI ` components ' exists in the user's mmh directory, it will be used instead of this form. You may specify an alternate forms file with the switch .B \-form .IR formfile . .PP You may also start .B comp using the contents of an existing message as the form. If you supply a .I +folder or .I msg argument, that message will be used as the message form. You may not supply both a .B \-form .I formfile and a .I +folder or .I msg argument. The line of dashes or a blank line must be left between the header and the body of the message for the message to be identified properly when it is sent (see .BR send (1)). .PP The switch .B \-use directs .B comp to continue editing an already started message. That is, if a .B comp (or .BR dist , .BR repl , or .BR forw ) is terminated without sending the draft, the draft can be edited again via .RB ` comp .BR \-use '. If .B \-use is given, .I msg is located within the draft folder. A .I +folder argument is not allowed together with .BR \-use . .PP If the draft already exists, .B comp will ask you as to the disposition of the draft. A reply of .B quit will abort .BR comp , leaving the draft intact; .B replace will replace the existing draft with the appropriate form; .B list will display the draft; .B use will use the draft for further composition; and .B refile .I +folder will file the draft in the given folder, and give you a new draft with the appropriate form. (The .I +folder argument to .B refile is required.) .PP Consult the .BR mh-draft (7) man page for more information. .PP The .B \-editor .I editor switch indicates the editor to use for the initial edit. Upon exiting from the editor, .B comp will invoke the .B whatnow program. See .BR whatnow (1) for a discussion of available options. .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^%etcdir%/components~^The standard message skeleton ^or $HOME/.mmh/components~^Rather than the standard skeleton ^$HOME/.mmh/profile~^The user profile ^+drafts~^The draft folder .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Draft\-Folder:~^To set the default draft folder ^Editor:~^To override the default editor ^Msg\-Protect:~^To set mode when creating a new message (draft) ^whatnowproc:~^Program to ask the `What now?' questions .fi .SH "SEE ALSO" dist(1), forw(1), repl(1), send(1), whatnow(1), mh-profile(5) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder" .RB ` msg "' defaults to the current message" .RB ` \-nouse ' .fi .SH CONTEXT None mmh-0.4/man/ali.man10000644000000000000000000000433713414435726012752 0ustar rootroot.\" .\" %nmhwarning% .\" .TH ALI %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME ali \- list mail aliases .SH SYNOPSIS .HP 5 .na .B ali .RB [ \-file .IR aliasfile ]... .RB [ \-list " | " \-nolist ] .RB [ \-normalize " | " \-nonormalize ] .RB [ \-user " | " \-nouser ] .RB [ \-Version ] .RB [ \-help ] .RI [ aliases " ...]" .ad .SH DESCRIPTION .B Ali searches the named mail alias files for each of the given .IR aliases . It creates a list of addresses for those .IR aliases , and writes that list on standard output. If no arguments are given, .B ali outputs all alias entries. This can be used to check the format of the alias file for validity. .PP By default, when an alias expands to multiple addresses, the addresses are separated by commas and printed on as few lines as possible. If the .B \-list switch is specified, and an address expands to multiple addresses, each address will appear on a separate line. .PP The .B \-user switch directs .B ali to perform its processing in an inverted fashion: instead of listing the addresses that each given alias expands to, .B ali will list the aliases that expand to each given address. If the .B \-normalize switch is given, .B ali will try to track down the official hostname of the address. .PP If no .B \-file .I aliasfile is given, then the default alias files, as specified by the profile entry .RI ` Aliasfile ', will be read. If any alias files are given by .B \-file .I aliasfile switches, these will be read instead of the default alias files. Either the default alias files are read or the ones given at the command line, never both. .PP Each .I alias is processed as described in .BR mh\-alias (5). .SH FILES .fc ^ ~ .nf .ta \w'%etcdir%/ExtraBigFileName 'u ^$HOME/.mmh/profile~^The user profile ^/etc/passwd~^List of users ^/etc/group~^List of groups .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's mail storage ^Aliasfile:~^For default alias files .fi .SH "SEE ALSO" mh\-alias(5) .SH DEFAULTS .nf .RB ` \-nolist ' .RB ` \-nonormalize ' .RB ` \-nouser ' .fi .SH CONTEXT None .SH BUGS The .B \-user option with .B \-nonormalize is not entirely accurate, as it does not replace local nicknames for hosts with their official site names. mmh-0.4/man/prev.man10000644000000000000000000000002013414435726013142 0ustar rootroot.so man1/show.1 mmh-0.4/man/spost.man80000644000000000000000000001071213414435726013356 0ustar rootroot.\" .\" %nmhwarning% .\" .TH SPOST %manext8% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME spost \- feed a message to sendmail .SH SYNOPSIS .HP 5 .na .HP 5 .B spost .RB [ \-verbose " | " \-noverbose ] .I file .RB [ \-Version ] .RB [ \-help ] .ad .SH DESCRIPTION .B Spost is the program called by .B send to feed the message in .I file to .B sendmail for delivery. In fact, many of the features attributed to .B send in its manual page are performed by .BR spost , with .B send acting as a preprocessor. Thus, it is .B spost which parses the various header fields, appends `From:' and `Date:' lines, and finally feeds the message to the MTA. .B Spost will not normally be called directly by the user. .PP .B Spost searches the `To:', `Cc:', `Bcc:', `Dcc:', `Fcc:', and `Resent\-xxx:' header lines of the specified message for destination addresses, .PP .B Spost invokes .B sendmail with all recipients, except the blind ones (`Bcc:'), as command line arguments: .RS .B sendmail .B \-i .RB [ \-v ] .I recipients ... .RE .PP If a `Bcc:' field is encountered, its addresses will be used for delivery, and the `Bcc:' field will be removed from the message sent to sighted recipients. The blind recipients will receive a newly constructed message with a copy of the original message attached. MIME rules are used for encapsulation. .RB ( spost invokes .B send to send the Bcc message.) .PP If a `Dcc:' field is encountered, the field will be removed before sending the message. The Dcc recipient will receive the message as well, but without being mentioned in the recipient headers. .PP In contrast to Bcc, the Dcc recipient receives the same original message as all the sighted reciepients, whereas the Bcc recipient receives a special, newly constructed message, which contains the original message as an attachment. .PP Bcc is probably a good choice for a message with both sighted and invisible reciepients (e.g. inform someone privately about the message being sent). Dcc is probably a good choice for a message to a group of only invisible recipients (e.g. invite to a party). .PP The `Aliasfile' profile entry can be used to specify one or more files that spost should take aliases from. .PP Aliasing is done on any address field. Those are: `From:', `To:', `Cc:', `Bcc:' and `Dcc:', or the `Resent\-xxx:' versions of these fields. .PP The .B \-verbose switch enables informational messages. For example, the `\-v' switch will be added to the .B sendmail invocation. .PP If you specify a `From:' line manually in the message draft, it will be used as provided. If there is no `From:' line in the draft, .B spost uses the .RI ` Default-From ' profile entry, if set. Otherwise .B spost constructs the `From:' line from the user's login name and the full name from the GECOS field of the passwd file. An example is `From: Dan Harkless '. .PP If you set the .B $SIGNATURE environment variable. Its value overrides the full name from the GECOS field. .PP A `Sender:' header will be added in two cases. First, if the `From:' line given in the draft contains one or more addresses, of which none is the user's own one, as defined by .RI ` Alternate-Mailboxes '. (The sender address will then be determined equally as described above for the absent `From:' header.) Second, if the `From:' line contains multiple addresses, of which at least one is the user's own address. The first own address will be used as the sender address. .PP Note that this applies equally to `Resent\-From:' lines in messages sent with .BR dist . .PP .B Spost tries to fully qualify the addresses in every address field. Your MTA is supposed to add the correct domain, if there is none after aliasing. .PP The draft is filed to the folders in the Fcc headers by .BR refile . .SH FILES .fc ^ ~ .nf .ta \w'ExtraBigFileName 'u None .fi .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 3.5i .ta \w'ExtraBigProfileName 'u ^Aliasfile:~^For default alias files ^Default\-From:~^The default From header ^Alternate\-Mailboxes:~^The user's addresses ^Sendmail:~^The path name to the sendmail program. .fi .SH "SEE ALSO" send(1), mh\-mail(5), mh\-alias(5), mh\-tailor(5), refile(1), .I "Standard for the Format of ARPA Internet Text Messages" (RFC\-822) .SH DEFAULTS .nf .RB ` \-noverbose ' .fi .SH CONTEXT None .SH BUGS None .SH HISTORY The .B spost in mmh-0.1 used .BR sendmail 's .I -t flag to have .B sendmail extract the recipients from the message headers. Now, it passes the recipients as command line arguments. This provides better compatibility to other sendmail implementations. mmh-0.4/config.h.in0000644000000000000000000001200213414435727012664 0ustar rootroot/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to use dot based file locking. */ #undef DOT_LOCKING /* Define to use fnctl() based locking. */ #undef FCNTL_LOCKING /* Define to use flock() based locking. */ #undef FLOCK_LOCKING /* Define to 1 if `TIOCGWINSZ' requires . */ #undef GWINSZ_IN_SYS_IOCTL /* Define to 1 if you have the header file. */ #undef HAVE_CRYPT_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define if you have the iconv() function. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_ICONV_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_LANGINFO_H /* Define to 1 if you have the `lockfile' library (-llockfile). */ #undef HAVE_LIBLOCKFILE /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* Define to 1 if you have the `mbtowc' function. */ #undef HAVE_MBTOWC /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the `nl_langinfo' function. */ #undef HAVE_NL_LANGINFO /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if `d_type' is a member of `struct dirent'. */ #undef HAVE_STRUCT_DIRENT_D_TYPE /* Define to 1 if `tm_gmtoff' is a member of `struct tm'. */ #undef HAVE_STRUCT_TM_TM_GMTOFF /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STREAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_TERMCAP_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define to 1 if you have the header file. */ #undef HAVE_WCTYPE_H /* Define to 1 if you have the `wcwidth' function. */ #undef HAVE_WCWIDTH /* Define as const if the declaration of iconv() needs const. */ #undef ICONV_CONST /* Define to the header containing the declaration of `initgroups'. */ #undef INITGROUPS_HEADER /* Use the Linux _IO_*_ptr defines from . */ #undef LINUX_STDIO /* Directory to store dot-locking lock files. */ #undef LOCKDIR /* Define to use lockf() based locking. */ #undef LOCKF_LOCKING /* Define to 1 if you need to make `inc' set-group-id because your mail spool is not world writable. There are no guarantees as to the safety of doing this, but this #define will add some extra security checks. */ #undef MAILGROUP /* Define to enable support for multibyte character sets. */ #undef MULTIBYTE_SUPPORT /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if tgetent() accepts NULL as a buffer. */ #undef TGETENT_ACCEPTS_NULL /* Define to what tgetent() returns on success (0 on HP-UX X/Open curses). */ #undef TGETENT_SUCCESS /* Define to 1 if `struct winsize' requires . */ #undef WINSIZE_IN_PTEM /* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a `char[]'. */ #undef YYTEXT_POINTER /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `int' if doesn't define. */ #undef gid_t /* Define to `int' if does not define. */ #undef mode_t /* Define to `long int' if does not define. */ #undef off_t /* Define to `int' if does not define. */ #undef pid_t /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to `int' if doesn't define. */ #undef uid_t mmh-0.4/Makefile.in0000644000000000000000000001135613414435726012720 0ustar rootroot# # Makefile for top level of mmh distribution # SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ VPATH = @srcdir@ # mmh version VERSION = `sed q $(srcdir)/VERSION` # ========== USER CONFIGURATION SECTION ========== # # If `make' is executed in the directory containing this Makefile, # any changes made in this section will override the values of # these parameters in makefiles in any of the subdirectories. prefix = @prefix@ exec_prefix = @exec_prefix@ # location of standard commands bindir = @bindir@ # location of support binaries and scripts libdir = @libdir@ # location of mmh configuration and formats files etcdir = @sysconfdir@ # location of ... datarootdir = @datarootdir@ # location of man pages mandir = @mandir@ # location of incoming mail mailspool = @mailspool@ # location of mail transport agent sendmailpath = @sendmailpath@ CC = @CC@ CPPFLAGS = @CPPFLAGS@ DEFS = @DEFS@ @OURDEFS@ CFLAGS = @CFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ # ========== YOU SHOULDN'T HAVE TO CHANGE ANYTHING BELOW HERE ========== # flags passed to recursive makes in subdirectories MAKEDEFS = CC='$(CC)' CPPFLAGS='$(CPPFLAGS)' DEFS='$(DEFS)' \ CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' LIBS='$(LIBS)' \ prefix='$(prefix)' exec_prefix='$(exec_prefix)' bindir='$(bindir)' \ etcdir='$(etcdir)' libdir='$(libdir)' mandir='$(mandir)' \ mailspool='$(mailspool)' sendmailpath='$(sendmailpath)' INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ .SUFFIXES: # distribute all files that are under version control ... # ... plus (for convenience): DISTINCLUDE = config.h.in configure stamp-h.in sbr/dtimep.c ChangeLog # ... minus (git stuff): DISTEXCLUDE = .git .gitignore # Subdirectories with own Makefiles SUBDIRS = h config sbr uip etc man # ========== DEPENDENCIES FOR BUILDING AND INSTALLING ========== # default target all: config.h Makefile all-recursive all-recursive: for subdir in $(SUBDIRS); do \ (cd $$subdir && $(MAKE) $(MAKEDEFS) all) || exit 1; \ done install: all for subdir in $(SUBDIRS); do \ (cd $$subdir && $(MAKE) $(MAKEDEFS) $@) || exit 1; \ done uninstall: for subdir in $(SUBDIRS); do \ (cd $$subdir && $(MAKE) $(MAKEDEFS) $@) || exit 1; \ done # ========== DEPENDENCIES FOR CLEANUP ========== mostlyclean: mostlyclean-recursive mostlyclean-local clean: clean-recursive clean-local distclean: distclean-recursive distclean-local realclean: realclean-recursive realclean-local superclean: superclean-recursive superclean-local mostlyclean-local: rm -f *~ rm -rf autom4te.cache clean-local: mostlyclean-local distclean-local: clean-local rm -f Makefile config.h config.status config.log config.cache stamp-h distname ChangeLog realclean-local: distclean-local superclean-local: realclean-local cd $(srcdir) && rm -f config.h.in stamp-h.in configure mostlyclean-recursive clean-recursive distclean-recursive realclean-recursive superclean-recursive: for subdir in $(SUBDIRS); do \ target=`echo $@ | sed 's/-recursive//'`; \ (cd $$subdir && $(MAKE) $(MAKEDEFS) $$target) || exit 1; \ done # ========== DEPENDENCIES FOR MAINTENANCE ========== lint: for subdir in $(SUBDIRS); do \ ( cd $$subdir && $(MAKE) $(MAKEDEFS) lint ) || exit 1; \ done # ========== DEPENDENCIES FOR MAINTENANCE ========== Makefile: Makefile.in config.status ./config.status $@ config.status: configure VERSION ./config.status --recheck configure: configure.ac cd $(srcdir) && autoconf config.h: stamp-h stamp-h: config.h.in config.status ./config.status config.h stamp config.h.in: stamp-h.in stamp-h.in: configure.ac cd $(srcdir) && autoheader date > $@ # rebuild all autoconf files reset: cd $(srcdir) && autoheader cd $(srcdir) && autoconf cd $(srcdir) && date > stamp-h.in # name of new mmh distribution tar file tarfile = mmh-$(VERSION).tar.gz # file containing name of new mmh distribution distname: @echo mmh-$(VERSION) > distname # pre-generate this file so users don't need lex(1) sbr/dtimep.c: @cd $(srcdir)/sbr && $(MAKE) dtimep.c ChangeLog: @git whatchanged --format=fuller > $@ # build mmh distribution distdir = `cat distname` mmhdist: $(DISTINCLUDE) distname @echo "Begin building mmh-$(VERSION) distribution" @rm -rf $(distdir) @echo "Copying files to distribution directory" @git clone $(srcdir) $(distdir) @chmod 755 $(distdir) @sleep 1 #avoid rebuilding sbr/dtimep.c in release @for file in $(DISTINCLUDE); do \ cp -p $(srcdir)/$$file $(distdir)/$$file; \ touch $(distdir)/$$file; \ done @for file in $(DISTEXCLUDE); do \ rm -rf $(distdir)/$$file; \ done @chmod -R a+r $(distdir) tar --owner=0 --group=0 -chf - $(distdir) | gzip -c > $(tarfile) @rm -rf $(distdir) distname @echo "Done building mmh-$(VERSION) distribution" mmh-0.4/README0000644000000000000000000000543613414435726011535 0ustar rootrootMeillo's Mail Handler (mmh) =========================== Mmh is a modified version of the electronic mail handling system nmh. Nmh (new MH) itself was originally based on the package MH-6.8.3, and was intended to be a (mostly) compatible drop-in replacement for MH. In contrast, mmh is not intended to be a drop-in replacement for nmh, but rather aims for the modernization and simplification of nmh, accepting reduced compatiblity if it, at the same time, allows to achieve greater goals from mmh's point of view. Mmh is small and simple; nmh is established and matured; MH is ancient. Unfortunately, the usage of the terms `mmh' and `nmh' is not fully consistent within the distribution. Installing ---------- See the INSTALL file. Copying ------- Mmh uses a BSD-style license, which can be found in the COPYRIGHT file. Users ----- Start by reading the man page mmh-intro(7). It explains the first steps. For convenience in the shell, have a look at the files docs/COMPLETION-*. They give cookbook examples of how to set up mmh- specific tab completion in your shell. Developers ---------- Information of interest to mmh developers can be found in the README.developers file in the docs subdirectory of this distribution. Markus Schnalke's master's thesis explains the existence, shape, and focus of mmh. You should read it before working on mmh. If you're hacking on the code, you should subscribe to mmh's mailing list. To do so, send a message to with the subject ``subscribe''. Changes ------- See the NEWS file for a summary of changes between releases. See the ChangeLog file (which is included in releases as a static copy of the VCS log) for a more detailed list of changes. Bug reports ----------- Please send bug reports and suggestions to the mailing list: . Acknowledgments --------------- The MH system was originally developed by the RAND Corporation, starting in 1979. It was written mainly by Bruce S. Borden after ideas in a memo by R. Stockton Gaines and Norman Z. Shapiro. In 1982, the University of California, Irvine took up maintenance of the software, under the direction of Marshall T. Rose and John L. Romine. Nmh was started by Richard Coleman (coleman@math.gatech.edu) after development on MH mostly stopped. He did the original autoconfiscation and most of the other work up until version 1.0. Nmh is currently being developed and maintained by a loosely organized group of volunteers. More information ---------------- There is more information in the docs subdirectory. Some of the documents are historic, however. The mmh website is located at . Feel free to write to mmh's mailing list at or contact Markus Schnalke directly. (The nmh website is located at .) mmh-0.4/version.sh0000755000000000000000000000104313414435726012667 0ustar rootroot#!/bin/sh # # version.sh -- script to create version string(s) for mmh. # # You can pass the top soucre directory to the script. # if [ -d "$1" ] then cd "$1" fi if [ ! -f VERSION ] then echo "No version file found" 1>&2 echo "usage: $0 [mmh-sourcedir]" 1>&2 exit 1 fi version="`sed q VERSION`" git_info="" if [ -d ".git" ]; then current=`git log -n 1 --pretty=format:+%h HEAD` release=`git log -n 1 --pretty=format:+%h "mmh-$version"` if [ "$current" != "$release" ] then git_info="$current" fi fi echo mmh-"$version""$git_info" mmh-0.4/configure0000755000000000000000000061454613414435727012575 0ustar rootroot#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for mmh 0.4. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='mmh' PACKAGE_TARNAME='mmh' PACKAGE_VERSION='0.4' PACKAGE_STRING='mmh 0.4' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="h/mh.h" ac_default_prefix=/usr/local/mmh # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS SIGNAL_H TERMLIB OURDEFS MAIL_SPOOL_GRP SETGID_MAIL dotlockfilepath EGREP GREP CPP mailspool vipath sendmailpath lspath TSORT LORDER GNU_LIBTOOL LIBTOOL LINTFLAGS LINT linttmp2 linttmp1 cutpath LEXLIB LEX_OUTPUT_ROOT LEX AWK RANLIB INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM SET_MAKE OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC DATE VERSION target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_debug with_locking with_lockdir ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures mmh 0.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/mmh] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of mmh 0.4:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-debug enable nmh code debugging Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-locking=[dot|fcntl|flock|lockf] specify the file locking method --with-lockdir=dir Store dot-lock files in "dir" Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF mmh configure 0.4 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by mmh $as_me 0.4, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- echo "configuring for mmh-0.4" VERSION=0.4 DATE=`cat ${srcdir}/DATE` echo "configuring for mmh dated $DATE" # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; fi if test x"$enable_nmh_debug" = x"yes"; then enable_debug=yes fi # Check whether --with-locking was given. if test "${with_locking+set}" = set; then : withval=$with_locking; fi if test x"$with_locking" = x"dot"; then LOCKTYPE="dot" $as_echo "#define DOT_LOCKING 1" >>confdefs.h elif test x"$with_locking" = x"flock"; then LOCKTYPE="flock" $as_echo "#define FLOCK_LOCKING 1" >>confdefs.h elif test x"$with_locking" = x"lockf"; then LOCKTYPE="lockf" $as_echo "#define LOCKF_LOCKING 1" >>confdefs.h elif test x"$with_locking" = x"fcntl"; then LOCKTYPE="fcntl" $as_echo "#define FCNTL_LOCKING 1" >>confdefs.h else LOCKTYPE="dot" $as_echo "#define DOT_LOCKING 1" >>confdefs.h fi # Check whether --with-lockdir was given. if test "${with_lockdir+set}" = set; then : withval=$with_lockdir; if test "x$with_lockdir" = xyes; then : as_fn_error $? "--with-lockdir requires an argument" "$LINENO" 5 fi fi if test x"$with_lockdir" != x; then LOCKDIR="$with_lockdir" cat >>confdefs.h <<_ACEOF #define LOCKDIR "$with_lockdir" _ACEOF fi test -z "$CFLAGS" && CFLAGS= auto_cflags=1 if test x"$enable_debug" = x"yes"; then test -z "$LDFLAGS" && LDFLAGS=-g fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Wno-pointer-sign" >&5 $as_echo_n "checking whether compiler supports -Wno-pointer-sign... " >&6; } if ${nmh_cv_has_noptrsign+:} false; then : $as_echo_n "(cached) " >&6 else nmh_saved_cflags="$CFLAGS" CFLAGS="$CFLAGS -Wno-pointer-sign" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : nmh_cv_has_noptrsign=yes else nmh_cv_has_noptrsign=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$nmh_saved_cflags" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmh_cv_has_noptrsign" >&5 $as_echo "$nmh_cv_has_noptrsign" >&6; } if test "$nmh_cv_has_noptrsign" = "yes"; then nmh_gcc_warnflags="-Wall -Wno-pointer-sign" else nmh_gcc_warnflags="-Wall" fi if test -n "$auto_cflags"; then if test x"$enable_debug" = x"yes"; then if test -n "$GCC"; then test -z "$CFLAGS" && CFLAGS="$nmh_gcc_warnflags -g" || CFLAGS="$CFLAGS $nmh_gcc_warnflags -g" else test -z "$CFLAGS" && CFLAGS=-g || CFLAGS="$CFLAGS -g" fi else if test -z "$LDFLAGS"; then case "$build_os" in darwin*) LDFLAGS= ;; *) LDFLAGS=-s ;; esac fi if test -n "$GCC"; then test -z "$CFLAGS" && CFLAGS="$nmh_gcc_warnflags -O2" || CFLAGS="$CFLAGS $nmh_gcc_warnflags -O2" else test -z "$CFLAGS" && CFLAGS=-O || CFLAGS="$CFLAGS -O" fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done for ac_prog in flex lex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LEX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LEX"; then ac_cv_prog_LEX="$LEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LEX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LEX=$ac_cv_prog_LEX if test -n "$LEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 $as_echo "$LEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LEX" && break done test -n "$LEX" || LEX=":" if test "x$LEX" != "x:"; then cat >conftest.l <<_ACEOF %% a { ECHO; } b { REJECT; } c { yymore (); } d { yyless (1); } e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ yyless ((input () != 0)); } f { unput (yytext[0]); } . { BEGIN INITIAL; } %% #ifdef YYTEXT_POINTER extern char *yytext; #endif int main (void) { return ! yylex () + ! yywrap (); } _ACEOF { { ac_try="$LEX conftest.l" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$LEX conftest.l") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 $as_echo_n "checking lex output file root... " >&6; } if ${ac_cv_prog_lex_root+:} false; then : $as_echo_n "(cached) " >&6 else if test -f lex.yy.c; then ac_cv_prog_lex_root=lex.yy elif test -f lexyy.c; then ac_cv_prog_lex_root=lexyy else as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 $as_echo "$ac_cv_prog_lex_root" >&6; } LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root if test -z "${LEXLIB+set}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 $as_echo_n "checking lex library... " >&6; } if ${ac_cv_lib_lex+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS=$LIBS ac_cv_lib_lex='none needed' for ac_lib in '' -lfl -ll; do LIBS="$ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lex=$ac_lib fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext test "$ac_cv_lib_lex" != 'none needed' && break done LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 $as_echo "$ac_cv_lib_lex" >&6; } test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 $as_echo_n "checking whether yytext is a pointer... " >&6; } if ${ac_cv_prog_lex_yytext_pointer+:} false; then : $as_echo_n "(cached) " >&6 else # POSIX says lex can declare yytext either as a pointer or an array; the # default is implementation-dependent. Figure out which it is, since # not all implementations provide the %pointer and %array declarations. ac_cv_prog_lex_yytext_pointer=no ac_save_LIBS=$LIBS LIBS="$LEXLIB $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define YYTEXT_POINTER 1 `cat $LEX_OUTPUT_ROOT.c` _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_prog_lex_yytext_pointer=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 $as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } if test $ac_cv_prog_lex_yytext_pointer = yes; then $as_echo "#define YYTEXT_POINTER 1" >>confdefs.h fi rm -f conftest.l $LEX_OUTPUT_ROOT.c fi pathtmp=/usr/bin:/bin:/usr/local/bin:/usr/xpg4/bin:/usr/ucb # Extract the first word of "cut", so it can be a program name with args. set dummy cut; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_cutpath+:} false; then : $as_echo_n "(cached) " >&6 else case $cutpath in [\\/]* | ?:[\\/]*) ac_cv_path_cutpath="$cutpath" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $pathtmp do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_cutpath="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_cutpath" && ac_cv_path_cutpath="no" ;; esac fi cutpath=$ac_cv_path_cutpath if test -n "$cutpath"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cutpath" >&5 $as_echo "$cutpath" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "lclint", so it can be a program name with args. set dummy lclint; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_linttmp1+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$linttmp1"; then ac_cv_prog_linttmp1="$linttmp1" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_linttmp1="lclint" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_linttmp1" && ac_cv_prog_linttmp1="no" fi fi linttmp1=$ac_cv_prog_linttmp1 if test -n "$linttmp1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $linttmp1" >&5 $as_echo "$linttmp1" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x$ac_cv_prog_linttmp1 != xno ; then LINT=$ac_cv_prog_linttmp1 LINTFLAGS="-weak +posixlib -macrovarprefixexclude" else # Extract the first word of "lint", so it can be a program name with args. set dummy lint; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_linttmp2+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$linttmp2"; then ac_cv_prog_linttmp2="$linttmp2" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_linttmp2="lint" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_linttmp2" && ac_cv_prog_linttmp2="no" fi fi linttmp2=$ac_cv_prog_linttmp2 if test -n "$linttmp2"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $linttmp2" >&5 $as_echo "$linttmp2" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x$ac_cv_prog_linttmp2 != xno ; then LINT=$ac_cv_prog_linttmp2 LINTFLAGS="" else LINT="echo 'No lint program found'" LINTFLAGS="" fi fi # Extract the first word of "libtool", so it can be a program name with args. set dummy libtool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIBTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIBTOOL"; then ac_cv_prog_LIBTOOL="$LIBTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $pathtmp do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIBTOOL="libtool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIBTOOL=$ac_cv_prog_LIBTOOL if test -n "$LIBTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBTOOL" >&5 $as_echo "$LIBTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -n "$LIBTOOL" ; then tmptest=`$LIBTOOL --version 2>&1 | grep GNU` if test x"$tmptest" != x ; then GNU_LIBTOOL=1 fi fi # Extract the first word of "lorder", so it can be a program name with args. set dummy lorder; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LORDER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LORDER"; then ac_cv_prog_LORDER="$LORDER" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LORDER="lorder" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_LORDER" && ac_cv_prog_LORDER="no" fi fi LORDER=$ac_cv_prog_LORDER if test -n "$LORDER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LORDER" >&5 $as_echo "$LORDER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "tsort", so it can be a program name with args. set dummy tsort; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_TSORT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$TSORT"; then ac_cv_prog_TSORT="$TSORT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_TSORT="tsort" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_TSORT" && ac_cv_prog_TSORT="no" fi fi TSORT=$ac_cv_prog_TSORT if test -n "$TSORT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TSORT" >&5 $as_echo "$TSORT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x$ac_cv_prog_LORDER != xlorder -o x$ac_cv_prog_TSORT != xtsort; then LORDER=echo TSORT=cat fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether tsort can deal with loops" >&5 $as_echo_n "checking whether tsort can deal with loops... " >&6; } if ${nmh_cv_tsort_loop+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "`echo a b b a | tsort 2>/dev/null | grep a`" ; then nmh_cv_tsort_loop=no else nmh_cv_tsort_loop=yes fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmh_cv_tsort_loop" >&5 $as_echo "$nmh_cv_tsort_loop" >&6; } if test x$nmh_cv_tsort_loop = xno ; then LORDER=echo TSORT=cat fi pathtmp=/usr/bin:/bin:/usr/local/bin:/usr/xpg4/bin:/usr/ucb # Extract the first word of "ls", so it can be a program name with args. set dummy ls; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_lspath+:} false; then : $as_echo_n "(cached) " >&6 else case $lspath in [\\/]* | ?:[\\/]*) ac_cv_path_lspath="$lspath" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $pathtmp do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_lspath="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_lspath" && ac_cv_path_lspath="no" ;; esac fi lspath=$ac_cv_path_lspath if test -n "$lspath"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lspath" >&5 $as_echo "$lspath" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$lspath" != "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to get ls to show us the group ownership of a file" >&5 $as_echo_n "checking how to get ls to show us the group ownership of a file... " >&6; } if ${nmh_cv_ls_grpopt+:} false; then : $as_echo_n "(cached) " >&6 else if test x"`$lspath -dl / | $AWK '{print $9}'`" = x"/"; then nmh_cv_ls_grpopt="-l" else nmh_cv_ls_grpopt="-lg" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmh_cv_ls_grpopt" >&5 $as_echo "$nmh_cv_ls_grpopt" >&6; } fi pathtmp=/usr/lib:/usr/sbin:/usr/etc:/usr/ucblib:/usr/bin:/bin # Extract the first word of "sendmail", so it can be a program name with args. set dummy sendmail; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_sendmailpath+:} false; then : $as_echo_n "(cached) " >&6 else case $sendmailpath in [\\/]* | ?:[\\/]*) ac_cv_path_sendmailpath="$sendmailpath" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $pathtmp do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_sendmailpath="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_sendmailpath" && ac_cv_path_sendmailpath="/usr/sbin/sendmail" ;; esac fi sendmailpath=$ac_cv_path_sendmailpath if test -n "$sendmailpath"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $sendmailpath" >&5 $as_echo "$sendmailpath" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi pathtmp=/usr/bin:/bin:/usr/ucb:/usr/local/bin # Extract the first word of "vi", so it can be a program name with args. set dummy vi; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_vipath+:} false; then : $as_echo_n "(cached) " >&6 else case $vipath in [\\/]* | ?:[\\/]*) ac_cv_path_vipath="$vipath" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $pathtmp do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_vipath="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_vipath" && ac_cv_path_vipath="/bin/vi" ;; esac fi vipath=$ac_cv_path_vipath if test -n "$vipath"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $vipath" >&5 $as_echo "$vipath" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking where mail spool is located" >&5 $as_echo_n "checking where mail spool is located... " >&6; } if ${nmh_cv_mailspool+:} false; then : $as_echo_n "(cached) " >&6 else for mailspool in /var/mail /var/spool/mail /usr/spool/mail /dev/null; do test -d $mailspool && break done nmh_cv_mailspool=$mailspool fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmh_cv_mailspool" >&5 $as_echo "$nmh_cv_mailspool" >&6; } mailspool=$nmh_cv_mailspool if test "$lspath" != "no" -a "$cutpath" != "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the mail spool is world-writable" >&5 $as_echo_n "checking whether the mail spool is world-writable... " >&6; } if ${nmh_cv_mailspool_world_writable+:} false; then : $as_echo_n "(cached) " >&6 else if test "`$lspath -dl $mailspool/ | $cutpath -c9`" = "-"; then nmh_cv_mailspool_world_writable=no else nmh_cv_mailspool_world_writable=yes fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmh_cv_mailspool_world_writable" >&5 $as_echo "$nmh_cv_mailspool_world_writable" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "lockfile.h" "ac_cv_header_lockfile_h" "$ac_includes_default" if test "x$ac_cv_header_lockfile_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lockfile_create in -llockfile" >&5 $as_echo_n "checking for lockfile_create in -llockfile... " >&6; } if ${ac_cv_lib_lockfile_lockfile_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-llockfile $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char lockfile_create (); int main () { return lockfile_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_lockfile_lockfile_create=yes else ac_cv_lib_lockfile_lockfile_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lockfile_lockfile_create" >&5 $as_echo "$ac_cv_lib_lockfile_lockfile_create" >&6; } if test "x$ac_cv_lib_lockfile_lockfile_create" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBLOCKFILE 1 _ACEOF LIBS="-llockfile $LIBS" fi fi # Extract the first word of "dotlockfile", so it can be a program name with args. set dummy dotlockfile; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_dotlockfilepath+:} false; then : $as_echo_n "(cached) " >&6 else case $dotlockfilepath in [\\/]* | ?:[\\/]*) ac_cv_path_dotlockfilepath="$dotlockfilepath" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_dotlockfilepath="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_dotlockfilepath" && ac_cv_path_dotlockfilepath="no" ;; esac fi dotlockfilepath=$ac_cv_path_dotlockfilepath if test -n "$dotlockfilepath"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dotlockfilepath" >&5 $as_echo "$dotlockfilepath" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$ac_cv_lib_lockfile_lockfile_create" != "no" ; then if test "$ac_cv_path_dotlockfilepath" != "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether dotlockfile is setgid" >&5 $as_echo_n "checking whether dotlockfile is setgid... " >&6; } if ${nmh_cv_dotlockfile_setgid+:} false; then : $as_echo_n "(cached) " >&6 else if test -g "$ac_cv_path_dotlockfilepath" ; then nmh_cv_dotlockfile_setgid=yes else nmh_cv_dotlockfile_setgid=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmh_cv_dotlockfile_setgid" >&5 $as_echo "$nmh_cv_dotlockfile_setgid" >&6; } fi fi if test x"$LOCKTYPE" = x"dot" -a x"$nmh_cv_mailspool_world_writable" = x"no" -a x"$nmh_cv_dotlockfile_setgid" != x"yes" ; then $as_echo "#define MAILGROUP 1" >>confdefs.h SETGID_MAIL=1 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking what group owns the mail spool" >&5 $as_echo_n "checking what group owns the mail spool... " >&6; } if ${nmh_cv_ls_mail_grp+:} false; then : $as_echo_n "(cached) " >&6 else nmh_cv_ls_mail_grp=`$lspath -dL $nmh_cv_ls_grpopt $mailspool|$AWK '{print $4}'` fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmh_cv_ls_mail_grp" >&5 $as_echo "$nmh_cv_ls_mail_grp" >&6; } MAIL_SPOOL_GRP=$nmh_cv_ls_mail_grp case "$target_os" in linux*) # Like DEFS, but doesn't get stomped on by configure when using config.h: OURDEFS="$OURDEFS -D_GNU_SOURCE" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether termios.h defines TIOCGWINSZ" >&5 $as_echo_n "checking whether termios.h defines TIOCGWINSZ... " >&6; } if ${ac_cv_sys_tiocgwinsz_in_termios_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifdef TIOCGWINSZ yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : ac_cv_sys_tiocgwinsz_in_termios_h=yes else ac_cv_sys_tiocgwinsz_in_termios_h=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_tiocgwinsz_in_termios_h" >&5 $as_echo "$ac_cv_sys_tiocgwinsz_in_termios_h" >&6; } if test $ac_cv_sys_tiocgwinsz_in_termios_h != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sys/ioctl.h defines TIOCGWINSZ" >&5 $as_echo_n "checking whether sys/ioctl.h defines TIOCGWINSZ... " >&6; } if ${ac_cv_sys_tiocgwinsz_in_sys_ioctl_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifdef TIOCGWINSZ yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=yes else ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&5 $as_echo "$ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&6; } if test $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h = yes; then $as_echo "#define GWINSZ_IN_SYS_IOCTL 1" >>confdefs.h fi fi for ac_header in fcntl.h crypt.h termcap.h \ langinfo.h wchar.h wctype.h iconv.h \ sys/param.h sys/time.h sys/stream.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "libio.h" "ac_cv_header_libio_h" "$ac_includes_default" if test "x$ac_cv_header_libio_h" = xyes; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "_IO_write_ptr" >/dev/null 2>&1; then : $as_echo "#define LINUX_STDIO 1" >>confdefs.h fi rm -f conftest* fi ac_fn_c_check_header_compile "$LINENO" "sys/ptem.h" "ac_cv_header_sys_ptem_h" "#if HAVE_SYS_STREAM_H # include #endif " if test "x$ac_cv_header_sys_ptem_h" = xyes; then : $as_echo "#define WINSIZE_IN_PTEM 1" >>confdefs.h fi for ac_func in nl_langinfo mbtowc wcwidth do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "initgroups" >/dev/null 2>&1; then : $as_echo "#define INITGROUPS_HEADER " >>confdefs.h else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "initgroups" >/dev/null 2>&1; then : $as_echo "#define INITGROUPS_HEADER " >>confdefs.h fi rm -f conftest* fi rm -f conftest* if test "x$ac_cv_header_wchar_h" = "xyes" -a "x$ac_cv_header_wctype_h" = "xyes" \ -a "x$ac_cv_func_wcwidth" = "xyes" -a "x$ac_cv_func_mbtowc" = "xyes"; then $as_echo "#define MULTIBYTE_SUPPORT 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "modf" "ac_cv_func_modf" if test "x$ac_cv_func_modf" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modf in -lm" >&5 $as_echo_n "checking for modf in -lm... " >&6; } if ${ac_cv_lib_m_modf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char modf (); int main () { return modf (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_modf=yes else ac_cv_lib_m_modf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_modf" >&5 $as_echo "$ac_cv_lib_m_modf" >&6; } if test "x$ac_cv_lib_m_modf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi fi termcap_curses_order="termcap curses ncurses tinfo" for lib in $termcap_curses_order; do as_ac_Lib=`$as_echo "ac_cv_lib_${lib}''_tgetent" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetent in -l${lib}" >&5 $as_echo_n "checking for tgetent in -l${lib}... " >&6; } if eval \${$as_ac_Lib+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l${lib} $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char tgetent (); int main () { return tgetent (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$as_ac_Lib=yes" else eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi eval ac_res=\$$as_ac_Lib { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then : TERMLIB="-l$lib"; break fi done if test "x$TERMLIB" = "x"; then echo 'Could not find tgetent() in any library.' echo 'Is there a ncurses-devel package that you can install?' exit 1 fi if test "x$ac_cv_header_iconv_h" = "xyes"; then ac_fn_c_check_func "$LINENO" "iconv" "ac_cv_func_iconv" if test "x$ac_cv_func_iconv" = xyes; then : ac_found_iconv=yes else ac_found_iconv=no fi if test "x$ac_found_iconv" = "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv in -liconv" >&5 $as_echo_n "checking for iconv in -liconv... " >&6; } if ${ac_cv_lib_iconv_iconv+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char iconv (); int main () { return iconv (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_iconv_iconv=yes else ac_cv_lib_iconv_iconv=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_iconv" >&5 $as_echo "$ac_cv_lib_iconv_iconv" >&6; } if test "x$ac_cv_lib_iconv_iconv" = xyes; then : ac_found_iconv=yes fi if test "x$ac_found_iconv" = "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libiconv in -liconv" >&5 $as_echo_n "checking for libiconv in -liconv... " >&6; } if ${ac_cv_lib_iconv_libiconv+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char libiconv (); int main () { return libiconv (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_iconv_libiconv=yes else ac_cv_lib_iconv_libiconv=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_libiconv" >&5 $as_echo "$ac_cv_lib_iconv_libiconv" >&6; } if test "x$ac_cv_lib_iconv_libiconv" = xyes; then : ac_found_iconv=yes fi fi if test "x$ac_found_iconv" != "xno"; then LIBS="-liconv $LIBS" fi else ac_fn_c_check_decl "$LINENO" "_libiconv_version" "ac_cv_have_decl__libiconv_version" " #include " if test "x$ac_cv_have_decl__libiconv_version" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libiconv in -liconv" >&5 $as_echo_n "checking for libiconv in -liconv... " >&6; } if ${ac_cv_lib_iconv_libiconv+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char libiconv (); int main () { return libiconv (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_iconv_libiconv=yes else ac_cv_lib_iconv_libiconv=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_libiconv" >&5 $as_echo "$ac_cv_lib_iconv_libiconv" >&6; } if test "x$ac_cv_lib_iconv_libiconv" = xyes; then : LIBS="-liconv $LIBS" fi fi fi fi if test "x$ac_found_iconv" = xyes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "x$ac_found_iconv" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 $as_echo_n "checking for iconv declaration... " >&6; } if ${ac_cv_iconv_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_iconv_const= else ac_cv_iconv_const=const fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_iconv_const" >&5 $as_echo "$ac_cv_iconv_const" >&6; } cat >>confdefs.h <<_ACEOF #define ICONV_CONST $ac_cv_iconv_const _ACEOF fi nmh_save_LIBS="$LIBS" LIBS="$TERMLIB $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if tgetent accepts NULL" >&5 $as_echo_n "checking if tgetent accepts NULL... " >&6; } if ${nmh_cv_func_tgetent_accepts_null+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : nmh_cv_func_tgetent_accepts_null=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ main() { char buf[4096]; int r1 = tgetent(buf, "vt100"); int r2 = tgetent(NULL,"vt100"); if (r1 >= 0 && r1 == r2) { char tbuf[1024], *u; u = tbuf; tgetstr("cl", &u); creat("conftest.tgetent", 0640); } exit((r1 != r2) || r2 == -1); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : if test -f conftest.tgetent; then nmh_cv_func_tgetent_accepts_null=yes else nmh_cv_func_tgetent_accepts_null=no fi else nmh_cv_func_tgetent_accepts_null=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmh_cv_func_tgetent_accepts_null" >&5 $as_echo "$nmh_cv_func_tgetent_accepts_null" >&6; } if test x$nmh_cv_func_tgetent_accepts_null = xyes; then $as_echo "#define TGETENT_ACCEPTS_NULL 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if tgetent returns 0 on success" >&5 $as_echo_n "checking if tgetent returns 0 on success... " >&6; } if ${nmh_cv_func_tgetent_zero_success+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : nmh_cv_func_tgetent_zero_success=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ main() { char buf[4096]; int r1 = tgetent(buf, "!@#$%^&*"); int r2 = tgetent(buf, "vt100"); if (r1 < 0 && r2 == 0) { char tbuf[1024], *u; u = tbuf; tgetstr("cl", &u); creat("conftest.tgetent0", 0640); } exit(r1 == r2); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : if test -f conftest.tgetent0; then nmh_cv_func_tgetent_zero_success=yes else nmh_cv_func_tgetent_zero_success=no fi else nmh_cv_func_tgetent_zero_success=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmh_cv_func_tgetent_zero_success" >&5 $as_echo "$nmh_cv_func_tgetent_zero_success" >&6; } if test x$nmh_cv_func_tgetent_zero_success = xyes; then $as_echo "#define TGETENT_SUCCESS 0" >>confdefs.h else $as_echo "#define TGETENT_SUCCESS 1" >>confdefs.h fi LIBS="$nmh_save_LIBS" ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" if test "x$ac_cv_type_pid_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" if test "x$ac_cv_type_off_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define off_t long int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 $as_echo_n "checking for uid_t in sys/types.h... " >&6; } if ${ac_cv_type_uid_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "uid_t" >/dev/null 2>&1; then : ac_cv_type_uid_t=yes else ac_cv_type_uid_t=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5 $as_echo "$ac_cv_type_uid_t" >&6; } if test $ac_cv_type_uid_t = no; then $as_echo "#define uid_t int" >>confdefs.h $as_echo "#define gid_t int" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default" if test "x$ac_cv_type_mode_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define mode_t int _ACEOF fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_gmtoff" "ac_cv_member_struct_tm_tm_gmtoff" "#include " if test "x$ac_cv_member_struct_tm_tm_gmtoff" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_TM_TM_GMTOFF 1 _ACEOF fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi ac_fn_c_check_member "$LINENO" "struct dirent" "d_type" "ac_cv_member_struct_dirent_d_type" " #include #ifdef HAVE_DIRENT_H # include #else # define dirent direct # ifdef HAVE_SYS_NDIR_H # include # endif # ifdef HAVE_SYS_DIR_H # include # endif # ifdef HAVE_NDIR_H # include # endif #endif " if test "x$ac_cv_member_struct_dirent_d_type" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_DIRENT_D_TYPE 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking where signal.h is located" >&5 $as_echo_n "checking where signal.h is located... " >&6; } if ${nmh_cv_path_signal_h+:} false; then : $as_echo_n "(cached) " >&6 else for SIGNAL_H in /usr/include/bsd/sys/signal.h /usr/include/asm/signal.h /usr/include/asm/signum.h /usr/include/linux/signal.h /usr/include/sys/signal.h /dev/null; do test -f $SIGNAL_H && \ grep '#[ ]*define[ ][ ]*SIG[0-9A-Z]*[ ]*[0-9][0-9]*' $SIGNAL_H > /dev/null && \ break done nmh_cv_path_signal_h=$SIGNAL_H fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nmh_cv_path_signal_h" >&5 $as_echo "$nmh_cv_path_signal_h" >&6; } SIGNAL_H=$nmh_cv_path_signal_h ac_config_files="$ac_config_files Makefile config/Makefile h/Makefile sbr/Makefile uip/Makefile etc/Makefile man/Makefile" ac_config_commands="$ac_config_commands stamp" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by mmh $as_me 0.4, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ mmh config.status 0.4 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "config/Makefile") CONFIG_FILES="$CONFIG_FILES config/Makefile" ;; "h/Makefile") CONFIG_FILES="$CONFIG_FILES h/Makefile" ;; "sbr/Makefile") CONFIG_FILES="$CONFIG_FILES sbr/Makefile" ;; "uip/Makefile") CONFIG_FILES="$CONFIG_FILES uip/Makefile" ;; "etc/Makefile") CONFIG_FILES="$CONFIG_FILES etc/Makefile" ;; "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; "stamp") CONFIG_COMMANDS="$CONFIG_COMMANDS stamp" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "stamp":C) test -z "$CONFIG_HEADERS" || echo > stamp-h ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi eval "nmhbin=${bindir}"; eval "nmhbin=${nmhbin}" eval "nmhsysconf=${sysconfdir}"; eval "nmhsysconf=${nmhsysconf}" eval "nmhlib=${libdir}"; eval "nmhlib=${nmhlib}" eval "nmhman=${mandir}"; eval "nmhman=${nmhman}" cat < # Permission granted to redistribute under the BSD license [ "$BASH_COMPLETION" ] || echo "ERROR: COMPLETION-BASH is not intended to be \ sourced directly, but rather added to a bash-completion package installation." have show && _nmh() { # args: command comp-word prev-word local command current prev folder origfolder i orig_opts COMPREPLY=() current=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} command=$1 orig_opts=$(shopt -p extglob) shopt -s extglob # Get the folder, if specified for (( i=0; i < ${#COMP_WORDS}-1; i++ )) do case "${COMP_WORDS[i]}" in \++([a-zA-Z_]) ) folder=${COMP_WORDS[i]} origfolder=$( folder -f ) ;; esac done case $current in -* ) # Command-line switches for the most common commands. case $command in ali ) # no sequences or messages options=(-alias -list -nolist -normalize -nonormalize -user -nouser -Version -help) ;; burst ) options=(-inplace -noinplace -quiet -noquiet -verbose -noverbose -Version -help) ;; comp ) options=(-form -use -nouse -editor -noedit -whatnowproc -Version -help ) ;; flist* ) options=(-sequence -all -noall -showzero -noshowzero -recurse -norecurse -fast -nofast -alpha -noalpha -Version -help) ;; folder* ) options=(-all -noall -create -nocreate -fast -nofast -header -noheader -recurse -norecurse -total -nototal -list -nolist -push -pop -pack -nopack -print -verbose -noverbose -Version -help) ;; forw ) options=(-annotate -noannotate -form -editor -noedit -whatnowproc -build -Version -help) ;; inc ) options=(-audit -noaudit -changecur -nochangecur -form -file -silent -nosilent -truncate -notruncate -width -Version -help) ;; mark ) options=(-sequence -add -delete -list -public -nopublic -zero -nozero -Version -help) ;; packf ) options=(-file -Version -help) ;; pick ) options=(-and -or -not -lbrace -rbrace --component -cc -date -from -search -subject -to -after -before -datefield -sequence -public -nopublic -zero -nozero -list -nolist -Version -help) ;; refile ) options=(-link -nolink -src -file -Version -help) ;; repl ) options=(-annotate -noannotate -group -nogroup -cc -nocc -query -noquery -form -filter -nofilter -mime -nomime -editor -noedit -whatnowproc -build -file -Version -help) ;; rmf ) options=(-interactive -nointeractive -Version -help) ;; rmm ) options=(-link -nolink -Version -help) ;; scan ) options=(-form -header -noheader -width -file -Version -help ) ;; show ) next ) prev ) options=(-file -part -type -form -Version -help) ;; sortm ) options=(-datefield -textfield -notextfield -limit -nolimit -verbose -noverbose -Version -help) ;; * ) options=(-help -Version -seq) ;; esac ;; +* ) # Folders options=( $( folder -all -r -fast | grep -v "^\." | sed "s/^/+/" ) ) ;; +([0-9a-z])-* ) # Partial range start=${current/%-*/} options=( $( scan $folder -form "=%(msg)" "${start}-last" ) first prev cur next last ) options=( ${options[@]//#/${start}-} ) ;; +([0-9]) ) # Message number, or start of range options=( $( scan $folder -form "=%(msg)" ) first prev cur next last ) options=( ${options[@]} ${options[@]//%/-} ) ;; [fpcnlu]* ) # special message aliases options=( first prev cur next last unseen ) ;; # What about sequences? I can't quite see how to get the list of possible sequences, so I # guess the user will have to type them in the old-fashioned way. esac eval $orig_opts COMPREPLY=( $( compgen -W "${options[*]}" -- $current ) ) return 0 } [ "$have" ] && complete -F _nmh ali anno burst comp dist flist flists folder folders forw inc mark mhbuild mhl mhlist mhmail mhparam mhpath mhstore next packf pick prev prompter rcvdist rcvpack rcvstore refile repl rmf rmm scan send sendfiles show slocal sortm whatnow mmh-0.4/docs/ChangeLog_MH-6.7.0_to_MH-6.8.4.html0000644000000000000000000013542013414435726017112 0ustar rootroot MH Change Log

                                   Changes to
                      The RAND MH Message Handling System:
                               UCI version MH 6.8


                                 John L. Romine

                            Computing Support Group
                        Information and Computer Science
                        University of California, Irvine
                             Irvine, CA  92717-3425
                               Bug-MH@ICS.UCI.EDU
                           http://www.ics.uci.edu/~mh/


                                   ABSTRACT


                    This document describes the changes to the
               UCI version of the RAND MH system from MH 6.6 to
               this release of MH 6.8.  This document is meant to
               supplement, not supersede, the standard MH User's
               manual and MH Administrator's manual.

                    Comments concerning this documentation should
               be addressed to the mailbox Bug-MH@ICS.UCI.EDU.
               Current information about MH can be obtained from
               the MH Home Page on the World Wide Web at
               http://www.ics.uci.edu/~mh/.



          ACKNOWLEDGEMENTS

          The MH system described herein is based on the original RAND
          MH system.  It has been extensively developed (perhaps too
          much so) by Marshall T. Rose and John L. Romine at the
          University of California, Irvine.  Einar A. Stefferud, Jerry
          N. Sweet, and Terry P. Domae provided numerous suggestions
          to improve the UCI version of MH.

               Of course, a large number of people have helped MH
          along.  The list of "MH immortals" is too long to list here.
          For this release, numerous MH-Workers sent in fixes and
          other changes.  A handful of courageous MH-Workers volun-
          teered to beta-test these changes; their help is particu-
          larly appreciated.

          DISCLAIMER

          The Regents of the University of California wish to make  it
          known that:

               Although each  program  has  been  tested  by  its
               contributor,  no  warranty, express or implied, is
               made by  the  contributor  or  the  University  of
               California,  as to the accuracy and functioning of
               the program  and  related  program  material,  nor
               shall the fact of distribution constitute any such
               warranty, and no responsibility is assumed by  the
               contributor  or  the  University  of California in
               connection herewith.

          CONVENTIONS

          In this document, certain formatting conventions are adhered
          to:

               The names of UNIX commands, such as comp are  presented
               in italics.

               Arguments to programs, such as `msgs' and `-nobell' are
               delimited by single-quotes.

               Text that  should  be  typed  exactly  as-is,  such  as
               command  lines (e.g., "folder -pack"), are delimited by
               double-quotes.

               UNIX pathnames and envariables, such  as  /usr/uci  and
               $SIGNATURE, are presented in bold font.


          CHANGES FOR MH 6.8.4

          The MH 6.8.4 release is a minor maintenance release, and
          contains few user-visible changes.  The changes consist
          mostly of documentation improvements, minor bug fixes, and
          some portability enhancements for BSD 4.4 and Solaris 2.x
          (contributed changes for HPUX and OSF1 have not yet been
          integrated into this release).  This is the current version
          of MH as of February 8, 1996.

          Runtime Tailoring

          By default post will now give the SMTP HELO command with the
          local hostname.  If you specify a hostname with the
          clientname: option in the mtstailor file, post will give the
          HELO command with that name instead.  If the argument to the
          clientname: option is empty, no HELO command is given.  See
          mh-tailor(5) for more details.

          Multi-media Mail & Encryption

          A few new PGP support programs can be found in the
          support/general directory.  repl supports the `-[no]mime'
          option.  See repl(1) for more details.


          CHANGES FOR MH 6.8.3

          The MH 6.8.3 maintenance release contains few user-visible
          changes.  Most of the changes are internal to the multi-
          media display program mhn to support RFC 1521 (the new MIME
          standard).  This is the current version of MH as of December
          1, 1993.

          Runtime Tailoring

          When posting mail using the SMTP, post did not normally send
          the HELO command. This was because SendMail would fail if
          the host name given in the HELO command was the local host.
          Later versions of SendMail will now complain if you omit the
          HELO command.

          User Interface Programs

          folder  The folder command now has `-create' and `-nocreate'
                  options.  See folder(1) for details.

          inc     A bug where `-host' would not override the pophost
                  as set in the mtstailor file has been fixed.  This
                  bug was also fixed in msgchk.

          mhn     The mhn command has several changes:  updates for
                  conformance with RFC 1521, addition of two caches:
                  public and private, addition of two caching poli-
                  cies: one for reading and one for writing, support
                  for storing multipart entities, and a few bug fixes.
                  See mhn(1) for complete details.

          CHANGES FOR MH 6.8.2

          The MH.6.8.2 patch release contains only internal changes to
          support the BSD 4.4 and 386BSD versions of UNIX.  This ver-
          sion of MH was released August 25, 1993, but was not widely
          distributed.

          CHANGES FOR MH 6.8.1

          The MH.6.8.1 patch release is a maintenance release.  This
          is the current released version of MH as of August 20, 1993.

               This release includes a small number of bug fixes, a
          few minor enhancements, some changes for the new MIME stan-
          dard, and support for ESMTP (RFC 1425).  Support for BSD 4.4
          and 386BSD is planned for the next release.

               Many other fixes which have already been received are
          still being merged.  If you've sent an update for MH 6.8 to
          Bug-MH@ics.uci.edu and it isn't in this release, it'll prob-
          ably appear in the next release.

          Fixes and Enhancements

          Many minor documentation corrections were made.  There are
          also a few program changes:

          mhn   The `-cache policy', `-[no]check', and `-[no]pause'
                switches have been added.   Some other minor changes
                have been made to comply with the new MIME standard.
                See mhn(1) for complete details.

          post  When posting mail with SendMail, post will not use the
                ONEX command when it is posting a message with BCCs.

          scan  scan will now work with big width values.

          Format Strings

          One new function has been added:

          %(profile arg)  This function looks up a component in the
                          .mh_profile or context files and returns the
                          value of that component.

          Configuration

          Two new configuration options are present:

          GCOS_HACK    The so-called "gcos" field of the password file
                       is used as a last resort to find the user's
                       full name (see mh-profile(5) for details).
                       Enable this option if your passwd(5) man page
                       notes that the `&' character in the "gcos"
                       field stands for the login name.

          NORUSERPASS  Tells MH that your system doesn't have the
                       ruserpass(3) routine; MH will include its own
                       copy of this routine in its library.


          CHANGES FOR MH 6.8

          This is the current released version of MH as of December
          14, 1992.  This release includes a number of bug fixes and
          internal changes to make the code more portable.  Two new
          authentication methods are provided for the POP, and support
          for SVR4 shared libraries is complete.

               The major user-visible change in this release is the
          incorporation of support for multi-media mail as specified
          by the Multi-purpose Internet Mail Extensions (MIME)
          RFC 1341.  This allows you to include things like audio,
          graphics, and the like, in your mail messages.  A new com-
          mand, mhn, has been provided to support MIME and a detailed
          man page is provided in mhn(1).

          Documentation

          The documentation has some general improvements, and the
          READ-ME document has been re-organized to help MH adminis-
          trators find the appropriate configuration options for their
          system.  The Makefiles in the papers/ hierarchy have been
          changed to invoke TeX as "tex" (instead of "tex82").

          The following new man pages are also available:

          mhn(1)      mhn helps the user process multi-media mail.

          mhparam(1)  mhparam lets the user extract information from
                      the MH profile.

          popauth(8)  the APOP database administration program (see
                      below).

          popi(1)     the POP initiator (see below).

          slocal(1)   fully documents slocal.  The mhook(1) man page
                      now documents only the MH receive-mail hooks.

          Internal Changes

          The MH source code is in the process of being cleaned up to
          make pedantic ANSI C compilers happy.  Occurrences of "NULL"
          have been replaced by "0" where appropriate.  Extra tokens
          after "#else" and "#endif" have been put inside comments
          (this is still in progress).  The code should now compile
          cleanly on many more systems, specifically, more variants of
          SVR4.

               The version of tws/dtimep.c which was included in MH
          6.7.2 was incompatible with the lex library on some systems,
          and has been removed.

               A bug in the handling of blind lists inside alias files
          has been fixed.

          Post Office Protocol

          There were three new options added to the POP.

          APOP  This option indicates that the POP daemon will support
                the   non-standard   APOP  command  which  provides  a
                challenge-based authentication system  using  the  MD5
                message digest algorithm.

                This option also causes  the  popauth  program  to  be
                installed,   which   allows   the   administrator   to
                manipulate the APOP authorization database.

          KPOP  Support for KERBEROS with POP.  This code builds popd,
                inc and msgchk to support only the "kpop" protocol.
                This code is still expiremental, but is available for
                those sites wishing to test it.

          MPOP  This option indicates that the POP daemon will support
                the non-standard XTND SCAN command which provides per-
                formance enhancements when using the POP over low-
                speed connections.

                This option also causes an interactive POP client pro-
                gram, popi, to be compiled and installed.  A man page
                for the popi program is also provided.  This option
                requires the configuration to have "bboards: pop".

          The APOP and MPOP non-standard POP facilities are documented
          in The Internet Message (ISBN 0-13-092941-7), a book by
          Marshall T. Rose.  For more details, see support/pop/pop-
          more.txt and the Administrator's Guide.  The APOP option
          peacefully co-exists with the standard POP, KPOP completely
          replaces the standard POP, and MPOP requires "bboards: pop".

          File Locking

          The file locking code has been cleaned up to support three
          kinds of kernel-level file locking.  As appropriate for your
          system, include the LOCKF, FCNTL or FLOCK option.  For more
          details, see mh-tailor(5).

          Configuration Directives

          A number of new configuration directives have been added  or
          changed.  The full details are given in the READ-ME.

          cp:        The command used to  install  new  files  if  not
                     "cp".

          ln:        The command used to link files  together  in  the
                     source tree if not "ln".

          mts:       Full support for ZMAILER has been added.

          popdir:    The directory where popd will be installed if not
                     /usr/etc.

          regtest:   Set to "on" to prevent the hostname  and  compile
                     date from being included in MH binaries.

          sharedlib: You may now specify "sun4" or "sys5"  (for  SVR4)
                     shared libraries.

          signal:    Specifies the base type of the function  returned
                     by  signal().   This  was previously defined with
                     "options TYPESIG".

          Several `-D' options to cc have been added or changed:

          APOP       Authenticated POP (see above).

          AUX        Support for A/UX systems.

          DBMPWD     The DBM option has been renamed DBMPWD.

          HESIOD     Support for the HESIOD name server.

          KPOP       KERBEROS POP (see above).

          LOCALE     Support for local characters sets; uses the set-
                     local() function.

          MAILGROUP  Makes inc set-group-id.  You may need this option
                     if your /usr/spool/mail is not world-writeable.

          MIME       Multi-media mail.

          MPOP       Mobile POP (see above).

          MSGID      Enables slocal to detect and suppress duplicate
                     messages.

          OSF1       Support for DEC OSF1 systems.  May be incomplete.

          RENAME     Include this option if your system has a rename()
                     system call.

          SVR4       Support for System 5 Release 4 or newer systems.

          TYPESIG    This option has been dropped.  See `signal'
                     above.

          UNISTD     Include this option if your system has the
                     include file <unistd.h>.

          VSPRINTF   Include this option if your system has the
                     vsprintf() library routine; otherwise, _doprnt()
                     will be used.

          YEARMOD    Forces the mh-format `year' function to return
                     2-digit values.  Use this option during a brief
                     transition period if you have local mh-format
                     files which need to be converted to support 4-
                     digit years.

          FUNCTIONAL CHANGES

          In addition to the configuration changes mentioned above, a
          number of functional changes have been made to the system.
          Many programs have new features added and a few new programs
          have are provided. Each command's manual page gives complete
          information about the its operation.  Here is a short sum-
          mary of the changes.

          MH Sequences

          A larger number of user-defined sequences are available.
          Previously, this number had been 10.  On 32-bit systems, 26
          user-defined sequences are available.

          Profile Components

          MH programs will now complain if the .mh_profile does not
          end in a newline.  Also, one enhancement and one new profile
          component are provided:

          Aliasfile:  Multiple filenames may now be given.

          Inbox:      New; the default folder (for inc, etc.) if not
                      "inbox".

          Format Strings

          A few minor bugs were fixed in format string handling, and a
          few  new features were added.  See mh-format(5) for complete
          details.

          Addresses      An  attempt  is  made   to   decipher   X.400
                         RFC 987-style addresses.

          Comments       Comments may be added to mh-format  files;  a
                         comment  begins with the 2-character sequence
                         "%;", and ends with an un-escaped newline.

          %(modulo n)    The `modulo' function escape has been added.

          %(year{date})  The  date  parser  has   been   enhanced   to
                         understand  more illegal date formats; `year'
                         now returns a 4-digit number.

          User Interface Programs

          A number of MH commands have minor changes:

          ali       The output with `-user -list' was changed to match
                    the output with `-nouser -list'.

          burst     Will no longer drop the last message of a digest.

          inc       Accepts the `-apop' switch for authenticated POP
                    (see above); will attempt to detect write errors
                    (e.g., no space left on device) when incorporating
                    mail; no longer replaces newline characters with
                    NULLs.

          folder    The `-noprint' option was broken and has been
                    dropped.

          forw      Supports `-mime' to use MIME-style multi-part mes-
                    sages.

          mhl       Will no longer put an extra space at the end of
                    the `%{text}' in a formatfield.

          mhn       New; manipulates multi-media (MIME) messages; a
                    detailed man page is provided.

          mhparam   New; reads the MH profile (and context) and writes
                    the values of the specified components on the
                    standard output; useful in programmatic con-
                    structs.

          msgchk    Supports `-apop' (see above).

          packmbox  New; packs an MH folder into a UUCP-style mailbox.

          popi      New; a client-side POP initiator; available only
                    if you built MH with the MPOP option (see above).

          refile    A bug where the `rmmproc' did not remove all
                    specified message files has been fixed.

          scan      The `-file' option is fully supported and will no
                    longer complain about empty folders.

          send      Supports `-mime' and `-split' to split large mes-
                    sages into multiple partial messages using MIME.

          Support Programs

          fmtdump   Can now read a format file, or a format string
                    given on the command line.

          popauth   New; manages the APOP authorization database (see
                    above).

          sendmail  The sendmail replacement will be installed only if
                    your `mts' setting uses the `/smtp' option.

          slocal    A new man page for slocal is available; the new
                    `mbox' action is available to write a file in
                    packf format; a bug where extra `>' characters
                    were written to MMDF-style maildrops has been
                    fixed; if compiled with the MSGID option, can
                    detect and suppress reception of duplicate mes-
                    sages.

          viamail   New; bundles a directory (like shar) and sends it
                    through multi-media mail.


          CHANGES FOR MH 6.7.2

          The MH.6.7.2 patch release is a maintenance release.  This
          is the current released version of MH as of February 1,
          1992.

               This release now supports the NCR Tower running SYS5R4.
          The WP changes installed in MH.6.7.0 have been removed.

          Shared Libraries

          Support for SYS 5 shared libraries is in progress.

               Support for Sun OS 4.0 shared libraries had been
          improved.  The MH library has been modified to move initial-
          ized data into a data definition file.  The shared library
          will now consist of a libmh.so and libmh.sa file.  The
          shared library version number will no longer track the MH
          patch release number, and its numbering begins with version
          `1.1' with this release.

          Replacement SendMail

          Since many standard system programs expect to post mail by
          invoking /usr/lib/sendmail, a minimal replacement SendMail
          is provided in this release.  This replacement is meant to
          be installed on (e.g., diskless) client workstations which
          post mail using SMTP, and do not run a message transport
          system.  It will call post to post mail; be sure you have
          configured MH with the `/smtp' mts option.  This sendmail
          replacement is installed in your MH etc directory, and you
          should link /usr/lib/sendmail to it.

          Format Strings

          A manual page for the fmtdump format string disassembler  is
          supplied, and some new format functions were added:

          folder   In scan, this component escape contains the name of
                   the current folder.  It is not defined for other MH
                   commands.

          getenv   This  function  escape  returns  the  value  of  an
                   environment variable.

               There will be some additional changes in these routines
          in the next patch release.

          Other Bug Fixes and Enhancements

          In addition to some other minor enhancements, some bugs were
          fixed which in general were not user-visible:

          Blind lists   Users may now specify RFC822 address groups in
                        their   alias   files.    These   groups   are
                        implemented by MH as blind lists.

          date parsing  A number of sites have brain-damaged  versions
                        of lex.  MH will now come with the date parser
                        already run through lex.

          mark          A bug dealing with mark and the sequence named
                        `cur' is fixed.  This was previously a problem
                        for mh-e users.

          MH.doc        The MH nroff version of the manual  no  longer
                        contains teletype escape sequences.

          scan          Can now handle headers as long as 512 bytes.

          Signals       MH programs will no longer catch the  HUP  and
                        TERM  signals while waiting for a sub-process.
                        This was  causing  hung  processes  when  your
                        terminal line was was dropped unexpectedly.

          Signature     If your signature is not defined, MH will  use
                        the   value   of   the  gecos  field  of  your
                        /etc/passwd entry as your signature.

          version.sh    A bug in the awk script  in  config/version.sh
                        was fixed.


          CHANGES FOR MH 6.7.1a

          The MH.6.7.1a patch was made available on January 25, 1991
          for limited distribution only.  (This release had some known
          bugs, and so was not widely distributed.)  This release
          incorporates several new features of particular note to
          users of sequences and format strings, as well as some gen-
          eral documentation improvements.  There are a few minor
          enhancements and internal bug fixes also.  Complete documen-
          tation of these changes is given in the individual manual
          pages, and the READ-ME file.

          Message Sequences

          A new manual page, mh-sequence (5), has been added.  This
          manual page attempts to completely document the syntax and
          semantics of MH message sequence specifications.

               A powerful new feature is the ability to specify mes-
          sage ranges with user-defined sequences.  The  specification
          "name:n" may be used, and it designates up to the first `n'
          messages (or  last  `n' messages  for  `-n') which  are
          elements  of the user-defined sequence `name'.

               The message specifications "name:next" and "name:prev"
          may also be used, and they designate the next or previous
          message (relative to the current message) which is an ele-
          ment of the user-defined sequence `name'.  The specifica-
          tions "name:first" and "name:last" are equivalent to
          "name:1" and "name:-1", respectively.  The specification
          "name:cur" is not allowed (use just "cur" instead).

               These specifications allow the user to step through a
          sequence with a command like "show name:next".

          Format Strings

          MH format strings now support an if-then-elseif-else clause
          (the `elseif' is new).  This will make format strings with
          multi-case conditions somewhat less complex.

               A new format function `addr' had been added.  This
          function takes an address header name as its argument, and
          returns a rendering of the address contained in that header
          as "user@host" or "host!user".

               Format widths now may be specified as a negative
          number.  This causes the output to be right-justified within
          the format width.

          Other Changes

          Along with a few minor enhancements, some  bugs  were  fixed
          which in general were not user-visible:

          fmtdump  This  new  program  produces   an   pseudo-language
                   representation   of  an  MH  format  file,  vaguely
                   reminiscent  of  assembly  language.   While   this
                   output  format is not explicitly documented, it can
                   still be useful when debugging MH format files.

          refile   Now takes a `-[no]rmmproc' switch.  This  makes  it
                   easier  to  avoid  loops  when your "rmmproc" calls
                   refile.

          slocal   A  problem  with  the  UUCP-style  mailboxes,   the
                   `RPATHS'  configuration  option,  and  the "Return-
                   Path:" header was fixed.

          sortm    Will ensure that no messages  are  lost  if  it  is
                   interrupted.

          whatnow  Will now tell you where it is  leaving  the  draft,
                   when  interrupted  in the initial edit.  Previously
                   the draft was simply unlinked.

          Compilation Options

          LOCKF    This option causes MH to  use  the  lockf()  system
                   call   for   locking  (if  available),  instead  of
                   flock().


          CHANGES FOR MH 6.7.1

          The MH.6.7.1 patch release is a maintenance release, and as
          such, provides few changes from the previous release.  This
          is the current released version of MH as of December 14,
          1990.

          User-Visible Changes

          The major change in this release is to the POP daemon
          (popd).  In MH 6.7, it was changed to be able to read both
          UUCP and MMDF-style mailboxes.  This did not work as
          reported.  The code has now been changed to parse MMDF-style
          mailboxes if you are configuring MH to run with MMDF as your
          message transport system.  Otherwise, UUCP-style mailboxes
          are expected.

               Since there are number of client programs available for
          only the POP2 protocol instead of POP3, popd has been
          updated to support both protocols.  This is a major win.  If
          you are compiling with POP turned on, add the `POP2' option
          to your MH config file, and the POP daemon will respond to
          POP2 or POP3 commands.  If you're using POP, there's no rea-
          son not to include this option; it does not affect the
          existing support for POP3.

          Internal Changes

          Some bugs were fixed which in general were not user-visible:

          context     Errors when writing out sequences  are  detected
                      correctly.

          inc         No  longer  inserts  extra  blank   lines   into
                      messages.

          mh-format   A nil pointer bug  in  the  address  parser  was
                      fixed.

          repl, etc.  The malloc/free problem has been fixed.

          rmf         A spelling error in the `-nointeractive'  switch
                      has been corrected.

          rcvtty      Will not print the message size if not available
                      (i.e., zero).

          send/post   Illegal signatures  (those  containing  unquoted
                      "."s) will be quoted.


          GENERAL CHANGES FOR MH 6.7.0

          The author is pleased to announce that there are very few
          user-visible changes to MH 6.7 from the previous MH 6.6 dis-
          tribution.  The majority of development was in the form of
          bug fixes and slight enhancements.  In addition, this
          release is slightly faster than the previous release.  With
          a few minor exceptions, it is backward-compatible with the
          previous release.  MH 6.7.0 is the current released version
          of MH as of April 12, 1990.

               The changes were made mainly to generalize the source
          code to be compatible with a larger range of systems and
          compilers.  There were many small changes to add declara-
          tions for ANSI C compliance.  The System 5 support has been
          brought up to SYS5 R3, and there is support for Sun OS 4.0.

          User-Visible Changes

          Here a quick summary of the changes that were made which are
          not backward-compatible with the previous release of MH:

          repl   The `-format' and `-noformat' switches have not been
                 functional since MH 5, and have been removed.  Any
                 users who have these switches in their .mh_profile,
                 will have to remove them.

          sortm  Previously, in most cases sortm would fill-in any
                 gaps in the numbering of a folder, by renumbering the
                 messages starting with `1'.  This will no longer
                 occur; for this behavior, use "folder -pack".


          Using Aliases

          A new profile entry `Aliasfile:' has been added.  The ali,
          send, and whom programs will look for this profile entry and
          treat it as they would an argument to `-alias'.  This should
          make it easier for novice MH users to begin using aliases.


          Reading Network News & BBoards

          The UCI BBoards facility can read local BBoards, and if com-
          piled with the `bboards: pop' and `pop: on' options, can
          also read remote BBoards using the Post Office Protocol (POP
          ver. 3).  With this release, MH can instead be compiled to
          read the Network News (i.e., USENET) using the Network News
          Transfer Protocol (NNTP).

               This capability is enabled by compiling MH with the
          `bboards: nntp' and `pop: on' options.  Unfortunately, read-
          ing remote BBoards via the POP and reading the Network News
          via the NNTP are mutually exclusive options.

               To support the NNTP, a new module, uip/pshsbr.c, is
          compiled and loaded into bbc and msh instead of
          uip/popsbr.c.  The default BBoard is changed from "system"
          to "general" for the NNTP.

               When reading BBoards, bbc will first look for local
          BBoards, and then contact the NNTP server to read the Net-
          work News.  The location of the NNTP server should be speci-
          fied with the `nntphost:'  entry in the mtstailor file (see
          the MH Administrator's Guide for details), or may be speci-
          fied on the command line with the `-host' switch.


          Format Strings

          The manual page mh-format (5) has been rewritten to give a
          better explanation of how to write format strings, and how
          they are interpreted by MH.  A line-by-line description of
          the default repl form file (replcomps) is now included in
          that manual page.

          Some new  format  functions  were  added,  and  others  were
          augmented:

          trim        Strips any leading and trailing white-space from
                      the current string value.

          date2local  Will coerce the date to the local timezone.

          date2gmt    Will coerce the date to GMT.

          divide      Divides  the  current  numeric  value   by   its
                      argument.   This  could  be  useful for building
                      scan format strings which  print  large  message
                      sizes in "Kb" or "Mb".

          friendly    If the address  field  cannot  be  parsed,  this
                      function  will  return  the  text of the address
                      header, instead of a null string.

          szone       A  flag  indicating  whether  the  timezone  was
                      explicit in the date string.

          PROGRAM CHANGES

          In addition to the general changes mentioned above, many
          programs have specific new features added, either by new
          switches or by expanded functionality.  Each command's
          manual page gives complete information about its new
          options.  Here is a short summary.

          User Interface Programs

          anno      Accepts a `-nodate' switch which inhibits the date
                    annotation, leaving only the body annotation.

          folder    When invoked with the `-pack' switch and the new
                    `-verbose' switch, folder will give information
                    about the actions taken to renumber the folder.

                    On most systems, folder can now create any
                    non-existing parent folders of a new sub-folder.

          forw      When making digests, forw will put the issue and
                    volume numbers in addition to the digest list
                    name, in the digest trailer.

          inc       Detects NFS write failures, and will not zero your
                    maildrop in that event.

          msh       Supports a variant of the new sortm.

          prompter  Considers a period on a line by itself to signify
                    end-of-file when the `-doteof' switch is speci-
                    fied.

          repl      The `-[no]format' switches have not been used
                    since MH 5 and have been deleted. repl will now
                    find filter files in the MH library area.

          scan      With the `-file msgbox' switch, scan can list a
                    packf'd-format file directly (without using msh).

                    Lists messages in reverse order with the
                    `-reverse' switch.  This should be considered a
                    bug.

          sortm     Now has the options:  `-textfield field',
                    `-notextfield', `-limit days', and `-nolimit'.

                    With these options, sortm can be instructed to
                    sort a folder based on the contents of an arbi-
                    trary header such as "subject".

                    sortm minimizes renaming messages, and will no
                    longer arbitrarily pack folders; for this
                    behavior, use "folder -pack".

          whatnow   Deletes the draft by renaming it with leading
                    comma, instead of unlinking it.

          MH Support Programs

          The  following  support  programs  also  have   changes   or
          enhancements:

          mhl     Will now accept a format string  on  any  component,
                  not just on addresses and dates.

          popd    Will use shadow passwords if compiled with the SHA-
                  DOW option.  It can now also read UUCP-style mail-
                  drops directly.

          rcvtty  If given no arguments, rcvtty will produce a scan
                  listing as specified by a format string or file; a
                  default format string is used if one is not speci-
                  fied.

                  Before the listing is written to the users terminal,
                  the terminal's bell is rung and a newline is output.
                  The `-nobell' and the `-nonewline' options inhibit
                  these functions.

                  rcvtty will obey terminal write notification set by
                  mesg.  With the `-biff' switch, rcvtty will also
                  obey the mail notification status set by biff.

                  On BSD43 systems, as with write, rcvtty will be
                  installed set-group-id to the group "tty".

          slocal  Understands UUCP-style "From " lines and will write
                  output files using this format if appropriate.
                  Before invoking a delivery program, slocal will
                  strip such lines unless compiled with the RPATHS
                  option, in which case it will will convert such
                  lines into "Return-Path:" headers.

                  slocal has a new result code "N", for use in .mail-
                  delivery files.  With this result code, slocal will
                  perform the action only if the message has not been
                  delivered and the previous action succeeded.  This
                  allows for performing an action only if multiple
                  conditions are true.

          DOCUMENTATION

          Several of the older MH papers have been difficult to format
          because they depended on an older version of PhDTeX which
          was not supplied.  These papers have been updated, and some
          TeX library files are supplied in papers/doclib/, so that
          these papers may be generated on any system with TeX.

               Many of the manual pages have been revised to include
          documentation of new command options, and some have been
          expanded to give more detail.  All are now slightly refor-
          matted at installation time to make them more compatible
          with programs like makewhatis.


          MH ADMINISTRATION

          This section describes changes in configuring, compiling and
          installing MH 6.7 and should not be of interest to casual MH
          users.  The READ-ME file has been considerably revised and
          expanded to give more detail about the configuration and
          compilation options which have been included in this
          release.  Some compilation options have been removed, and
          many new options have been added.

               All MH Makefiles have been updated to work around some
          incompatibilities introduced in newer versions of make.  MH
          programs will no longer be installed with the sticky-bit
          turned on.

               Reading this section not a substitute for carefully
          reading the READ-ME file before attempting to compile MH


          Bug Fixes

          Some bugs were fixed which in general were not user-visible:

          address parser  Fixed to allow use of the "AT"  domain,  and
                          some  minor  bugs  were  fixed pertaining to
                          address groups.

          date parser     Improved to accept  more  forms  of  illegal
                          dates.  Military timezones were removed.

          dynamic memory  Many problems with corruption of the dynamic
                          memory pool have been fixed.

          locking         Will open files for write, if  necessary  to
                          enable locking.

          nil pointers    All reported nil pointer problems have  been
                          fixed.

          replcomps       The "In-Reply-To:" header had  quotes  added
                          around the date field to comply with RFC822.

          White Pages

          If MH is compiled with the WP option, send recognizes an
          address between "<<" and ">>" characters such as:

                  To: << rose -org psi >>

          to be a name meaningful to a whitepages service.  In order
          to expand the name, send must be invoked interactively
          (i.e., not from push).  For each name, send will invoke a
          command called fred in a special mode asking to expand the
          name.

               To get a copy of the white pages service, contact
          wpp-manager@psi.com.

          Configuration Options

          Some configuration options have been added or changed:

          cc          To specify an alternate C compiler.

          ccoptions   Defaults to `-O'.

          bboards     May now be defined as "on", "off", "pop", or
                      "nntp".

          bbdelivery  Determines whether the bboard delivery agent and
                      library files should be installed.

          lex         To specify an alternate version of lex.

          mailgroup   If defined, inc will be made set-group-id to
                      this group.

          sharedlib   For SUN40 systems; if "on", makes libmh.a into a
                      shared library.

          slibdir     The directory where the above shared library
                      should be installed.

          sprintf     Set this to "int" if that's what your
                      sprintf (3) library routine returns.

          Compilation Options

          For different configurations, several `-D' options to cc
          have been added or changed:

          BERK        This disables the address and date parsing rou-
                      tines.  If you want to do much with
                      mh-format (5), don't enable this.

          BSD43       Will make rcvtty set-group-id to the group
                      "tty".

          DBM         For sites with a dbm-style password file (such
                      as with Yellow Pages), MH will not read the
                      entire passwd file into a cache.  At one site
                      that runs YP on a large passwd file, using this
                      showed a 6:1 performance improvement.

          NETWORK     This option has been deleted.  See SOCKETS.

          NOIOCTLH    Tells MH not to include the file sys/ioctl.h.
                      Use this if this file is not present on your
                      system.

          NTOHLSWAP   On systems with TCP/IP networking, msh will try
                      to use the ntohl() macro from the file
                      netinet/in.h to byte-swap the binary map files
                      it writes.

          SENDMAILBUG Some versions of sendmail return a 451 (failure)
                      reply code when they don't mean to indicate
                      failure.  This option considers that code to be
                      equivalent to 250 (OK).

          SHADOW      Causes popd to read the file /etc/shadow for
                      encrypted passwords instead of /etc/passwd.  Use
                      this if you have a shadow password file (such as
                      on newer versions of SYSTEM 5).

          SOCKETS     Enable this if you are on a non-BSD system with
                      a socket interface for TCP/IP networking compa-
                      tible with 4.2BSD UNIX.

          SUN40       Use on Suns running Sun OS 4.0 and later.

          SYS5        This option has been updated to refer to SYS5 R3
                      and later systems.

          SYS5DIR     Use this if your system uses "struct dirent"
                      instead of "struct direct".  This should be true
                      for systems based on SYS5 R3 and later.

          TYPESIG     Defines the base type for the signal system
                      call.  This defaults to "int", but should be
                      defined as "void" if appropriate for your sys-
                      tem.

          WP          Enables support for the White Pages service.

          Installation

          MH will now explicitly set the protection mode on every file
          it installs.

               Previously any existing file installed by MH would be
          backed up into the source tree, and then overwritten.  Now,
          a few system-dependent files will not be overwritten, and
          your changes will have to be merged in by hand.  See the
          READ-ME file for more details.

mmh-0.4/docs/README.start-devel0000644000000000000000000001031413414435726014705 0ustar rootrootHow to start developing nmh =========================== markus schnalke 2010-12 I started using nmh in Fall 2009. Soon afterwards, I used it exclusivly. In Spring 2010, I subscribed to the nmh-workers mailing list. From October until December 2010, I worked for two month full-time on nmh as a private project. First of all, I needed to become familiar with the code. This had been the most difficult part. This document is based on my experience on starting to hack nmh. It describes how I would do it a second time. These are my recommendations. Prerequisites ------------- You should be familiar with nmh. Use it! Adjust nmh to your needs. This is almost a requirement for using it for modern emailing. It took me several month until I had a satisfying setup. Lots of research and reading was necessary. Subscribe to the nmh-workers mailing list [0] and read it. Reading documentation --------------------- Read Jerry Peek's book ``MH & nmh: Email for Users & Programmers'' [1], at least the history, concepts, and get an overview of the rest. This book is a wonderful resource for everything about nmh. Cross-read the FAQs [2] although they are old. Read README and docs/README.developers. The rest below docs/ is valuable too. You might want to read it now or later. Reading code ------------ I split the task of code reading into five stages. (1) Get an overview: Understand the directory structure. Get a feeling for what kinds of files are unter sbr/ and what under uip/. Scrolling through the files is sufficient for that. These two directories will be most important. See docs/README.developers for help. (2) Take a look at some simple tool: I recommend reading uip/rmm.c, which is a pretty straight-forward tool. It shows the structure of the common tool code in nmh pretty well. You don't need to fully understand it, but you should try to find out how things work generally. The identifiers and comments in the code will provide most of that information. (3) Read through the header files: Read h/mh.h, the central header file of the project. It contains a lot of important information. Like above, you don't need to understand it fully now. Later, jump back to this header file as needed in order to incrementally understand it better and better. (4) Read code in uip/, starting with simple tools: Now you can continue reading tool code in uip/. Go from the simple tools (e.g. mhparam, mhpath) to the more complex ones (e.g. send, pick, spost). Defer everything with MIME involved (e.g. mhshow, mhbuild) and the tools that use format or component files until the end. As a rule of thumb: Simple tools are those with few lines of code and no *sbr.c files. (5) Jump to sbr/ as needed: As you read through the code, you'll encounter several functions that are not part of the C standard library but of similar style. Look for these below sbr/. There most files are named like the single function they contain. You can often guess from the filename what is inside. Read their sources as you need them. I found it useful to write down short explanations of functions whose names didn't express enough information. Once you reached this point, I'm sure you'll find your further way alone. Code history ------------ Note that large parts of the code are very old and were written by a whole bunch of different people. You will likely encounter code that simply puzzles you. Check the ChangeLog and similar sources first. If you still don't understand, ask on the mailing list. You'll see that the folks there sometimes don't know either. A lot of knowledge was lost in time. The Community ------------- A short note for those who come from the modern Free Software world: Don't expect nmh to be like modern Free Software projects. Nmh is old and MH is much older. The community still carries old spirits; you might not be used to them. Also, keep in mind that nmh is matured back-end software, thus the view on change may be different than you might expect. Nonetheless, I encourage you to interact with the community. You will learn a lot and you will receive valuable comments. REFERENCES ---------- [0] http://lists.nongnu.org/mailman/listinfo/nmh-workers [1] http://rand-mh.sourceforge.net/book/ [2] http://www.newt.com/faq/mh.html mmh-0.4/docs/README.developers0000644000000000000000000000632213414435726014627 0ustar rootroot# # README.developers # This file is intended to provide a few tips for anyone doing development on mmh. Developers who learn things "the hard way" about the mmh codebase (as opposed to local info best encoded in a comment) are encouraged to share their wisdom here. Absolute beginners should start reading docs/README.start-devel. ------------------- directory structure ------------------- Following is a list of mmh's directories along with a brief description of the purpose of each one. Meanings are given for the abbreviations, but note that these meanings are just informed guesses as to what the MH developers were thinking. ./ The top-level directory. Contains files like README and INSTALL. config/ Contains utility files for the `configure' process. Ordinarily nothing in here needs to be messed with, but config/config.c is very interesting to have a look at. docs/ Contains more specialized documentation, such as this file and the FAQ. etc/ Contains files, file templates, and scripts to generate files that will be installed in the ${prefix}/etc directory. Stuff like replcomps. h/ Most of mmh's header files are kept in this central location instead of in the individual source directories. man/ Contains all the input files that are processed to generate mmh's manual pages. sbr/ "sbr" stands for "subroutine(s)". For the most part, each source file in this directory contains a single function with the same name as the source file. These functions are of general use and are called from throughout mmh. uip/ "uip" stands for "User Interface Programs". Most mmh commands have a file in this directory named .c containing the code for that command (e.g. repl.c). In some cases there is also an auxiliary file called sbr.c which contains additional subroutines called from .c. ---------------------- version control system ---------------------- As of December 2010, nmh has switched to using git for revision control instead of CVS. Mmh has stick to git. While the topic of git is beyond the scope of this FAQ, to get started with git and mmh, you can run the following command to checkout the mmh repository: % git clone http://git.marmaro.de/mmh That will create a workspace called mmh. To update that workspace change to it and run: % git pull -------------- autoconf files -------------- If you wish to change the `configure' script or its related files, you'll need to first install GNU m4 and GNU autoconf. Mmh is currently using a minimum of autoconf 2.61. Most of the configure-related files are automatically generated. The only files you should need to manually edit are `acconfig.h' and `configure.ac'. Don't, for instance, edit `config.h.in'. Though it is an input file from the point of view of the users (and the configure script) it is an output file from the point of view of the developers (and the autoconf script). Note that the automatically generated autoconf files (such as `config.h.in', `stamp-h.in', and `configure'), are NOT kept in the version control system. Thus, when you check out the source tree, you need to run the `autogen.sh' script before you can build anything: % ./autogen.sh mmh-0.4/docs/MAILING-LISTS0000644000000000000000000000262513414435726013501 0ustar rootrootThere are currently three mailing lists related to nmh: nmh-announce@nongnu.org ---------------------- This is a very low-traffic mailing list for announcing new releases, patches, and important events related to nmh. To subscribe or manage your subscription options, go to: https://lists.nongnu.org/mailman/listinfo/nmh-announce nmh-workers@nongnu.org ---------------------- This is the main list for discussing work on nmh. There is currently no nmh-users mailing list, so user questions are acceptable here (the comp.mail.mh newsgroup is another good option). Bug reports and feedback should be submitted here. To subscribe or manage your subscription options, go to: https://lists.nongnu.org/mailman/listinfo/nmh-workers nmh-commits@nongnu.org ---------------------- All commits to the nmh source code repository are copied to this list. Therefore, it is probably only of interest to nmh developers. To subscribe or manage your subscription options, go to: https://lists.nongnu.org/mailman/listinfo/nmh-commit mmh@marmaro.de -------------- This is the mailinglist of mmh. To subscribe send a Mail witch the subject subscribe to: mmh-request@marmaro.de To unsubscribe use the subject unsubscribe mail archives ------------- The nmh-workers and nmh-commits mailings lists archives are available here: http://lists.nongnu.org/archive/html/nmh-workers/ http://lists.nongnu.org/archive/html/nmh-commits/ mmh-0.4/docs/FAQ0000644000000000000000000051176513414435726012146 0ustar rootrootNewsgroups: comp.mail.mh,comp.answers,news.answers Subject: MH Frequently Asked Questions (FAQ) with Answers Keywords: FAQ,mh,mail,question,answer,pop,slocal,letter,signature, draft,message,folder,xmh,olmh,vmail,vmailtool,comp,repl, forw,scan,SMTP,bind,MH-E,MIME,plum,exmh,nmh Summary: This document answers Frequently Asked Questions about MH, a sophisticated mail interface. It should be read by new MH users and comp.mail.mh readers and before posting to this group. Followup-To: poster Approved: news-answers-request@MIT.Edu Reply-To: Bill Wohler From: Bill Wohler Organization: Newt Software, Menlo Park, California, USA Archive-name: mail/mh-faq/part1 Last-modified: $Date$ Version: $Revision$ Posting-Frequency: monthly This is a living list of frequently asked questions on the mailer user interface, Mail Handler, or MH. The point of this is to circulate existing information, and avoid rehashing old answers. Better to build on top than start again. Please read this document before ever posting to this newsgroup. This article is posted monthly. If it has already expired and you're not reading this, you can hope that you saved the instructions to retrieve the FAQ (see "Where can I get MH") so that you can get a copy through other means. Please do not post an answer when someone posts a frequently asked question; rather, email the relevant section of the FAQ to eliminate unnecessary traffic in this newsgroup. This list depends on your comments, additions and fixes: please send them to Bill Wohler . Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2004, 2005, 2006, 2007 Bill Wohler Permission to use, copy, distribute, and translate this document for any non-commercial purpose is hereby granted, provided that this copyright notice appears in all copies. Commercial distributions require prior written consent. This article 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. ---------------------------------------------------------------------- Subject: Table of Contents From: Bill Wohler Date: Sat, 3 Mar 2001 11:29:16 -0800 Legend: + new, - deleted, ! changed __________________ 01.00 Introduction 01.01 Why should I use MH? !01.02 What is the current version/status of MH? !01.03 Where can I get MH? !01.04 What references exist for MH? 01.05 What other MH software is available? !01.06 How can I print a MH manual? 01.07 How should I report bugs? 01.08 How can I convert from my mailer to MH? 01.09 What is the copyright status of nmh? _________________ 02.00 Building MH 02.01 What machines does MH run on? 02.02 How do I build MH? 02.03 What options should I use? 02.04 What do I need to do to use POP? 02.05 Does MH support IMAP? 02.06 Why does "mailgroup mail" only affect inc and not slocal? 02.07 How can I build MH on Solaris 2? 02.08 How can I build MH on Linux? 02.09 How can I build MH on IRIX? 02.10 How can I get MH to interpret the Content-Length field? 02.11 How do I build MH on HP-UX? 02.12 Can I prevent adding the local hostname to addresses behind firewalls? 02.13 Is there a patch to fix this or that? 02.14 How can I build MH on OS/2? 02.15 Do any POP/IMAP servers handle MH format? 02.16 How can I build MH on Windows? !02.17 How can I build MH on a Mac? ________________________ 03.00 Scanning & Reading 03.01 What do I do if scan shows the wrong date? 03.02 How would one go about reading Usenet with MH? 03.03 How can I search through multiple folders? 03.04 Why don't MH format commands such as %(friendly) work? 03.05 Why doesn't "show" display all of a MIME message? 03.06 Can I get show not to run "less" so much on MIME messages? 03.07 Why do I get "mhn: don't know how to display content"? 03.08 How can I automatically delete MH backup files? 03.09 Fixing "cannot fopen and lock /var/spool/mail/(user)" 03.10 Can I read my mail with a Web browser? 03.11 How can I run inc automatically with POP? 03.12 Why does inc hang (on Sun)? 03.13 How can I get POP to work? 03.14 How do I persuade mhshow (mhn) not to bring up a new window? 03.15 How do I turn off of all the mhshow (mhn) prompts? 03.16 Why is inc splitting messages improperly? 03.17 Can MH thread messages? 03.18 How can I avoid reading the HTML version of the message? 03.19 How do I view or save attachments? 03.20 How do I view HTML attachments with Netscape? 03.21 Fixing folders: unable to allocate storage for msgstats 03.22 How do I recursively list message attachments? 03.23 Why do folder and flist overlook some of my sub-folders? ____________ 04.00 Filing 04.01 Can I append MH messages to a Unix mailbox format file? 04.02 Can I append MH messages to a GNU Emacs rmail BABYL-format file? 04.03 Why do I get ".../.mh_sequences is poorly formatted?" 04.04 How can you save News articles into an MH folder? !04.05 Are there any good tools to archive MH messages? 04.06 How can I remove duplicate messages? 04.07 How can I remove holes in numbering? __________________________ 05.00 Composing & Replying 05.01 Why does repl add a "Re:" to a message that already has one? 05.02 How do I include messages in repl with or without ">"? 05.03 How can I eliminate duplicate copies of letters to myself? 05.04 How can I include my signature? 05.05 How do I call my editor with arguments? 05.06 How can I digestify messages in a folder for mail to another user? 05.07 How can I change my return address? 05.08 How can I change my From header? 05.09 How can I save a copy of all messages I send? 05.10 Can the folder in Fcc: be dynamically specified? 05.11 Can I post secure/encryped mail? 05.12 How can I send multi-media (MIME) attachments? 05.13 What's the best way to send mail to a long list of people? 05.14 What is the Dcc header? 05.15 How can I make sense of the replcomps file? 05.16 How can I convert quoted-printable to 8bit in quoted text in replies? 05.17 Can I have aliases include aliases? 05.18 Why doesn't mhmail understand aliases? 05.19 How do I send blind carbon copies? 05.20 When I forward a message, can I use its Subject? 05.21 Why is the timezone field in my 'Date:' field wrong? 05.22 Can I automate the comp -editor mhn process? 05.23 How can I remove those "=20" characters when forwarding? 05.24 Can I use mh-format substitution with forw? 05.25 How can I keep repl from breaking long lines? 05.26 How do I fix a bogus In-Reply-To or missing References field? _____________ 06.00 Posting 06.01 What to do with "Problems with edit - draft removed". 06.02 Can I run my message through a program (e.g., ispell) before sending? 06.03 What to do with "bad address 'xxx' - no at-sign after local-part". 06.04 Fixing "post: problem initializing server; [BHST] no servers available" 06.05 Fixing "post: problem initializing server; [RPLY] 503 Sender already specified" 06.06 Fixing "post: unexpected response; [BHST] no socket opened" 06.07 How do I fix the "X-Authentication-Warning" header? 06.08 Fixing "post: unexpected response; [RPLY] 503 Need MAIL before RCPT" 06.09 Fixing "post: problem initializing server; [BHST] premature end-of-file on socket" 06.10 Fixing "Sender didn't use the HELO protocol" 06.11 Fixing "post: problem initializing server; [RPLY] 553 Local configuration error, hostname not recognized as local" __________________ 07.00 Mail Filters 07.01 What mail filters are available? 07.02 Why slocal writes messages to system mailbox that from(1) can't read. 07.03 Where can I read about slocal and the format of .maildelivery? 07.04 How do I debug my .maildelivery file? 07.05 Why isn't slocal working? 07.06 Are there any good biff applications for MH? 07.07 How do I read new messages filed by procmail? __________ 08.00 MH-E 08.01 I have a question about MH-E _________ 09.00 Xmh 09.01 How can I get xmh to use Emacs as the editor? 09.02 Does xmh support subfolders? 09.03 How do I precede included messages with ">" when replying in xmh? ________ Appendix Glossary & Acknowledgments Switching xmh's editor babyl2mh.pl inco - babyl to MH converter t2h - add hyperlinks to message viewed srvrsmtp.c patch IRIX config file HP-UX 10.20 config file Removing duplicate messages (Bourne) Removing duplicate messages (Perl) Removing duplicate messages (Perl) ------------------------------ Subject: Viewing This Article From: Bill Wohler Date: Mon, 27 Nov 1995 14:44:19 -0800 To skip to a particular question with Subject or number xx, use "/^S.*xx" with most pagers. In GNU Emacs type "M-C-s ^S.*xx", (or C-r to search backwards), followed by ESC to end the search. To skip to new or changed questions, use "/^S.*[!+]" with most pagers and "M-C-s ^S.*[!+]" in GNU Emacs. This article is in digest format. nn may have already broken this message into separate articles; if not, then type "G %". In rn, use ^G to skip sections. This article is treated as an outline when edited by GNU Emacs. Run "M-x describe-mode" to see available outline-mode commands. Useful commands are "M-x hide-body", "C-c C-s" (show-subtree) and "M-x show-all" Check out the Usenet Hypertext FAQ Archive (see "What references exist for nn?"). Files available by ftp, man pages, and other Web pages, as well as cross-references like the one in this paragraph are just a click away. A "Date" field whose time is 00:00:00 is approximate. The month and year in these fields represent the time they were added to the FAQ, rather than when they were contributed by the author, as is the case since November, 1995. If you should need the Internet address, use nslookup or dig if you have them, or send mail to with "help" for a Subject. References to $MHLIB refer to the directory that contains MH support files and routines. This directory is usually /usr/lib/mh or /usr/local/lib/mh (or /usr/local/nmh/lib or /etc/nmh for nmh). Do not use $MHLIB literally; use the real, absolute path to your MH library directory. There are slight differences between the original MH and nmh. In the text, the nmh command or filename is preferred, and the MH equivalent is placed in parenthesis. For example, the MH configuration is in $MHLIB/mts.conf (mtstailor); mhshow (mhn -show) is used to view attachments. Note that due to bottom feeding email address harvesting spam scum, mailto links have been removed and @s in addresses have been replaced by "at." ------------------------------ Subject: 01.00 ***** Introduction ***** From: Bill Wohler Date: Fri, 1 Mar 1991 13:03:15 -0800 ------------------------------ Subject: 01.01 Why should I use MH? From: Jerry Peek Date: Fri, 1 Mar 1991 13:03:15 -0800 The MH message handling system is a set of electronic mail programs in the public domain. If your computer runs Unix, it can probably run MH. The big difference between MH and most other "mail user agents" is that you can use MH from a Unix shell prompt. In MH, each command is a separate program, and the shell is used as an interpreter. So, all the power of Unix shells (pipes, redirection, history, aliases, and so on) works with MH--you don't have to learn a new interface. Other mail agents have their own command interpreter for their individual mail commands (although the mush mail agent simulates a Unix shell). Because MH commands aren't part of a monolithic mail system, you can use them at any time; you don't have to start or quit the mail agent. Because you use them from a shell prompt, you can use all the power of the shell. If your shell has time-saving aliases or functions (and most do), you'll be able to use them with MH, of course. And because MH isn't a monolithic mail agent, you can use MH commands in Unix shell scripts, or call them from programs in high-level languages like C. Unlike most mail agents, MH keeps each message in a separate file. The filename is the message number. To rearrange the messages, MH just changes the filenames. MH can use standard Unix file system operations such as removing, copying and linking messages. The message files are grouped into one or more folders, which are actually Unix directories. MH is free, powerful, flexible--and the basics are easy to learn. ------------------------------ Subject: !01.02 What is the current version/status of MH. From: Bill Wohler Date: Sun, 23 Sep 2007 23:51:52 -0700 The current official version of MH is 6.8.3, although a beta of 6.8.4 is available. This version includes MIME, a multi-media MH package that implements the new IETF work on Multi-media 822 (MIME). This allows you to include things like audio, graphics, and the like, in your mail messages. --Marshall Rose MH now works with Kerberos as well. In addition, a new program called mhparam extracts arguments from .mh_profile which is useful in shell scripts. Please see the file CHANGES in the distribution for more details. Due to the languishing state of MH, Richard Coleman created another version of MH called nmh based upon MH 6.8.3. He added GNU autoconf to ease installation considerably and fixed several bugs and inconsistencies. Doug Morris picked up the torch in 2002 and moved development to Savannah where Jon Steinhart joined him as a project maintainer. See http://www.nongnu.org/nmh/. The stable version of nmh is 1.2. The file DIFFERENCES in the nmh distribution contains an ever-growing list of differences between nmh and MH. GNU mailutils (version 1.2) is a collection of mail-related utilities. At the core of mailutils is libmailbox, a library which provides access to various forms of mailbox files (including remote mailboxes via popular protocols and MH). See http://www.gnu.org/software/mailutils/. ------------------------------ Subject: !01.03 Where can I get MH? From: Bill Wohler Date: Sun, 23 Sep 2007 23:51:46 -0700 MH comes standard with: Berkeley Software Design BSD/386 . . . . MH 6.8.3 Control Data Corp. CDC4680-MP . . . . . . EMH 1.4.2 (modified MH) Debian GNU/Linux 4.0 . . . . . . . . . . nmh 1.1-RC4 Debian GNU/Linux 4.0 . . . . . . . . . . mailutils 1.1 DEC Ultrix 3.1 . . . . . . . . . . . . . MH 6.5 DEC Ultrix 4.2A.4 . . . . . . . . . . . . MH 6.7.1 DEC OSF/1 . . . . . . . . . . . . . . . . MH 6.7 Evans and Sutherland ES/OS 2.3 . . . . . MH 6.6 FreeBSD . . . . . . . . . . . . . . . . . MH 6.8.4 IBM PS/2 AIX 1.3 . . . . . . . . . . . . MH 6.4 IBM RISC System/6000 AIX 3.x and 4.x . . MH 6.6 MIPS RISC/OS 4.52 . . . . . . . . . . . . MH 6.6 Red Hat Linux (3.0.3, 4.0 and 4.1) . . . MH 6.8.3 SGI Irix 6.2 Freeware 2.0 CDROM . . . . . MH 6.8.3 Sony NEWS-OS 4.3 . . . . . . . . . . . . MH 6.7.2 Tektronix UTek . . . . . . . . . . . . . MH (Version Unknown) Download MH: http://download.savannah.nongnu.org/releases/nmh/nmh-1.2.tar.gz 831kB Download GNU mailutils: http://ftp.gnu.org/gnu/mailutils/mailutils-1.2.tar.gz 3.4MB ------------------------------ Subject: !01.04 What references exist for MH? From: Bill Wohler Date: Sun, 23 Sep 2007 23:51:41 -0700 The Web: http://rand-mh.sourceforge.net/ http://www.nongnu.org/nmh/ http://www.gnu.org/software/mailutils/ http://mh-e.sourceforge.net/ Books: MH & xmh: E-mail for Users & Programmers. Third edition. Jerry Peek, with Bill Wohler and Brent Welch. ISBN 1-56592-093-7. 738 pages. O'Reilly & Associates, Inc. Out of print as of August, 1996. References to "the MH book" in this document refer to the third edition (plus updates) of this book online at http://rand-mh.sourceforge.net/book/. Section numbers for the second edition may appear in parentheses. There is another book that contains a number of examples of advanced mail handing using MH as the example message handler. It's also quite a good reference on email in general. The Internet Message. Marshall T. Rose ISBN 0-13-092941-7. 396 pages. P T R Prentice Hall Papers: MHN Tutorial by Jerry Sweet ftp://ftp.ics.uci.edu/pub/mh/contrib/multimedia/mhn-tutorial.ps.Z 141k ftp://ftp.ics.uci.edu/pub/mh/contrib/multimedia/mhn-tutorial.tex.Z 48k Usenet: comp.mail.mh gmane.mail.exmh.devel gmane.mail.exmh.user gmane.mail.mh-e.announce gmane.mail.mh-e.devel gmane.mail.mh-e.user gmane.mail.nmh.devel Mailing lists: There are three mailing lists for nmh: nmh-announce, nmh-workers, and nmh-commits. See: http://savannah.nongnu.org/mail/?group=nmh The page for each list contains a link to the archives. MH-users archives: Current archives can be found at: http://lists.nongnu.org/archive/html/nmh-workers/ Older archive can be found in the mh-users and mh-workers archives at: http://sourceforge.net/project/showfiles.php?group_id=143658&package_id=188462 There are directions in the release notes. Basically, you can use either "msh" or the individual commands "inc -file" to get the messages into a folder, and then "scan", "pick", "show", and so on (or your favorite commands in xmh, MH-E, etc.). --Jerry Peek This document: http://www.newt.com/faq/mh.html http://faqs.cs.uu.nl/na-dir/mail/mh-faq/part1.html MH-E documentation: GNU Emacs 19.29 comes with a version of MH-E that includes online (Texinfo) documentation. Try "C-h i m mh-e RET". It is also available in HTML and PDF formats at http://mh-e.sourceforge.net/manual/. See also "What other MH software is available?" to see where you can get the latest version of MH-E which includes the documentation sources. exmh: The FAQ is available at http://www.beedub.com/exmh/exmh-faq.html. The online exmh sections from the MH book can be found at http://rand-mh.sourceforge.net/book/index.html#chTourexmh Signature and Finger FAQ: http://www.faqs.org/faqs/usenet/signature-faq/ ------------------------------ Subject: 01.05 What other MH software is available? From: Stephen Gildea , Bill Wohler Date: Thu, 19 May 2005 21:20:57 -0700 MH-E is the Emacs interface to the MH mail system. It offers all the functionality of MH, the visual orientation and simplicity of use of a GUI, and full integration with Emacs and XEmacs, including thorough configuration and online help. MH-E allows one to read and process mail very quickly: many commands are single characters; completion and smart defaults are used for folder names and aliases. With MH-E you compose outgoing messages in Emacs. This is a big plus for Emacs users, but even non-Emacs users have been known to use MH-E after only learning the most basic cursor motion commands. Additional features include: * attractive text rendering with font lock * composition and display of MIME body parts * display of images and HTML within the Emacs frame * folder browsing with speedbar * threading * ticking messages * lightning-fast full-text indexed searches of all of your email * virtual folders to view ticked and unseen messages, search results * multiple personalities * signing and encrypting * spam filter interaction * XFace, Face, X-Image-URL header field support with picons The GNU Emacs distribution includes MH-E. MH-E is maintained at SourceForge: http://mh-e.sourceforge.net/ From: Chris Menzel Date: Sat, 15 Dec 2001 10:02:38 -0600 The terminal-oriented, fast, and powerful mutt mail client not only supports the MH mail format but also supports .mh_sequences files, providing a robust interface to MH. It is also amazingly configurable and is very adept at handling MIME attachments and HTML mail. Unlike MH, the displayed message numbers do not necessarily correspond to the message filenames. This makes threading and sorting lightning fast but slower to display very large folders. http://www.mutt.org/ From: Brent Welch Date: Tue, 20 Mar 2001 22:42:15 -0800 EXMH is a user interface for the MH mail system written in TCL/TK. Exmh has MIME support, color feedback in the scan listing, a folder display with one label per folder, clever scan caching, facesaver bitmap display; background inc, various inc styles, searching over folder listing and message body, a dialog-box interface to MH pick, a simple built-in emacs-like editor, interfaces to other editors, user preferences, user hacking support. For more info or to obtain exmh, see: http://exmh.sourceforge.net/ From: "Eric D. Friedman" Date: Tue, 9 Feb 1999 22:52:44 -0800 Mhtake is a perl script that lets you add people to your mail aliases file by typing mhtake [message #]. http://orion.oac.uci.edu/~friedman/mhtake.txt From: Steinar Bang Date: Fri, 26 Jan 1996 13:51:08 +0100 Mew (an Emacs interface to MH that has MIME and PGP capabilities) is found at: ftp://ftp.aist-nara.ac.jp/pub/elisp/Mew/mew-current.tar.gz [MH-E has had these capabilities since version 7.0 so mew is obsolete if you use MH-E. --Ed] From: James Perkins Date: Fri, 1 Jan 1993 00:00:00 -0800 Vmh is designed for people using the bulletin-board features of MH, where mail is stored in packed (single-file) folders. As a result, use of this program cannot be mixed with the use of normal MH commands. Vmh is a part of the official MH distribution. From: James Perkins Date: Fri, 1 Jan 1993 00:00:00 -0800 Xmh is a X11 mouse-based MH browsing tool. It is very powerful and feature-filled and thus comes with a moderate learning curve. Its dependence on the X11 environment makes it very reconfigurable, but only by people well-versed in X applications programming. Its message reply built-in-editor interface is not always popular among those used to having MH bring up the editor of their choice. Date: Fri, 1 Jan 1993 00:00:00 -0800 xmh is part of the standard X Window System distribution from the X Consortium. Ultrix also ships dxmail which is similar. ftp://cs.utk.edu/pub/xmh.shar.Z 162k From: Harald Tveit Alvestrand Date: Fri, 1 Jan 1993 00:00:00 -0800 Here's a version of xmh that includes MIME. ftp://aun.uninett.no/pub/mail/mixmh/mixmh-0.3.tar.Z 232k From: Nathaniel Borenstein Date: Sun, 26 Nov 1995 19:04:51 -0800 Metamail is a package that can be used to convert virtually ANY mail-reading program on Unix into a multi-media mail-reading program. It is an extremely generic implementation of MIME (Multipurpose Internet Mail Extensions), the proposed standard for multi-media mail formats on the Internet. The implementation is extremely flexible and extensible, using a "mailcap" file mechanism for adding support for new data formats when sent through the mail. At a heterogeneous site where many mail readers are in use, the mailcap mechanism can be used to extend them all to support new types of multi-media mail by a single addition to a mailcap file. The metamail distribution comes complete with a small patch for each of over a dozen popular mail reading programs, including Berkeley mail, mh, Elm, Xmh, Xmail, Mailtool, Emacs Rmail, Emacs VM, Andrew, and others. Note that the MH patches are now integrated into MH 6.8. ftp://ftp.bellcore.com/pub/nsb/mm2.7.tar.Z From: Tom Christiansen Date: Tue, 9 Feb 1999 22:55:24 -0800 Plum is a highly configurable and extensible screen-oriented front-end for processing MH mail on ASCII terminals. Unlike MH-E, the extension language used in plum is perl, not LISP. Plum offers many of the advantages of xmh, but lacks several of xmh's disadvantages. The look&feel derives more from vi than from emacs. Key bindings and functions may be changed on the fly to suit the user's preference. It offers filename and word completion on folder, variables, and command names. Until it is included in the standard distribution (under miscellany), you can find a copy on: http://www.cpan.org/authors/Tom_Christiansen/scripts/plum.gz 29k or mail requests to Tom From: Jerry Sweet Date: Tue, 1 Nov 1994 00:00:00 -0800 Mhunify is a set of perl scripts and templates that provides shell-level MH functionality with USENET news. Since MH supports MIME, MIME-format news articles just work. I've found that being able to handle news in the same way that I handle email is very useful, although there are some tradeoffs. Mhunify also treats MH folders just like news groups. If you subscribe to several mailing lists, and your email is automatically delivered to separate folders, say, via procmail or via MMDF's .maildelivery, the mhunify package lets you progress automatically through your folders just as you would news groups. ftp://ftp.ics.uci.edu/pub/mh/contrib/multimedia/mhunify.shar.gz From: Dale Carstensen Date: Tue, 1 Nov 1994 00:00:00 -0800 olmh is a demo for OLIT (Open Look Interface Toolkit, the Open Look wrapper to Xt) in Sun's Open Windows 3 that does handle 3rd and subsequent levels of nesting of folders. Obtain the Open Windows 3 distribution CD/ROM from Sun (SPARC only). To do this, call 1-800-USA-4SUN and send tone "2" for telemarketing after it answers. The 4.1.2 CD/ROM may also have Open Windows 3. The list price for the 4.1.2 CD/ROM is $200. From: James Perkins Date: Sun, 1 May 1994 00:00:00 -0800 Vmail is a curses-based, vi-like message browser which calls on MH programs to manipulate mail. It can be used on almost any terminal. It organizes mail folders into index pages, from which a message can be selected to be shown, replied-to, forwarded, refiled, deleted, and so on. The vi-like interface and command keystrokes are comfortable to less-experienced Unix users, and it is a small, compact program, unlike the MH-E Emacs package. This version of vmail has been bugfixed and enhanced from the original vmail published on the net in 1987 by J. Zobel. ftp://ftp.uu.net/comp.sources.unix/volume12/vmail/part0*.Z 46k ftp://ftp.ucs.ubc.ca/pub/mh/vmail.[1-3]of3.Z 58k Or mail requests to James. From: James Perkins Date: Sun, 1 May 1994 00:00:00 -0800 vmailtool may be for you if you have a Sun workstation. It is a button gadget panel for the above-mentioned vmail program. It brings vmail into the windows era where people no longer need to memorize specific command keystrokes. It also provides a mail icon with the flag that pops up when new mail arrives. Again, this is a compact, simple tool, unlike the powerful xmh program. Still, it's a welcome alternative for many people who are running SunView or OpenWindows. ftp://ftp.ucs.ubc.ca/pub/mh/vmailtool.Z 18k or mail requests to James. MMH, My Mail Handler, is a Motif interface for reading and sending mail. It uses the MH commands to actually handle sending a receiving messages. It does not support all the capabilities of MH, but offers a large enough subset to handle the majority of users. Its intended user is someone between "bumbling email novice" and "sophisticated user". Hooks are provided to allow the user to customize and add new commands. ftp://ftp.eos.ncsu.edu/pub/bill/bill.tar.Z 120k From: Andrew Waugh Date: Fri, 1 Jan 1993 00:00:00 -0800 X.500 lookups: If a name is enclosed in square brackets, when entering a destination address: To: [Greg Wickham,CSIRO] a search will be made in the X.500 Directory for the individual's entry. If an address exists then it will be extracted and placed into the headers. Mail requests for the software to the author. From: Barbara Dyker Date: Fri, 1 Jan 1993 00:00:00 -0800 QueueMH is an email based service request and tracking system based on the Rand Mail Handler. ftp://ftp.cs.colorado.edu/pub/cs/sysadmin/utilities/queuemh.tar.Z 98k From: Date: Mon, 1 Mar 1993 00:00:00 -0800 Qmh is an MH-based group mail management tool. Written entirely in perl, Qmh combines the best aspects of MH with group mail heuristics and delivers a sensible package for all levels of Unix users. A limitless number of individual queues and associated groups of permitted users can be established. Specific functionality includes the following modes of operation; checking header dates and sending reminder/deadline mail, editing existing messages, help screens, creating new messages from scratch or exiting messages, resolving messages, scanning queue folders, and annotating with status both by editing and sending mail. Qmh is a single generic program in and of itself from which all modes of operation are invoked. Additionally, each separate queue may be accessed via a link to the single program. All system configuration is maintained in a single file that is read upon each invocation of Qmh. Formatting and template files are provided in the system library, although individual users can override the defaults simply by creating equivalent files in their own MH mail directory. Qmh provides a powerful database-like functionality by allowing limitless per-queue X-Qmh-<$value> headers to be included in messages. These "fields" then form the context of the queue messages and provide a user-defined, but yet structured environment for queries, reporting, and random information. Qmh is designed to provide a complete solution for SA groups, help desks, support organizations, or wherever two or more individuals are trying to manage multiple mail requests. Qmh is also compatible with versions of xmh that provide user-level command buttons. Provided in the Qmh package is a ~/.Xdefaults template file that's setup to harness the power of Qmh. From: Jerry Peek , Shannon Yeh Date: Sun, 11 Mar 2001 00:23:21 -0800 MacMH and PC/MH: These were available only for non-commercial degree-granting institutions from: Networking & Communication Systems 115 Pine Hall Stanford University Stanford, CA 94305-4122 Phone: +1 415-723-3909 See also: ftp://netix.com/pub/pc-mh-info/* For more PC/MH info, contact: Netix Communications, Inc. 15375 Barranca Parkway Building G, Suite 107 Irvine, CA 92718 Phone: +1 714-727-9532 FAX: +1 714-727-3922 Internet: info at netix.com In addition, you might try Wollongong, to see if they have something you can get. [This information appears to be out of date. Please send me pointers to valid information. Potential sites include jessica.stanford.edu. --Ed] Two other potential methods to run MH under Windows: Run Unix under Windows with VMware (http://www.vmware.com/) or try to compile nmh with the Cygwin tools (http://www.cygwin.com/). ------------------------------ Subject: !01.06 How can I print a MH manual? From: Bill Wohler , Jos Vos Date: Sun, 23 Sep 2007 23:51:33 -0700 Documentation in text and PostScript format is found in the MH-doc.tgz tarball on: http://sourceforge.net/project/showfiles.php?group_id=143658&package_id=188464 To generate your own copy for printing, first obtain the MH sources (see "Where can I get MH?") if you don't already have it. Go into the "doc" directory and run "make guide" to create the administrators guide and "make manual" to create a user's manual which includes tutorials and man pages. If the doc directory is empty or is missing the Makefile, you'll have to run "mhconfig MH" in the conf directory so that the documentation with correct local information is created. For properly formatting the documentation (at least the manual pages) you might even have to install MH, because a reference to a tmac.h file in the MH lib directory is made in the manual pages. ------------------------------ Subject: 01.07 How should I report bugs? From: Bill Wohler Date: Wed, 29 Sep 2004 00:12:42 -0700 Bugs in nmh should be reported at: http://savannah.nongnu.org/bugs/?group=nmh Bugs in MH-E should be reported at: http://sourceforge.net/tracker/?atid=113357&group_id=13357 ------------------------------ Subject: 01.08 How can I convert from my mailer to MH? From: Mike Sutton Date: 7 Jul 1995 10:03:50 GMT The unrmail function will convert rmail format to mbox format. From: Jerry Peek Date: Fri, 1 Mar 1991 13:03:15 -0800 If you use one of a mail agent like 'mail', 'mailx', 'elm' or 'mush', converting to MH is easy. When you run the 'inc' command, it reads all new messages from the system mailbox into your 'inbox' folder. Those mail agents also have separate files or "folders" that hold messages in the same format as the system mailbox. You can read them with the 'inc -file' command. For example, to read the messages from your 'mbox' mail file into your MH 'inbox' folder, you'd type: % cd % cp mbox mbox.backup % inc -file mbox If you see the usual "Incorporating new mail into inbox..." message and a scan listing, the messages probably were converted. Read some or all of them (with the 'show' command) and be sure. The 'inc' won't remove your mbox unless you use '-truncate'. From: "Jason R. Mastaler" Date: Mon, 1 May 1995 00:00:00 -0800 You can also specify an alternate folder to inc. Here's how you can convert all your folders en masse: for arg in `cat flist`; do echo "converting $arg" inc +"$arg" -file "$arg" -silent done Section D.4 of the MH book's second edition lists two scripts to convert mail files to MH folders: babyl2mh to convert from rmail's BABYL format; vmsmail2mh to convert from VMS's mail (see "What references exist for MH") to see where the book's examples can be ftped from). These scripts aren't in the third edition but are in its archive file. From: Vivek Khera Date: Fri, 1 Jan 1993 00:00:00 -0800 I rewrote the above script in Perl since the original script doesn't work for some people (see "babyl2mh.pl" below). From: Juergen Nickelsen Date: Fri, 1 Jan 1993 00:00:00 -0800 You can remove the second to last second line ("> $input"), so that the script doesn't zero out your RMAIL file. Another alternative is to replace this line with "inc -file $tmpmbox $folder && > $input", so that the RMAIL is only zeroed if inc successfully incorporated the mail. Finally one could add a switch -z, so that the RMAIL file is only zeroed if the switch is given. (See "Appendix inco".) Date: Sun, 1 May 1994 00:00:00 -0800 Use the following to convert a BABYL format file to Unix mail format. ftp://inf.informatik.uni-stuttgart.de/pub/gnu/emacs_extras/rmailtovm.el.Z 6k See also MH book second edition (Appendix D). ------------------------------ Subject: 01.09 What is the copyright status of nmh? From: Richard Coleman Date: Mon, 10 Oct 2005 18:16:58 -0700 nmh is distributed under a variant of the classical BSD copyright. Check the COPYRIGHT file in the nmh distribution for the details. There are some specific files which were contributed to the original MH package that are copyrighted by their original author. We have retained the copyright notices of these authors in these files. ------------------------------ Subject: 02.00 ***** Building MH ***** From: Bill Wohler Date: Fri, 1 Mar 1991 13:03:15 -0800 ------------------------------ Subject: 02.01 What machines does MH run on? From: Bill Wohler Date: Thu, 19 May 2005 21:22:55 -0700 MH isn't just for Unix any more. Versions are reported to run on OS/2 (see "How can I build MH on OS/2?"), Windows (see "How can I build MH on Windows?"), and Mac (see "How can I build MH on Mac?"). Oh yeah, the Mac is now Unix. Maybe Windows Longhorn will be built on Unix too. From: Jerry Peek Date: Fri, 1 Mar 1991 13:03:15 -0800 If you have a computer running Unix, you can probably run MH. ------------------------------ Subject: 02.02 How do I build MH? From: Bill Wohler Date: Sun, 8 Sep 1996 15:13:12 -0700 If you're using Linux, you can simply install the nmh or MH package which is available in most distributions. If you want to build nmh, follow the directions in the file named INSTALL. Basically, it's simply "./configure; make; make install." If you have MH on the other hand, if you carefully read the file named READ-ME in the root of the source hierarchy, you should not have any trouble building MH. If you're having troubles building MH, it could be that the problem has already been fixed, but hasn't yet gotten into an official release. Please see http://www.gw.com/mail/mh/patches/ for more info. ------------------------------ Subject: 02.03 What options should I use? From: Bill Wohler Date: Tue, 1 Dec 1992 00:00:00 -0800 BERK: Do NOT include the BERK option (in versions 6.7 or later)! BERK breaks the mh-format functions that take apart address lines, for example mbox, from, and friendly. This would really put a crimp on my replcomps file. LOCKF: if you have NFS, you need to lock your mailbox with lockf() so the lock will be honored by all machines on the local network. If you have the lockf() system call, include LOCKF. JQ Johnson makes the point that one should use this option carefully since it requires a robust lockf() call. For example, this option caused serious problems on his SunOS 4.1.1. He suggested using LOK_BELL instead, and adding "lockstyle: 1" to $MHLIB/mts.conf (mtstailor). ATZ: makes your timezones print like "EST" instead of "-0500". Much prettier. --Stephen Gildea However, Tony Landells replies: "Yes; very pretty. How unfortunate that timezone names are so ambiguous, so that EST can be interpreted, at a minimum, as (American) Eastern Standard Time, (Australian) Eastern Standard Time, or (Australian) Eastern Summer Time (and yes, I think it's dumb having the same acronym for both normal and Summer time, but that's a different problem). While the numeric timezones may not look as nice, they are, at least, reasonably unambiguous. I would urge anyone who ever intends/hopes/expects to use email outside the U.S. to NOT use ATZ (sorry Stephen)." At any rate, the conf/examples directory has been updated and contains many examples show you which options are required on your platform and which are optional (in the upcoming version MH 6.8). At any rate, it is recommended that you examine the options in the example configuration files, and read about them in READ-ME. RPATHS: a side-effect is that slocal writes messages to your system maildrop without the MMDF C-A's that separate messages, so your BSD tools like from work. ------------------------------ Subject: 02.04 What do I need to do to use POP? From: Bill Wohler Date: Sun, 8 Sep 1996 23:31:01 -0700 MH6.7 (and earlier versions too) include a server for version 3 of POP. From: Morgan Fletcher Date: 14 Mar 1996 19:24:23 -0800 Ensure that /etc/services contains the following: pop2 109/tcp postoffice # POP version 2 pop2 109/udp ->pop 110/tcp # POP version 3 (MH's inc thinks it's "pop") ->pop 110/udp pop3 110/tcp # POP version 3 pop3 110/udp Also compile with the POP options: POP, DPOP, RPOP, etc. From: Richard Coleman Date: 06 Feb 1997 03:43:17 -0500 To get MH to use the pop3 service, add POPSERVICE=pop3 to your MH configuration and recompile: ------------------------------ Subject: 02.05 Does MH support IMAP? From: Lyndon Nerenberg Date: 27 Jul 1999 11:33:39 -0600 Run exmh on the laptop, and modify your .mh_profile to inc using APOP. This is how I run MH-E and it works fine. (I did have to modify MH-E a wee bit to allow it to prompt for the password. You would likely have to do something similar with exmh.) As a spare time project I'm adding enough IMAP support to MH (6.8.3) to allow you to 'inc -imap [-imapfolder foo]'. If I ever get this done I'll stick the diffs up somewhere. (It's not a big priority as I can get at my IMAP INBOX using APOP.) From: Tim Showalter , John Prevost Date: Wed, 25 Sep 1996 21:34:56 -0400 We are developing fmh and intend to support as much of MH as is feasible. However, MH and IMAP don't necessarily agree as to what things are going to look like. MH has static message numbers until you pack a folder; IMAP keeps two numbers on a message, one which is absolutely static and one which is relative to the top of a mailbox. Messages in IMAP are essentially immutable. IMAP doesn't (currently) allow message annotations. fmh will keep state with a background daemon instead of writing it to disk, and will probably try and keep as little on disk as possible. fmh doesn't understand MH folders at the moment, and probably won't for a really long time, if ever. As I said before, we're mostly interested in the IMAP aspects as we're using a networked file system and saving stuff on the local disk just isn't an option. fmh is not MH at a very fundamental level. It is very unlikely that it will be merged, as we're not quite as interested in creating something that is MH and IMAP as we are in writing a good IMAP client. Also, the MH code isn't going to take the introduction of IMAP without a near complete rewrite. It is not available yet. Inquiries are welcome at . From: Rahul Dhesi Date: 23 Sep 1996 08:39:52 GMT What prevents people from doing a telnet to their mail server, logging in, and firing up MH directly? Site policy? An operating system that does not let MH compile or run? Overloaded machine with insufficient processing power for MH? All these are site-specific problems and the solution lies in solving them locally, not in forcing MH to go over IMAP. IMAP was never designed to emulate a filesytem. MH was designed to make direct advantage of the filesytem structure. There is no compatibility between the two. By the time IMAP is revised enough to support MH you will have reinvented NFS. There *is* scope for redesign here, though. It would be nice to have a single-user filesystem. Create a binary telnet session to the filesystem server, log in as yourself, and then over that session run a filesystem protocol. Normal filesystem protections at the other end will be sufficient for all permissions checking, so the filesystem protocol would need to do no other permissions checking. The question of whom to export directories to would go away: They are exported to whoever completes a successful login, and accessible to the user if he would be able to access them on the server as his login id. You could even use challenge-response for the initial login, coupled with ssh-based encryption, so you automatically have a secure filesystem without even trying. IMAP is too restricted in its scope to be easily modifiable to emulate such a filesystem. It would have to be a redesign from scratch. From: John Romine Date: Sun, 8 Sep 1996 15:45:27 -0700 No. MH only supports retrieving mail using POP3. POP3 is on the "standards track"--it is now an elective Internet Draft Standard (see RFC 1939 for more details). At this point, IMAP[23] are "experimental, limited use" protocols; it is unlikely that MH will support them. From: Bill Wohler Date: Sun, 8 Sep 1996 15:45:32 -0700 Since John posted the message above, IMAP has progressed from an "experiemental, limited use" protocol. While IMAP is not universal, many vendors now have implementations. I've found several things which might help. First, a definition lifted from the Pine FAQ: What is IMAP? IMAP stands for "Internet Message Access Protocol". An IMAP client program on any platform at any location on the Internet can access email folders on an IMAP server. While the messages appear to be local, they reside on the server until the client explicitly moves or deletes them. The IMAP protocol is a superset of POP, containing all POP commands plus more. For a comparison of IMAP and POP, see the paper Comparing Two Approaches to Remote Mailbox Access: IMAP vs. POP (in ftp.cac.washington.edu:/mail/imap.vs.pop). IMAP is what allows Pine (or any other IMAP client) to get to email on a central campus email server. There are current IETF working groups revising IMAP and readying it to become an Internet standard. A copy of the latest IMAP draft may be obtained from: ftp://ftp.cac.washington.edu/mail/latest-imap-draft For a list of IMAP clients, see the file imap.software, in the same directory. From: David L Miller Date: Mon, 1 Aug 1994 00:00:00 -0800 ipop3d from the UW IMAP toolkit can operate in a couple modes. As a straight POP3 server, it uses the same C-client library as imapd, so it co-exists comfortably with imapd. It can also operate as a POP-to-IMAP gateway so that your POP-only clients can access IMAP services. ftp://ftp.cac.washington.edu/mail/imap.tar.Z 1.0M From: Mark Crispin Date: Mon, 1 Aug 1994 00:00:00 -0800 The only answer I can give for [how MH users can use IMAP] is that Pine can read mailboxes in MH format; and that someone might in the future develop a version of MH that can use IMAP. From: Philipp Takacs Date: Sun, 25 Oct 2015 15:42:23 +0100 There is other software which support IMAP and MH, like Mutt and mailsync. mailsync is based on C-client. To use MH you need a '.mh-profile' in your $HOME with your MH-Path. Here is a example config for a MH store: store test { pat \#mh/test/* prefix \#mh/test/ } ------------------------------ Subject: 02.06 Why does "mailgroup mail" only affect inc but not slocal? From: John Romine Date: Fri, 1 Jan 1993 00:00:00 -0800 If "mailgroup" is set, inc is made set-group-id to this group name. Some SYS5 systems want this to be set to "mail". Set this if /usr/spool/mail (or /usr/mail) is not world-writable. These changes were contributed by Peter Marvit, and "inc" is very careful about its use of the set-gid privilege. Note that slocal doesn't know how to deal with this, and will not work under these systems; just making it set-group-id will open a security hole (since it doesn't know when to drop the set-gid privileges). If you're using "mailgroup", you should remove slocal (and its man page) from your system. Alternatives to slocal include deliver, procmail, and mailagent. (See "What mail filters are available?") ------------------------------ Subject: 02.07 How can I build MH on Solaris 2? From: Richard Coleman Date: Tue, 20 Jan 1998 02:19:58 -0500 nmh builds out of the box on Solaris. From: Bill Wohler Date: Sun, 8 Sep 1996 15:56:31 -0700 See http://www.gw.com/mail/mh/patches/solaris/ for patches you may need. From: Neil Rickert , Scott K. Hutton , Casper H.S. Dik Date: Sun, 8 Sep 1996 15:57:25 -0700 First, don't use the BSD compatible stuff. Make sure that the Sun or GNU compiler appear before the BSD compiler in your PATH (e.g., /usr/ccs/bin). Second, don't use GNU make. Make sure that the Sun make appears before the GNU make in your PATH. Use conf/examples/solaris2.sun.com and fix the paths, if necessary. Optionally change the following to use the GNU compiler, to perform optimization, and to create shared libraries. cc gcc ccoptions -O -g -msupersparc slflags -shared Fix mhn.c with the diff in http://www.gw.com/mail/mh/patches/solaris/si_value_2.3. Optionally incorporate the Content-Length header fix. (See "How can I get MH to interpret the Content-Length field?") Linking with /usr/ucblib/libucb.so is incompatible with including . When compiling, you can ignore the following warning: fmtcompile.c, line 238: warning: semantics of "/" change in ANSI C; use explicit cast If you're using AFS, you'll have to replace any occurrence of "ln" with "ln -s" wherever the make dies when it tries to make a link "on a different file system." See also ftp://ftp.fwi.uva.nl/pub/solaris/solaris2.faq. Date: Thu, 1 Dec 1994 00:00:00 -0800 Unset LD_LIBRARY_PATH. From: Gary Strand Date: Mon, 1 May 1995 00:00:00 -0800 To cure slocal's Segmentation Fault problems, I decided to try 'cc' instead of 'gcc' (an alleged no-no under Solaris) and MH built just fine, and it's working perfectly. From: "Jason R. Mastaler" Date: Mon, 25 Sep 1995 17:35:13 -0400 Don't use "ldoptions -s" with gcc. It may cause the compile to fail with: gcc: Internal compiler error: program ld got fatal signal 11 *** Error code 1 From: "Jeffrey T. Eaton" Date: Fri, 04 Apr 1997 15:30:36 GMT Fixed [DBM_PAGFNO_NOT_AVAILABLE error] by getting the latest gdbm package, compiling and installing it and the dbm/ndbm compatibility stuff, and moving Sun's broken ndbm.h out of /usr/include. To fix "../sbr/libmh.so: undefined reference to `__builtin_va_arg_incr'", add "option __BUILTIN_VA_ARG_INCR" to your MH configuration. ------------------------------ Subject: 02.08 How can I build MH on Linux? From: Richard Coleman Date: Tue, 20 Jan 1998 02:19:58 -0500 nmh should build out of the box for most Linux systems. From: Bill Wohler Date: Tue, 9 Feb 1999 23:04:53 -0800 The Debian distribution of Linux comes with an MH and nmh packages. See http://www.debian.org/. See also http://www.gw.com/mail/mh/patches/linux/. From: "James A. Robinson" Date: 17 Apr 96 20:39:02 GMT Somebody on Debian ported it to Linux ELF. Look on ftp://ftp.debian.org/debian/stable/binary/mail/mh_6.8.4-13.deb for the .deb package of MH (it's a compressed tar file). The source is in ftp://ftp.debian.org/debian/stable/source/mail/mh_6.8.4-orig.tar.gz and mh_6.8.4-13.diff.gz. From: Brian Kirouac Date: 18 Apr 96 14:00:20 GMT If you are running Redhat and have rpm available you can also use ftp://???/pub/redhat-3.0.3/i386/RedHat/RPMS/mh-6.8.3-5.i386.rpm. The source code is in ftp://???/pub/redhat-3.0.3/i386/SRPMS/mh-6.8.3-5.i386.rpm From: "Brandon S. Allbery" Date: Sun, 26 Nov 1995 16:18:50 -0800 The current patch is the first one listed below. The old patch only works with libc-4.4, which is no longer used. The current patch is split into two pieces, as with the previous patch, but now the divisions are purely functional: the first diff enables MH to compile, the second allows creation of a shared library. [The paths are up to date, but I think the info in this paragraph is old. --Ed] Recent versions of GNU make choke on MH's makefiles. Unfortunately, the shared library patches depend on "export". If you have problems building MH, remove the "export" lines from all of the makefiles (if you applied the shared library patches) and try using BSD pmake instead. If you don't want to compile MH, the second file contains pre-compiled ready-to-run binaries which can simply be extracted in the root directory. ftp://sunsite.unc.edu/pub/Linux/system/Mail/readers/mh-6.8.3-diffs.tar.gz ftp://sunsite.unc.edu/pub/Linux/system/Mail/readers/mh-6.8.3-bin.tar.gz The sizes are 650k and 22k respectively. Note that these files are occasionally "cleaned up" by accident so please let me know if they are missing. ------------------------------ Subject: 02.09 How can I build MH on IRIX? From: Richard Coleman Date: Tue, 20 Jan 1998 02:19:58 -0500 nmh should build out of the box for Irix. From: Bill Wohler Date: Sun, 8 Sep 1996 15:33:22 -0700 See http://www.gw.com/mail/mh/patches/sgi/ for patches you may need. From: Arne K. Frick Date: 06 Jun 1995 18:30:01 GMT There is a file at viz.tamu.edu:/pub/sgi (see FAQ) containing a diff and sample configuration. If you cannot locate it, I can mail it to you. Note, however, that I had tremendous difficulties with them under 5.3: 1. Be sure to use /bin/make, NOT GNU make. 2. patch vomits over the diff. You can get around this by increasing the "fuzz factor" to 4. 3. The Makefile target for the shared library doesn't work. I had to do it by hand. But I'm stuck compiling mhn.c. From: Shankar Unni Date: 9 Jun 1995 01:53:48 GMT The fix for compiling mhn.c is in http://www.gw.com/mail/mh/patches/solaris/si_value_2.3. From: Jack Repenning Date: 25 Jul 1995 02:35:41 GMT (See "IRIX config file") below. ------------------------------ Subject: 02.10 How can I get MH to interpret the Content-Length field? From: Casper H.S. Dik Date: Sun, 8 Sep 1996 15:38:30 -0700 Apply http://www.gw.com/mail/mh/patches/solaris/content_length to your MH distribution and add the configuration option "CONTENT_LENGTH". It also includes the si_ fix in http://www.gw.com/mail/mh/patches/solaris/si_value_2.3 ------------------------------ Subject: 02.11 How can I build MH on HP-UX? From: Bill Wohler Date: Sun, 8 Sep 1996 15:50:54 -0700 If you find that your zotnet/tws directory isn't compiling, upgrade your MH (see "What is the current version/status of MH?") which includes fixes to lexedit.sed. See http://www.gw.com/mail/mh/patches/hp/ for for patches you may need. ------------------------------ Subject: 02.12 Can I prevent adding the local hostname to addresses behind firewalls? From: Ted Remillard Date: 24 Jun 1996 08:53:42 -0700 You can get MH to stop managing the headers and let the email server to do it. To do this, build MH with the options DUMB and REALLYDUMB. In the $MHLIB/mts.conf (mtstailor) file, set the server option to the IP address of the email server. After this is done, MH sends email directly to the email server and Local email To: and From: fields just have the user's simple email address, e.g., , and the remote email From: header will contain user@domainname, e.g., . Don't forget to define the REALLYDUMB option in the file sbr/addrsbr.c described below. From: Bret Rothenberg Date: Tue, 23 Jan 1996 12:25:24 -0800 (PST) Yes, use the "localname" parameter in "$MHLIB/mts.conf" (mtstailor) to specify the desired hostname. From: Ken Hornstein Date: 18 Aug 1995 23:51:48 -0400 If you're behind a firewall and sendmail gives you fits because MH adds the node name or site name to each address in the To: and CC: fields, you'll need to modify the MH source. The relevant source has to do with the REALLYDUMB option in sbr/addrsbr.c. Essentially what you need to do is set it up so REALLYDUMB is turned on (normally, it's turned off if you have MMDF or SMTP turned on). This will do what you want. I did this at our site, and it's been working great. The stuff for REALLYDUMB starts around line 613. ------------------------------ Subject: 02.13 Is there a patch to fix this or that? From: Kimmo Suominen Date: Sat, 3 Mar 2001 13:40:35 -0800 The MH Patch Archive has been opened at http://www.gw.com/mail/mh/patches/ It is a collection of patches to MH (the RAND MH Message Handling System), a set of electronic mail programs in the public domain. Since the last complete release of MH (version 6.8.3) UNIX systems have evolved making changes in the MH code necessary. Several new UNIX systems have emerged requiring new configuration templates and examples. This archive tries to collect all these fixes and enhancements that in the past have been available only through word-of-mouth and occasional reposts to newsgroups or mailing lists. The initial archive layout and the very time consuming collecting and categorizing of patches has been done by Jerry Peek. I will be the primary maintainer of the archive. Even though I will be monitoring several sources for new material (mainly the comp.mail.mh newsgroup but also the mailing lists , and ), I'd like to encourage everyone to submit patches also directly to the archive at . ------------------------------ Subject: 02.14 How can I build MH on OS/2? From: Sanjay Aiyagari Date: 21 Nov 1996 19:37:10 GMT ftp://ftp.jaist.ac.jp/pub/os/os2/network/MH/ ------------------------------ Subject: 02.15 Do any POP/IMAP servers handle MH format? From: "Carl S. Gutekunst" Date: 27 May 1997 07:24:34 GMT The University of Washington POP3 and IMAP servers can be backended by a variety of stores, including MH. This is the basis for Netscape's store, curiously enough. I haven't looked closely at how Mark Crispin implemented support for the new IMAP4 features when using an MH backend; it seems like there is a lot of computation when opening a folder for the first time, writing in the UID fields and such. But it basically appears to work. From: Lyndon Nerenberg Date: 27 Jul 1999 11:36:25 -0600 But [the UW IMAP server] can't delete/expunge from MH folders. (At least I've never been able to get it to work, and I've tried just about everything.) #mh in UW imapd isn't something I'd recommend to any serious MH user. From: Mark Crispin Date: Tue, 27 Jul 1999 14:43:25 -0700 > But it can't delete/expunge from MH folders. That's a very old version. delete/expunge has been in imap-4.x for a long while. However, there's no sticky flags. > #mh in UW imapd isn't something I'd recommend to any serious MH user. The converse is also true. The two don't play ball very well. From: Dieter Weber Date: 11 Feb 2003 04:23:38 -0800 The UW imap server supports MH folders. In order to see the MH mailboxes, you need to "subscribe" to the folders or add them to the .mailboxlist file in your home directory. ------------------------------ Subject: 02.16 How can I build MH on Windows? From: Satyaki Das Date: Wed, 19 Jun 2002 20:57:19 -0700 I have gotten MH-E to work on Windows (under Cygwin) using Earl Hood's patched nmh. It was really quite simple, but not very portable. I just needed to add/subtract "c:/cygwin" from a couple of places. Now it can read and send mail (even does PGP attachments). Thought this might be of interest to those of you stuck using Windows at work. From: Earl Hood Date: Sat, 08 Jun 2002 20:30:44 GMT I've made a tar/bz2 bundle available at This includes the patched source with binaries pre-built. I just remembered that I also had to hack the makefiles to get things to install since windoze executables have to end with .exe. I hacked the generated makefiles, so if you rerun configure, you may lose the hacks. Also, I believe the install will fail when trying to install the documentation, so to force things do: make -i install The binaries and support files should get installed (under /usr/local/nmh), but the docs probably won't. Then you will need to edit /usr/local/nmh/etc/mts.conf to reflect your local configuration. If anyone has any problems installing, I could zip up my /usr/local/nmh since I think it contains everything needed for runtime usage. From: Bill Goffe Date: 25 May 1999 18:13:55 GMT If you have Windows, consider looking at VMware http://www.vmware.com/ which provides a virtual machine where you can run Unix and therefore MH under Windows. From: Ted Nolan Date: 24 May 99 17:20:27 GMT The latest Cygnus Cygwin, GNU tools that run under Windows, http://www.cygwin.com/ seems to work pretty well and may well be able to build nmh. ------------------------------ Subject: !02.17 How can I build MH on a Mac? From: Dr Eberhard W Lisse Date: Sun, 05 Jun 2005 13:43:19 +0100 nmh compiles on the G4 iBook running Mac OS X 10.3.7 more or less out of the box with the powerpc HOST option. Use make all install. Use fink to install the nmh package on Max OS X 10.3.9 (and 10.4.1). metamail does not work out of the box. However, metamail-2.7.19-1030.src.rpm (SuSE) which compiles and installs cleanly. For exmh, first use fink to install the tcltk package. Then use fink to install exmh. ------------------------------ Subject: 03.00 ***** Scanning & Reading ***** From: Bill Wohler Date: Fri, 1 Mar 1991 13:03:15 -0800 ------------------------------ Subject: 03.01 What do I do if scan shows the wrong date? From: Bill Wohler Date: Fri, 1 Jan 1993 00:00:00 -0800 Upgrade to MH 6.8 or nmh. From: Darryl Okahata Date: 19 Jan 2000 23:01:10 -0800 MH 6.8.3 and nmh 1.0 still have a minor buglet where sortm doesn't always sort messages properly. If a (questionable) mail client sends messages with 2-digit years, like: Date: Sat, 23 Oct 09 22:02:01 EST or sends out buggy dates like (as buggy versions of Elm do): Date: Sat, 23 Oct 100 22:02:01 EST then sortm will not sort these messages properly. I have submitted patches to nmh-workers. ------------------------------ Subject: 03.02 How would one go about reading Usenet with MH? From: Bill Wohler Date: Sun, 26 Nov 1995 12:32:09 -0800 You can post via mail. Send your article to with a legitimate Newsgroups field. From: Jerry Peek Date: Tue, 1 Nov 1994 00:00:00 -0800 You can save articles in the news readers for later perusal with MH. First, create a symbolic link from your mail directory (e.g., usenet) to your news directory (e.g., "ln -s ~/News ~/Mail/usenet"). You can then treat your news directory as a mail folder. Thus, to select a news group, use "folder +usenet/comp/mail/mh". To set the default save location correctly in rn, use: rn -M -/ or in your nn presentation sequence: news.announce. +$F/$N comp.mail.mh + . . If there's news spooled on your machine (that is, not via NNTP) then you can read a newsgroup with commands like: show first +/usr/spool/news/comp/mail/mh next ... You can also use sequences to keep track of what you've read. MH will automatically set a "cur" sequence in each newsgroup you read that way. So, to continue reading the newsgroup sometime later, after you've read some other folder, you can do: next +/usr/spool/news/comp/mail/mh and you'll read the next (new) article (if any) in that newsgroup. Note that this can eventually make your private context file pretty huge; if there's a group you don't read often, you can remove its context entries with a command like: rmf +/usr/spool/news/comp/mail/mh Don't try that on a folder full of mail (a folder that isn't read-only), though... in that case, it'll remove all the messages! I haven't looked into posting. It seems like it shouldn't be hard. You could set up a "sendproc" that would look at outgoing email messages. If the message had a Newsgroups: header field, your sendproc could call inews(1) instead of post(8). I haven't seen much in the MH manpages or documentation about sendprocs (though I haven't looked for a couple of years...). See the "mysend" script in the MH book section 7.1.4 (13.13), or the URL: http://rand-mh.sourceforge.net/book/mh/senove.html#ASAtDm A threaded news reader like trn or tin is so much nicer, though, that reading news with MH may not be worth the hassle. See also MH book section 9.9 (8.7), or the URL: http://rand-mh.sourceforge.net/book/mh/shafol.html From: Stephen Gildea Date: Fri, 1 Mar 1991 13:03:15 -0800 Although news readers are better, if one really wants to use MH, bbc will do the job. For example, "bbc comp.mail.mh" reads this newsgroup. To enable bbc, you have to specify "bboards" when you build MH. From: Kimmo Suominen Date: 15 Aug 1996 18:18:10 GMT Sendmail v8 comes with MAILER(pop) which was written for the MH spop. Since I use bboards with NNTP, I never looked at the bboards setup. Date: Tue, 1 Nov 1994 00:00:00 -0800 See mhunify in (see also "What other MH software is available?"). ------------------------------ Subject: 03.03 How can I search through multiple folders? From: Jerry Peek Date: Mon, 1 Mar 1993 00:00:00 -0800 Recurse through the folders (in csh and sh): % foreach f (`folders -f`) $ for f in `folders -f` ? pick [switches] +$f > pick [switches] +$f ? end > done Or create a folder that contains links to all messages (in csh and sh): % foreach f (`folders -f | grep -v -x ln`) ? refile -src +$f -link all +ln ? end $ for f in `folders -f | grep -v -x ln` > do refile -src +$f -link all +ln > done and in the future, refile messages with "refile +folder +ln". To find something, use: % pick [switches] +ln See MH book sections 8.2.9 (7.2.9), 8.9.3 (7.8.3), or the URLs: http://rand-mh.sourceforge.net/book/mh/finpic.html#SeMTOnFo http://rand-mh.sourceforge.net/book/mh/usilin.html#AFoFuoLi ------------------------------ Subject: 03.04 Why don't MH format commands such as %(friendly) work? From: Anthony Baxter Date: Sun, 1 May 1994 00:00:00 -0800 The BERK option disables address parsing and therefore functions such as %(friendly). Recompile MH without the BERK option. ------------------------------ Subject: 03.05 Why doesn't "show" display all of a MIME message? From: Jerry Peek Date: Mon, 1 Aug 1994 00:00:00 -0800 It's not the fault of the "show" command or of MH in general. It's your system's configuration. Check the $MHLIB/mhn.defaults (mhn_defaults) file; if it doesn't have defaults for all content types, add them. Or, if you can't (or shouldn't) change mhn.defaults (mhn_defaults), you can put default entries in your MH profile file for those content types. Here's the part of the mhshow(1) (mhn(1)) manpage that explains how content types are handled. The example is for mhshow, but if you're using mhn, you'd replace mhshow with mhn: First, mhshow will look for an entry of the form: mhshow-show-/ to determine the command to use to display the content. If this isn't found, mhshow will look for an entry of the form: mhshow-show- to determine the display command. If this isn't found, mhshow has two default values: mhshow-show-text/plain: %pmoreproc '%F' mhshow-show-message/rfc822: %pshow -file '%F' If neither apply, mhshow will check to see if the message has a application/octet-stream content with parameter "type=tar". If so, mhshow will use an appropriate command. If not, mhshow will complain. So, add defaults that cover the types MH doesn't handle right now (or doesn't handle the way you want it to). Your defaults will override corresponding defaults in the $MHLIB/mhn.defaults (mhn_defaults) file. For example, if you don't have an HTML editor/browser on your system, you could tell MH to use the "less" paginator for HTML message parts: mhshow-show-text/x-html: less %F You can put that line in your MH profile. You can even set different defaults for different terminal types (say, your VT100 at home and your X setup at work). Make a file in the same format as mhn.defaults (mhn_defaults); store its pathname in the MHSHOW (MHN) environment variable. Add a test to your shell setup file (.bash_profile, .profile, .login) that tests the value of the TERM variable -- and, if you have an mhshow (mhn) setup file for that terminal type, store its pathname in the MHSHOW (MHN) variable. See also MH book sections 6.2.3, 9.4.4, 9.4.5, or the URLs: http://rand-mh.sourceforge.net/book/mh/remime.html#HomhShMe http://rand-mh.sourceforge.net/book/mh/confmhn.html#ShComhsh http://rand-mh.sourceforge.net/book/mh/confmhn.html#DiOChSmc From: Michael K. Neylon Date: Tue, 1 Nov 1994 00:00:00 -0800 If you are not using the X Window System, you may have to add this line to your MH profile: mhshow-charset-iso-8859-1: /bin/sh -c '%s' # nmh mhn-charset-iso-8859-1: /bin/sh -c '%s' # MH ------------------------------ Subject: 03.06 Can I get show not to run "less" so much on MIME messages? From: Richard Coleman Date: Tue, 20 Jan 1998 02:19:58 -0500 On nmh, you can do this just by "show -nocheckmime". This will disable the detection of MIME messages. From: Bill Wohler Date: Tue, 1 Nov 1994 00:00:00 -0800 If you say, "show all," and one of the messages was a MIME message, your pager will be run several times on each message, rather than once on all the messages as a whole. If you find this annoying, set the environment variable NOMHNPROC: % setenv NOMHNPROC "" # csh $ NOMHNPROC= # sh and bash $ export NOMHNPROC See also MH book sections 6.2.3, 6.2.10, or the URLs: http://rand-mh.sourceforge.net/book/mh/remime.html#HomhShMe http://rand-mh.sourceforge.net/book/mh/remime.html#Alttomhn ------------------------------ Subject: 03.07 Why do I get "mhn: don't know how to display content"? From: Richard Coleman Date: Tue, 20 Jan 1998 02:19:58 -0500 This has already been fixed in nmh. From: Keith Moore Date: Sun, 8 Sep 1996 15:49:50 -0700 MH 6.8.3 has a bug where it will not handle multipart/foo correctly if it doesn't know about foo. The patch: http://www.gw.com/mail/mh/patches/all/mhn_multipart tells it to treat such things as if they were multipart/mixed. (See also "Why doesn't "show" display all of a MIME message?"). ------------------------------ Subject: 03.08 How can I automatically delete MH backup files? From: mccammaa at expt05.stp.xfi.bp.com (Andy McCammont) Date: 22 May 1995 06:27:36 -0400 On System V system, add this to your crontab. If you don't have one, put this in a file, and run "crontab file". If your system does not support personal crontab files, get your system administrator to add an equivalent line to the system crontab file or daily clean-up script. Note that some administrators set the prefix character to '#'. # Remove old MH files 5 5 * * * find /PATH/TO/HOME/Mail -name ",*" -mtime +5 -exec rm {} \; ------------------------------ Subject: 03.09 Fixing "cannot fopen and lock /var/spool/mail/(user)" From: Patrick.Wambacq at esat.kuleuven.ac.be Date: Mon, 30 Sep 96 15:00:16 +0200 One should put the following lines in the $MHLIB/mts.conf (mtstailor) file: lockldir: lockstyle: 1 This prevents MH from using kernel level locking, and uses lock files instead. It solved the problem for me on two different architectures. When the lockldir entry is left empty as above, the lock file is put in the same directory as the file to be locked. If another directory is wanted, its name should be put here. From: alhy at MAILBOX.SLAC.Stanford.EDU Date: Mon, 9 Sep 1996 01:01:16 -0700 Often, this is caused by an NFS file lock. Don't ask me how it got there in the first place. To remove the file lock, do the following: # cd /var/spool/mail # cp user /tmp/user.tmp; rm user # save mail; remove locked file # chown user /tmp/user.tmp # allow user to inc old mail # su - user user% inc -file user.tmp # incorporate user's old mail Any mail that you receive in the fraction of a second that the second set of commands takes will be lost. (See also "Why does inc hang (on Sun)?") ------------------------------ Subject: 03.10 Can I read my mail with a Web browser? From: Jerry Heyman Date: Sat, 09 Oct 2004 12:41:03 -0400 See http://www.squirrelmail.org/ SquirrelMail is a standards-based webmail package written in PHP4. It includes built-in pure PHP support for the IMAP and SMTP protocols, and all pages render in pure HTML 4.0 (with no JavaScript required) for maximum compatibility across browsers. It has very few requirements and is very easy to configure and install. SquirrelMail has all the functionality you would want from an email client, including strong MIME support, address books, and folder manipulation. No MH support. Unless you're willing to write it... From: J C Lawrence Date: Wed, 10 Dec 2003 09:54:15 -0500 UW-imap can read MH folders although it doesn't maintain sequence files properly. Drop any of the IMAP web front ends in front of that. From: aeriksson at fastmail.fm Date: Wed, 10 Dec 2003 22:36:52 +0100 Have a peek at http://wmh.sf.net/. It's been a while since I worked on it, but it does give me what I need. Date: Mon, 05 Oct 1998 11:02:52 -0500 From: Kent Landfield Hypermail now supports MIME and alternate mailbox formats and sorts by author, date, and thread and can be read by a WWW reader. http://www.landfield.com/hypermail/ From: "Patrick A. Coronato" Date: 8 Sep 1995 16:36:03 GMT MHonArc, by Earl Hood from Convex, will read MH mailboxes as well as Unix mailboxes, create HTML "archives" and will also sort by date, thread and author and has support for MIME. Also, MHonArc is written in the Perl language. (You should go to this site if nothing more than to see the cool logo!) http://www.mhonarc.org/ ------------------------------ Subject: 03.11 How can I run inc automatically with POP? From: Bill Wohler Date: Mon, 27 Nov 1995 12:23:51 -0800 If MH has been compiled with RPOP, then the POP server host either needs to have your host in /etc/hosts.equiv or in your .rhosts file. Then add to your MH profile: inc: -host cuckoo given that "cuckoo" is the name of the your POP server. From: Andy Norman Date: Mon, 1 May 1995 00:00:00 -0800 Assuming your POP server is called cuckoo, add an entry to your MH profile for 'inc' like so: inc: -noaudit -norpop -noapop -host cuckoo Add the following to ~/.netrc and ensure it is readable only by you (e.g., chmod 600 .netrc): machine cuckoo.domain.name login joeuser password secret Replace the hostname, login and password with your own, of course. The hostname probably has to be fully qualified (i.e., include the full domain name). This example assumes that you can send mail by other means (e.g., with SMTP). ------------------------------ Subject: 03.12 Why does inc hang (on Sun)? From: ericding at mit.edu (Eric J. Ding) Date: 30 Apr 1996 00:22:01 -0400 This may be due to a non-robust implementation of lockf() over NFS. Try setting lockstyle to 1 in the $MHLIB/mts.conf (mtstailor) file so that MH uses dotfile locking rather than FLOCK or LOCKF. ------------------------------ Subject: 03.13 How can I get POP to work? From: Jonathan George Date: Tue, 23 Apr 1996 10:23:16 GMT If you get the error: inc: -ERR Unknown command: "rpop" you're trying to use "rpop" as the mechanism to authenticate the user. This mechanism is specified in RFC 1225 and then removed by RFC 1460. Your POP server is (rightly) rejecting this. The POP specification (RFC 1939) states that authentication is done either via a USER/PASS pair or via the APOP command. Try running inc with -noapop -norpop flags. ------------------------------ Subject: 03.14 How do I persuade mhshow (mhn) not to bring up a new window? From: Joel Reicher Date: Tue, 13 Nov 2001 16:49:04 +1100 I personally think [the solution below] is not the right solution. There's a reason that new window is opened--to ensure the correct characters are available. The "right" solution is surely to set the MM_CHARSET env var to iso-8859-1 and make the appropriate adjustments to the pager (in the case of less, setting LESSCHARSET=latin1). From: Larry Daffner Date: 27 Mar 1996 16:53:39 -0600 Add one of the following to your .mh_profile: mhshow-charset-iso-8859-1: %s # nmh mhn-charset-iso-8859-1: %s # MH ------------------------------ Subject: 03.15 How do I turn off of all the mhshow (mhn) prompts? From: Bill Wohler Date: Sun, 11 Mar 2001 11:33:10 -0800 In nmh, use mhshow -nopause. From: Larry Daffner Date: 27 Mar 1996 16:53:39 -0600 The "part xxx" message is controlled by the -list switch to mhn so add "mhn: -nolist" to your .mh_profile. To remove the pause, add an entry for "mhn-show-text/plain: more '%F'" to override the default which includes the "%p" escape. All of this is covered in the mhn man page (sort of--you need to add 2+2). It's a bit long, but well worth reading. ------------------------------ Subject: 03.16 Why is inc splitting messages improperly? From: Mayank Choudhary Date: Mon, 29 Apr 1996 09:39:29 -0700 MH considers "From " lines as message separators, so if this string is found within the body, inc splits the message. Add the following line to your .forward "|/usr/bin/mailcompat " where user-name is your login-id. See mailcompat(1) for more information. ------------------------------ Subject: 03.17 Can MH thread messages? From: "John W. Coomes" Date: 30 Apr 1997 13:02:10 -0500 Sort of. You can resort your folders by Subject with: sortm -textfield subject ------------------------------ Subject: 03.18 How can I avoid reading the HTML version of the message? From: Bill Wohler Date: 23 Jun 2000 10:19:34 -0700 You might find that you have two versions of the same message within the message. For example, one part might have a content type of text/plain and the other might be text/html. You may find that mhshow (mhn -show) wants to show the HTML version This is a feature of the multipart/alternative content type. If you prefer reading the the plain text version over the HTML version, you'd have to remove the line in $MHLIB/mhn.defaults or ~/.mh_profile that starts with mhshow-show-text/html (mhn-show-text/html). Of course, the tradeoff is that you'd never be able to view text/html at all, but you probably wouldn't care. ------------------------------ Subject: 03.19 How do I view or save attachments? From: Bill Wohler Date: Mon, 5 Mar 2001 09:12:15 -0800 Use mhshow (mhn -show) and mhstore (mhn -store) respectively. See the man pages for more details. ------------------------------ Subject: 03.20 How do I view HTML attachments with Netscape? From: Bill Wohler Date: Mon, 5 Mar 2001 09:58:05 -0800 Add one of the following to ~/.mh_profile: mhshow-show-text/html: %lnetscape -remote 'openURL(file:%f, new-window)' mhn-show-text/html: %lnetscape -remote 'openURL(file:%f, new-window)' The % escapes are described in the mhshow (mhn) man page. The ", new-window" argument in the netscape invocation is optional, but handy. After reading the message, you can dismiss the window with M-w and go back to reading mail. ------------------------------ Subject: 03.21 Fixing folders: unable to allocate storage for msgstats From: Pete Phillips Date: 30 Jan 2003 03:33:57 -0800 I found the following in my context file: atr-cur-/tmp: 1 atr-pseq-/tmp: 1 For some reason folders doesn't like this. Whether it's because of permission problems or just the size of my tmp directory (about 3/4 of a GB) I don't know, but removing these lines from my context file fixed the problem. ------------------------------ Subject: 03.22 How do I recursively list message attachments? From: Joel Reicher Date: 31 Oct 2001 00:36:14 +1100 I haven't quite managed a recursive listing, but I have worked out a recursive store, which is still useful. Hinted by a builtin display string for mhshow, I found the following works for mhstore: mhstore-store-message/rfc822: | mhstore -file - With that, mhstore will happily recurse down storing everything on its way. Not very discriminate, but the line can be altered to limit without destroying the recursion: mhstore-store-message/rfc822: | mhstore -auto -type message/rfc822 -type image/jpeg -file - which also names the files automatically for good measure. And, FWIW, I engage this by putting it in a separate file and invoking mhstore like env MHSTORE=mhn.rec mhstore ------------------------------ Subject: 03.23 Why do folder and flist overlook some of my sub-folders? From: Richard Coleman Date: Mon, 10 Oct 2005 18:14:24 -0700 There was a bug in these commands which caused them to quit searching a folder for sub-folders too early if the folder contained sub-folders which were symbolic links. This has been improved in nmh-0.25, but folder and flist will still not recurse into folders that contain only symbolic links. ------------------------------ Subject: 04.00 ***** Filing ***** From: Bill Wohler Date: Fri, 1 Mar 1991 13:03:15 -0800 ------------------------------ Subject: 04.01 Can I append MH messages to a Unix mailbox format file? From: Richard Coleman Date: Tue, 20 Jan 1998 02:19:58 -0500 In nmh, use packf instead. From: Bill Wohler Date: Fri, 1 Jan 1993 00:00:00 -0800 Yes, see $MHLIB/packmbox. ------------------------------ Subject: 04.02 Can I append MH messages to a GNU Emacs rmail BABYL-format file? From: Bill Wohler Date: Fri, 1 Mar 1991 13:03:15 -0800 To convert your MH folders to BABYL folders, first run the following script on your Mail directory. #!/bin/sh for f in Mail/*; do if [ -d $f ]; then touch msgbox folder=`basename $f` echo -n packing $folder ... packf +$folder echo done mv msgbox Mail-rmail/$folder fi done This assumes you don't have nested folders. Your rmail folders will be left in $HOME/Mail-rmail in MMDF format which rmail can read. Then run rmail-input for each folder, which converts each folder into BABYL format. Be sure not to append any messages before they are converted from MMDF to BABYL, since there may be really strange results. ------------------------------ Subject: 04.03 Why do I get ".../.mh_sequences is poorly formatted?" From: Richard Coleman Date: Tue, 20 Jan 1998 02:19:58 -0500 This bug has been fixed in nmh (as of version 0.20). There are no limitations on the length of an entry in the .mh_sequences file. From: Jerry Peek Date: Mon, 1 Aug 1994 00:00:00 -0800 There is a line length limit in this file. When sequences are unbroken (without gaps in numbering), that makes short entries in the .mh_sequences file, like this: inftex: 72-8000 But when there are lots of numbering gaps, the entry gets long: inftex: 76 79-81 87 95-96 105 109 120 124 135 141 158 163... That's when you run into problems, and why it's good to keep the folder packed when you can. Simply run "folder -pack +folder". If you're refiling a lot of messages in a large folder, you might not be able to use sequences. Use backquotes to give the message numbers directly to "refile". For example: refile +tex/info-tex `pick -to info-tex` That can still generate a long list of arguments to the "refile" command, and some Unixes can't handle that. In that case, use xargs(1): pick -to info-tex | xargs refile +tex/info-tex If worse comes to worst, fire up a Bourne shell and use a "while" loop: pick -to info-tex | fmt | while read nums; do refile +tex/info-tex $nums done The fmt(1) command breaks long lines into manageable chunks of 72 characters or so, splitting arguments at whitespace. When you redirect the input of a while loop, a "read" command will read the incoming text and store it in a shell variable line by line. This is a quick-&-dirty way to write xargs(1) if you don't have it. ------------------------------ Subject: 04.04 How can you save News articles into an MH folder? From: Jerry Peek Date: Mon, 1 May 1995 00:00:00 -0800 If your newsreader handles backquotes on its command line, you can use the mhpath command. For instance, if your "save" command is "s": s `mhpath new +somefolder` Or if your newsreader lets you define your own commands, as in shell aliases, you could define that as a command. If your newsreader can pipe an article to the standard input of a program, use the "rcvstore" command (in the MH library). For instance, if your "pipe" command is "|": | $MHLIB/rcvstore +somefolder Of course, you can also put that in a little shell script. ------------------------------ Subject: !04.05 Are there any good tools to archive MH messages? From: Bill Wohler Date: Sun, 23 Sep 2007 18:35:53 -0700 For those of lesser means, I have three shell scripts for archiving, seeking, and extracting MH messages that I had been using for a couple of decades. Send mail if interested. However, now that disk space is cheap and one can index years worth of mail in a minute or two, I haven't run those scripts in a few years. I intend to update them to index and archive a years-worth of mail at some point. Since glimpse is no longer free (as in speech), I've switched to swish++. Other indexing tools (which are also compatible with MH-E) include mairix and namazu. From: glimpse at cs.arizona.edu Date: Sun, 4 Mar 2001 10:26:24 -0800 Glimpse is a very powerful indexing and query system that allows you to search through all your files very quickly. It can be used by individuals for their personal file systems as well as by organizations for large data collections. http://www.webglimpse.org/ ------------------------------ Subject: 04.06 How can I remove duplicate messages? From: Bill Wohler Date: Sun, 17 Oct 2004 13:04:57 -0700 Don't let them get in there in the first place. Add the following to your .promailrc: :0 * ? formail -D 16384 $PM_CACHE/msgid /dev/null If it's too late, you might be interested in mhfinddup, attached below, which is an embellishment of the Perl script in (see "Removing duplicate messages (Perl)"). From: Jerry Peek Date: 20 Nov 1995 18:51:24 GMT The easiest way I know of is to sort the folder by the Message-ID field using the sortm(1) command. After the sort, each message should be next to its duplicates in the folder. Use a script (shell, Perl, etc.) to weed out the duplicates. (See "Removing duplicate messages (Bourne)"). The Perl script in (see "Removing duplicate messages (Perl)") does not require that you first sort the folder. ------------------------------ Subject: 04.07 How can I remove holes in numbering? From: Bill Wohler folder -pack ------------------------------ Subject: 05.00 ***** Composing & Replying ***** From: Bill Wohler Date: Fri, 1 Mar 1991 13:03:15 -0800 ------------------------------ Subject: 05.01 Why does repl add a "Re:" to a message that already has one? From: Larry McVoy Date: Fri, 1 Mar 1991 13:03:15 -0800 I carefully reconfigured and rebuilt MH from scratch and the problem went away. ------------------------------ Subject: 05.02 How do I include messages in repl with or without ">"? From: Richard Coleman Date: Tue, 20 Jan 1998 02:19:58 -0500 In nmh, to include a message in a reply with a leading ">", just use "repl -format". From: Alan Thew , Mike Schwager , James T Perkins Date: Fri, 1 Jan 1993 00:00:00 -0800 When making a reply, specify a filter file on the command line: repl -filter repl.format This filter file must be in your MH mail directory (usually "Mail", in your home directory). Here are a couple of example repl.format files: overflowtext="",overflowoffset=0 message-id:nocomponent,formatfield=\ "In message %{text}, you wrote:" body:component="> ",overflowtext="> ",overflowoffset=0 or overflowtext="",overflowoffset=0 date:component="Your message dated",formatfield=\ "%<(nodate{text})%{text}%|%(pretty{text})%>" body:component="> ",overflowtext="> ",overflowoffset=0 Setting overflowoffset to 0 keeps MH from doing anything to extra-long lines in the headers. In the body, however, this behavior is overridden so that long lines are automatically broken and a ">" is inserted before every line. You could put almost whatever you want between those quotes, although the "standard" ">" makes it easier to read notes that have been included several times. The examples differ with the descriptive text that is inserted before the included body. It is suggested not to use the "prompter" editor in this case, since it is likely that you'll not want to use all of the included message. Indeed, it is proper etiquette to edit out all unnecessary include verbiage so readers don't have to wade through the morass to read your pearls of wisdom. WARNING: the '>' appears on the first line ONLY in versions prior to 6.7.2. Upgrade to MH 6.8. See also MH book sections 7.8.4 (6.7.4), 7.8.5 (6.7.5), 10.4.1 (9.4.1), or the URLs: http://rand-mh.sourceforge.net/book/mh/reprep-2.html#ReaEdi http://rand-mh.sourceforge.net/book/mh/reprep-2.html#Inc http://rand-mh.sourceforge.net/book/mh/verrep.html#IncRep ------------------------------ Subject: 05.03 How can I eliminate duplicate copies of letters to myself? From: Bill Wohler Date: Fri, 1 Mar 1991 13:03:15 -0800 Add these two lines to your MH profile file: Alternate-Mailboxes: user@host1, user@host2, ... repl: -nocc me The Alternate-Mailboxes also tells scan which messages are really from you so that it can place the recipient in the scan line instead of the sender. From: Jerry Peek Date: Fri, 1 Mar 1991 13:03:15 -0800 To get one copy, you can either: - Take out the "-nocc me"... then you'll get exactly one copy of your replies (assuming all your addresses are listed in Alternate-Mailboxes), or - (See also "How can I save a copy of all messages I send?"). For more info, see the man pages comp(1), repl(1), forw(1), dist(1) and mh-mail(5). See also MH book sections 7.8.2 (6.7.2), 9.8 (8.6), or the URLs: http://rand-mh.sourceforge.net/book/mh/reprep-2.html#Sel http://rand-mh.sourceforge.net/book/mh/defmai.html From: Alec Wolman Date: Fri, 1 Mar 1991 13:03:15 -0800 Listing the name of a mailing list in Alternate-Mailboxes is also a convenient way to AVOID automatically cc-ing a mailing list when replying to a person who sent the message to the mailing-list. From: Andre Srinivasan Date: Fri, 24 Jan 1997 09:33:19 -0800 Rather than specify the hostname as part of the mailbox, you can simply specify the username and it will match on any host: Alternate-Mailboxes: asriniva ------------------------------ Subject: 05.04 How can I include my signature? From: Eric W. Ziegast , Hardy Mayer Date: Tue, 1 Nov 1994 00:00:00 -0800 There are several ways. 1) The MH way. 1a) In your Mail directory, create files that include your signature into the format of the message. ~/Mail/components: To: cc: Subject: -------- -- Eric Ziegast ziegast at uunet.uu.net UUNET Technologies uunet!ziegast ~/Mail/replfmt body:component="> ",compwidth=2 :-- :Eric Ziegast ziegast at uunet.uu.net :UUNET Technologies uunet!ziegast To use the replfmt file, add the following to your ~/.mh_profile: repl: -filter replfmt When comp is used, your signature is already there along with my headers. When repl is used, the mhl program takes the body of the letter you're replying to, prepends '> ' to each line and then adds your signature at the end (available after version 6.7). 1b) Create an "editor" which can be called from whatnow to add the signature when desired or create a frontend to post (use the .mh_profile line "postproc: postproc" to call it) that always appends the .signature file before calling post to mail the message. David J. Fiander , David A. Truesdell and Tom Wilmore have sample scripts to do these. From: Jerry Peek Date: Tue, 1 Sep 1992 00:00:00 -0800 1c) mysend, a sendproc script, processes a message after "What now? send". See "What references exist for MH" to see where the MH book scripts can be ftped from. The script is explained in MH book Section 7.1.4 (13.13), or the URL: http://rand-mh.sourceforge.net/book/mh/senove.html#ASAtDm 2) Using your editor. If you use vi, you can use something like: map S :r ~/.signature to load your signature out of .signature every time you hit 'S'. 3) Use your windowing system. xterm, for example, can provide key and button mappings for the utterly lazy. 4) If you use Emacs with MH-E: 4a) C-c C-s will append the signature. From: Andre Srinivasan Date: Mon, 1 May 1995 00:00:00 -0800 4b) Add the following to your .emacs file: (add-hook 'mh-compose-letter-function (function (lambda(a b c) (save-excursion (goto-char (point-max)) (beginning-of-line) (mh-insert-signature))))) This hook is called after the draft buffer has been initialized, but before you have a chance to type anything. From: Tom Christiansen Date: Tue, 1 Nov 1994 00:00:00 -0800 Tired of the same old signature? Want different signatures for different newsgroups? Here's a program to help you out. The way it works is to have .signature be a named pipe, so if you don't have named pipes, just say 'n'. The sigrand program then feeds stuff down the pipe every time someone wants to read it. That way it works for more than just news, but for anything that wants to read your .signature, like a mailer. You have your choice of three kinds of signatures: 1) random (short) fortune from "fortune -s"; you get these if you don't have a global sig file. 2) random fortune from ~/News/SIGNATURES [global sig file] 3) random fortune form ~/News/(newsgroup)/SIGNATURES [local sig files] Send mail if interested. Date: Tue, 1 Nov 1994 00:00:00 -0800 See also the Signature FAQ (see "What references exist for MH?"). ------------------------------ Subject: 05.05 How do I call my editor with arguments? From: John Romine Date: Mon, 1 May 1995 00:00:00 -0800 Set your editor (in .mh_profile) to the following shellscript. #/bin/sh "$@" exit 0 From: Ray Nickson Date: Fri, 1 Mar 1991 13:03:15 -0800 You might find it useful to make $EDITOR, or to use different arguments depending on your EDITOR environment variable. ------------------------------ Subject: 05.06 How can I digestify messages in a folder for mail to another user? From: Jerry Peek , Bill Wohler Date: Fri, 1 Mar 1991 13:03:15 -0800 How about: forw [-digest tmp] [-form forwcomps] [-filter mhl.digest] messages +folder These messages can be un-digestified :-) by the MH burst(1) program. See also MH book sections 7.9.7 (6.8.7), 8.10 (7.9), or the URLs: http://rand-mh.sourceforge.net/book/mh/forfor-2.html#CreDig http://rand-mh.sourceforge.net/book/mh/burdig.html From: Glenn Vanderburg Date: Tue, 1 Nov 1994 00:00:00 -0800 There's another way, which is better if the recipient understands MIME. forw -mime messages +folder (Make sure that you either have "automhnproc: mhn" in your mh profile, or type "edit mhn" to whatnow before you send it.) This bundles each message in a MIME message/rfc822 part, and then bundles the whole mess up in a multipart/digest part. You can still add your own text at the beginning. The MH burst program can also understand these messages and split them apart with no problem. This works beautifully with MIME-capable mail readers, especially exmh. ------------------------------ Subject: 05.07 How can I change my return address? From: Bill Wohler Date: Tue, 1 Dec 1992 00:00:00 -0800 If you find that your mailer creates a From header that others have trouble replying to, you can add a Reply-To header to override the From header in replies. Copy the components and replcomps files which are normally found in $MHLIB into your Mail directory and add a line like the following after the Subject header replacing my address with your address: Reply-To: jack@newt.com ------------------------------ Subject: 05.08 How can I change my From header? From: Bill Wohler Date: Mon, 27 Nov 1995 11:40:50 -0800 With either of the following solutions, you'll need to add an Alternate-Mailboxes entry in your MH profile so that scan prints "To: recipient" rather than your faked address. For example, if your real address is user@somedomain.com and you've added a From field of: From: Joe Bob you'll add the following to .mh_profile: Alternate-Mailboxes: joe.bob@somedomain.com From: Bill Wisner Date: Tue, 1 Dec 1992 00:00:00 -0800 If you're just interested in changing the hostname, add a line to $MHLIB/mts.conf (mtstailor): localname: desired_host_name From: Jerry Peek Date: Tue, 1 Dec 1992 00:00:00 -0800 Just put a "From:" header in your "components", "replcomps" and "forwcomps" files. MH will add a "Sender:" header with what it thinks is your real address. ------------------------------ Subject: 05.09 How can I save a copy of all messages I send? From: Ping Huang Date: Mon, 18 Dec 1995 17:51:33 -0800 I suggest the use of the Dcc: field (See "What is the Dcc header?"), since the use of "Dcc:" solves the issue of having the same Message-Id. The warning about using Dcc: in general contexts doesn't apply to self-blind-carbon copies, and if "Dcc:" is used and you are automatically sorting messages into folders based on mailing lists, messages which you send will get refiled in the same way. Some may prefer all outgoing messages to be segregated; others (including myself) prefer not to segregate outgoing messages. From: Bill Wohler , Jerry Peek Date: Mon, 1 Aug 1994 00:00:00 -0800 Copy the components and replcomps files which are normally found in $MHLIB into your Mail directory and add a line like the following after the cc header: Fcc: +out All outgoing messages will then be saved in the +out folder. If you make a distcomps file, it needs "Resent-Fcc:". From: Jeppe Sigbrandt Date: Sat, 5 Apr 1997 02:04:53 +0100 You can also use @ in the Fcc field to file the outgoing message in the current folder. Fcc: @ This is useful if you filter your mail (e.g., with procmail) and you read your mail in folders other than +inbox. From: David S. Goldberg Date: 30 Oct 1995 10:23:55 -0500 You can get the Message-ID field by placing the folder in the "Fcc" field and adding: send: -msgid to your .mh_profile. Unfortunately, this Message-ID isn't as useful as sendmail's--it doesn't include the date. ------------------------------ Subject: 05.10 Can the folder in Fcc: be dynamically specified? From: Andy Rabagliati Date: Mon, 1 Aug 1994 00:00:00 -0800 My suggestion would be to run Tom Christiansen's rfi script. If you cannot find it on *.sources archive sites (please try first), I can mail it to you. One good idea would be to write a whatnowproc that files the mail based on a procmail or deliver file. Then you can use the same file for incoming and outgoing mail. ------------------------------ Subject: 05.11 Can I post secure/encryped mail? From: Bill Wohler Date: Thu, 19 May 2005 18:06:39 -0700 MH-E 7.0 supports GPG out of the box. From: Bill Wohler Date: Mon, 5 Mar 2001 05:30:43 -0800 PGP keys can be obtained via mail from , and via the Web at http://www.pgp.net/pgpnet/pks-commands.html. Many PGP front-ends (e.g., mailcrypt) automatically obtain keys for you. See http://www.pgp.net/ for more info. From: Vivek Khera Date: 19 Jun 1995 22:06:37 GMT A much more robust Perl script I wrote is appended below. [Send a note to Vivek for the script. --Ed] It works its way through aliases, and avoids problems with full names in the headers. Here is my mhn profile entry to display the messages. mhshow-show-application/x-pgp: %l pgp -m '%F' # nmh mhn-show-application/x-pgp: %l pgp -m '%F' # MH to use the script, after you edit the message, at the What now? prompt, type "edit pgpmail" for plain ascii encryption or "pgpmail -m" for a MIME formatted encryption. If you want to add a digital signature, give the script the -s flag also. From: Jeffrey C. Ollie Date: Mon, 1 May 1995 00:00:00 -0800 TIS has a free, draft-standard compliant public key system that works with MH (PEM). Check it out on ftp.tis.com. From: Kimmo Suominen Date: Mon, 1 May 1995 00:00:00 -0800 You could try looking at the URL http://www.tac.nyc.ny.us/ and following the link from the cover page. Everything you need for PGP to work with MH is there (scripts and mhn entries). From: mathew at mantis.co.uk Date: Mon, 1 May 1995 00:00:00 -0800 Excellent stuff. I've tried altering it to conform to draft-borenstein-pgp-mime-00.txt. Unfortunately, I can't get mhn to tag PGP-armoured text as application/pgp; format=text without it insisting on base64 encoding it. So I can't quite manage to implement the standard. *sigh* Presumably mhn thinks that anything which isn't text/* must be encoded. From: John R MacMillan Date: Wed, 16 Apr 1997 00:06:59 -0700 Premail, in conjunction with MH, can display and compose security multiparts (e.g., multipart/signed and multipart/encrypted PGP mail, non-MIME PGP, and some S/MIME). Check out http://www.c2.org/~raph/premail/ for details. ------------------------------ Subject: 05.12 How can I send multi-media (MIME) attachments? From: Brian Exelbierd Date: Mon, 09 Oct 1995 08:05:55 -0400 The short guide: 1. Compose a letter using comp. 2. When you get to a point where you want to include a MIME attachment, type the following to include a GIF image (note: the '#' must be in the first column): #image/gif [Pictures at an Exhibition] /usr/lib/pictures/exhibition.gif 3. Finish your letter, adding more text or attachments as needed. 4. Save your letter and exit the editor. At the Whatnow prompt type "edit mhn". mhn will automatically format your letter with the MIME attachments leaving the original letter in ,##,orig where ## is the letter number. 5. Type "send" at the Whatnow prompt, and poof, you have just sent MIME mail. I strongly recommend you practice sending yourself MIME mail first. For more information, see the mhn(1) man page, ftp://ftp.isi.edu/in-notes/iana/assignments/media-types/media-types for a list of allowed media types in addition to image/gif, and Chapter 3 in the MH book or the URL: http://rand-mh.sourceforge.net/book/overall/tocs/intmime.html ------------------------------ Subject: 05.13 What's the best way to send mail to a long list of people? From: Bill Wohler Date: Thu, 12 Oct 1995 07:53:53 -0700 There are three ways to keep the list of members from appearing in everyone's header. If you're planning on mailing to these people regularly, the best way is to create an alias in /etc/aliases (/usr/lib/aliases). That way, recipients can send and reply to the list as well. The other two ways allow you to manage the list privately, but the recipients cannot send to the list (unless you set something up with your deliver or procmail script). One is with a group list. It looks like this: To: All-members: member1, member2, member3, ..., membern; The recipients see this: To: All-members:; You can make this an MH alias as well. The second way is to use a blind carbon copy (see "How do I send blind carbon copies?"). Or you could also use the undocumented Dcc field which is used like the Bcc field, but doesn't inject the "Blind-Carbon-Copy." Warning: (See "What is the Dcc header?") ------------------------------ Subject: 05.14 What is the Dcc header? From: jpeek at jpeek.com (Jerry Peek) Date: 14 Sep 96 05:51:13 GMT If you put the alias in the Dcc field and leave the To: field empty, there's a good chance that the recipients will get a message with the header field: Apparently-to: and it might even list several addresses. To avoid that, use a To: field with some address (like yours) in it. I use a comment that tells people what's really happening--like this, more or less: To: "Faculty members, c/o" dcc: faculty There are some other choices, like using an un-replyable group list in the To: field, but I think they tend to confuse non-techies. Date: Wed, 27 Sep 1995 09:46:37 -0700 From: John Romine The Dcc (Distribution Carbon Copy) field behaves much like the Bcc field, but does not add the "Blind-Carbon-Copy" notice. This header is removed before posting the message,and a copy of the message is distributed to each listed address. This could be considered a form of Blind Carbon Copy which is best used for sending to an address which would never reply (such as an auto-archiver). People should not be using Dcc as a substitute-Bcc to send to other people. When users use Dcc as a substitute for Bcc, there is *no* indication to the "blind" recipients that they have received a blind copy. If those recipients should reply (and they have no indication why they shouldn't), the original author could be very embarrassed (or worse). ------------------------------ Subject: 05.15 How can I make sense of the replcomps file? From: Bill Wohler Date: Thu, 9 Mar 2006 19:27:14 -0800 The best thing to do is curl up with the mh-format(5) man page, or Section 11.2 of the MH book, or the URL: http://rand-mh.sourceforge.net/book/mh/mhstr.html These will explain the default replcomps file, included here. Don't start with the first four lines--the latter group of lines are much easier to understand. %; $Header$ %; %; These next lines slurp in lots of addresses for To: and cc:. %; Use with repl -query or else you may get flooded with addresses! %; %; If no To:/cc:/Fcc: text, we output empty fields for prompter to fill in. %; %(lit)%(formataddr{reply-to})\ %(formataddr %<{from}%(void{from})%|%(void{apparently-from})%>)\ %(formataddr{resent-to})\ %(formataddr{prev-resent-to})\ %(formataddr{x-to})\ %(formataddr{apparently-to})\ %(void(width))%(putaddr To: ) %(lit)%(formataddr{to})\ %(formataddr{cc})\ %(formataddr{x-cc})\ %(formataddr{resent-cc})\ %(formataddr{prev-resent-cc})\ %(formataddr(me))\ %(void(width))%(putaddr cc: ) Fcc: %<{fcc}%{fcc}%|+outbox%> Subject: %<{subject}Re: %{subject}%> %; %; Make References: and In-reply-to: fields for threading. %; Use (void), (trim) and (putstr) to eat trailing whitespace. %; %<{message-id}In-reply-to: %{message-id}\n%>\ %<{message-id}References: \ %<{references}%(void{references})%(trim)%(putstr) %>\ %(void{message-id})%(trim)%(putstr)\n%>\ Comments: In-reply-to \ %<{from}%(void{from})%?(void{apparently-from})%|%(void{sender})%>\ %(trim)%(putstr)\n\ message dated "%<(nodate{date})%{date}%|%(tws{date})%>." -------- In particular, note the following: \ consider the following line to be part of the current line. If this continuation character is absent, a newline (\n) will always be inserted. Note that if the field is conditional, and the condition is false, and there isn't a trailing backslash, then a blank line will appear in your reply. Since the rest of the header will now be considered to be part of the body, this is probably not what you want. \n inject an actual newline into the reply. Note that inserting a field without a trailing backslash (\) will cause that field to be emitted in the reply as well. %<{field}, %?{field}, %|, %> if field exists, else if field exists, else, endif. Conditional fields nearly always contain an explicit newline (\n) and end with a continuation character (\). %(command) mh-format commands %{field} value of the header field inserted at this point To add new fields, you can either add fields based on whether certain fields exist in the original message (e.g., %<{message-id}...), or hard-code them, as in the Fcc, Subject, or Comments fields above. ------------------------------ Subject: 05.16 How can I convert quoted-printable to 8bit in quoted text in replies? From: Jarle F. Greipsland Date: 22 Aug 1995 10:42:07 +0200 The idea behind the solution is that I need mhn to store the contents of the mail in the native iso8859-1 format somewhere. I did this by creating a custom editor that is invoked when I reply to a message. This editor extracts the body of the message (sorry, no multipart stuff), indents it with '> ', appends it to the draft message and invokes the ordinary editor on it. Here are the details: `isorepl' is a symbolic link from my $HOME/bin-directory to `repl'. In my .mh_profile I added the following two lines: isorepl: -form isoreplcomps -editor isoextract isoextract-next: vi The isoreplcomps file in my Mail-directory contains: %(lit)%(formataddr %<{reply-to}%?{from}%?{sender}%?{return-path}%>)\ %<(nonnull)%(void(width))%(putaddr To: )\n%>\ %(lit)%(formataddr{to})%(formataddr{cc})%(formataddr(me))\ %<(nonnull)%(void(width))%(putaddr cc: )\n%>\ %<{fcc}Fcc: %{fcc}\n%>\ %<{subject}Subject: Re: %{subject}\n%>\ %<{date}In-reply-to: Your message of "\ %<(nodate{date})%{date}%|%(pretty{date})%>."%<{message-id} %{message-id}%>\n%>\ -------- #\ %<{from}%(friendly{from}) writes%|You write%>: This is a "Usenet-like" quoting style. Modify to suit your own taste. This form will setup the proper header, as well as the first line of the new message (In nnnn writes etc.). The first editor, `isoextract', looks like this: #!/bin/sh # # Called from within repl where the "editalt" variable is valid # # Point to a special MHN configuration file (save old one) OLDMHN="$MHN" MHN=$HOME/`mhparam Path`/isoquotemsg export MHN # Extract message body to "native" format (should be iso-8859-1) # > More bla bla. mhn -file "$editalt" -store >> $1 2>/dev/null MHN="$OLDMHN" myname=`basename $0` next=`mhparam ${myname}-next` if [ "x$next" != "x" ]; then exec $next "$@" fi `isoquotemsg' has just one rule; how mhn should store a text message. mhn-store-text: |sed -e 's/^[ ]*$//' \ -e 's/^\([>|]\)\(.*\)$/>\1\2/' \ -e 's/^\([^>|].*\)$/> \1/' This tells mhn to pipe the message to stdout, where the sed commands will do the reformatting/quoting. (Note: the first pair of square brackets contains a space and a tab.) So, when I do a `isorepl' to a message, `repl' will create the draft message with the proper headers (based on the `isoreplcomps' format file), fire off its first editor, `isoextract', with the name of the draft file as its parameter. `isoextract' then invokes mhn in a suitable environment, tells it that it is to use the file $editalt as its source, and orders it to store the contents. The store-text rule in the custom MHN-file tells it to just pipe the message (in native iso8859-1 form) through a small set of sed commands, and `isoextract' uses the normal shell construct to append the result to the draft file. Then, if there's defined a `isoextract-next' entry in the .mh_profile, isoextract exec's this editor. ------------------------------ Subject: 05.17 Can I have aliases include aliases? From: Bruce Cox Date: Fri, 16 Aug 1996 14:26:12 +1000 Indeed, you can. You just need to remember the way MH expands aliases. In particular, the right hand sides are only expanded by the aliases below them in your aliases file. So, if you put in: dead-men: presidents, authors presidents: washington, lincoln, jefferson, roosevelt authors: thoreau, irving, london and type: ali dead-men then you would get the response: washington, lincoln, jefferson, roosevelt, thoreau, irving, london If you had the dead-men line after the presidents and authors aliases, the response would be: presidents, authors ------------------------------ Subject: 05.18 Why doesn't mhmail understand aliases? From: "John L. Romine" Date: 25 Apr 1996 16:34:10 GMT One way that mhmail might be run is from a shell script. This means that the user running it might not use MH, and would not have a .mh_profile, etc. If you want to use aliases with mhmail, expand them before passing them as arguments (e.g., "mhmail `ali joe`"). ------------------------------ Subject: 05.19 How do I send blind carbon copies? From: Bill Wohler Date: Mon, 9 Sep 1996 00:32:14 -0700 Use the Bcc header field: To: your-address-here Bcc: member1, member2, member3, ..., membern The recipients see this: To: your-address-here ------- Blind-Carbon-Copy Content of message, with headers If you don't want the "Blind-Carbon-Copy" message, use the Dcc field, but this is discouraged in true blind carbon copies since the warning may prevent the recipient from embarrassing someone inadvertently. Read the warning in (see "What is the Dcc header?"). ------------------------------ Subject: 05.20 When I forward a message, can I use its Subject? From: Jerry Peek Date: Sun, 17 Nov 1996 20:16:31 -0800 Obtain forwedit. http://rand-mh.sourceforge.net/book/examples/mh/bin/forwedit ------------------------------ Subject: 05.21 Why is the timezone field in my 'Date:' field wrong? From: Alex Tomlinson Date: Wed, 11 Jun 1997 09:16:41 -0500 If the date field in your mail header looks like this: Date: Tue, 10 Jun 1997 15:59:03 +2228904 remove -lbsd from your MH configuration, add "curses -lcurses", and rebuild. ------------------------------ Subject: 05.22 Can I automate the comp -editor mhn process? From: Soren Dayton Date: Tue, 21 Jan 1997 17:23:32 GMT Add automhnproc: mhn to your MH profile. ------------------------------ Subject: 05.23 How can I remove those "=20" characters when forwarding? From: Dave Marquardt Date: 12 Oct 2000 10:27:38 -0500 Use `forw -mime'. ------------------------------ Subject: 05.24 Can I use mh-format substitution with forw? From: Dave Marquardt Date: Tue, 3 Aug 1999 13:28:30 -0500 (EST) The answer is no, and the real question is why not? ------------------------------ Subject: 05.25 How can I keep repl from breaking long lines? From: Jerry Peek Date: Fri, 14 May 1999 11:15:07 -0400 Try adding width=10000 (or so) to your replcomps. It should work unless you have messages with lines longer than that... ------------------------------ Subject: 05.26 How do I fix a bogus In-Reply-To or missing References field? From: Bill Wohler Date: Thu, 9 Mar 2006 21:42:21 -0800 In the past, the In-reply-to header field looked as it does in the new Comments field (see "How can I make sense of the replcomps file?"). However, the old format is no longer allowable under RFC 2822 which specifies that this field should only include the Message-ID. You can fix the replcomps and replgroupcomps files by upgrading to nmh 1.1 (be sure to update your personal copies if applicable) or simply by fixing the In-reply-to field in your own replcomps file using the example in the question referenced in this paragraph. In addition, older replcomps files lacked the References field which enables threading in capable UIs. You can get it in the same fashion as the In-reply-to field--by upgrading or copying. ------------------------------ Subject: 06.00 ***** Posting ***** From: Bill Wohler Date: Fri, 1 Mar 1991 13:03:15 -0800 ------------------------------ Subject: 06.01 What to do with "Problems with edit - draft removed". From: John Romine Date: Mon, 1 May 1995 00:00:00 -0800 If your users are using an AT&T version of "vi", it's exiting with non-zero status (supposedly a count of the "errors" during the edit). Move "vi" to "broken_vi" and put it its place : #! /bin/sh /usr/ucb/broken_vi "$@" exit 0 Alternatively, compile MH with the ATTVIBUG option. Then complain to your vendor that "vi" is broken, and they shouldfix it. ------------------------------ Subject: 06.02 Can I run my message through a program (e.g., ispell) before sending? From: Jerry Peek Date: Fri, 1 Mar 1991 13:03:15 -0800 It's pretty simple. If your speller is called myspell, use: What now? edit myspell MH will actually execute: myspell /your-mail-draft-directory/draftfile and give the entire draft message to your speller. The header will probably be "misspelled," of course, though you might be able to tell the speller to ignore it--or you could hack up a little shell script to run the speller on just the message body, then tack the corrected body back onto the header before sending. You can automate this some more. For example, if you want your speller to run after your first edit with "prompter" and also after you leave the "vi" editor, add these lines to your MH profile: prompter-next: myspell vi-next: myspell Then, at the "What now?" prompt: What now? e your speller will run. For more info, see the mh-profile(5) man page or section 7.2.1 (6.2.1) of the MH book, or the URL: http://rand-mh.sourceforge.net/book/mh/chaedi.html#Edi ------------------------------ Subject: 06.03 What to do with "bad address 'xxx' - no at-sign after local-part". From: Owen Rees Date: Fri, 1 Jan 1993 00:00:00 -0800 You may find that post returns the following message: post: bad address 'Mr. Foo Bar ' - no at-sign after local-part (Bar), continuing... The unquoted dot causes "Mr. Foo" to be parsed as the local part of the address. Either remove the dot, or rewrite the address as follows: "Mr. Foo Bar" (Mr. Foo Bar) (Mr. Foo Bar) fb@somewhere.edu ------------------------------ Subject: 06.04 Fixing "post: problem initializing server; [BHST] no servers available" From: Peter Marvit , Eric Bracken Date: Tue, 1 Nov 1994 00:00:00 -0800 The error message itself is essentially correct. However, what this really means is: MH's post cannot connect to a running sendmail over an SMTP port (MH configured with SMTP and SENDMTS). The potential problems: 1. Your local sendmail daemon is dying or not running for some reason. 2. You use BIND and your local nameserver is not responding. Solution: Delete "/etc/resolv.conf." 3. Your $MHLIB/mts.conf (mtstailor) has its "servers:" pointing to a non-existent machine or a machine which is a) not reachable or b) not running the sendmail daemon. From: Bdale Garbee , Eric Bracken Date: Sun, 1 May 1994 00:00:00 -0800 4. The hostname localhost [127.0.0.1] is missing from /etc/hosts. Solution: add an entry for "localhost" to /etc/hosts or your DNS database or add the following to $MHLIB/mts.conf (mtstailor): servers: 127.0.0.1 \01localnet From: Larry Daffner Date: 3 Mar 1996 14:39:54 -0600 5. Your load average is so high that sendmail is refusing connections. Solution: Change your configuration from "mta: sendmail/smtp" to "mta: sendmail" so that a sendmail processes is spawned to deliver the message. This is a double-edged sword since the extra process only makes the load worse. From: Corbin Covault Date: Sun, 02 Sep 2001 02:13:42 -0400 6. Sendmail may not be located on the path that MH expects. Solution: Try specifying the path explicitly by adding a line to mts.conf thus: sendmail: /usr/sbin/sendmail or wherever your sendmail daemon executable lives. From: Neil W Rickert Date: 13 Apr 2001 18:47:43 -0500 7. You don't want to use an available server. Solution: Try postproc: /usr/local/lib/mh/spost in your MH profile (but check the path first). That should use command line sendmail. ------------------------------ Subject: 06.05 Fixing "post: problem initializing server; [RPLY] 503 Sender already specified" From: Paul Pomes Date: Mon, 1 Mar 1993 00:00:00 -0800 The problem in sendmail is that the RSET after the ONEX does not reset all the state information. Normally sendmail fork()s after the Mail from: statement and a RSET causes that child to exit. This automatically cleans up. If the fork() is suppressed by ONEX, then the source must be modified to do the cleanup. See "srvrsmtp.c patch" in the Appendix. If you don't have the sources, modify your MH sources to not use the ONEX verb. ------------------------------ Subject: 06.06 Fixing "post: unexpected response; [BHST] no socket opened" From: Steve Lembark , Bill Wohler Date: Mon, 1 Aug 1994 00:00:00 -0800 This problem happens when there is no interface defined within the tcp system. A couple of workarounds include: o Use a hostname (other than the local host) instead of localhost in the "servers" entry of the $MHLIB/mts.conf (mtstailor) file. o Recompile MH with sendmail instead of sendmail/smtp (not very elegant). A better fix would be to define your tcp interface. Here, you run ifconfig and route (as root) to define the loopback device and route. You should add them to rc.local so they are effected at every boot. # ifconfig lo 127.0.0.1 # Linux # ifconfig lo0 127.0.0.1 # Sun # route 127.0.0.1 If all is well, "ifconfig lo" (or lo0), will show something like this (on my Linux system): lo Link encap Local Loopback inet addr 127.0.0.1 Bcast 127.255.255.255 Mask 255.0.0.0 UP LOOPBACK RUNNING MTU 2000 Metric 0 RX packets 0 errors 0 dropped 0 overrun 0 TX packets 519 errors 0 dropped 0 overrun 0 and "netstat -r" will show: # netstat -r Destination net/address Gateway address Flags RefCnt Use Iface 127.0.0.0 * UN 0 519 lo If you're not on a network and running DNS, your /etc/hosts will need at least: 127.0.0.1 your_host_name localhost # loopback address Note: put your name FIRST on the localhost line. This official name is used by sendmail to determine your return address. If you are on a network and running DNS, you might find that putting your host name in the localhost entry might gum up other things, in which case you'll want your hostname to have its own proper address. This might not do it though. David Youatt says that his network was happy but he still had the problem until he upgraded his system and got the latest revision of sendmail as well. He says: "Turns out that that the problem I was having seems to be caused (at least partly, maybe entirely) by the version of sendmail that is shipped with IRIX 5.2 (sendmail 5.65, I think). The version shipped w/IRIX 5.3 (in beta) is sendmail 8.6.9 and works fine." I'm not entirely happy with this section, so please give me some feedback. If you have this problem, please send me a brief description so I'll know which problems and solutions seem to be the most prevalent. ------------------------------ Subject: 06.07 How do I fix the "X-Authentication-Warning" header? From: Bill Wohler Date: Mon, 9 Sep 1996 01:32:15 -0700 (See "Fixing "Sender didn't use the HELO protocol"".) ------------------------------ Subject: 06.08 Fixing "post: unexpected response; [RPLY] 503 Need MAIL before RCPT" From: Bjoern Stabell Date: Mon, 1 May 1995 00:00:00 -0800 I inserted: clientname: localhost in the $MHLIB/mts.conf (mtstailor) file, and that fixed the problem. ------------------------------ Subject: 06.09 Fixing "post: problem initializing server; [BHST] premature end-of-file on socket" From: Ginko Date: Thu, 8 Mar 2001 09:18:14 +0000 (UTC) I have sendmail under control of tcpwrapper started by inetd and didn't want to take it away, the very simple fix to this problem was to allow the localhost on /etc/hosts.allow on the sendmail entry. From: Stefan Huebner Date: Wed, 11 Sep 1996 20:06:49 +0200 Use spost instead of post. To do this: % mv post post.orig % ln -s spost post From: Chuck Mattern Date: Mon, 1 May 1995 00:00:00 -0800 If you are running sendmail instead of smail, make sure that all smtp entries in /etc/inetd.conf are commented out. If you do edit /etc/inetd.conf, don't forget to run to restart inetd with "kill -1 ". ------------------------------ Subject: 06.10 Fixing "Sender didn't use the HELO protocol" From: rickert at cs.niu.edu (Neil Rickert) Date: Tue, 20 Mar 2001 22:01:16 -0800 If you are sharing your $MHLIB/mts.conf (mtstailor) file among several machines, and you are connecting to the local sendmail, then use 'localhost' as the hostname argument to the clientname parameter (described below). Otherwise, place mts.conf somewhere under /etc on each system, and install a symlink to it on the shared file system. From: labrown at dg-rtp.dg.com (Lance A. Brown) Date: 23 Apr 1996 14:43:04 -0400 You can solve this by putting localname: localhostname localdomain: local.domain.name in your $MHLIB/mts.conf (mtstailor) file. This will make MH send a HELO string in the SMTP transaction. From: Terry Manderson Date: Mon, 1 May 1995 00:00:00 -0800 Add clientname sender to $MHLIB/mts.conf (mtstailor) where sender is the name of the machine sending the message. The error message occurs because newer MTA's require SMTP's "HELO" command which MH omits in some configurations. When you add the above line, it forces MH to use the HELO command. From: Bill Wohler Date: Fri, 1 Mar 1991 13:03:15 -0800 You get a header like: X-Authentication-Warning: screamer.rtp.ericsson.se: Host rcur7.rtp.ericsson.se didn't use HELO protocol Easy possibilities are: apply the patch to MH that comes with Sendmail 8.X.X and makes it use HELO, or comment out the line that says Opauthwarnings in your sendmail.cf. ------------------------------ Subject: 06.11 Fixing "post: problem initializing server; [RPLY] 553 Local configuration error, hostname not recognized as local" From: "Matthew V. J. Whalen" Date: Mon, 1 May 1995 00:00:00 -0800 Change your "mts" in "conf/MH" from "sendmail/smtp" to just "sendmail." From: Bill Wohler Date: Mon, 1 May 1995 00:00:00 -0800 The solution above will keep MH from using any SMTP server on your network. require sendmail to be installed on all machines. You could take advantage of the "sendmail/smtp" option to have MH talk to a non-local sendmail. In $MHLIB/mts.conf (mtstailor) add: servers It may also be caused by old versions of sendmail. ------------------------------ Subject: 07.00 ***** Mail Filters ***** From: Bill Wohler Date: Fri, 1 Mar 1991 13:03:15 -0800 ------------------------------ Subject: 07.01 What mail filters are available? From: Bill Wohler Date: Sun, 11 Mar 2001 10:27:24 -0800 The list currently includes slocal (included with MH), deliver, procmail and mailagent. They are briefly described here. Slocal is probably the most popular by virtue of being included in the distribution. The next most popular entry is procmail, followed by deliver. Slocal comes with MH. It can be used to process incoming mail based on the contents of any of the headers. Actions include filing messages, running commands, printing messages on your terminal and so on. The configuration is made in ~/.maildelivery. People seem to have trouble with slocal bugs, and you can't use it if you don't have write permission on your system maildrop so a lot of people have opted for the alternatives, but it's easy to use and comes with MH. procmail is quite popular and has a very powerful configuration file. However, the syntax is its own, but it is easy to learn given a couple of good examples. Its advantages are its small size and speed. Like deliver, procmail may be installed as a delivery agent so you would not even have to have a .forward file. Deliver can run any script or program (called ~/.deliver), so you really can do anything you want to incoming mail. One feature that it sports that no other does is that you can install it as a local mailer in place of /bin/mail. If it's the local mailer, you don't need to have a .forward--~/.deliver is run anyway. In addition, it allows the system administrator to write some programs to filter everybody's mail. It came with my Linux system, so installation was non-existent. I started with slocal, and then moved to deliver. I switched to procmail because of a bug in deliver (which I think has since been fixed) whereby a blank line would be inserted into the header before header fields with numbers in them. I am still using procmail and probably will do so indefinitely since it is powerful, there are many spam filters written in it, and it coexists with MH and Gnus so well. My recommendation is to use the one that is installed on your system or get procmail. Here are the URLs for the filters mentioned in this document: http://www.procmail.org/ From: "Eric D. Friedman" Date: 28 Aug 1996 08:28:46 GMT See http://www.faqs.org/faqs/mail/filtering-faq/index.html. From: Stephen R. van den Berg Date: Mon, 1 Aug 1994 00:00:00 -0800 Procmail can be used to create mail-servers, mailing lists, sort your incoming mail into separate folders/files (real convenient when subscribing to one or more mailing lists or for prioritizing your mail), preprocess your mail, start any programs upon mail arrival (e.g. to generate different chimes on your workstation for different types of mail) or selectively forward certain incoming mail automatically to someone. From: Raphael Manfredi Date: Tue, 28 Jul 1998 13:22:07 +0200 "mailagent" is yet another mail filter, written in perl, which will let you do anything with your mail. It has all the features you may expect from a filter: mailing lists sorting, forwarding to MTA or to inews, pre-processing of message before saving into folder, vacation mode, etc. It was initially written as an Elm-filter replacement, but has now enough power to also supplant MMDF's .maildelivery. There is also a support for @SH mail hooks, which allows you to automatically distribute patches or software via command mails. The mailagent was designed to make mail filtering as easy as it can be. It is highly configurable and fairly complete. Rules are specified in a lex-like style, with the full power of perl's regular expressions. The automaton supports the notion of mode, and header selection has many magic features built-in, to ease the rule writing process. The distribution comes with a set of examples, an exhaustive test suite, and naturally a detailed manual page. It should be noted that the mailagent will work even if your system administrator forbids "| programs" hooks in the ~/.forward, provided you have access to some sort of cron daemon. http://www.cpan.org/authors/Raphael_Manfredi/ ------------------------------ Subject: 07.02 Why slocal writes messages to system mailbox that from(1) can't read. From: Bill Wohler Date: Mon, 1 May 1995 00:00:00 -0800 Upgrade to MH 6.8 and set the RPATHS option. Better yet, use a more MH-like command instead of from: "scan -file $MAIL". ------------------------------ Subject: 07.03 Where can I read about slocal and the format of .maildelivery? From: Bill Wohler Date: Fri, 1 Mar 1991 13:03:15 -0800 See the slocal man page. Here is brief example of a .maildelivery file that stores messages to babble in a folder and the system mailbox, stores mh-users in a folder but not the system mailbox, and puts the rest in the system mailbox. to mh-users | A "$MHLIB/rcvstore -create +lists/mh-users" cc mh-users | A "$MHLIB/rcvstore -create +lists/mh-users" to babble | R "$MHLIB/rcvstore -create +lists/babble" cc babble | R "$MHLIB/rcvstore -create +lists/babble" default - > ? /usr/spool/mail/wohler Your .forward file may look like (quotes necessary): "| $MHLIB/slocal -user your_login" In some implementations, the "-user your_login" is not needed. If not, manually running slocal with the flag will produce an error. See also chapter 12 (11) in the MH book, or the URL: http://rand-mh.sourceforge.net/book/mh/tocs/prmaau.html Alternatives to slocal include deliver, procmail, and mailagent. (See "What mail filters are available?") ------------------------------ Subject: 07.04 How do I debug my .maildelivery file? From: Bill Wohler Date: Mon, 1 Mar 1993 00:00:00 -0800 Use as many of the following as necessary. Put a message into a file and call slocal directly on it. $MHLIB/slocal -user $USER -verbose -debug < test-msg Modify your .forward to look like: "|/bin/sh -c 'exec >> /tmp/out 2>&1; $MHLIB/slocal -user $USER -verbose -debug'" Or modify a rule in .maildelivery to look like this: to foo | R "set -xv; exec >/tmp/out 2>&1; $MHLIB/rcvstore +foo" The previous examples are broken up for readability; the text must appear on one line. See also MH book section 12.11 (11.11), or the URL: http://rand-mh.sourceforge.net/book/mh/debugti.html ------------------------------ Subject: 07.05 Why isn't slocal working? From: Bill Wohler Date: Mon, 1 Mar 1993 00:00:00 -0800 If slocal doesn't appear to be doing anything, run the following $MHLIB/slocal -user your_login -verbose < file where "file" is some message in a mail folder. If you get something like: .maildelivery: ownership/modes bad (0, 154,154,0100666) your .maildelivery is writable by too many people. Make it writable only by you by running "chmod 644 .maildelivery". See also "How do I debug my .maildelivery file?" ------------------------------ Subject: 07.06 Are there any good biff applications for MH? From: Rob Austein Date: Tue, 01 Dec 1998 03:02:34 -0500 I've been been using a program called xlbiff (X Literate Biff) and have been quite happy with it. By default, xlbiff generates its pop-up listings by running scan on your mail drop file, but it's not a big deal to customize xlbiff for more complicated setups if you make heavy use of procmail, multiple mail drops, and so on. From: Richard Coleman Date: 07 Jul 1997 03:31:42 -0400 nmh (new MH) has an additional command (flist) that will tell you which folders have unseen messages. I can't imagine using MH without it. From: crow at tivoli.com (David L. Crow) Date: 7 Jul 97 09:36:32 GMT I have used the following X resource with xbiff before: xbiff*checkCommand: grep -q '^unread' `mhpath +inbox`/.mh_sequences \ && exit 0 || exit 2 This should be all one line, but I split it with a line continuation character for readability. ------------------------------ Subject: 07.07 How do I read new messages filed by procmail? From: Bill Wohler Date: Sun, 17 Oct 2004 15:17:14 -0700 If you use MH-E, use "F n (mh-index-new-messages)" to display unseen messages. From: Neil W Rickert Date: 23 Apr 2002 20:38:57 GMT Here is my "unseen" shell script: #! /bin/sh - case "$1" in "") grep unseen $HOME/Mail/context $HOME/Mail/*/.mh_sequences | sed -e '/\/fromme\//d' \ -e "s=$HOME/Mail/==" \ -e 's=/.mh_sequences:unseen==' ;; "+") shift mark -sequence unseen -add "$@" ;; "-") shift mark -sequence unseen -delete "$@" ;; *) echo "Invalid arguments $*" ;; esac From: Paul Fox Date: Tue, 23 Apr 2002 20:13:42 GMT I have procmail deliver to a set of mbox files and use "inc -f foo" to inc from them. The names of the mbox files are the same as the MH folders which makes it easy to write a script that does something like this: cd Mailboxes for x in *; do inc -f $x +$x done ------------------------------ Subject: 08.00 ***** MH-E ***** From: Bill Wohler Date: Fri, 1 Mar 1991 13:03:15 -0800 ------------------------------ Subject: 08.01 I have a question about MH-E From: Bill Wohler Date: Sat, 3 Mar 2001 13:51:29 -0800 Let me send you over to: http://mh-e.sourceforge.net/ This is the SourceForge MH-E project. It has mailing lists and files to download, and will let you submit patches or support requests. The Support Requests section may already contain an answer to your question. If not, you can post your question: http://sourceforge.net/tracker/?group_id=13357&atid=213357 ------------------------------ Subject: 09.00 ***** Xmh ***** From: Bill Wohler Date: Fri, 1 Mar 1991 13:03:15 -0800 ------------------------------ Subject: 09.01 How can I get xmh to use Emacs as the editor? From: Bob Ellison Date: Fri, 1 Mar 1991 13:03:15 -0800 The modifications to xmh to support an external editor, annotations, and an append command can be found in the these places. ftp://ftp.x.org/R5contrib/xmh-mods-R5-1.7.Z 37k ftp://ftp.sei.cmu.edu/pub/xmh/xmh-mods-R5-1.7.Z 37k ftp://ftp.sei.cmu.edu/pub/xmh/xmh-mods-R6-1.0.Z 37k From: Andrew Wason Date: Fri, 1 Mar 1991 13:03:15 -0800 As of R5, xmh has a new action proc called XmhShellCommand. A string parameter will be executed as a shell command with the currently selected messages as parameters (or the current message if there are no selected messages). Using this new action, a couple of shell scripts, a window version of emacs (e.g. xemacs) and some elisp code, xmh can use emacs as its editor instead of the built in Athena text widget editor. This doesn't require any source code changes to xmh. These are included in the Appendix "Switching xmh's editor". ------------------------------ Subject: 09.02 Does xmh support subfolders? From: Steve Malowany Date: Fri, 1 Mar 1991 13:03:15 -0800 Yes. Create one by invoking "Create Folder" as usual, and enter something like: existing-folder/new-sub-folder. You can then access the subfolder by popping up a menu over the "existing-folder" button item. But: From: John Cooper Date: Fri, 1 Mar 1991 13:03:15 -0800 The R5 version of xmh does *not* handle nested sub-folders. If you create a folder as 'grab/some/bandwidth', xmh displays this folder name for the remainder of the session where it was created, BUT if you later re-run xmh, the folder is no longer visible to xmh. See also MH book section 15.6.2 (15.6.2), or the URL: http://rand-mh.sourceforge.net/book/xmh/orgfol.html#FolaSub ------------------------------ Subject: 09.03 How do I precede included messages with ">" when replying in xmh? From: Len Makin Date: Fri, 1 Mar 1991 13:03:15 -0800 Include the following line in your ~/app-defaults/XMh file: Xmh*replyInsertFilter: "sed 's/^/> /'" or, Xmh.ReplyInsertFilter: $MHLIB/mhl -form repl.filter From: Andy Linton Date: Fri, 1 Mar 1991 13:03:15 -0800 Using this means that you can chose to insert the original by use of the "Insert" button in the Draft message pane. See "How do I include messages in repl with or without ">"?" to find examples of repl.filter. See also MH book sections 15.1.4 (15.1.4), 16.3.3 (16.3.3), or the URLs: http://rand-mh.sourceforge.net/book/xmh/senmai.html#MorRep http://rand-mh.sourceforge.net/book/xmh/resfun.html#Rep ------------------------------ Subject: Glossary From: Bill Wohler Date: Wed, 29 Sep 2004 00:04:34 -0700 MH Mail Handler MHLIB Where MH support routines and files are kept; usually /usr/lib/mh or /usr/local/lib/mh. POP3 Post Office Protocol, RFC 1939 MMDF Multi-channel Memo Distribution Facility MIME Multipurpose Internet Mail Extensions, RFC 1521 IMAP Internet Message Access Protocol, RFC 1064, 1176 TIS Trusted Information Systems PEM Privacy Enhanced Mail PGP Pretty Good Privacy SMTP Simple Mail Transport Protocol (STD 10; RFC 821) ------------------------------ Subject: Acknowledgments From: Bill Wohler Date: Mon, 9 Sep 1996 01:37:27 -0700 I'd like to thank the following people for providing ideas on the layout of this article: Joe Wells Richard M. Stallman David Elliott Tom Christiansen Eugene N. Miya We are also grateful to Kim F. Storm and Edward Vielmetti and the folks mentioned in the text of this document who have provided answers or other information to make this a better document. I regret that it is possible that some names have been accidentally omitted. I would also like to thank all the readers of comp.mail.mh. I'd also like to thank John Romine for maintaining MH and the MH Web page, Jerry Peek for writing the MH bible and for all his hard work with the entire MH project, Stephen Gildea for maintaining MH-E in years past and always sending me lots of great comments, Kimmo Suominen for maintaining the MH patch page, and Richard Coleman for taking MH to nmh. ------------------------------ Subject: Switching xmh's editor From: Andrew Wason Date: Fri, 1 Mar 1991 13:03:15 -0800 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh 'README' <<'END_OF_FILE' XThis is a short description of what to do with each of the enclosed files. X XXmh.ad X Merge this in with your xmh resources. If you already have X user defined buttons, then you may need to renumber the X buttons in this resource file. X Xxmh-command.el X Byte compile this file and put it in your GNU emacs load-path. X Xxmhcommand Xxmhemacs X Put these somewhere in your path. X X XOnce you have installed these, restart the R5 xmh with the new Xresources. When you press the repl, forw or comp buttons Xan xemacs window will come up with your draft message. X XOnce you have written your mail, save it and exit GNU emacs (C-xC-c). XYou will be prompted if you want to send the current message. XIf you enter 'y', the message will be sent and the output will Xbe displayed in an emacs window (in case you use -verbose or -snoop). XThen you will be prompted to exit emacs. Enter 'y' when you are ready. X XIf you answered 'n' when prompted to send the message, Xthen the draft message will be deleted and emacs will exit. X XYou can modify the Xmh.ad resources to add more buttons. XAny MH command which accepts "+folder msg" can be used X(e.g. a replx shell script which includes the body of the Xmessage being replied to can be bound to a replx button) X X XAndrew Wason Xaw at bae.bellcore.com END_OF_FILE if test 1269 -ne `wc -c <'README'`; then echo shar: \"'README'\" unpacked with wrong size! fi # end of 'README' fi if test -f 'Xmh.ad' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Xmh.ad'\" else echo shar: Extracting \"'Xmh.ad'\" \(457 characters\) sed "s/^X//" >'Xmh.ad' <<'END_OF_FILE' XXmh*CommandButtonCount: 3 X XXmh*commandBox.button1.label: repl XXmh*commandBox.button1.translations:\ X #override\n\ X : XmhShellCommand(xmhcommand y repl) unset() X XXmh*commandBox.button2.label: forw XXmh*commandBox.button2.translations:\ X #override\n\ X : XmhShellCommand(xmhcommand y forw) unset() X XXmh*commandBox.button3.label: comp XXmh*commandBox.button3.translations:\ X #override\n\ X : XmhShellCommand(xmhcommand n comp) unset() END_OF_FILE if test 457 -ne `wc -c <'Xmh.ad'`; then echo shar: \"'Xmh.ad'\" unpacked with wrong size! fi # end of 'Xmh.ad' fi if test -f 'xmh-command.el' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'xmh-command.el'\" else echo shar: Extracting \"'xmh-command.el'\" \(1294 characters\) sed "s/^X//" >'xmh-command.el' <<'END_OF_FILE' X;;; These functions are for use with xemacs and xmh. X;;; The R5 xmh has a new action - XmhShellCommand which executes X;;; a shell command with the current msg as an arg. X;;; By executing something like: X;;; XmhShellCommand(xmhcommand repl) X;;; you can use xemacs as your editor with xmh. X;;; X;;; The following elisp functions perform the basic whatnowproc functionality X;;; (quitting and deleting, sending) X;;; X;;; Andrew Wason aw at bae.bellcore.com X X X;;; Override C-xC-c X(define-key indented-text-mode-map "\C-x\C-c" 'xmh-command-send-or-delete) X X X(setq mhdraft (getenv "mhdraft")) ; save the filename of the draft X X X(find-file mhdraft) ; load the draft letter X(indented-text-mode) X(setq draft-buffer (current-buffer)) ; save the buffer the draft is in X X X(defun xmh-command-send-or-delete () X "Prompt to send or delete letter, then quit." X (interactive) X (set-buffer draft-buffer) X (if (y-or-n-p "Send message? ") X (progn X (save-buffer) ; save the draft buffer X (message "Sending...") X (pop-to-buffer "MH mail delivery"); pop to a buffer for "send" output X (erase-buffer) X (call-process "send" nil t t mhdraft) ; call MH "send" X (if (y-or-n-p "Exit? ") X (kill-emacs))) ; exit emacs X (delete-file mhdraft) ; delete the draft letter X (kill-emacs))) ; exit emacs END_OF_FILE if test 1294 -ne `wc -c <'xmh-command.el'`; then echo shar: \"'xmh-command.el'\" unpacked with wrong size! fi # end of 'xmh-command.el' fi if test -f 'xmhcommand' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'xmhcommand'\" else echo shar: Extracting \"'xmhcommand'\" \(669 characters\) sed "s/^X//" >'xmhcommand' <<'END_OF_FILE' X#!/bin/sh X# This shell should be invoked by the xmh XmhShellCommand() action as X# XmhShellCommand(xmhcommand y repl) X# XmhShellCommand(xmhcommand n comp) etc. X# If the second arg is y, then the message list will be used. X X# We invoke the passed MH command on the identified message X# (we must strip the message number and folder from the pathname) X(if [ $1 = "y" ] Xthen X $2 -whatnowproc xmhemacs +`dirname \`echo $3 | \ X sed "s;\\\`mhpath +\\\`/;;"\`` `basename $3` X X# You can use this more readable version instead if you have ksh X# $2 -whatnowproc xmhemacs +$(dirname $(echo $3 | \ X# sed "s;$(mhpath +)/;;")) $(basename $3) X Xelse X $2 -whatnowproc xmhemacs Xfi)& END_OF_FILE if test 669 -ne `wc -c <'xmhcommand'`; then echo shar: \"'xmhcommand'\" unpacked with wrong size! fi chmod +x 'xmhcommand' # end of 'xmhcommand' fi if test -f 'xmhemacs' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'xmhemacs'\" else echo shar: Extracting \"'xmhemacs'\" \(116 characters\) sed "s/^X//" >'xmhemacs' <<'END_OF_FILE' X#!/bin/sh X# Invoke xemacs and load the xmh-command.el stuff. X# xmhemacs is used by xmhcommand Xxemacs -l xmh-command END_OF_FILE if test 116 -ne `wc -c <'xmhemacs'`; then echo shar: \"'xmhemacs'\" unpacked with wrong size! fi chmod +x 'xmhemacs' # end of 'xmhemacs' fi echo shar: End of shell archive. exit 0 ------------------------------ Subject: babyl2mh.pl From: Vivek Khera Date: Fri, 1 Mar 1991 13:03:15 -0800 #!/usr/gnu/bin/perl # incorporate an RMAIL babyl file into an MH folder # # usage: babyl2mh +folder babyl-file # # V. Khera 17-JUL-1991 # where to find rcvstore $rcvstore = "/usr/local/lib/mh/rcvstore"; # # pull out command line args # die "usage: babyl2mh +folder babyl-file\n" unless @ARGV == 2; $folder = shift; # make sure folder name starts with a "+" (substr($folder,0,1) eq "+") || (substr($folder,0,0) = "+"); $bfname = shift; print "Incorporating RMAIL file $bfname into MH folder $folder\n"; # # read in babyl file. # $/ = "\037"; # this separates the records in a babyl file $* = 1; # records are multi-lines open(BABYL,$bfname) || die "Couldn't open $bfname\n"; $_ = ; # discard header. $msgnum = 0; while () { chop; # get rid of delimeter s/\f(.|\n)*\*\*\* EOOH \*\*\*\n//; # remove duplicate header information open(RCVSTORE,"|" . $rcvstore . " $folder"); print RCVSTORE $_; $msgnum++; print "Message $msgnum done.\n"; } ------------------------------ Subject: inco - babyl to MH converter From: Juergen Nickelsen Date: Fri, 1 Mar 1991 13:03:15 -0800 #!/bin/sh # Usage: inco [from [folder]] # "from" defaults to $HOME/Mail/outbound, "folder" to +inbox. lispfile=/tmp/inco.$$.el input=${1-$HOME/Mail/outbound} tmpmbox=/tmp/inc.$$.mbox folder=${2-+inbox} if [ $# -ge 3 ]; then echo Usage: `basename $0` [ from [ folder ]] exit 2 fi trap "rm -f $lispfile $tmpmbox ; exit 1" 1 2 15 touch $tmpmbox chmod 600 $tmpmbox echo '(rmail-input "'$input'") (rmail-last-message) (setq last (rmail-what-message)) (rmail-show-message 1) (while (not (equal (rmail-what-message) last)) (rmail-output "'$tmpmbox'") (rmail-delete-forward nil)) (rmail-output "'$tmpmbox'") (kill-buffer (current-buffer)) ' > $lispfile emacs -batch -l $lispfile inc -file $tmpmbox $folder > $input rm -f $lispfile $tmpmbox ------------------------------ Subject: t2h - add hyperlinks to message viewed From: TANAKA Tomoyuki Date: Mon, 13 Sep 1999 11:35:43 -0600 #! /bin/sed -f # "t2h" by TT news:alt.tanaka-tomoyuki http://listen.to/TT # USE: t2h file.html # Or: show | t2h | lynx - s/&/\&/g s//\>/g s/http:[^ "&) ]*/&<\/a>/g s/news:[^ "&) ]*/&<\/a>/g s/ftp:[^ "&) ]*/&<\/a>/g s/telnet:[^ "&) ]*/&<\/a>/g 1i\

$a\
------------------------------ Subject: srvrsmtp.c patch From: Paul Pomes Date: Fri, 1 Mar 1991 13:03:15 -0800 >From the 5.67 sources: *** srvrsmtp.c- Mon Feb 22 12:25:54 1993 --- srvrsmtp.c Mon Feb 22 12:29:09 1993 *************** *** 384,389 **** --- 384,395 ---- message("250", "Reset state"); if (InChild) finis(); + + /* clean up a bit if running in parent */ + hasmail = FALSE; + dropenvelope(CurEnv); + CurEnv = newenvelope(CurEnv); + CurEnv->e_flags = BlankEnvelope.e_flags; break; case CMDVRFY: /* vrfy -- verify address */ ------------------------------ Subject: IRIX config file From: Jack Repenning Date: 25 Jul 1995 02:35:41 GMT # Irix 5.3 (based on examples/sys5r4) bboards on bin /usr/local/bin/mh cc cc ccoptions -g chown /bin/chown curses -lcurses etc /usr/local/lib/mh ldoptions -L/usr/local/lib/mh mail /usr/mail mailgroup: mail manuals local mts sendmail/smtp pop on popdir /usr/local/bin ranlib off #sharedlib sys5 #slibdir /usr/local/lib/mh signal void sprintf int options BIND options DBMPWD options DUMB options FOLDPROT='"0700"' options MHE options MHRC options MIME options MORE='"/usr/bsd/more"' options MSGPROT='"0600"' options RENAME options RPATHS options SBACKUP='"\\#"' #options SENDMTS options SGI #options SMTP options SOCKETS options SVR4 options SYS5 options SYS5DIR options UNISTD options _XOPEN_SOURCE options VSPRINTF From: David Paschich Date: 23 Apr 96 21:27:12 GMT # @(#)$Id$ # a 4.2BSD VAX system running SendMail bin /usr/local/bin/mh bboards off etc /usr/local/lib/mh mail /var/mail manuals local mandir /usr/local/man chown /sbin/chown ranlib off mts sendmail signal void options BIND LOCKF FOLDPROT='"0700"' MHE MHRC MORE='"/usr/bsd/more"' options MSGPROT='"0600"' RPATHS SENDMTS SGI SMTP SOCKETS SYS5 options TYPESIG="void" ncr MIME VSPRINTF UNISTD SYSVR4 SYS5DIR ------------------------------ Subject: HP-UX 10.20 config file From: Marko Heikkinen Date: 06 Jan 1997 17:19:07 +0000 bin /opt/mail/bin bboards on etc /opt/mail/lib/mh editor prompter remove mv -f mail /var/mail mandir /opt/man manuals standard chown /bin/chown cc cc ccoptions +DA1.0 +DS1.0 curses -lcurses mts sendmail/smtp pop off slibdir: /opt/mail/lib options SYS5 options MHE options MIME options ATZ options BIND options MHE options MIME options ATZ options BIND options MHE options MHRC options MORE='"/opt/gnu/bin/less"' options MSGPROT='"0600"' options NDIR options NTOHLSWAP options POPUUMBOX options SOCKETS options SYS5 options TZNAME options TYPESIG=void options VSPRINTF options WHATNOW options _STRINGS signal void curses -lcurses -ltermlib sprintf int ------------------------------ Subject: Removing duplicate messages (Bourne) From: Jerry Peek Date: 20 Nov 1995 18:51:24 GMT Here's a simple-minded Bourne shell version. It uses "scan" to get the message number and message-id of each message. If a message has the same message-id as the previous message, the script adds its message number to the "remove" shell variable. #!/bin/sh lastmsgid=hahahaha remove= scan -width 300 -format '%(msg) %{message-id}' | while read msg msgid; do if [ "$msgid" = "$lastmsgid" ]; then remove="$remove $msg" else lastmsgid="$msgid" fi done rmm $remove That's pretty simple-minded. For example, if the $remove variable gets too big, your system may complain. And I'm sure there are some more-efficient ways to find the list of duplicate message-ids. But that's the idea. Subject: Removing duplicate messages (Perl) From: rtor at ansa.co.uk (Owen Rees) Date: 20 Nov 1995 12:39:47 GMT I wrote a perl script to do this some time ago. All the usual dire warnings about destructive technology apply - take a backup, do it on a copy, try it on a small test case first etc. Don't use this script unless you are prepared to accept the consequences. #!/usr/local/bin/perl $version = "rmmdup 1"; if (@ARGV == 0) { $folder = ""; } elsif (@ARGV == 1) { $folder = $ARGV[0]; unless ( $folder =~ /^\+.+$/ ) { die "usage $0 [+folder]\n"; }; } else { die "usage $0 [+folder]\n"; }; $rmmlist = ""; open (scan, "scan $folder -format '%(msg) %{message-id}'|"); while () { if ( ($msg,$msgid) = /^(\d+) (<.*>)$/) { if ($msgs{$msgid}) { print "$msg duplicates $msgs{$msgid}\n"; $rmmlist .= " $msg"; } else { $msgs{$msgid} = $msg; }; }; }; if ( $rmmlist ) { exec "rmm $folder $rmmlist"; }; exit; Subject: Removing duplicate messages (Perl) From: Bill Wohler Date: Sun, 17 Oct 2004 13:00:20 -0700 #!/usr/bin/perl -w # # Id: mhfinddup 6593 2004-09-02 16:34:24Z wohler =head1 NAME mhfinddup - find duplicate messages =head1 SYNOPSIS mhfinddup [options] [folder ...] =head1 DESCRIPTION B finds and removes duplicate MH messages in the folders listed on the command line (default: current folder). By default, you deal with duplicate messages interactively. You can either remove the duplicate, not remove the duplicate, or view the original and duplicate message before deciding. If you use the B<-msgid> option to B, then you probably don't want to list any F<+outbox> folders if you are using the B<--no-same-folder> option and you want to preserve your sent messages as well as your messages to mailing lists. Note that if you specify one or more folders, or if you use the B<--all> option, B recursively descends the given folders. =head1 CONTEXT Context is per B(1). That is, if F<+folder> is given, it will become the current folder. If multiple folders are given, the last one specified will become the current folder. =head1 OPTIONS =over 4 =item --all Look for duplicates in all folders. If any folders are specified, this option is ignored. =item --debug Turn on debugging messages. =item --help Display the usage of this command. =item --list List duplicated messages. =item --no-same-folder Since it is common to use C to file a message in multiple folders, this script doesn't consider messages in different folders to be duplicates. Specify this option to list or remove duplicates across folders. =item --rmm Remove messages non-interactively. Use with care! For safety, the B<--list> option takes precedence if specified and is a good option to use before using B<--rmm>. =item --version Display program version. =back =head1 RETURN VALUE Returns 0 if all is well; non-zero otherwise. =head1 EXAMPLES =over 0 =item mhfinddup Interactively remove duplicates from the current folder. =item mhfinddup --all --list --no-same-folder List all duplicates regardless if they are in different folders or not. =item mhfinddup --rmm +lists Remove all duplicates in F<+lists>, recursively. =back =head1 SEE ALSO B(1), B(1), B(1) =head1 VERSION Revision: 6593 =head1 AUTHOR Bill Wohler Copyright (c) 2003 Newt Software. All rights reserved. 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, you can find it at http://www.gnu.org/copyleft/gpl.html or write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. =head1 METHODS =cut # Packages and pragmas. use Getopt::Long; use strict; # Constants. my $cmd; # name by which command called ($cmd = $0) =~ s|^\./||; # ...minus the leading ./ my $ver = '6593'; # program version with CVS noise # Variables (may be overridden by arguments). my $all = 0; # look in all folders my $debug = 0; # verbose mode my $help = 0; # display usage my $version = 0; # display version my $list = 0; # list duplicates my $no_same_folder = 0; # consider duplicates across folders my $rmm = 0; # remove duplicates without asking # Constants. my $mhl = "/usr/lib/mh/mhl"; my $tmp = "/tmp/mhfinddup$$"; # Parse command line. # The use of the posix_default option is to ensure that folders like +a are # not confused with --all. I'd really prefer to set prefix_pattern to "(--|-)" # so that abbreviations of options can be used without being confused with # folders, but I couldn't make it so. my %opts; Getopt::Long::Configure("pass_through", "posix_default"); GetOptions('all' => \$all, 'debug' => \$debug, 'help' => \$help, 'list' => \$list, 'no-same-folder' => \$no_same_folder, 'rmm' => \$rmm, 'version' => \$version, ) or usage(); show_version() if ($version); usage() if ($help || int(@ARGV) != int(map(/^\+/, @ARGV))); my @folders = expand_folders(@ARGV); print("Expanded " . join(" ", @ARGV) . " into\n" . join("\n", @folders) . "\n") if ($debug); print("Scanning for duplicate messages...\n"); my %msgs; foreach my $folder (sort @folders) { print("Scanning $folder...\n") if ($debug); open (SCAN, "MHCONTEXT=$tmp scan +$folder -format '%(msg) %{message-id}'|"); while () { if (my ($msg, $msgid) = /^(\d+) (<.*>)$/) { if ($msgs{$msgid}) { $msgs{$msgid} =~ m|^\+(.*)/(\d+)$|; my($f, $m) = ($1, $2); if ($folder eq $f || $no_same_folder) { handle_dup($f, $m, $folder, $msg); } } else { $msgs{$msgid} = "+$folder/$msg"; } } } close(SCAN); } unlink("$tmp"); sub expand_folders { my @folders = @_; print("Getting list of folders..."); open(FOLDERS, "flist -recurse " . (($all == 1 && @folders == 0) ? "-all" : join(" ", @folders)) . "|") or die("Could not determine folders\n"); @folders = (); chomp(my $current_folder = `mhparam Current-Folder`); $current_folder = quotemeta($current_folder); while () { chomp; my ($folder, $a, $b, $c, $d, $e, $f, $g, $count) = split; if ($folder =~ /^$current_folder\+$/) { $folder =~ s/\+$//; # remove current folder indication } next if ($count == 0); push(@folders, $folder); } close(FOLDERS); print("done\n"); return(@folders); } sub handle_dup { my($f1, $m1, $f2, $m2) = @_; my $ans; repeat: print("+$f2/$m2 duplicate of +$f1/$m1"); if ($list) { print("\n"); } else { if ($rmm) { $ans = "y"; print("\n"); } else { print(", remove? [Yns?] "); chomp($ans = ); } if ($ans eq "y" || $ans eq "") { system("rmm +$f2 $m2"); } elsif ($ans eq "s") { system("$mhl `mhpath +$f1 $m1` `mhpath +$f2 $m2`"); goto repeat; } elsif ($ans eq "?") { print("y, remove message (default)\n" . "n, don't remove message\n" . "s, show messages\n" . "?, show this message\n"); goto repeat; } } } =head2 usage Display usage information and exit. =cut sub usage { print <\n\n". "$cmd comes with ABSOLUTELY NO WARRANTY.\n\n". "This is free software, and you are welcome\n". "to redistribute it under certain conditions.\n\n". "See `http://www.gnu.org/copyleft/gpl.html' for details.\n"); exit(0); } Local Variables: mode: outline outline-regexp: "^Subject:" fill-prefix: " " End: mmh-0.4/docs/DIFFERENCES_nmh_MH0000644000000000000000000002506013414435726014466 0ustar rootroot[NOTE: This file is out-of-date. Updating it every time new features are added to nmh forevermore is a pain. Perhaps we should limit it to documentation of _incompatibilities_ with MH (which should be rare).] The following are the differences between nmh and MH-6.8.3. UCI has since released MH-6.8.4. Most of the new features it adds have also been added to nmh, but those differences are not listed here. There are a few new features in MH-6.8.4 that are missing from nmh, but they are primarily undocumented in MH-6.8.4 (and no one has ever asked me for them). GENERAL ------- *) nmh has been converted to autoconf (configure) and should be more portable and easier to install than MH. In particular, nmh will now compile on Linux. *) All of MH's Makefiles have been rewritten for nmh. You can now use GNU make without any problems. Also, if your make supports the VPATH variable (such as GNU make), you can now compile in a different directory from the one containing the source code. *) The source code for nmh has been substantially cleaned up. It now requires an ANSI C compiler (gcc is fine) to compile. *) A new option `-version' has been added to all the commands. *) The POP server (popd) has been removed from the distribution. RPOP on the client side is not currently supported. *) The support for MH-style bulletin boards has been removed (NNTP makes this obsolete anyway). *) Currently nmh doesn't support using shared libraries for libmh. This may return in the future, but is not a high priority, since the nmh commands are not that large, and disk space gets cheaper every day. *) Almost all of the commands in nmh have been modified to accept an arbitrary number of command line arguments (most MH commands will not accept more than 1000 arguments on the command line). *) nmh should be more secure than MH. Hundreds of buffer overflow problems have been fixed in the source code. Of course, I still don't make any guarantees. DOCUMENTATION ------------- *) Many of the man pages have been cleaned up or clarified. *) The mhook man page has been split into separate man pages for rcvtty, rcvdist, and rcvpack. *) Added new man page `mh-draft' which discusses the nmh draft folder facility. *) The various `procs' (rmmproc, moreproc, showmimeproc, etc...) are now documented in the "mh-profile" man page. Many of these were previously undocumented. FORMATTING ---------- *) Added a new formatting string escape %(decode) to decode and display RFC-2047 encoded header fields. SEQUENCES --------- *) The is no longer a limitation on the length of lines in the file containing your public sequences (.mh_sequences). That should be the end of the error message ".mh_sequences is poorly formatted". ANNO ---- *) The switch -inplace is now on by default. CONFLICT -------- *) Conflict now works on systems that define more than 100 groups. DIST ---- *) The switch -inplace is now on by default. FLIST ----- *) A new command `flist' has been added to nmh, that will list the folders that contain messages in a given sequence (such as the unseen sequence). This was a much needed command in the MH suite of programs. FOLDER ------ *) `folder -all' now dynamically allocates space for folder names and can handle more than 300 folders. *) `folder' now uses the standard Unix trick of looking at the number of links to a directory entry, in order to avoid doing a stat(2) call on messages in folders with no subfolders. This greatly increases the speed of `folder -all -recurse' on large mail setups. *) The switches `-header' and `-total' are more orthogonal. The command `folder -all -noheader -nototal' now does the right thing. FORW ---- *) The switch -inplace is now on by default. *) Added switches `-dashstuffing' and `-nodashstuffing', to determine whether forwarded messages are RFC934 quotes (dashstuffed). (This corresponds to the undocumented switch "nodashmunging" in MH). INC --- *) If compiled with RPATHS, a Delivery-Date header is now added to all messages incorporated with `inc'. *) Using the new format string escape %(decode), the scan lines for `inc' will correctly decode RFC-2047 encoded headers. MARK ---- *) If neither of the switches -public/-nopublic are specified, then existing sequences will retain their current public/private status, instead of being changed to public. *) The command "mark -list -sequence foo" will now indicate if the sequence "foo" is a private sequence. MHBUILD ------- *) The functionality in `mhn' to create MIME messages, has been cleaned up substantially, and moved to separate command `mhbuild'. *) If given a file argument of "-", mhbuild will now accept the MIME composition file on the standard input, and output the new MIME message to the standard output. This makes it much easier to use this functionality in shell scripts. *) The switch -norfc934mode is now the default. MHL --- *) There is a new variable "decode" which instructs `mhl' to decode a component as a RFC-2047 encoded header field. MHLIST ------ *) The functionality of `mhn -list' has been moved to the new command `mhlist'. MHN --- *) mhn is now obsolete. It has been split into the commands mhbuild, mhlist, mhshow, mhstore, and viamail. mhn still exists for backward compatibility, but the new commands should be preferred. *) Changed the profile entry automhnproc to automimeproc (which has slightly different semantics). MHPATH ------ *) `mhpath all' will no longer abort if the folder has more than 998 messages. MHSHOW ------ *) The functionality of `mhn -show' has been moved to the new command `mhshow'. *) mhshow now correctly treats unknown subtypes of text as text/plain, as specified by RFC-2046. *) mhshow now correctly treats unknown subtypes of multipart as multipart/mixed, as specified by RFC-2046. *) You can now override the default method by which mhshow handles subtypes of multipart that are known internally (mixed, alternate, etc...). Previously the behavior on these types could not be changed. MHSTORE ------- *) The functionality of `mhn -store' has been moved to the new command `mhstore'. *) mhstore will now correctly identify a formatting string of "-" and send the content to stdout. PACKF ----- *) When packing a folder, the default format is now `mbox' format, rather than `mmdf' format. The options -mbox and -mmdf have been added to `packf' so you can choose the desired format. PACKMBOX -------- *) The script packmbox has been removed from the nmh distribution, since its functionality has been added to the command packf. PICK ---- *) If neither of the switches -public/-nopublic are specified, then existing sequences will retain their current public/private status, instead of being changed to public. RCVPACK ------- *) The default format for `rcvpack' is now `mbox' format, rather than `mmdf' format. The options -mbox and -mmdf have been added to `rcvpack' so you can choose the desired format. *) Rcvpack no longer adds the field "Delivery-Date", as that is added by `slocal'. RCVSTORE -------- *) Added new switches -unseen/-nounseen to control whether new messages are added to the Unseen-Sequence. RCVTTY ------ *) The option `-width' has been added. REFILE ------ *) If an conflict occurs when using the `-preserve' switch, then refile will search for and use the next available message number above the one you wish to preserve, rather than aborting with an error. *) Added new options `-unlink' and `-nounlink' which specify that that messages "removed" from the source folder should just be unlinked, rather than moved to name with prefix. REPL ---- *) Added new options `-format' and `-noformat'. The switch `-format' will filter the message to which you are replying with a standard message filter "mhl.reply" which is included in the distribution. The switch `-noformat' will negate `-format' and `-filter', so that the message to which you are replying is not included in the draft. *) Added new options `-group' and `-nogroup'. These switches direct repl as to whether or not this is a group reply. A group reply uses a different forms (components) file (default is replgroupcomps). *) The standard forms files "replcomps" and "replgroupcomps" now have support for the "Mail-Reply-To:" and "Mail-Followup-To:" header fields. *) The switch -inplace is now on by default. RMM --- *) Added new options `-unlink' and `-nounlink' which specify that that "removed" messages should just be unlinked, rather than moved to name with prefix. SCAN ---- *) Using the new format string escape %(decode), the scan lines created by `scan' will correctly decode RFC-2047 encoded headers. SHOW/NEXT/PREV -------------- *) Added new options `-checkmime' and `-nocheckmime' which allow you to enable and disable the test for MIME messages. *) The "mhnproc" profile entry has been changed to "showmimeproc". *) Added `-showmimeproc' switch to specify the showmimeproc at the command line. *) The default "showproc" has been changed to `mhl'. *) The default "showmimeproc" is now `mhshow'. *) `show' is better at handling alternate character sets. It knows that US-ASCII is a subset of any ISO-8859-X character set. SLOCAL ------ *) Added new action `folder' or `+' to slocal, which adds new message to a nmh folder. Currently, this is handled by piping the new message to rcvstore, although this may change in the future. *) The action `mbox' now delivers to a file in mbox format. Previously it delivered to a file in mmdf format. *) Added new action `mmdf' to deliver to a file in mmdf format. *) Added new options -[no]suppressdup to slocal to check for duplicate messages. The code for suppression of duplicate messages (MH config was MSGID) is now always built into slocal. *) Improved the debugging of slocal ".maildelivery" files. It will now warn when an entry in this file is skipped because there are not enough fields. Also the debugging output of slocal has been cleaned up, so that it is much easier to read. *) Slocal now adds the Delivery-Date header to all delivered messages. Previously it only added them to messages delivered to a file. VIAMAIL ------- *) The functionality of this new command, was formerly part of `mhn' as the (undocumented) option `mhn -viamail'. WHATNOW ------- *) Added new action "mime" to whatnow, which causes whatnow to call program specified by "buildmimeproc" profile entry, to process MIME composition files (default is mhbuild). *) Added new action "delete" to whatnow, which deletes draft file and exits. mmh-0.4/docs/m_getfld.c.humor0000644000000000000000000006235313414435726014664 0ustar rootrootThis is the pre-mmh version of sbr/m_getfld.c (dated 2008-12-26). The current version is still unbearbable, but this one is original. Enjoy! :-) -- 2012-04-01 markus schnalke /* * m_getfld.c -- read/parse a message * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for * complete copyright information. */ #include #include #include /* This module has a long and checkered history. First, it didn't burst maildrops correctly because it considered two CTRL-A:s in a row to be an inter-message delimiter. It really is four CTRL-A:s followed by a newline. Unfortunately, MMDF will convert this delimiter *inside* a message to a CTRL-B followed by three CTRL-A:s and a newline. This caused the old version of m_getfld() to declare eom prematurely. The fix was a lot slower than c == '\001' && peekc (iob) == '\001' but it worked, and to increase generality, MBOX style maildrops could be parsed as well. Unfortunately the speed issue finally caught up with us since this routine is at the very heart of MH. To speed things up considerably, the routine Eom() was made an auxiliary function called by the macro eom(). Unless we are bursting a maildrop, the eom() macro returns FALSE saying we aren't at the end of the message. The next thing to do is to read the mts.conf file and initialize delimiter[] and delimlen accordingly... After mhl was made a built-in in msh, m_getfld() worked just fine (using m_unknown() at startup). Until one day: a message which was the result of a bursting was shown. Then, since the burst boundaries aren't CTRL-A:s, m_getfld() would blinding plunge on past the boundary. Very sad. The solution: introduce m_eomsbr(). This hook gets called after the end of each line (since testing for eom involves an fseek()). This worked fine, until one day: a message with no body portion arrived. Then the while (eom (c = Getc (iob), iob)) continue; loop caused m_getfld() to return FMTERR. So, that logic was changed to check for (*eom_action) and act accordingly. This worked fine, until one day: someone didn't use four CTRL:A's as their delimiters. So, the bullet got bit and we read mts.h and continue to struggle on. It's not that bad though, since the only time the code gets executed is when inc (or msh) calls it, and both of these have already called mts_init(). ------------------------ (Written by Van Jacobson for the mh6 m_getfld, January, 1986): This routine was accounting for 60% of the cpu time used by most mh programs. I spent a bit of time tuning and it now accounts for <10% of the time used. Like any heavily tuned routine, it's a bit complex and you want to be sure you understand everything that it's doing before you start hacking on it. Let me try to emphasize that: every line in this atrocity depends on every other line, sometimes in subtle ways. You should understand it all, in detail, before trying to change any part. If you do change it, test the result thoroughly (I use a hand-constructed test file that exercises all the ways a header name, header body, header continuation, header-body separator, body line and body eom can align themselves with respect to a buffer boundary). "Minor" bugs in this routine result in garbaged or lost mail. If you hack on this and slow it down, I, my children and my children's children will curse you. This routine gets used on three different types of files: normal, single msg files, "packed" unix or mmdf mailboxs (when used by inc) and packed, directoried bulletin board files (when used by msh). The biggest impact of different file types is in "eom" testing. The code has been carefully organized to test for eom at appropriate times and at no other times (since the check is quite expensive). I have tried to arrange things so that the eom check need only be done on entry to this routine. Since an eom can only occur after a newline, this is easy to manage for header fields. For the msg body, we try to efficiently search the input buffer to see if contains the eom delimiter. If it does, we take up to the delimiter, otherwise we take everything in the buffer. (The change to the body eom/copy processing produced the most noticeable performance difference, particularly for "inc" and "show".) There are three qualitatively different things this routine busts out of a message: field names, field text and msg bodies. Field names are typically short (~8 char) and the loop that extracts them might terminate on a colon, newline or max width. I considered using a Vax "scanc" to locate the end of the field followed by a "bcopy" but the routine call overhead on a Vax is too large for this to work on short names. If Berkeley ever makes "inline" part of the C optimiser (so things like "scanc" turn into inline instructions) a change here would be worthwhile. Field text is typically 60 - 100 characters so there's (barely) a win in doing a routine call to something that does a "locc" followed by a "bmove". About 30% of the fields have continuations (usually the 822 "received:" lines) and each continuation generates another routine call. "Inline" would be a big win here, as well. Messages, as of this writing, seem to come in two flavors: small (~1K) and long (>2K). Most messages have 400 - 600 bytes of headers so message bodies average at least a few hundred characters. Assuming your system uses reasonably sized stdio buffers (1K or more), this routine should be able to remove the body in large (>500 byte) chunks. The makes the cost of a call to "bcopy" small but there is a premium on checking for the eom in packed maildrops. The eom pattern is always a simple string so we can construct an efficient pattern matcher for it (e.g., a Vax "matchc" instruction). Some thought went into recognizing the start of an eom that has been split across two buffers. This routine wants to deal with large chunks of data so, rather than "getc" into a local buffer, it uses stdio's buffer. If you try to use it on a non-buffered file, you'll get what you deserve. This routine "knows" that struct FILEs have a _ptr and a _cnt to describe the current state of the buffer and it knows that _filbuf ignores the _ptr & _cnt and simply fills the buffer. If stdio on your system doesn't work this way, you may have to make small changes in this routine. This routine also "knows" that an EOF indication on a stream is "sticky" (i.e., you will keep getting EOF until you reposition the stream). If your system doesn't work this way it is broken and you should complain to the vendor. As a consequence of the sticky EOF, this routine will never return any kind of EOF status when there is data in "name" or "buf"). */ /* * static prototypes */ static int m_Eom (int, FILE *); static unsigned char *matchc(int, char *, int, char *); static unsigned char *locc(int, unsigned char *, unsigned char); #define Getc(iob) getc(iob) #define eom(c,iob) (msg_style != MS_DEFAULT && \ (((c) == *msg_delim && m_Eom(c,iob)) ||\ (eom_action && (*eom_action)(c)))) static unsigned char **pat_map; /* * defined in sbr/m_msgdef.c = 0 * This is a disgusting hack for "inc" so it can know how many * characters were stuffed in the buffer on the last call * (see comments in uip/scansbr.c). */ extern int msg_count; /* * defined in sbr/m_msgdef.c = MS_DEFAULT */ extern int msg_style; /* * The "full" delimiter string for a packed maildrop consists * of a newline followed by the actual delimiter. E.g., the * full string for a Unix maildrop would be: "\n\nFrom ". * "Fdelim" points to the start of the full string and is used * in the BODY case of the main routine to search the buffer for * a possible eom. Msg_delim points to the first character of * the actual delim. string (i.e., fdelim+1). Edelim * points to the 2nd character of actual delimiter string. It * is used in m_Eom because the first character of the string * has been read and matched before m_Eom is called. */ extern char *msg_delim; /* defined in sbr/m_msgdef.c = "" */ static unsigned char *fdelim; static unsigned char *delimend; static int fdelimlen; static unsigned char *edelim; static int edelimlen; static int (*eom_action)(int) = NULL; #ifdef _FSTDIO # define _ptr _p /* Gag */ # define _cnt _r /* Retch */ # define _filbuf __srget /* Puke */ # define DEFINED__FILBUF_TO_SOMETHING_SPECIFIC #endif #ifdef SCO_5_STDIO # define _ptr __ptr # define _cnt __cnt # define _base __base # define _filbuf(fp) ((fp)->__cnt = 0, __filbuf(fp)) # define DEFINED__FILBUF_TO_SOMETHING_SPECIFIC #endif #ifndef DEFINED__FILBUF_TO_SOMETHING_SPECIFIC extern int _filbuf(FILE*); #endif int m_getfld (int state, unsigned char *name, unsigned char *buf, int bufsz, FILE *iob) { register unsigned char *bp, *cp, *ep, *sp; register int cnt, c, i, j; if ((c = Getc(iob)) < 0) { msg_count = 0; *buf = 0; return FILEEOF; } if (eom (c, iob)) { if (! eom_action) { /* flush null messages */ while ((c = Getc(iob)) >= 0 && eom (c, iob)) ; if (c >= 0) ungetc(c, iob); } msg_count = 0; *buf = 0; return FILEEOF; } switch (state) { case FLDEOF: case BODYEOF: case FLD: if (c == '\n' || c == '-') { /* we hit the header/body separator */ while (c != '\n' && (c = Getc(iob)) >= 0) ; if (c < 0 || (c = Getc(iob)) < 0 || eom (c, iob)) { if (! eom_action) { /* flush null messages */ while ((c = Getc(iob)) >= 0 && eom (c, iob)) ; if (c >= 0) ungetc(c, iob); } msg_count = 0; *buf = 0; return FILEEOF; } state = BODY; goto body; } /* * get the name of this component. take characters up * to a ':', a newline or NAMESZ-1 characters, whichever * comes first. */ cp = name; i = NAMESZ - 1; for (;;) { #ifdef LINUX_STDIO bp = sp = (unsigned char *) iob->_IO_read_ptr - 1; j = (cnt = ((long) iob->_IO_read_end - (long) iob->_IO_read_ptr) + 1) < i ? cnt : i; #elif defined(__DragonFly__) bp = sp = (unsigned char *) ((struct __FILE_public *)iob)->_p - 1; j = (cnt = ((struct __FILE_public *)iob)->_r+1) < i ? cnt : i; #else bp = sp = (unsigned char *) iob->_ptr - 1; j = (cnt = iob->_cnt+1) < i ? cnt : i; #endif while (--j >= 0 && (c = *bp++) != ':' && c != '\n') *cp++ = c; j = bp - sp; if ((cnt -= j) <= 0) { #ifdef LINUX_STDIO iob->_IO_read_ptr = iob->_IO_read_end; if (__underflow(iob) == EOF) { #elif defined(__DragonFly__) if (__srget(iob) == EOF) { #else if (_filbuf(iob) == EOF) { #endif *cp = *buf = 0; advise (NULL, "eof encountered in field \"%s\"", name); return FMTERR; } #ifdef LINUX_STDIO iob->_IO_read_ptr++; /* NOT automatic in __underflow()! */ #endif } else { #ifdef LINUX_STDIO iob->_IO_read_ptr = bp + 1; #elif defined(__DragonFly__) ((struct __FILE_public *)iob)->_p = bp + 1; ((struct __FILE_public *)iob)->_r = cnt - 1; #else iob->_ptr = bp + 1; iob->_cnt = cnt - 1; #endif } if (c == ':') break; /* * something went wrong. possibilities are: * . hit a newline (error) * . got more than namesz chars. (error) * . hit the end of the buffer. (loop) */ if (c == '\n') { /* We hit the end of the line without seeing ':' to * terminate the field name. This is usually (always?) * spam. But, blowing up is lame, especially when * scan(1)ing a folder with such messages. Pretend such * lines are the first of the body (at least mutt also * handles it this way). */ /* See if buf can hold this line, since we were assuming * we had a buffer of NAMESZ, not bufsz. */ /* + 1 for the newline */ if (bufsz < j + 1) { /* No, it can't. Oh well, guess we'll blow up. */ *cp = *buf = 0; advise (NULL, "eol encountered in field \"%s\"", name); state = FMTERR; goto finish; } memcpy (buf, name, j - 1); buf[j - 1] = '\n'; buf[j] = '\0'; /* mhparse.c:get_content wants to find the position of the * body start, but it thinks there's a blank line between * the header and the body (naturally!), so seek back so * that things line up even though we don't have that * blank line in this case. Simpler parsers (e.g. mhl) * get extra newlines, but that should be harmless enough, * right? This is a corrupt message anyway. */ fseek (iob, ftell (iob) - 2, SEEK_SET); return BODY; } if ((i -= j) <= 0) { *cp = *buf = 0; advise (NULL, "field name \"%s\" exceeds %d bytes", name, NAMESZ - 2); state = LENERR; goto finish; } } while (isspace (*--cp) && cp >= name) ; *++cp = 0; /* fall through */ case FLDPLUS: /* * get (more of) the text of a field. take * characters up to the end of this field (newline * followed by non-blank) or bufsz-1 characters. */ cp = buf; i = bufsz-1; for (;;) { #ifdef LINUX_STDIO cnt = (long) iob->_IO_read_end - (long) iob->_IO_read_ptr; bp = (unsigned char *) --iob->_IO_read_ptr; #elif defined(__DragonFly__) cnt = ((struct __FILE_public *)iob)->_r++; bp = (unsigned char *) --((struct __FILE_public *)iob)->_p; #else cnt = iob->_cnt++; bp = (unsigned char *) --iob->_ptr; #endif c = cnt < i ? cnt : i; while ((ep = locc( c, bp, '\n' ))) { /* * if we hit the end of this field, return. */ if ((j = *++ep) != ' ' && j != '\t') { #ifdef LINUX_STDIO j = ep - (unsigned char *) iob->_IO_read_ptr; memcpy (cp, iob->_IO_read_ptr, j); iob->_IO_read_ptr = ep; #elif defined(__DragonFly__) j = ep - (unsigned char *) ((struct __FILE_public *)iob)->_p; memcpy (cp, ((struct __FILE_public *)iob)->_p, j); ((struct __FILE_public *)iob)->_p = ep; ((struct __FILE_public *)iob)->_r -= j; #else j = ep - (unsigned char *) iob->_ptr; memcpy (cp, iob->_ptr, j); iob->_ptr = ep; iob->_cnt -= j; #endif cp += j; state = FLD; goto finish; } c -= ep - bp; bp = ep; } /* * end of input or dest buffer - copy what we've found. */ #ifdef LINUX_STDIO c += bp - (unsigned char *) iob->_IO_read_ptr; memcpy( cp, iob->_IO_read_ptr, c); #elif defined(__DragonFly__) c += bp - (unsigned char *) ((struct __FILE_public *)iob)->_p; memcpy( cp, ((struct __FILE_public *)iob)->_p, c); #else c += bp - (unsigned char *) iob->_ptr; memcpy( cp, iob->_ptr, c); #endif i -= c; cp += c; if (i <= 0) { /* the dest buffer is full */ #ifdef LINUX_STDIO iob->_IO_read_ptr += c; #elif defined(__DragonFly__) ((struct __FILE_public *)iob)->_r -= c; ((struct __FILE_public *)iob)->_p += c; #else iob->_cnt -= c; iob->_ptr += c; #endif state = FLDPLUS; break; } /* * There's one character left in the input buffer. * Copy it & fill the buffer. If the last char * was a newline and the next char is not whitespace, * this is the end of the field. Otherwise loop. */ --i; #ifdef LINUX_STDIO *cp++ = j = *(iob->_IO_read_ptr + c); iob->_IO_read_ptr = iob->_IO_read_end; c = __underflow(iob); iob->_IO_read_ptr++; /* NOT automatic! */ #elif defined(__DragonFly__) *cp++ =j = *(((struct __FILE_public *)iob)->_p + c); c = __srget(iob); #else *cp++ = j = *(iob->_ptr + c); c = _filbuf(iob); #endif if (c == EOF || ((j == '\0' || j == '\n') && c != ' ' && c != '\t')) { if (c != EOF) { #ifdef LINUX_STDIO --iob->_IO_read_ptr; #elif defined(__DragonFly__) --((struct __FILE_public *)iob)->_p; ++((struct __FILE_public *)iob)->_r; #else --iob->_ptr; ++iob->_cnt; #endif } state = FLD; break; } } break; case BODY: body: /* * get the message body up to bufsz characters or the * end of the message. Sleazy hack: if bufsz is negative * we assume that we were called to copy directly into * the output buffer and we don't add an eos. */ i = (bufsz < 0) ? -bufsz : bufsz-1; #ifdef LINUX_STDIO bp = (unsigned char *) --iob->_IO_read_ptr; cnt = (long) iob->_IO_read_end - (long) iob->_IO_read_ptr; #elif defined(__DragonFly__) bp = (unsigned char *) --((struct __FILE_public *)iob)->_p; cnt = ++((struct __FILE_public *)iob)->_r; #else bp = (unsigned char *) --iob->_ptr; cnt = ++iob->_cnt; #endif c = (cnt < i ? cnt : i); if (msg_style != MS_DEFAULT && c > 1) { /* * packed maildrop - only take up to the (possible) * start of the next message. This "matchc" should * probably be a Boyer-Moore matcher for non-vaxen, * particularly since we have the alignment table * all built for the end-of-buffer test (next). * But our vax timings indicate that the "matchc" * instruction is 50% faster than a carefully coded * B.M. matcher for most strings. (So much for elegant * algorithms vs. brute force.) Since I (currently) * run MH on a vax, we use the matchc instruction. --vj */ if ((ep = matchc( fdelimlen, fdelim, c, bp ))) c = ep - bp + 1; else { /* * There's no delim in the buffer but there may be * a partial one at the end. If so, we want to leave * it so the "eom" check on the next call picks it up. * Use a modified Boyer-Moore matcher to make this * check relatively cheap. The first "if" figures * out what position in the pattern matches the last * character in the buffer. The inner "while" matches * the pattern against the buffer, backwards starting * at that position. Note that unless the buffer * ends with one of the characters in the pattern * (excluding the first and last), we do only one test. */ ep = bp + c - 1; if ((sp = pat_map[*ep])) { do { /* This if() is true unless (a) the buffer is too * small to contain this delimiter prefix, or * (b) it contains exactly enough chars for the * delimiter prefix. * For case (a) obviously we aren't going to match. * For case (b), if the buffer really contained exactly * a delim prefix, then the m_eom call at entry * should have found it. Thus it's not a delim * and we know we won't get a match. */ if (((sp - fdelim) + 2) <= c) { cp = sp; /* Unfortunately although fdelim has a preceding NUL * we can't use this as a sentinel in case the buffer * contains a NUL in exactly the wrong place (this * would cause us to run off the front of fdelim). */ while (*--ep == *--cp) if (cp < fdelim) break; if (cp < fdelim) { /* we matched the entire delim prefix, * so only take the buffer up to there. * we know ep >= bp -- check above prevents underrun */ c = (ep - bp) + 2; break; } } /* try matching one less char of delim string */ ep = bp + c - 1; } while (--sp > fdelim); } } } memcpy( buf, bp, c ); #ifdef LINUX_STDIO iob->_IO_read_ptr += c; #elif defined(__DragonFly__) ((struct __FILE_public *)iob)->_r -= c; ((struct __FILE_public *)iob)->_p += c; #else iob->_cnt -= c; iob->_ptr += c; #endif if (bufsz < 0) { msg_count = c; return (state); } cp = buf + c; break; default: adios (NULL, "m_getfld() called with bogus state of %d", state); } finish: *cp = 0; msg_count = cp - buf; return (state); } #ifdef RPATHS static char unixbuf[BUFSIZ] = ""; #endif /* RPATHS */ void m_unknown(FILE *iob) { register int c; register long pos; char text[10]; register char *cp; register char *delimstr; /* * Figure out what the message delimitter string is for this * maildrop. (This used to be part of m_Eom but I didn't like * the idea of an "if" statement that could only succeed on the * first call to m_Eom getting executed on each call, i.e., at * every newline in the message). * * If the first line of the maildrop is a Unix "From " line, we * say the style is MBOX and eat the rest of the line. Otherwise * we say the style is MMDF and look for the delimiter string * specified when nmh was built (or from the mts.conf file). */ msg_style = MS_UNKNOWN; pos = ftell (iob); if (fread (text, sizeof(*text), 5, iob) == 5 && strncmp (text, "From ", 5) == 0) { msg_style = MS_MBOX; delimstr = "\nFrom "; #ifndef RPATHS while ((c = getc (iob)) != '\n' && c >= 0) ; #else /* RPATHS */ cp = unixbuf; while ((c = getc (iob)) != '\n' && cp - unixbuf < BUFSIZ - 1) *cp++ = c; *cp = 0; #endif /* RPATHS */ } else { /* not a Unix style maildrop */ fseek (iob, pos, SEEK_SET); if (mmdlm2 == NULL || *mmdlm2 == 0) mmdlm2 = "\001\001\001\001\n"; delimstr = mmdlm2; msg_style = MS_MMDF; } c = strlen (delimstr); fdelim = (unsigned char *) mh_xmalloc((size_t) (c + 3)); *fdelim++ = '\0'; *fdelim = '\n'; msg_delim = (char *)fdelim+1; edelim = (unsigned char *)msg_delim+1; fdelimlen = c + 1; edelimlen = c - 1; strcpy (msg_delim, delimstr); delimend = (unsigned char *)msg_delim + edelimlen; if (edelimlen <= 1) adios (NULL, "maildrop delimiter must be at least 2 bytes"); /* * build a Boyer-Moore end-position map for the matcher in m_getfld. * N.B. - we don't match just the first char (since it's the newline * separator) or the last char (since the matchc would have found it * if it was a real delim). */ pat_map = (unsigned char **) calloc (256, sizeof(unsigned char *)); for (cp = (char *) fdelim + 1; cp < (char *) delimend; cp++ ) pat_map[(unsigned char)*cp] = (unsigned char *) cp; if (msg_style == MS_MMDF) { /* flush extra msg hdrs */ while ((c = Getc(iob)) >= 0 && eom (c, iob)) ; if (c >= 0) ungetc(c, iob); } } void m_eomsbr (int (*action)(int)) { if ((eom_action = action)) { msg_style = MS_MSH; *msg_delim = 0; fdelimlen = 1; delimend = fdelim; } else { msg_style = MS_MMDF; msg_delim = (char *)fdelim + 1; fdelimlen = strlen((char *)fdelim); delimend = (unsigned char *)(msg_delim + edelimlen); } } /* * test for msg delimiter string */ static int m_Eom (int c, FILE *iob) { register long pos = 0L; register int i; char text[10]; #ifdef RPATHS register char *cp; #endif /* RPATHS */ pos = ftell (iob); if ((i = fread (text, sizeof *text, edelimlen, iob)) != edelimlen || strncmp (text, (char *)edelim, edelimlen)) { if (i == 0 && msg_style == MS_MBOX) /* the final newline in the (brain damaged) unix-format * maildrop is part of the delimitter - delete it. */ return 1; #if 0 fseek (iob, pos, SEEK_SET); #endif fseek (iob, (long)(pos-1), SEEK_SET); getc (iob); /* should be OK */ return 0; } if (msg_style == MS_MBOX) { #ifndef RPATHS while ((c = getc (iob)) != '\n') if (c < 0) break; #else /* RPATHS */ cp = unixbuf; while ((c = getc (iob)) != '\n' && c >= 0 && cp - unixbuf < BUFSIZ - 1) *cp++ = c; *cp = 0; #endif /* RPATHS */ } return 1; } #ifdef RPATHS /* * Return the Return-Path and Delivery-Date * header information. * * Currently, I'm assuming that the "From " line * takes one of the following forms. * * From sender date remote from host (for UUCP delivery) * From sender@host date (for sendmail delivery) */ int get_returnpath (char *rp, int rplen, char *dd, int ddlen) { char *ap, *bp, *cp, *dp; ap = unixbuf; if (!(bp = cp = strchr(ap, ' '))) return 0; /* * Check for "remote from" in envelope to see * if this message uses UUCP style addressing */ while ((cp = strchr(++cp, 'r'))) { if (strncmp (cp, "remote from", 11) == 0) { cp = strrchr (cp, ' '); break; } } /* * Get the Return-Path information from * the "From " envelope. */ if (cp) { /* return path for UUCP style addressing */ dp = strchr (++cp, '\n'); snprintf (rp, rplen, "%.*s!%.*s\n", (int)(dp - cp), cp, (int)(bp - ap), ap); } else { /* return path for standard domain addressing */ snprintf (rp, rplen, "%.*s\n", (int)(bp - ap), ap); } /* * advance over the spaces to get to * delivery date on envelope */ while (*bp == ' ') bp++; /* Now get delivery date from envelope */ snprintf (dd, ddlen, "%.*s\n", 24, bp); unixbuf[0] = 0; return 1; } #endif /* RPATHS */ static unsigned char * matchc(int patln, char *pat, int strln, char *str) { register char *es = str + strln - patln; register char *sp; register char *pp; register char *ep = pat + patln; register char pc = *pat++; for(;;) { while (pc != *str++) if (str > es) return 0; if (str > es+1) return 0; sp = str; pp = pat; while (pp < ep && *sp++ == *pp) pp++; if (pp >= ep) return ((unsigned char *)--str); } } /* * Locate character "term" in the next "cnt" characters of "src". * If found, return its address, otherwise return 0. */ static unsigned char * locc(int cnt, unsigned char *src, unsigned char term) { while (*src++ != term && --cnt > 0); return (cnt > 0 ? --src : (unsigned char *)0); } mmh-0.4/docs/COMPLETION-TCSH0000644000000000000000000000314413414435726013732 0ustar rootroot# This file, to be sourced by tcsh, contains useful command completions for nmh. # [There's lots more that can be done -- folder name completion is just the most # useful ...] # Note that if you use nested folders, the below completions will not find # them. If you are in this boat, you might want to use something like: # # set nmh_mail_dirs = `folder -all -fast -recurse` # # complete anno c%+%"($nmh_mail_dirs)"% # [...] # # The problem with that is that new folders you create won't be available for # completion until you re-source this file. # # Note also that if you use '%'s in your folder names, you'll need to use a # different separator character below. set nmh_mail_dir = $HOME/`mhparam Path` complete anno c%+%D:$nmh_mail_dir% complete burst c%+%D:$nmh_mail_dir% complete comp c%+%D:$nmh_mail_dir% complete dist c%+%D:$nmh_mail_dir% complete flist c%+%D:$nmh_mail_dir% complete folder c%+%D:$nmh_mail_dir% complete forw c%+%D:$nmh_mail_dir% complete inc c%+%D:$nmh_mail_dir% complete mark c%+%D:$nmh_mail_dir% complete mhl c%+%D:$nmh_mail_dir% complete mhpath c%+%D:$nmh_mail_dir% complete next c%+%D:$nmh_mail_dir% complete packf c%+%D:$nmh_mail_dir% complete pick c%+%D:$nmh_mail_dir% complete prev c%+%D:$nmh_mail_dir% complete rcvstore c%+%D:$nmh_mail_dir% complete refile c%+%D:$nmh_mail_dir% complete repl c%+%D:$nmh_mail_dir% complete rmf c%+%D:$nmh_mail_dir% complete rmm c%+%D:$nmh_mail_dir% complete scan c%+%D:$nmh_mail_dir% complete send c%+%D:$nmh_mail_dir% complete show c%+%D:$nmh_mail_dir% complete sortm c%+%D:$nmh_mail_dir% complete whatnow c%+%D:$nmh_mail_dir% mmh-0.4/docs/README.mhsign-mhpgp0000644000000000000000000001200613414435726015051 0ustar rootrootmhpgp, mhsign ------------- This software (shell scripts) written by Neil Rickert. It is placed in the public domain. You are free to use it and modify it to suit your needs. The scripts are adjusted to mmh by markus schnalke . They work a bit different today. The following excrept of the README and CHANGES files of the Neil's distribution is preserved for documentation. These are scripts for using with MH or nmh. The two scripts are tuned for the use of gnupg. It is not too hard to adapt to pgp2, pgp5 or pgp6.5. But why bother, since gnupg has clearly become the way to go for unix. Use: mhpgp ## to verify signature or decrypt current message. edit mhsign [-e] ## to sign [encrypt] at the whatnow prompt. See the man page for mhsign on creating a file "pgpkeys" in your MH directory or GNUPGHOME directory. Change log for mhsign: RCS file: RCS/mhsign,v Working file: mhsign head: 1.1 branch: 1.1.0 locks: strict access list: symbolic names: keyword substitution: kv total revisions: 10; selected revisions: 10 description: Program to sign [encrypt] a message from whatnow prompt. ---------------------------- revision 1.1 date: 2003/06/14 18:38:14; author: rickert; state: Exp; branches: 1.1.0; Initial revision ---------------------------- revision 1.1.0.9 date: 2007/05/30 14:48:40; author: rickert; state: Exp; lines: +14 -9 Make sure that an MD5 hash is used with "-R" when signing. ---------------------------- revision 1.1.0.8 date: 2007/01/21 04:18:04; author: rickert; state: Exp; lines: +2 -2 Fix unmatched quote ---------------------------- revision 1.1.0.7 date: 2004/06/13 20:14:52; author: rickert; state: Exp; lines: +3 -3 Make sure that gnupg-1.3.6 uses the correct digest in pgp2 compatibility mode ---------------------------- revision 1.1.0.6 date: 2004/05/23 00:49:43; author: rickert; state: Exp; lines: +6 -6 Use "--always-trust", and ignore any "encrypt-to" in options file ---------------------------- revision 1.1.0.5 date: 2004/02/25 04:03:44; author: rickert; state: Exp; lines: +12 -7 When using -b with mime signature, turn off textmode and include the trailing blanks in the signed data. There is no point in using -b unless the trailing blanks are significant, in which case they should be protected by the signature. ---------------------------- revision 1.1.0.4 date: 2003/09/13 19:56:53; author: rickert; state: Exp; lines: +10 -6 Skip comment lines in '.pgpkeys'. Allow preferred keys to come from environment Use case insensitive search (grep -i) for .pgpkeys lookup of addresses. ---------------------------- revision 1.1.0.3 date: 2003/07/19 14:30:32; author: rickert; state: Exp; lines: +20 -3 Put personal keys in ".pgpkeys" database, so that script does not need to be personalized. ---------------------------- revision 1.1.0.2 date: 2003/07/18 23:26:41; author: rickert; state: Exp; lines: +17 -13 Force pgp/mime format if the message is already multipart mime. ---------------------------- revision 1.1.0.1 date: 2003/06/22 00:48:09; author: rickert; state: Exp; lines: +8 -2 Check in $GNUPGHOME for .pgpkeys . This allows a per-keyring list ============================================================================= Change log for mhpgp: RCS file: RCS/mhpgp,v Working file: mhpgp head: 1.1 branch: 1.1.0 locks: strict access list: symbolic names: keyword substitution: kv total revisions: 8; selected revisions: 8 description: Script for pgp verify/decrypt of mh messages (uses gnupg) ---------------------------- revision 1.1 date: 2003/07/19 16:50:32; author: rickert; state: Exp; branches: 1.1.0; Initial revision ---------------------------- revision 1.1.0.7 date: 2005/11/29 06:25:05; author: rickert; state: Exp; lines: +3 -1 If a message does not end in "\n" after decryption, then add "\n". ---------------------------- revision 1.1.0.6 date: 2005/07/13 01:00:10; author: rickert; state: Exp; lines: +2 -2 Fix mishandling of boundary=string; ---------------------------- revision 1.1.0.5 date: 2004/09/05 14:49:59; author: rickert; state: Exp; lines: +2 -2 Fix line endings when building a decrypted message (-w flag), the encrypted text might use CRLF. ---------------------------- revision 1.1.0.4 date: 2004/02/22 17:14:02; author: rickert; state: Exp; lines: +27 -10 Add "-b" option to strip blanks on pgpmime signature Use "getopts" for checking options. ---------------------------- revision 1.1.0.3 date: 2003/09/09 04:29:11; author: rickert; state: Exp; lines: +3 -2 Don't use exec, as that skips the trap and temp files are not deleted ---------------------------- revision 1.1.0.2 date: 2003/07/26 00:06:40; author: rickert; state: Exp; lines: +33 -11 Drop "-o outfile". Add "-w" to write back as a message to current folder. This allows easier examination of mime components that might be in the encrypted portion. ---------------------------- revision 1.1.0.1 date: 2003/07/19 16:57:16; author: rickert; state: Exp; lines: +4 -7 Clean up script, for more general usefulness ============================================================================= mmh-0.4/docs/DIFFERENCES_mmh_nmh0000644000000000000000000000025113414435726014736 0ustar rootrootDIFFERENCES between mmh and nmh ------------------------------- Updating this file constantly is a pain. See NEWS for the differences between mmh-0.1 and nmh-1.3-dev. mmh-0.4/docs/README.mail-filtering0000644000000000000000000000764613414435726015374 0ustar rootroot INTRODUCTION ------------ It is a common practice when using nmh to filter your inbound mail directly into nmh folders. There are several programs which allow you to do this, of which two common ones are procmail and slocal. SLOCAL ------ The slocal command is part of the nmh distribution. It is a fairly simple mail filtering program. Check the slocal man page for an example filtering file (called .maildelivery). PROCMAIL -------- Probably the most popular mail filtering command is procmail. It can filter mail into standard mbox-style spool files, as well as into MH/nmh style folders. Although procmail knows how to put a message directly into an nmh folder, this is not recommended. Procmail doesn't know about nmh sequences. Instead you should have procmail use the nmh command `rcvstore' to put the message into the folder. The `rcvstore' command will (by default) add each new message to the "unseen" sequence, so you can detect new messages in folders with the `flist' command. Also, nmh commands generally like to keep mail messages in RFC-822 format. But by default, procmail will leave the first line of the message unchanged. This line (which usually begins with "From ") is not in the standard RFC-822 format. It is recommended that you use the command `formail' (which comes in the procmail distribution) to rewrite this line so that it begins with the header name "X-Envelope-From:". An example of how to do this is given below. The reason the header name "X-Envelope-From:" is recommended, is that the nmh command `packf' (as of version 0.23) will check for this header when packing folders. The `packf' command knows how to undo the rewriting of the "From " line to the "X-Envelope-From:" line. By checking for this header name, `packf' is able to pack the folder into exactly the form that is used if procmail delivers to the standard mail spool. If you do not rewrite the "From " line into this format, the `packf' command will still work. But it may create fake "From " lines which are not the same as the originals. Alternatively, you might be able to suppress generation of the "From " line. If your procmail invocation includes the -f or -r option, remove. Those options add a "From " line to incoming beginning of messages that do not have them. Here is a typical .procmailrc file for using procmail in conjunction with nmh. For more information, see the manual pages for procmail, procmailrc and procmailex. ################################################################### # .procmailrc ################################################################### # To use procmail, put the next line in your .forward file: # "|IFS=' ' && exec /usr/local/bin/procmail -f- || exit 75 #XXX" # Do not remove the double quotes. Change XXX to your username. # Edit path to procmail above, and the VARIABLES below, as needed. # Adapt the MAILING LIST section below for lists you subscribe to. # Your .forward needs to be world-readable, but not world-writable. ################################################################### # This .procmailrc is written for use with nmh/mh/exmh/mh-e ################################################################### ### VARIABLES ### VERBOSE=off SHELL=/bin/sh PATH=/usr/local/nmh/lib:/usr/local/nmh/bin:/usr/bin:/usr/local/bin MAILDIR=$HOME/Mail LOGFILE=$MAILDIR/procmail.log LOCKEXT=.lock ################# # CLEANUP MESSAGE ################# # Force the "From user date" to become part of header :0 Whf | formail -z -R 'From ' X-Envelope-From: ############### # MAILING LISTS ############### :0 w: nmh-workers/$LOCKEXT * ^Resent-from: *nmh-workers | rcvstore +nmh-workers # catches exmh-{announce,users,workers} :0 w: exmh/$LOCKEXT * ^TOexmh | rcvstore +exmh # Catch junk. Don't add it to "unseen" sequence (nmh only) :0 w: junk/$LOCKEXT * ^(reply-to|from|sender):.*(spammer|flamer|evil-host) | rcvstore -nounseen +junk ################ # DEFAULT ACTION ################ :0 w: inbox/$LOCKEXT | rcvstore +inbox mmh-0.4/docs/schnalke-mmh.pdf0000644000000000000000000212440413414435726014646 0ustar rootroot%PDF-1.4 %Çì¢ 5 0 obj <> stream xœU‘ÉNÃ0E÷Ùð Þá,l<ÄÓ’ŠIH•Ò IBJª:ß ý'VAVd=ùÞûÎ{Ù‚) Ùîj“\<)Ðný×&»„˜®jf¹iÀÈß“ÑGÓª€ÔK‘|“À¼¶iÞqĈj…Hú²N^à|]Z×¥ˆs†Ñp^4«¡âð®èÊ•ui‘߇*C·Ìw(™ŠÉ¬”7÷[ëÎû1À7ï›>ø…Àœ PLðõ3b3 E±VšFç*\»ë#ƒÏ˺+V­ qRc&‰‡ÐcÜYL“˜qBã»g,S÷MoË€† Ã…¤ÄtˆOÚ·~K 6škqÔsxåþ7®è¾¦’ºƒmªÊºíˆ…JÄ"@;Sõ?é²+-ú×lí–u :­ˆi¬…d§ -Vq=.ºfo]ßlSDÅ€Äà8^æ'¡ÆÄß?Ça[×yòèÏ/rë™endstream endobj 6 0 obj 370 endobj 13 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^Ìe ÎÈv†âendstream endobj 14 0 obj 34 endobj 17 0 obj <> stream xœMßOà ǟ寸·u‰EX»võÅĸh|Óø &côÖ1éµúßK»-18ßûÜ÷8£Øç¬jróšCåƒÇ°*r$|À9©îEñøÄŽœ 9ð´ 9‡å2¥é2QF‹"1è© la@Pmó­…ÐaÛ¿—tm++ëZ7Õ\HÌšçÙbž‚(É{ätÝ­´ÿÙ” Œ´á<“$¡ŒGv¤¸}ký- #´–~a 5²qóOñLRºÈ2öª¤1°Ù ÁJS³Ù…—@išÖƒ„R»'·Á±ézû{ Û>¼LØ8£|ÅØê”íCS3ZðhO3–¨t‰¶èÄ`µW ›†ÙImz‹wãäyNyP‹Õ„º‚uéªy£ð _Î[9Ê8Ëi’†ŸDãÍZ—n›„’endstream endobj 18 0 obj 333 endobj 24 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^Ìe ÎÈv†âendstream endobj 25 0 obj 34 endobj 28 0 obj <> stream xœÍY[ÛDê[þ¤áÍFò0÷ËcéÔm¡ë>-<ÇÙ5$Në$­Ú_ÍvÓ"Þ8ãñ%x—Íe£U¢dlŸóÍw¾óÍÌkD0EĽê÷t2øö…Fç³Aáÿ|ðz@«¨~K'è»qøF¡x4ðRÄ˜ÄÆ0¤9ÁBjOgÁýçψ+l1AFLÝ7"UŸ†¿Ä?ÔwcînÁQ¤,Їp‹ËP¸ëi’4 #J ÃÒøÐð(Î v¼Éó*PFQüts|FÖ¨àûb^†’aFÓ0r‘ZÅ‚á"çÓ«,ÜÀ„C(CSC(ЍÁÌÃw‰/ÃÈH1ªàäIƒ7k+l70ƒ0š@®0§oÁÏ%š_dè$ÉÇèIR ÇYÆ¿ ¬ÄV êGÃ3ˆ–Õp´Mp¿.hj€‚\ú;—îLj3†-ã]6þû•è%@KH}л%Ê[#ê?ô.¥kCšTÖÀ9—J1¹Ø&›-RfÖTéùø–ûOùê?RDW)O—òºŒ?Öáµ¥ÏU¼+3ÇÝ/|‘=Ègéb6óõDŒÁÒ¦ø›š¢Á×kjê•n1%ýÙüÇ”œ§ &ŠKdUÔÂ4qÛV¯+.™Œó"/Î÷6q½¨5ǶylpùGEN¦5æNš©Ø7»@¨°T„õì,¨´+…ñͧLŠÙ(+Ñ£$ÍÇù<Ïf_*0g¢ÅWP»©¢õ Ú¡G‰Ø5é[E,x6->;y醆™Ñ¶ß îŠð+€£E£ýÐëà+’ÍH]ÏRU^C§ãÙmyÙp£ºóêˆÀ¼&ª7ÒÏiÖ«qòÎUèI6›%çUûä˜IÖê/^³Ñê¡$)&¶™‘Ëå¡´\K¹ûÓâÎù¢r‚cÝ:о =å Ô¬cVx w²œÞÚuô‘ªwÈ}<"ä>nƯûÓÉ|zš:}›ÏÓ‹¬‹2@´y”KnfÑz1Qµvì/oNhÐ:áZ?ê]›i*l0óé´š3ÜYOÍj¿–¿?`Tª´1,ö^aût½ «¸À±¹;à ½ÈÆyê‹K€‹W(i¦·¶ô7ÉxŸy„®m‹@uZ3ìÞ|ž¤“¬˜ßº«ÝL*€œw¤útDlØÜNóóÊ{:zX¤•ÖÓ;㬒땵“•Úz%íj½ÏC‰M»ƒ³Ü{¿Ü½Íú%ZeRº5ίeRæ~}åe:¿jw^ r,Zž-÷¾Ù°R›-Ï‚—³¬„~XõM!EÌôtZõN¥Vªð’Üop¥Iµ¾ÞrçAC·ËÃå1µ‰OkKóÄ· ÀDKÓž5žCÃÅxö¾Bf×úc ¸Ù±êúf·¬Ñj6»ïúÍîÓ,ìKøìN’'Q“x¸/x€ÐÌ$}é·½ÝùÖ½0ÒŠq¨¸;Ýr‡[•£7n׸ ¿éM&.M —²]Ê&Z|å¾" JKÁ¶H¾ÈFYu*G 8ì¬HA9DèüŠòÔp%´»+çlįƒrÊ|¨+äCëa<ø ^×ù{/endstream endobj 29 0 obj 1450 endobj 37 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^Ìe ÎÈv†âendstream endobj 38 0 obj 34 endobj 41 0 obj <> stream xœ•ZMsãF’‡çп·%#D,ª vO¯×Û;_¶&ö û‘ d”¬ùÕž¹Ím^fÖ$w÷îF‡ÝR±*+óåË—Yü)+r•ôÇÿ½=½ÿ×oëì0½/²oðßáýOï/Èü_ÛSöÛ,2øI•ÝÜ¿—ªL“W*«M‘—¶ÎnNïoWZo´Ë›ÆèÕ·_ÿçÚ6«ë5–ávõÕ×ën~G;iÚ;mTér[«lSa«ìf÷^åUÑd7ÏØêCvlŸÖuÞ8ëÊÕ>ÛuÓvä¬ÊKå`>p»zZ»¼PVaÍ™——•^íy¡ªs«šFV®vÙ|Üg§¶ë³mßí‡y}ó#¬Q·¦¶yQTÚ¯NGù}´VëÜ~3E7‡™«nÈîÛ¾—¥.¬lrã·ùû/¿üãÍ>Êá®òÛ<»žaU‹ÿu§}ö!»L{Zíʼ¨’áo mr…_CO—y~{V¸BùWY;áÚà ­Ú]Áå&Û(Í¿mwOí°åS(ãoØT‰]ö—¡û™l;#¼pvaWS¶× [hƒküÏq?Àü³¸]•¹SᎼuÉÐ!fí.kïÖ8\ÕE³/s_eÝöµñ±H`¦kYC`¾ã-jØalÈfŸ¤àCcMŠ9B(…Å A€°Iˆð &µ‡}ÂaDõ”Ýãæ›œ[å{´C]yìaS¶Ë›—&¯q•³«Áݬ[ø”"Ζ—e^–Ñr¤z^ÿ,]ÔÈýÞ$imð¿Î›Ò§"±g;A­é,púˆð›í¥ŸsÏ2*¯CÒçC~ÈC¸÷„8Mûyf¼ÒyB]ÚÞu=½Ÿ|Õ0°¦XÜùû5Åɇ€ð1U®£u®$Sög$+ñP@4Ô ©ê•õ\vàqP„§sÚp"oÕaדÅí<·Û#¥*6ÆáÝõw_}@]†d(@}ˆ¿ÎívÞK1Þ8›×$‚·îq„ç?½È¿º*%88“=…Ðâš4Öb­/¶÷,¥ÈÈ`í|ÔUy•DÈ~¢ðøä²È‹„i_c”ÉuÄÊíjÈö¤Ô`Lžýþ…Ò¼ÛsMò\RQQ;RªB*GîÚ@þä*ÑÐê4›l´É øàn× ¢ÐN§U!M›/—sË<„ø>®7€ FÀ=°&â™ ^9ŽœÂ÷‘*küBË$†àéÊRˆ¼cÂÅEd¤Õs;Ì"rl®LRl…õ¸û÷ì…/¸eÎN/¾‚ûµ®"üì­¯L”Ìe^§í »g;·R?ž9zÈ#Ü)ÒëÕ\!¹£âËà¢#¼A"‚Ôà+‘WE ƒõg"ÿ*ð׳õéñ2ËÒ¶Ч’‚sbâ´¥Dé&._Ù#/®JÜï:Îíé$›€Þk“èÜ–‰C°BüºÓ£dP Y¬)ù‹ =É“/Î6AäøÈ¡à^Øg ªF¦×0Ú†.ÇÎûjÕôxöÅ35ð1ñhì!þö˧{ˆ+ÁjR±ï® ¼Â5ÂyšB©×5̼%/ÿÛzƒrƒžK¯Nsûîtiø”LÄà›Ô½{ÏûóôÆ0ŽOı$$â4ûî![réíZ1—–«gl]Áýû;o—…ªá£b]Á™é>,Ù×¾mãqx"·¡/E-¤R×-fÜ ìCâ–µM“w%¢êQWåÿ.:@‘IÇK¿c^§ÓjK¼.œÞ`ûêmà ‡Åp ;kïz6ŽÁ¬ ¤ÀœÝ_Põ¹ùQÂs¢má,ô,IƒêÜúþöºŸãåp䨧‰c/€,TŠâ¬£&¶ä ·à½äbv"BÕ¨º\‘búDÄŸ´ pFmI)“Öì_G¬L„¾˜©Ç``h@%V²[ sâå m.b 9@ìx•º\ާ¬šÅXâÔ ` *¶¼­EÕŒ¥$RûÌÜK|¤W'‡õ“4rž¿]µàûOäŠ0Œ5uˆqèÎ*MÚ²ù LÚÐ¥¨Æ¢K9át £åÁÅÂfÑ¿ÙРEmˆÚ,9MC ëøÎw‚K. V«–”[(9Ø·òœ7NPÄd;çDëûäT%ï€UÕ6}8PÜk4ÙFôdNýÅï~ì{–úN—zõÌà ßÛEQÿ5úWû\óà‡2M¤‘Q®R,h¤í¹I%Sþÿºx) õéìë À1ä®< Ô6`-&¿SU€ Í/Ó$¾á¡Å.ÜÑ÷\ŽÔ©ôY¯vý'I ‘h¸óz^G•ñkxHKØ apºµ6 ‰þéM¿Dµ!Öp„LÆ@ÙOIš—°®ò³ÉFº7Æ%–(dL°šŽ ctýE Ž+ê@ ¬:CyFpïÛ­o}^é뚨à+j+ÃÎ5ᦇ‹$ ÃBÜÇâû{:膣‰óë´ï´h‘öëƒgê4“ å}QkdÒfA{?„tPy®LLwbì²Ò]T a<„-Â=:à°k©¬!­B8aÇG²ë¾Üûz Ýìê78HCr„ˆ]ôÏZE2:y™¨¦Òÿ˜Å¸'ÆýîH@`hhSÔ<¸jw½4ë¥ôÊ»Ã%DÒÔíM®äKø¢GÄg –_¼¿Ð}€`?}2ʃÞdƒ#Ê¥Ö6N€ç?DùæÆ-´©×h –ßÊ,oðµÑ££‰í…Jì9Š:RŠ%%HËmPžc'Èè§± µv[š¼š"c-HNä»F7㺽èf&‰Ò¼o zÕüšSÂÇŽ‚‹#†Þu¾ìQD⎆²65ËÆ#6aËï–^* B•›¨Ñe„רÜÄšMnS£ªå¡®‘7©û B$ƒØÿjû{8¥ƒ¡ùÁ¯ Ý«¡ý9ë[jÄXÔ‚7¯â°—q¸ÓؘܗÃešß¼Tÿ·ÖFz³P\ôÑ#ERbvf&õý¥—ÞPˆ©Öa¦BÊã,m¸ @uÇs˜«5UK•pͺ8x5µÿ“^ή!ù»m›gÿq¡¦¢ËÚ~å ôÑëäXС­ï×àïº)£¨5uhØ|/¦Ç;ÑŒt[©þ{÷*×I—¤üÀWãýü,CCµÊ¸×«M]ÄÑ[žÝ€öÒw¡Çî|fØjÁe!’šÜ7ÓÛÌ]»}ð/%yömG“¨ØiØí{t4Ub²,jho—v Cs‘òܵšð«‰UÑ’Ñ@8ضËÁ2-IIÝ¥ª¨hD"fþfÛ»îÚ©iþîÒÙ7(?»– ¤¤?AÚJ2‡C¹÷œnª…^ø¸FŒa Ú,4ñ’Ïu4Ì6jzÍŒ×GK%Ó™Ú–AÓè&)Jo/¾àVIÑÖ4íþ+[ÒâD|¯§)4V²ºNuG@¸â÷™ƒ_V †á_ÔCÃÒDlØ'ñ»å™PÔ“þ'°L¯ B7fÉä»PÃpfTw”·nÕ„ª­ª…Y(†UxzÇÓpâ¦JLÀoî¯#<ßg_Oa@ªJø4ªnÿð´H¡«€ŒÌVšÏævžýùÒmú?ªÊR%¥0ı7=@¡‰ülJ}!¿ð¸ºnVOò˜@µÎÏãµÓÐueš r ågÜ2L‹˜¢H*hä”z®t¥ª~¯”ÆÑªZ§=ýSBqyožŒ¢¾oR'@Ïga´F‡ûÚFì~d²VÅ:|ëGkqºñ ;½|Âφ÷LÀl:9 –ºŒA¡Ð{øŽž‚/~æçàsš%?öô4ñý:»ö²K[¢ñáÕùØñÆ!P¤HÈn˜©ŽÍ< èB)ŸÂªéEfY™2åÄzvðŠÉåªro¢ì¸%(Oá=ÏîßtÈÇî(Ä¢Ã4ÍØ,†>Ú?O´;¢“ ˆüê ~\Q-Y4*óæ…‹žQ=•)!¼¨,ìé›á[ Pi¶0ŸD»ÌÓRí¬æ*øPƒt?^üKíRUeº†'S7 1º»¤á}>¢Xúa¿®l^.qßc¢>* 5)@6wW«p.tʬ¾ø9h•ÊkUù’…šwí46†/¾{gwmšÅ/] ½4|t þ_{WïÆÐÿFÂ#ÃÒÓ’¦pùGi.ÀºvMúµ‹Ý?p¹P’zßâZÈA;Üל»â'I[­hñÝ‹®žE? dæqñý%Ò&Fà£oºþE˜Qê'2áqÃùg«IxòÊ,8´.Aï/ÛPšˆVÞxbþixK3PÁs7œ¤o®048ö“sÊqv¡ÔúRЦ»‰s”Ó ÆLüž…¿ÚÀ4K°=ÐìJ«d{x]½Lá÷¸n~"Ѝb°Áþu×?šŽ—ùÝxÿ>|Ç嶦կfO%3Lz “WÆ WÕ=çû3á1|™€'˱÷÷í­çÄ‚C—LñÌŽÒx%³„ÞkzÈ9£ôfPh$ý7 =¡Q= Dt™÷õÍû?ãÏ?à[Aõendstream endobj 42 0 obj 4292 endobj 46 0 obj <> stream xœ•ZasÜÆ‘-•+_ô+ðÍ`‰Ã €ÀßlÅŽu9%>™©¤ŠQ]À]„„¨–4ÿuΗ»R¾ÝëéžpEÚw%©Híƒéîׯ_÷àc’g*ÉéüÜì^þË[›\Ï/óäwøwýòãKå.HäÇf—|sŽ‹ MŸœ_½äU¢J•Y|jë"ÓºIÎw//Ò»¾ïOÎTi­ÊŠôÍÉ»ó޵¿Õ4™Î Ü~¾}™¾¯?N'çï׋ë&+LÓÈ?ò·þö2«+ùæ?¶ïßÝ\·Gw6ÓÊß}‘~urVE–kžïDeÆäZVÛ/¤Ê,¯s%_¿y¼:+ê¦.åËkÇ÷Çûȳ¢ø¿Ýþ®»9~¶É oæ÷oµYðÝû¿Ý´ãѰÖfª,’³Òdˆ@C—æpZ•œßÃÃ4^'Û~Þ湟Æ9K^'›v×%Ë”Æm·G䲦 ÓyiÇm²Ütý>¹u¾SM‘)%£E -šNý¸$ÓUr×w´›X0Ú[~O™¬®ó¼öA9M.KÒãü­³<·µJ;¬tµ?±YS׺N§]²ëÇŽ®ÆÒȲ-{V8 `:SZ¶T4nK_/´ñ¤ƒÓ]ZÔ†µ»,Ù=àº=]PÀì¼ò¨cC²ªÌµww÷b7ËMrë.‡w%¥Ó{w½Ò!6›å޽i·É¥»Zg¹r´x p‘n&ÄàªÝõCßî“ûw7_ÎÉf:9«à²®Óm—\¶s— .Î%g:|Ryûi•Ýaì—Ù¢V‚çlöëwlI•gÞö™àü<7u™ÞQ¬Ém*(Ú€h‡ qFQâIÁwOy#éGŠäľ³™-Íjc%c3¹oüêÆVé|Jvb³óÒ¾#_Œwý¸éNÎJ`¡q»h—ä5»CçlQÁ÷í¸¸½è*Sðv ¿óÄ–@5—~<¸ØNÉìØ¨ÑY©±†ÛÏÖ§tV1ÌÆ ^ØÃŸ£ ô’áW3•g¹UÇ @µ÷="?´ Ò¡j(bQLX—öïfÎX ܺw¶ë\;ð?·xÚnn(×G÷UAëSô"];4Äz艓 HÑ¥Ž`»qŸãRè¾µlóD8Å­·ý&¹â¸¢D£`%ì0l×ΰp‡½sVú3Œ›@â?„Z'eƒ*MÅá»w ­+NûÉ4RÖdÉ7‡…aøy¢Q9.ah¨¬,*寧Øquà¸F1ǵ›exõO9©‰{j{ìòGIÝàN·v³énýöµVºýB¸–´Å•žaVSç•cÄk1ê˜*}Ñp¾ÇZ«:Òä?. ¨UV–Ár§²å´;g9TW·O…7ÀQ8)k¸×*ònÊÁ€×AØ…^¦Ã°Mx·…2i7NöÃæfUg(•Oñ9xÛÒ' ‚ÉI‚Lœ9$YØ ”§Ïk*#þóÓdè—eèØZÃ*ïÙ›¨*”|/-.Hò8+taÄ ¾·.pëNäzÍK"÷!‘ØäèŽBóv ð+cˆˆçLš˜"÷‚OϨ*ëÒ¹ü»I¥‰T ¦¼„\˜“ߺºAÐŽMç˜óßæ@ຠC]ëŸ"—ê}N‹ny…øñ0‡þ¯¬†CÛ®²ƒCçþz”zÊs}ÉsõŒ"¡ÊFb00TKš€(ùÌ?fÓ»~†´F²£ÝŽDSeMÔȤv,yVdNˆBÀÙô#l¡£üU˜WaQÓH®¾^|E„„[dïM§ßŒý¦Nør™öü;”èȲ¶lÃ^ÈþÛ›~˜æ ?p‰˜§K*¦b¢¸ á óÞ¹ î£ <®üsºŽR Ñë)ãdË·ÈÊÓ CTáÍó*·ù†s‘–¿ç¢çÿûŒ# á3˜ÀT¾_ïKÔ[ÚgM±2®áQ30/¾oË {,eÉv7øÞÜ[!¢¼Ë@M7Eúàõ³·íwœEh¶C Áv¿jN¡ Ä'U•٠ö׮t4ÊId¸^FùÚ-¤8Ø=eѧ^€í’|¯ï%ÐÀ8Ü Z7&¨¦"*BKdçÒ²³HwÆøGˆ1O¨,Ð5Ý" Ç Ž%×% ±¬¼>QTçmMÆP×Lôf‰ÏÈ r&iwŒ)Ðɬ»ˆØªjRH@‰}ƒŽÑø:׉ÃÊu»²ß’·iLJ¹‹šÆÚˆ†Êrù!g÷ºni×öCrÕyý›úv9ìE¬™:ê4g):¹FdÐn¶LX¼]*My¬ô×R`ã’Œ´îÚ90uV•A_TV&?ú¦ ¨õ+R~s‘¤n$è[Ÿ‡\V êaàsGÒ,óÉá!Eп͛}4ƒç-XP½Ë~úM·¢ýeSKã†JÅûi_UTßã3òÕU*q+ý&|Èyº!YD!éÆ2öØË¸&/c}'ÊŽãˆi8»[Né—}HÚ~7£[F^;‚2@EÌè†/˜i¶ÎMîZ7éFzvÂÓÎC¦¤©¢þ¥Þ} ¾Zî9xjâ™ÆÔ:˜úÙx„ÄB–üýK“7È´5Éûd¦Ök^ÉʆˆHÑ•ÒLˆy¥©h$2ùʇ]èDVô)z›âÿ§±ÿ)”‡h‚¦nhæ°VŒ^ºVÔiBÊü Ö°5êÒ]m_ ™Rr2!0–n9§«¥ºéRûòâ¡ëʪé™eÚ «rPTE´G(ŠÜ Æ'éÕ±?ŸÞl†Ãöïºágǹ!Sò·ôà…<Žrî\u¨œ5L"Ë«¢NÅá@Cµr.W#.§;…ü[w-PL’5L˜šÂóòmn‹¬½’®·@>:ñšh·ÖÒ0íÊÚ¸Ömn‚/îÞµà8pQú1x*eÕP-Ze•U’¨wíppÍ-R Ò $ÏØÁ‹G™F¨âóâG!^ü‚‹zV„Xi?›f5ÃL?}zË:³â,€úk.šGŠ£J½êaè¡–éCÒ®(“ØÔaTg£.œ}1pÃî”1'£äèÆj¢y·Òˆþ†ç.Ó,uQà M”éáj=$¶žð¥c¸¶hÁjãkM܇}9ÀIO”×£žèH 9‰7HWñH^K‰ cìŽZèpºç–žùÚÅh5¼(m^ÌT¯hûÚ¦›Î¿ô£êBÑK?mÌ—ŽzfEé:w«ŽõÝçÝ‚Ow2EY?ìé²Îƒ!ÿÿ>‚$;î(êʦ÷ÒÅ2pÝáí®uCžÎBqέ?*°ÿØD>=éAädlÇC^þS;K“U¾ù°‘i â)3š¨äaÈg?çæý,ûvœ¯à'éª]þJW}]$¾v^HÍ·4uë7ô´á‘…;ÅjÀÙAö¿^¾¤ìºëg骥TXx,òvÉË Â é7èŒw/UµoQ";æùÅ>7JŒ È­?æ ’·ß½bN\T®‡lŸ~þÏ#Ê®^ørEòx‰’^ ¤óéçŸuné.K¾;ì݈êܽ¤l<„¦ì GÏ’–áN'Vœ·£qçD>•}’¹ÓS]& óæõ›oeXn2šÙ&[U\2íˆPQ ¢m?ÿýÇt xÜþuÿØ/jTTó¸÷ŸÏÞZˆg(—kàXR¥ˆÑû“Ø™…×V)õ2Ï∠¿A´ñçþCï&˜UN]Ù/¼à°í[™–èÒýtZ\:öIwPaÞˆ&¾_äϘ‰Ož°¡—0ú¨*µº‡¸NÑðQMrÊB¢Ïú¢RkB^ô#xG%xÄTõçsÔ³µ«Ù &n((+Wrù>—˯¤6VéŽw<ùöüå¿ãÏÿð‚”endstream endobj 47 0 obj 4667 endobj 51 0 obj <> stream xœ[mÜÆ‘†áoû+úSÄviv7›Ív`ÃIçrŠ,ã5ÃÝ¡wÞ4ähµþÕ—Ü»§ºú…3»ÒÅq°R-Ù/õòÔSUô;Q•RTô¿ðs±¹øâ¥·ãE%þ€ÿß^¼»þ~,6âw¯ðV$yusÁ/JÑš²ÒN ÛêR)'^m.Š—¯~ƳmxÔ”ºrÖâñWË‹×Ŷ{{©t ‰,~º”ª¬”vÅv—?½úÓ|mLiZͯÃZôZ×UÙ:-®ë¦ÄŽ—üýá²¥eš¶èý2XÕ~S•uÛˆW÷Å»c¿ÄÖÑØU6aéþ¦÷Biʦ­dûƒ”#^ wô`£çÞ콡†‡9—"£¤+rÒ±÷;UšÆ¤'»ýåuC‡³–Žqž áÝÔñ¶ÿJÀ‚4ÀÒm4€.kŨ@¸5N\›Ž‚f<Ó—µ¥‘u¿×ß/VÛn}w)M°Ç¹ú‘>tRÿßþë ­G¤|›ÖD ØûõØó]‹®Ãr;֤˚¤‹8‘÷ÃÈ ;ðC¶tªMÇö€!qöàô>â.’‘Œ¨UÜ‹ÝÖkq‚rN—ÖØ$ ÈMƒ,–p¡ýQ†íb}\RèvbÑ=|\>P@üëKÀ• C4 ôdzíëu@§N¼EJ¸šO‡°u㢠X ¸`-êeyDÈÑ©ùîÀ¢è´:ë{ $€ý!¨Çh›Ô³»´Á I‹¬E™;Þw‰³ˆï½#k ‡ˆöõÛž&vNe] œ¿G8ð*üª<{¯Tÿÿ;WÞ0þ Ê•¶µî4ÆŒLžQ õpc¶ÒCSÕá‘ÇwÇCwëýXKøÖµ*eÊöÍš‚r0r5çÆ8¤öN¬w>2=²îîD7'ØÕéˆÐÿoÄv³úR|»é†µ¸ÙÄcˆ8‰s¨Êäí7)<šUiTDÿâ-k m˜Aô þÄÀEài˜1Ù)Û™®Ä‹>¤ËÚ%ëöww´€åYzœ3^»¶ôà) €ÊÉ”-?‘Îu‡~bD\Á…]Óœž·ÑÙታ½÷7óá“Äaº)0Ø ò0’zÞ:DF÷öèÞ®{qã·³Eƒkåíá>뇈Ï·SÈI®nt±í§R<Ÿ(Ôè·Ëþóí0 ï™C4¦´RÏ׆ÔàÊ1äöˆH$¯ƒÛPfã<‚ðY³ƒ¾"r· L®–M±8_ clû'9Àað¶g8×qÚ†nMpÁÔF"‰·‰ƒHNkb³Y‰-œ˜‘Ù`†î‰\•|+#^#È K—ôZb®•fÿ&M»ý°j•Ld¨ÒLoAÔ¼o*¼LyñÒöÈæ1Š¥õ@Ÿ\ÆdËáê\[ ‰ h`9Œ‹ãH.2‘Ã2®­ ¢{Gù\tË÷à­½gôR) Xx”º¬Rì½±7SD¿.Å_úÀ¶AÜÙ£3ôîP1RÉWˆC‰àLw·õ­4ê~ÍBöUÅò–q žJ¥Ø€ž‚‘†oŽÛeGô.úý4FÝìF„R·>zÿ¶@%>´Ã©gK2/G ë²+!·m»ÃÃmfwÝâÝqàeŒ›hцYók‚OÔI5áʳÝqãnÓSrÂßîünÜÝL÷l•¦µd•ñÁZ‹â­§~Cé ú}ôøM÷j0¤xðwqÏsØÍ˜|8źÇu!³µ¦MÖó¡t¤¿4Î<V‚ò-ª‰%cêØÊµÙQ-ñÕ 0¹Þ1™óì59 Ïän8âĤ:Ð ¡ýzò¥®ˆ^ËŠ8¨¸V5oôoD&‹ÛKŸÑ¤+ºíð‹·×yÍøñç _ø xø€;Œƒ/‹ð‚à}váÀš*Ť³¡˜œV\÷4T€¨OA¥X¬º}ÄÈÖÁc)¾ ²Ó´ÑZ*”"Ñ9ç¨D•µ‰?zL¢ˆÕ€;F2ÊsYgÀ"0B<ÆÕºÇ™+ ò¸8 oCñqÑ—šÈ‘醌»Þ/jʳQª +zÏš¨Žÿ°_wÖmô¶[ÜÝ2&µŠ¼ðMΡ*á©Ëð—ëÖcŒ[à}Äݺ2ñb»ŸûˆmSVéi›t<ÛçïgE¶×Îö‘2íÌו|q:Ú½×q¢Ì™ºÅjðí;›ï#’äÆLLß041‡`”îŽ ÷Pݱïr¹9NGw]gŠ Úï¡ëÔgŽ€@pw^"oã‚m¦óÅs´aq¦,߈r©hQ&¤Ÿ›Ó{Š ò?pØÉ3€ŠG© ´6‚3 ‘V'δ 'ÁÅRº`àn:F¼kb<ÑÙ*<ÔR·Â›ÓP/"ö7‹Îƒ¬óñ˜8ÃŒöm•Ê„Âó ë¸u. ‚ÉÖk¢J0J¿Ù¯º¹•Îe$W÷":%UÖ&âÿf , $.x*uB²G¨ ÿpÙñ xÞûa9­Îko*í«Ôb¯¸”<³ ‡5 w–ýv7õÙ8Ñpø6axèÖqè“véx2ž­Ÿv¦åm?_“Áó}õ…?.v¨Þû¿rɾ‡6š™éBÔØ­C/ ¦Ò3d˜˜Ð s^óy¼ ¼Ôf2Sµ”žòÏM꟥T'ÝÆ¥/œ°R*™•J[î!‘oïÒ˜?Ò¨–RzF£¨”ÿxûšè“ á ³ZbékÓT?oWÔ›¸EI|UBüaŠaîi&´ /雊9Ï]‡Š³­¯¼0­Î}ÚÌsig.å¸Ù†ŽÕlbºM׆:ÃÎåÜ[SÁ}Ör&–ÜTmlÀEÈK÷íiêä‡ÂÝ:«]ä ·?¥jª—î ttP7º´9[ré‘î8à©ø¹¤àÿ£éÈS›.‰ ‡ù-q`‚‡êO+“_'ï:Ofømê›ÜOä2Sëä÷OÏñ—~>±ØQ3‹2@¥L±[ûN§ ­|êtr¨K¤²ŸU•Ök9à‰5ĹSs™1JÊÙ·-x“[ÓzÖÒX7öП¶J½`3»¡öÄ:AaÍ,¾rGýŠ¡¡mPåÔO Ã)-ñá¶àò¼ñUkjªr«Ü'~š 8øŽKéHwë¶=Õ“¯‚"¦‚ë«Õ#Å©|^Œ¡ŒÍ䵩åÛWEP¡.¿¿<„2†“B5•†[ˆÍ\bKT?kH4A2$8ºŽTñ(¬%ÆÐ[Š~$`¾Ð„Ú Ò?ÒÆeÊ–$º¢4B ½¤}µ¡ß„G¤ñ€”Q¼L#ƒÄ¶t>EÓS µÀ‚ÄøÓÐíN—©âVª”*\SúÓB¼& ~¾U,Áù¢i](Ð|$˜ AzA8p¸‚q¨àç·$AefºÊïD•ƒ#ÒÖ µ¾ø+ë(£ÏoÈxIBŒñ=ëh¼&*§Æãï£Xbƒr«‚*Ôô“Dß½¶~Ýð Ž2S:*•Ë3Ã4–N€ˆz…Ú̉ÁmÌ ½ÚHbý'^¾…JÅù…5ÙÌKj¯cX~Ä÷Ó:\ ›O Iã·ru8q–ØpbŸÐ:šŠJ—‰çŒù-HlØ=ì ©¨˜óïÐ@†Ohø-å­ï¯åÂ3†ü,+#K A™$d-+w*AqɻÎììY[Ikâ-T‘ŠW®yÈ|åŠ&§’ª¬NËQQxbuúþÌÍÏ3“ ûé[ð^ÒÄõ¥âÉîYÒd/œÙÇ‹¿ÊhÍ®­£ÈC!‘ì,YfU™ø–wLèÉ™»܃Æ1 aw’±) ZV¡±Ñ‰€rÓÉ+Šüƒ=Žz‹YâuìÂ3:ܲfO™Iš2ÂNÞ¢´B‘ï¢7A¢HøiÜ©)\Ÿ¾Õp„fcÏöÔõžOl•%Ñž°Í‘(%I ²ÒÁ ²DTAÔ21~±~øÈ2ê1A"Ñ%‡9g(ïÜ–ÊœJlR†J˜«l\GúgL€{¼îAÄ)›Ü,¯9jÈ Šò#mËpEË·2 i´0ç9ÁŠ¦Þ¥¹Ö{JÎÖ0ÍQ Wy™¦eHË[Qw(ž8€°J'æGè^8nE“^¸™/f„¨ÒóÌBÙÆ#˜• 6s‰‹¦|A˜áGá„Ç›rŽ{Q’qOWåIJ÷’ê÷”M(%''¤Sì»ïÜDåßâoÆw‘”!-[ÿÝ·ìÔ[½¨Ïrü´`VD+úR-öršÃµÀ°¤êsÿ9Wd\i!N¬1O°ìígkÿðg¡P#âruúù‡ØFâ¡›Íý ëBWf>Ï2¤±Ÿžô¹öÊ-ѧ!gÕDnûäGКGæ©_çìaZ‡Ô]ÕÍÙ—¢§c±ãvxwä²yÇØÜ¯«C/ÅÁöa>ðQ¾dì¶áC‰ˆîšK*çh–œ¿ý»Ës©ØÒËqÚG»‡0s´:<û=WŸôñàn&øk ¿®ºì¼’¿Ç1Îm¼º¨1³AV(Êæ lñæ¬üBȺ6—·JM{Ôbb\íî…Tº6=ŸfiTç¾â¹µÖ¥æ^MÕf“ú.ûu·èÃ×5ͼŸGe¬7}äÃî…ûº4]è§ sÓÀ’‹"#5¡I4óoúr¿ª]Qþx)¾í‰aãëîû4¹ ÎJ×5Øa˜üÈ9û#ÍÂ)€Èõy.›{Ñ+¥ìäÿràŸñÊÝÖ;G7}yf¨kE ªIŸ{«iÚùÅpŽrÓðï®\ö_üËþ«ÍfõÛî+òµaZ77¿]}õ´]TÖÄ/+j¾ÆÐû>ÆÐ¿µ†®Ô¡T§/¶èÜÖÍ ]?ÑjæiÒZ6ü§?„þ‘ÑM޾|úvù ‚¢{òƒô8à î;î h© }U4‰Ã0ÞùÛÛ…á p=›µËð=^|™û׋ÿ Ž}endstream endobj 52 0 obj 5287 endobj 58 0 obj <> stream xœµYÛŽÜÆ…`$@ö+:OâÚ»›l²ã'vÙàØ›† DÜ!w†Z¹"9»ÿZ¾!Oþ¡œê ›³º$/l¬½3lvU:çTé=K¹`)ýñ?·‡‹?ýX°Ýt‘²oñïîâý…°_`þÇöÀ¾ºÂ—”¤ß\Ý\¸™à~[”ŠKiØÕáâuòËæRä¹\%¯6o®¾ÃƒexN.S…g¯ê‹äM¿{?l®Þ­O–†+mŒÿÆOîÓðxÆËÜòÏúÝ›ý®zô´*¸áé×ÉŸ7—J)žJ™\=¾‰àZ§ÒŸV?>Hd<-Sá?~u~’«Ò”™ÿðömÕ¿{|”+õ¿=þ¦Ù?~·æ*„ù×óG ¾äîÝÛ}Õû'Sÿ1¢-¸È»Ì4/ a\žo­1ÈÂö¶6OE®Êä¡k6—9ýOY$õîÐôóä³ï’sÍ®^^$?Œ›§¸¹ñCq‹’]=àôᆳ¯ÇMnpR©Î~Úîì9¹DòP˦Ýíè¾ï¹iÆ™U}M'à³,ãÒhßaÜ;8ûjqqc”ÐÉv§ž±Ó¦L†#;TuÃ'ö°)yšæªH†ñ–Ým.57E.’ašÚë®aí¼Ç38¤PZáÉ‘]ÛkJ‰{ @ÓtmC9Ju™%÷öûe.“Æ~÷RáŠF"ÃBº;æFÑ“¶gó¾a6 %¹Ñ:Dˆ4SØøªXw_õÛ† 7x¦Ø<ܵ[Î^°¦7¸/§88W:ÙЊRø[ž¯TSôs{hØ4ëSÛï.ó÷î€ö0 1•eHjn¤½°½nÓß·.ó’g© µzBýÞB*5KÀIe¿^¢ÏR¡Ã™Æ%`8¢–îºÒP’9ûË0²C³ADA%Ï\Èûªöé²äyV†lÙËà© Pozöî8Í.½ín?³»®Böf—ªÔêy¼I梻¦ Ï Uªó³U‘ª¥Úœý¼Ñ‚p´¯î—{SbÆ8³ ’fei³ì 5 Š‘”—”ý¶™ØÎ%4åYdÈI†WWsw²Ø±¼Û–˜u®Ê…Z‘ÈkJü%âC¬YÒ»o”aIÍ*Ö 3»©/® "wí:=Óy2Ì{ή@·Ì$”àÇWþÈmÙeVpdõRD”ÙRØfL®,b÷Í„øسu€¨riöúUÁ3³”ñuÒ»EäÔ¢ÏØõqfílï q¡Œ–ÒÁ O ÿJE1tµùºÇí=n›AòbI°¹$zÓoðÁñ¤KΛ‘MûÊ‘ƒT$ކ£…—¯o@ªñ8 ³T—ì›îŽzöfl›¾ž(‹¶®0™/}½°_?±éŽ>–èå|Éï<;:ÈyY˜biáÆ‚F ³E±ÜvŒ%ôÑ KWú6!‡è#GWF–É/茾šÛ¡ÇGŽ„Eš­ŸÅá-#lI„{îŽÔûáà3¢ž„yA}hùmw,}]ÛέT­\Õ Ù7ýÔ:Ði‘D¦ãîÍ$ŒtéK§¥5uz¼ªOtf3Ñ™º\™|1:îR+œf×/=u8uÞW³›2ãÅ'«›TÓгªúÆëk8з9z_¯ïö½½ŽMÃrÄü®b?V¼U†>]·“ã$­d2ùD{ëôâg›3.Ô"X‚¬I‹‘ٮڀΠ„=©þ7ý®k§=òÕïŽ0î59±$åÁ¾ÞdÐó±½òí\-óŒT2¾Ò©^Ó7cÕ±‡jbhúiÆ)O\&P§BšX‡ZD»dÃïfùçz©Ã<´]Ä z×ÀŒ…þPì€åa×·¿66ø¥§¢DX6hXE„<…;­4+é$º³­#s^èˆZÇÄE^zGA1º4Ýq Çî2tÜ" n!_ækÇö©^,¨íÛ[öe³ÄGäšàÓ¨€U·‡\Yùð*EŒÄÙmÒp8ìŸÚRqã(²œú|´¸9E!:zž, t¹üôÛè~™CmCp½oQ˜ÍeF&37H„¡…—AycKÔ!±R;[¼í<‡k=ˆ-dϰ߭æ?z“‰¡E+“©¼g³²=ØZk\PF·l|Wyf­0ìÆ•­›kñ˜*äÊ Õ×ÕövM×d}ÌÂÙþú© EÇì¼Í:k‚±¦VDq “7æÖV¡/*{}Ö›:CmK|±ÞOB2€“R}¬1×Úå+fòŠàЪý'¯¯`íª¦c¯~ë:Wj™FiˆIö#i™»,¸6[Ñ_Ôg—b¦0:t÷ÖKhB+¦ž¼V·tg²™EÏ'§ÿ=Ž¿‹ff7Vwû“²$Ü—L-à¬u`ÕŒ” Åøh¿ý?Åöú3ÁAÚGªÍ)Z·‘½}Ûµ÷ô[÷. ÞpeÚ´7¶ÃáéÓM†9³ÌVQj ã«(1 ¢ìßÕq>䜮Î]š}.š'Ÿ‰¶LÓò¿GK¥lkš’ŠXIÇgÙä Ë…>²Ô̬ªiž9Ÿ-{/ŸeÎeúÁpújæãuO=¯ë1d·™&?H•Æ.>b…o}&iVR&fr½¨|;æÎ­„9pÕ# )KðŸãðLgAÙ­bá’P( ÕC»€Ž#Ù*Ùx“ßKçäA|ax91OUháëá΂‹»&A’Œiçg´3 µìSÓÝPõ®K ]¤ªðº¾'èþàã^)¸ô®¾È"°×Ücà /–q%ñsØBè—Ò•y¶OîU©^Øu¡?Âò}Õ+ÚmT=|¡³ì™ï-˜Ü_‰&ÞåF“#˰ø6캇üq–QÉØ'öm÷ïÝ®ó²‰ßÁdU´áé«îÖ_ðôlx¿ªpýú)˜H.³s˜@ˆBXe åUÊ+wmUÊLãRX‡`jHß[(£NêDÈæjBšQ¦z8"aO¶~Ø €t-ºímðŸŠÞ»ÎT"}Íì)Ì(8¦•Œß¸«)‰b[ÏÈ+åòCõ‚Höî®×íu×F~Ož…óÁ+ÃvV¸Æf™!<0ÓýÚgºìÁÆÝCœöÝZB}hè$†Ä<[OûB[3‘¼:±›êÐÂÀNÇ;ÛeZÓ ié¼Ñϳšg‘7l×ÒF¬Å€Ã0"±Ö(ü"[º\èeα]§Ó—ì;Ï‹€rôäåqË~h·°¤÷ÛÀT0ì&[C öa;T/¦`¸uî5¸²”wáÕHhI{I‚e̾E‹Õ÷Þ)£ ‹‹êgÇ'K>.­'NX~u[¹É¥Nž[RüQú4…kîÓ^?à6~Gˆ×{Š,ÒÈ{ ©Q†;µv@5»óDW˜Ç&Z¦PÛ0XgPV‡Þƒìä ±mç°¼4:Ò¥ìÊ•D¨”¥]¹¢„Ûnð£´)Á„¹Šùµ\5ùä0Á& w)<^žê÷á N0·Luòö¾qÞãhVW§8ò‘ wa1B3«<ÃÙŒq…y–hÓÖŸ›–b)¼‘¦äöÕ3` Òhf2!£õŽíIVhxUZà^qk"0V”©Ž¬Ùɽ_âʸÄM¹ÑËK …û¡km°v`L³„pµ˜”6¦;Jä[çñ0³VÜn‡ãܤ…´»Y—ØÆm$:s½A¢ã«î!dœ–*SÜ’ÑÚ6ÍóÕ"\¸OÞE4ëW?uûûí±›[;ÅNÇßùMWþébÀnâº8<ûph³á®EFzOö(Im#òÄ.i)·,½…ïqç½›.¤V S§uŠf).ܦûRá·R¬èÂ'7qûóÚ{Œ ù‰éoC —>ÉIrÑ'´nÜW"ˆ ,ÈÑ¡RÓ~•5š°}^²àòåŠ]ëÈÅÒç_ô8€³=àÑÎMM»î™ø!ŒãQZ\{[G$}«[àÊ4EEë[Úí[L &²Ÿ-5xÐ\GBr4Èóµý:þDÊÿ…ÌÙ’„Ýü6¢dèÞX~"Akq¿5"Ÿ;Íÿêë¾õ–曫‹¿áϽX¬endstream endobj 59 0 obj 3150 endobj 63 0 obj <> stream xœYMsÛF-Wv/ú¹Í-à–„ÅÌ3ƒ£-;‘R–“µ•“ìD@&b`P²ò¯·ö#ñm_Ï ÊN¶\);$8ݯß{Ýø…e)gýñ/×G­Ùûá(cßá¿÷G¿qûó-×ìÙ%’øD±Ë›#÷C΄”iV¦e–æ…f—룫ätUmÇf·8‘R¤e™|½xwùýщÐi¡LÎðvYã¹óʼnÈÓŒ&y…‡ušeB%—ôiòú‡ç?Ò?%VÈóäü‡WvœAЩp†.hSÎN”L-ÉS#Øå–¾8cíÀ*64#ëoغj;¶ª6u×nÞ³±_œ(,+x™ôÝÀîÚq…g—ýzÝoð×fÙlÇ”´ÆÐ®Û®ÚÙÍ%ÏSUââ~/N›%X«†ý´i?..>:ñá|ô`‚íð©I…–îÇ"å™ûqß±åªÆcv·j—+ìHk•êLòø°»T¼Ïâ$/Ê´4EòU×<¼Aþƒ{ù0òÒ‡QH•~«d³^Ñþ³( ‘ÿ%¢{º+æy*Œ w¼J–{ä[`s“©ÄE‹#Ƹ²û±D¦¤»F³»{¶î‡‘mm"ŒÊLÒo÷3k×Û®Yã‘jlqhä®Ú°‹³']ûa°–e&’ÆæÓî!r“Χ=rª”áÞž‹s-’alÖ)»\!È‘ªHµááYjüqÍ·­›a¹k¯nB‹2I3ÐqûkS¤Ò”!6·Ž’R™OrÒìZ{“ŽÝÒ—¹FÈ2¿ô¨ÈJ­ýgƒ¿2²pÌ6ÕÚÆZ¤'®Y»ôÄì{ˆÜ»~œ>\ªðߦ6uBšT:‹P4E®,)0@£-^ÖnF{BÍS]„Ý-’‹4›mYï—ˆÊÅÙ1kÇa…±w7S(n{o€úÏÀî£ã€HŠiÍVvm]¤¹ñ “i—;¬NÕ¸šÅ @AKj[£!I”“R¥¹×mU…¤ÈU0’)Ý¢ó7¸pïVT<©v] =UÍ~ÓŽ÷TÞïÛÛ…!¦â9ÐGÅî Žä¥fÊ·¿$užT5BYÑç`?£MJº4Æ#õÚn/•°GŠü~Syr`Ng ÅqÉ•ŸCn.€>Õßv·Ðø/Qú?»‡ǽÞh5åv\ŽöÖXÔ–X5Ú À*8¨Ù0€ˆaÓÝØXàÓjÖÿ5eßîwxÒßh.…ÁU²îÝþ’«ÄeS=Πe1¤SÎÅìlÚQi¿Ÿx‚¡'Ôai&¨éÆÒ=æÖA ¶¢ËS!ŠTúO–#!³énŽT,WÒ ýØÞ:ž¹éw„0J<Áø½ÍX›pÃÞòHªn,J‚(¬‰’§„²Ü?ÿuúµ@-!Göù\¦&÷+fÐKVÉÛ»´gÖ £PVgžN²’ÇÄ ¾`O½xмH^²³§NužJ­øž¿|ñú€Nx®R>¿Hµp Šé‹rÖj¬l÷. `¬ðÕÂ-Q*ŵ}¿‰Ñ£%LVÔÍ«§  tí Vré¡G €·˜rmOZ³Šê7uPàA˜¥\,cò\@89K¡TòœöÌZ#u*°ðÖ‘œ˜¸ŠööåÚïìH®dâ„LŽœ*p:_æÉWöpe*óL¯zs­‹wlæ®lÐç’‘ù¦}¿Ûf8ÿ[šˆN3ˆ0åá3hª…<­ºöÆ ¹AGŸlÚŠº”súÈí•ÜB¯ÙÛÐ蓟NÏß.Bn7„U-t,Jm¼éC­Ñ¸ÄÖ8ÏLæÿ£U”ÂwU~vG¤<¬PŒhHnª”½f̤&¶7Ú›\‚Õ÷ýjÃ^Ò³k:ðHs„k×7‚-ò/×ŲZ»J½koÉÜøñ *FÑ¡ÓÄŒ]%Îy!¡Mèqø„‡þƒï3Ðæ3,ºâ!rp)kå4t’Þ67;w°Æx>ɸ›ç¥¦œõM×oI¢l<¶ûaåÇ'&“TJgÌ¥ºp܆¦£fW.UF¼ÚS7þž>S)ÙŸÖI¬¹‰bvPÄ¥¢ÔZ¯Ç0éS Í5¼+Úx\vœé—F¤D„Z²ì} #6ê(Œ¾‹ÁÖ[yV‚ìó餞íi4æ­/Ь(¦¶U…y"­u¾ÃðŽÊwƒ>¶Ú:ÛªÝá!ƒÒ+çÛs$ ¶\D<ÔðkožÏ'rÔKºú†#ö~*‡1ìw# ×.²Õ2”Ïé?÷"² !‚^QØcÿ£>ÞÅøõ»¨Ãc ã;$äiסÃðÙ‘ä|VKN3 zµ0õŸO‰ŽÜ«ö¦ÙÔäùc*}ÀM:M…?Bv]ÅÑë¢ žvècRD×~æS“Àzn‘q4}åÈeýÀgݸÃK«Ø”PO¶4¿œ\bû|œ©,¦žNjÇž#Hz£u$HÆmÉèuhCÎæšžF-u@|h–h_¨Ì.`’ çoJí@pßE4uxåƒÍÅ— kâ+lê&}¯¿=h\º<ä1åaˆ›MšÁªÚ–›1Â$~…Pÿ3¯|‚~$RLª“Þ.ï»±Ýîw[ÜÑU è_èBFs–Έ2ë¯_6èÉp@U@ƒ}~ñâíâ8D²‡ùz=ÊEÈlœÏM¨y<ŸsãaÊèü®È­MÍnhµïÂä”&÷àùÔÄçï\DðÞ]l ›“›˜XÄ”º°,rí ®&—ÏŽµóŽÑwÊð^ÍvQöÜ ‘ç|FEô.7 J»žûóÝá4Ǥ|6óøôß/¶™P ×è¬p{«ž4jâÓ$×ø¼žö]ó$²ªžÂ‹$…W¹k;âkǶ ÝŸD+WqJ§À¯š;ö}º˜9h6ëlÕ6˜ù\óè">óF!e¯Ü›6I5%¢ùÊ%lGéü®¤ ¯±æ)Ôía gÆô@°Ed¤ÃöþÿùÍ¿™%y´XˆÑÞpèUa…<Ë ..çôЋˣàÏÿ2P$endstream endobj 64 0 obj 3488 endobj 68 0 obj <> stream xœZ]äÈqÄaá—ùõ&¶1C³>È"å§Óéä[yW°¬9¿Œ»›;Ã]6ÙÛdÏìøWûÃн)2ëƒlήdáN=ÍbUfdDdVY*EFÿøïWÿôïVÜW™øüïþêÓ•ä/ÿ¯ÝAüê_*éƒÛ÷Wî9)¤‘©ÕJØR§JUâöp•üysû_ŧþ»E––Rãû·û«ä­ûkX¨Lu•©ðÇwýý§aõ¸ªR]T•ÿÆ.7i™û¿üçþû‡ûzõ´¶©’áé»ä—›­uš)•ÜnÞÝþvy$™E¦üjûõBÒ¤Y™É¯ž¢¬JãÿøñOuÿa½,Õúÿöø»æáESŽùÃå£6±û𧇺_=‰ÓÚT-nL‘Z++úªNµ±âö ñØÖc3ЇfscÒÊV*OêǶ{C/&|ê"„§ÜjU™æEéß÷æWoÄo¼oÆÕKó*ͬ ‘ÜÒ_‘'[1 Ïâ?6Ít•Ô½øm½¶ãÐ_‹·íǤ­d6iÄ¿òdV¥U|m}¢õJd5“…ÿ¬éFQ÷{úƒ–i•Y÷9³¤s&â»SÝÞ‹7 ?llš«"ìÏmÿF¥R#PR¹=Þm¤M3™›äic±£‚¶´ý%oI™Te¹?ŽJeéÃÙm»w©ønè8UÛOM¿w¡­l^${1 â0¸C)Ú<jï6&QD3Ôûö¿ñö:™hGwnI(Œq6Bc­MyÕ*-‹–;D°FqÜÜà[¥2*NS½m»vzæUß¾~û=?w£rœÂæáô2U•rGB†÷]Ûß‹]…rÊYQ$n•¶SqûЈ}ã•¥• Yyô‰_@»é†ã¡é'1¼ç“MþL*¦ƒÞ¬]Î~üîµ§áxäu Ú_ˆWã–ÎU¦CIíEý~jN ÛKŠ(SS”áÉÿ]aÕ¤E¨¬ôò9•„üåÿñÌÿ¬žÁ&ŒªlÈ̉!Uæ !ñ±Ë—¹GY?˜F§…™qù›f{ÚÜ(‚¦.“3êáFfÉóŠÍè!mÃr?ýüóúà²L}¢Lªmé’}-ÆasØ«²” H Æ4¤¸ÊÒÂF¾þ;)îâ¡Þ#‹õijÂñ|©æsá${Àˆÿ\¥ÆÚÝ„7eŒ»â jfák~Cë Xêu5 ;&Ü›²À>KŠ—4¼=>!GÏI‹EQ`ÚC/W;¶ªðݼØÎ¼Xj@$=¥ÝSâ5êž’BUÎè›Iì†ÃáÜ£ì6y‰å >©x=!6à­î0Œüc×L Þqr“AY«pÒæØÕ;Ž Ê‘€LGÔSn†SûZÚè®ßÔ}Û×J.Ÿ dœšÃ(íýĵ]'ŽîݤØ:ƒK1È» Ø~l÷{oùáZlÏt–Ó›?œÄ=§Òd©]ÇÑ‚M=ÿe±Tö‘ ½¨Æ%¿Ò¨…¡SÇS:+Ó’rŒ(8©ÂAè5gFt5‚ùLëȉ‘‹åˆ†UQ’‚8²BtBÖi_ã5/t¨? ¬ Jà˜enƒwf²Ê!BÞòw¨™çë~׈'—9ä8ÏÃé†ÓÇÔåkÔB`~×l}Ø8•”’OÖœ°Ÿ®ýÆö  ?ad¹ªÃ…•ŠuˆMÒ_I”eVÍ‹;’õjjdL/Å zÒrÍd<àð®djPç1iˆÁ¯™-¾ U·k['°ˆ8ÆŠ¢tg ןÿû§ŸÖÎn", ç›Ïn*¨Á|lo{ŸÅØö®jn4´•L¨~‚Höž¼uÞgÄ훫ä»§qó‹ ¾dĽ¹¢(8ÄAÀv@f;Bc’ZŒ ±“²#ó@ ¦ôЂþ;v•¦L† õ°DÚ’z÷€õµ»ì~1¹'Rd¼Ñi#ÚÚhæ¯ïÚW;1ÕãGÚgÄv"È:ÿŒ;ŒÜ`c)T)F‰X‰s è.™Q¤atÛ8œ5W}³ÁÃV´2MÃÚWiY«=Ó “;vÍ >^â}Àr}u6^qýb^¿¾•²JšWÝÅ¥g”†ŒX-öí?”„rþµòŒæq*­J«è.®½G„Ï"ˆ Ç[ì€>‡óØd; ú’ôé_nCy©ÃK©@É;Gå‘"± BЍùT¥6dêzÏÖÎë¬s Žõ–Â,«dórµs!gÕWár—ì&brT6LŒ!¦4ð„k”.îZ<=´\±¾Ývc+ÓŠdø¯óú./z!‰…UDÿ“ ëœÌÊFHéìÐwßx¡3Š-E„ZVŒ5œ¶û›Ðð,ö”CSÑì†M1Ø^4gå¢(æýœfš¿?w^Á¯U´äwÉ«ŽÞ˜Šï‰£ f5„ÿâØºÈR«š™¯3#w–Ïl…å©ÌóÕš2èÍNVF)Å6ÄŒ3¨`ÁkÞþ@Rò¹>Bà…?—”æ(9_Ç µ1¾¥{Çõ¸AB`ûKͱÕˆœàü}}ð4žK…s=µêÍ‘B† :ÔË*Ö]èc³jv¼ÌÎùHSä¬ È8"Þn;´^YOÏç{Iw¢˜¡c]‹‚ž:‹ìë)º¿(í×–±a)­^ô„ ^Ž TÄY¤¹¬¤“1„féTï`ѾŽÔå9Ï,F„ fçÈÿŸ^Mm £ïnU‡?H®£€’¸ÑÑã³F>·7dd}¯D£½ö¿É垈ÈR‡£™`$—…×õ‰]/Ì´\4¦…wšÄ7ìújBðª!€2Ú,è'¼áçiíkà·t wàX•î¼ÇöÈB·=¬YJŠÔîì 2  ãXÅå MÞ¢õ‚‚-¨ˆõ(0ÑI¤_R±»äßÀÁ–ƒÀc ð…rñCͳ\yóUJ%çïycx¨Ù8cHgQàí¡­5d•)tòyºæOB/œ|J×ø Hc¿þò˜w|ΧÀð×´±)['œ­\›Q&V¢¨¹S€LL€¯ Þu§?BxzÑ.Poç,ú¸žOrBãá ºŸÔäi™ç]CcžÎPP}XÈêŠÂBlÀåU<£“ªùÅyèN·›Ð?Ïý‘²t±æ 3³¾éD}žT^hi ƈæ¯î:.6ÄÅÀÒ18×­ŒÎ­ÝWg3whá„«ª¹ Dùx2k¦Z6$npJŽŽê¼·‹\V”†"‡ÏcÓ=FUg®$PE®¤#¸ì‰óØšu'E6»_‚2w²È|8þÜR“ÅXl„ ñ¥ ~çnjÑÐÓwÆÝé6¸6÷å¾a³. ßäDe˜¼;­$ZÌÀ~®¬•E?µh“·Ñ5ël1»&“íOÀB'#^ÈâÈ…ðåÕžHÅÀž;OejŽÀÉü½†·:–‚%FÜòCÚçŒgŽ šz‚2#?1>‡JV¥Ž­$àðø€ð!|ùÂ&™Üë6m ÷ÄGZ8œ®cHŒWp×…ˆ¦¥ RG ˜Üiç5’vã«£ù& ú†y€¸´óC=xz+‡pìgOEA½ÓÔ›ò>y[[ sZU³ìR¹ÉÄÃpš¨qc‰ 28ñ\‚L¿-Þ jvéÐʄ€ïÔ¿A‹:Õ[àò~n|†óÑï‚–­OÛdÆ\É.9ÂS£Ÿ™ø¸`'pûì–Ž¢<† óªÞ‚r;â0lñy0•bëPSàbGŒ~ß8ÏÑ>P1Öþv e²,O_LTâ|ôCRŸÐóx)-úñL]ä„ÁêË<ø TYâÈž’LõIgG>£5©`~GÀª(¶¯˜a) MѱP8‘ØòªXÍ1"<¶Ã¹ëË‘MbÙô: ˜äóD<èä¢ëg;0wÎöÚ®:ç%´Ø¶RÅј Bàõ¨HÍ"•+­$UeûÈyãϔ墴y2 mñ¥ 'ö’ê˜;œ0Æ»+X;ߨ|aó©@ku«,:Vhòáðp=ÏjQ¬ºŒð«r?áõ¸w΀%¼…®ÛãíÒë×Û­ç‰á/ÔË“>¶„9I¤—í74ÌmJ±l¯Ü´˜mÊ8ùèÐ…Ì¢•‰–Ÿ·‹Ìpý”¢-ü‘Ê|ß¼ê]!•™±¾Ö#æÝÎÕÖߦ)¥ÉçÅ؇sŽàýåÚÀÍé’ùRk_¼`£VøÒ:+Úm¶ÒÙäxÞ‚íq¿í•—2"½âô^·G¢»_Œ/ů]Ýj7Ånòxji|ðÕ÷UË)(šb§½4wWÍ„vÂq·²:-44³±Y?žéºOyØ&-÷MH˜DáØŠ»!ÈÁò0Їvô†äÕý=4x-¿öˆnÚãmE¡]/Ó¼¯áTÄ{±{‰ÊSSÌ…Yæž­7´èlÛý¹îâ †o»*§4D/,sÿÂОRMÙåx>NÛWqàïÙzõþÃyt>o•e·$Ê Fíëý5ÍêÎS/4Äæqô>Ž ýÜ ¢TÃ3{³äÄÇ [ˆlôv9䎞ډÒx>»–\ Ï¡ª˜9ôËóÝ@Ĩ\´yÑäÓ½z¶d]Žòxô{a¼éÂÌq ’Pärni°¦AašhâüßFˉJÍŠpq÷m¸¸›…l¿gM ýÏCçß`\sWØß¾4Ÿ#ÑñTÆàÿ¶ÿèÙHÑÝûßšôŸ{ßì"¥ÆrÞ£ï”æA¯VÊ zï“©ö’oN7÷>î 7,µ‘‘L0ÎXaïKç±îÎŒß ŽÅù®ølÇDâLUï®"a7ž¢["³œ‰3.ÂpœãÓë<­ Þ»²Ô š–¶–'×À`Í/ ½A5÷S_æd!<<Ѻ(/1œ§ãÙMdh&ÐqR(–×i#ý`$´6t”‡L†'LÂåY¸lÕòÅý¥oè¼Ê^›fO‰ Ó0Âßò…)ç;OU¾MòM» Cþu æq¾p÷®aÍ£:? Ašy BéÌ_L•âŒoSñú2+¸X(k™k‚³ íEs…€{ÃjÌÌ_êÔ/X Ñ‹žâŽykîchRL»¿/•<Y S.£H™ž†nÞ?ÙÞëÑåoÌ;1îNíÑ5T®M¼~PYØåç©éÇvë2F÷s³3ûÝýó€Í÷|³QÒä-c‹šüâd²b¾b/½×tÓxä…~ÓdfHËÂCz8ñ/˜†#_xÅŸ|ö÷4Ô”‹Oçv÷E÷. ¥•ÒÞÃáç™p’Íu†5§n»ÁÝÕHm“k Uÿòè™dáH1Ù;[M²à&|wQˆN2P4éõæ„ôc{\^ R¡É]D^è©#’°o| ËyÐê·2ôK¬HÞ±ŽÂ@ϧ‹{°ðÂ8èb¾¡±dªûS’ÛËÊÙíÝLÍ?OZLRNôK"ïÂaý'Ú[ á|ž §·È”Åýuô—í²Dâè ý=½çûÛ«ß㟿”jlendstream endobj 69 0 obj 4271 endobj 73 0 obj <> stream xœ­WßoÜÆ~Uôà¿a ˜ëVË]þTƒÔq'v¬Öu.HÙ¨)ruG‹äžHždý×-ŠÎ[¾Ù%yÒYŠ :I'qgfg¾™ùfî‚ î3A¯á=¯÷_ÅlÙí ö=~–ûû¾`Ã[^³' )IOgûNÑgIÈ…J}'ŠK™²E½ï}3[¼ƒl2ˆF<Ó8†ø¢Ø?ñŠ7Õ:kfs¥T}ïß³7‹ç7M!”ð¼÷ì¶1ÉÓ(MåpønÝœ¿½øçZŸ¿#1%§j8üÓTbP«Hñ$TlD<Žý”¤O[\í{?we³dÇ? JSœp†-^à^é;Á㬹fý¦7m™Uë Ûêì! “<€Y{=)VFÙ ™•äÝ„÷Êtúvl~Êe2þá;®¤\Ìæ~ñHHïØtÝ€à„r’F“Ÿe罜AOÄJzY[ô;6U|Óæ¯ÿºßæ–µ³ÄÓÌTÅ;Ýô¬ë˪býJÏ`÷yÀO[û¾¯x”ƒÕ,_‘Ù¹ .cäÉ—ôÜç"pHÂËM“ëuß±¬)ØiÖ•ywÀ®Ve¾b-iû*âɈ±®³²±(Ë”‡©ë¦`›&_eÈŽT…}°Âým‘œ¹R‚‹Ñ]rËVĉg}yejÜÅVÙå,A˜B†Ààj6—øÇ¥×–}¯ˆÚÈç2x’&c'¸9öÞÛ³”û¡»Cqê- =×U¥›ž•Moà bž ‘ .zDYrÊC±ÉûÒ4 ß«M{Ã+ ?xš‘òòUSæYŪ!#à¡®÷.ÉÖ®§+À]ö+¶¶g¸4KÞ3ðN[÷$ &¸©KlnàtêoC“#|Åe†¬ÎæT€A’P~ºliŠžD*¾™4rêP[ìNPÇÀY$¾k«~i„éˆÕ‡ÿÞW»¾eëÒΞšv^ÇI(\ë\ ABÒß©˜`‹QN™*lÈŠŒÊx{Ás¾©!tÀJ¤´C‡Ø[P†ži–Õõp‘/X$3 €Ð@R¥Èš©¡_¸HÌD˜H[j×Üž˜†š¢=×…ë‚·¾ž}\TBLû@0æäÛ¬×Gì]ü.†€0`Ï7•-WG0÷HH!lðNó#óO[SEÆw›þòÔœ>ÖïmssÓ.¿²éé\1‘èÂ!|¬Bæ1âÅ·á…Ÿ_ìþisúNçýÕÝG•õpŸòôÂ¥–¤×Ľ~ßñ²@šn‹8r®*[çÜÑÝMF·º+—XÎhs=#¾»r °ã†í6ï+öµc•&' u‡èÈ!e¡3üñópút°6Wº%eåu×ë‹j…æ¯fgH„•ju•ÑRÓ­Ê5,@7«10Ùº5Ë6«éŽ¬ÙŠßx¬ëNW—ºãPSÉTç{{ì öø†ýÂÙºm@µY3¬s§è±s·öMkš÷ºyÝØŒüõÙ?ØKg¿&>ú®¹,[ÓÐTÿâ‹]%ïbczë9œÓš<Àj±€êÂûÜǧ…Ïè¾VŸ•˜"È î>¯ks©ïjBÚè1R\ü·Îæ'ºo—ž¾A$ýhc6RC©÷àp…üºz?<Q:óþ®Ý0³ŒXÞjƒrþãDCZc€fúbƒÝq¾Ý‰]?Hïlj¢8ÖìÞ½åQï.Œ$6Õîa©Ÿ²þS,…­ÿQÐdp¤ïXJÜÅRŽœì®#'ƒöež­±F47]·§i=_·e§K9ÕÿQѼGÊ#¨DLC+I?EQ'ÞßÖøum6-V£¦«xuýX156n<`«²Ã'õëƒ[´eg¦cŸ¯a ³ŸNÁP5Я ëP»xÒ,‰.¾[ìÿ¯ß·q^endstream endobj 74 0 obj 1927 endobj 80 0 obj <> stream xœ¥YmoÜÆ†Q´0ô¡ßÛOû¡€©Fb¹/ä’ Š"oDnZ+hÙ¨©;êŽöy>ò$«¿»? Ïìì.iYN 4Ž#„»\î<3óÌ3£·"K¥Èèÿ¹ØýéV¬†£L|‡¿«£·GÒmþÇb+¾ºÀ¦’\\ñ{RH#S«•°¥N•ªÄÅö(ùïñÅklÅS¿·ÈÒRjì¿X%ç¼*S]e*,¾ìVoû{¯«*ÕEUùÏßݤeîWþ½|ýr½ªï½­mªdxû2ùüøTkfJ%Ç//¾Ÿ›$ӢȔ?myÿ iÒ¬ÌäG­(«ÒøÅ7¯êîõý{d©ÖŸöúËfý‚©f>}ÿU›Fì^¿ZׯæZTiN맪²©4Zœš"µVVnïx›ÍÃ6úÁÇì›Ý†W±7¬fa9KmYŠ‹Û£ä…Ûy'Æ^ŒëvÛfêUóâøƒÈ,§R¹Ó/Ó4}yÿxÚÀ‘ŒëFðÁ8sÑowýÐ,EÛ‰ºͲû½ð¥¶ï>ö%eø¢™ûÇTî¶ÿ\×£èúÛ¿Ü7ÜØhùÐtËŽtëþÌŸƒíºß,›ý§·Û·Ý›®ûý¶aŠÀ¿døâ°ß7XâÃ~Ê{¶ÝUÿî3±®d¥÷½^ùï»°O¼HÔcõâø Z4*µñ~ïGWù³¢=§)d? ƒaâï—Ø´Ãè,ö7Èß„@™»Ë<„Áe¢>Jùã,,ñUõ¹´Ç„Y–üöû¦îÿpXˆÛE½_þÖ%¿,ãí ë,ÿ®ï]¨2ý6õò¦]8tO•ï}28â³·‡~l†ÿ$F¼âƒžüBÑ,)T&ÕãÌ>Î ½RȺ^éÏz ¯ú+·¤ãëVnñbÍ1—Ñ“Ïþ©k߉ݺÝôC¿[ß1†²ü0Ç4ª‹â ̈»˜¾—þÞx–'ÏΟz Ÿˆ2O±ó‡#•J|ñâ—ÉòkO ªeé©ÂEi’a¬»%^ß]‹'bűAvÁì=W”ò4›jÕeRoA¯/ïø@YåIWoÛÅ úkQ‹ÝžÊ*oƒþµƒHªÈÛ‹ñù߈Î-6ÕŽ¥9*˜/Ld™qX.äÔDí(¾dßtî9ÀÈe(h(ÁäÖ™ë˜ 5ÉÚÊÞû–Ê´Œ&}7ˆ«ãS“Ve®ó¤Y· Ø6…·AÑCs|Z`Ñ”,!.[µ7Ç6­l‘Ù1{U/Þ¬öÇešÉ\š¤‡˜ú8 ¾,L†)EaRc`’ó(Ý¿*9†ÎŸ²žYöq¤.QÑ"Îܳnôn—Uf’®¿íHõ®Ýí²\ۤߊ±Å3v\¡Ó<7¿Ê‡°‹ÿ25EüRÒ9„xÿ2!Ž·EU"Zûý›¶[‰[ô¡Dô…ªH‹¼ 1Æå£„^ÉdX£ÞÐM½›…ÕÁÍ‚"gÞ›ÛÁ({;ÄíºAÝÜÖí&||ØÖ›Í‰Öý~tá;´Ûݦ9®Òª(U‘_dO. YTñAŸä૽ccuM†µœ·Œ ¥P=ø(;ùn #§·(¼(³’zéÞ;չ♙š[ͦÒëe½ý[…6É’E’hu,é¹rÁç,ç« ±*íÈ­áó{HË"¡º3®ÄLÁc‡Õ:g#é=í*t‰S‰*ÍnNĺç³sP®1Áw¢-s5ÃãÆjó’¼ìß¼>&+"0¸}×LÉÀAΔ8 ±-ÁPo/+U”ðå7‡=9žVšvµÛ×ÆÃÆ‚½F_U:ñ‹²¾šŠŸ¾>5’Úås™U€ºŒ][TÈ[}ˆèžp÷‡ÎraI çü©‹-ÂDJ«’;8rÉ›+…Ó"ë-9Ü‘~ÆD3æÇ ­DL<„-:V»n|h•QÃ×ã!¤e±¾¤¸ (êwH‘ö?À¼ž¡‰IB%˜=iPp÷îñ–—žè†±Ùb瘯2…NúÝaSï'¶Ò{ìåÂ"{f·eöÜIéØvl¬Ô©ÔfòiÅŸp;ÎÑ*Í+ýqÊAhþø·çgÿ"ë\¹¢Ö§n­,#%¾|öüL|Š/;ÓFkR™•µ3i9#²‹ÁBë2©÷£+o3¤´´†"T< )«™„È̈†,‰µx/£·É&/sI›boøp\ÖwOÑm×bèû˜µ ¾îGu“ïÑn6”¥#ÒIÝ!ÒºEKù½s7VÆHgI*¾zþÍ£aÇβyjî•Û2ºˆôtÛþjŒwGá£Qøä#NQ‡TNyÙW(Â÷ªña8qÏ {ÓuÓSAx "/]@®!aoë‰ïv‰=A+xvíN•3Ž>E*]éäí¤|ciù¬Þ¢ô›ûŒ —O˜ŒkÔWîÿ¤Í*0åè$ÌÒ‹«“EM \ gO L~Â)/XÁ¥V+’ÂG}Úr¬Þ:ØÀ¹÷w®/_M¨9Ø+FÐe2ƒe3Ëîzð9 CcŸ”Ê|eY"%Ä¶çø­l·ÌïiüHN\¦q)ULs….!¢°H–ĹÃx·ë:åA§”¤ÊŸ÷mÈ*ŠfÈ'@x…k‹+àËQ UÉ>…RÉÉNn8É'''—ÊÓ²ª&hà  Önf(õ;Gʜ༠odÖ U míäñêÕ1œägŠ@·"Æ;w¶EÕª²(Θ=!ŒÉ‘ôV%mòä‰XTÿ˜®jPl–Nâ…CfJF°{'eØcø|¯;›ßøMÔódpÈoÔÐ ÄdøºWlb†(S0:QY &xŽ+R3¯ëãú0xõ.Ôä‹+–¶”‰—z6€"Õe½äA±E|ïóŽËz-TŨèMŸ¹¸ö¯9_ŠBK'p|t±žˆa "üq?IÕÕ¾Þniq·§ú¿˜D²m€×ù\wŽ¢˜Ç¸è¼TENšI¢$K_»ã3Ã].ÑÍŽûUÚFpÉPŸä<Œ³9?-p<¬ 9ëUú.èSm˺õ^®|’¥,ÃÒ/ƒ³Á\³¯7È?j= Þ²êJõ¨Èi°r‰ r:gbrí2ª'~0`d`O<ú$jåU“«²Wîý°D ö@ÉšErT¤¢ö¬‰Ë‹|RØY!Ù#}·Ú ŸØûÉÔ5ôˆ©\-Î bÎóèûvA1æûˆŠU9›ÙvIæ”pϹ±g#ýÞä¦Ú+P6Ê$õKÜÀýõ’[ù>!1€ð;?;ÿÔÝó9ƒ×¡n.D-®’Uò®ï‚ÞP(, •\ƒÜ¸áB!•K×á‡jã^vlëU×ÒÂO %邉…–¾Q--Ô»kTëIÔ4ކ£"ª7}3¨%"£™Ù¥2*yGÍ@c ¶Þ }D—`õÍS Õ7/¦Fúvð‡ÝÎI„,/TBs7êüY瘲ôÒï‚|g-Ij  5ÒÙITŸ?uS)ÂÆMî…ãL.;»R~(ºGƒ¼n†Ñw)[êÖ¨Y÷a§`¾žèåÃá*n“+/O‡|à ÔñýÀøÐÂUO“Zkf/Æpéࣚ-üK“™e@Ô;O~UŽrŠl˜Á—3S“'®A:ÐPyZ×›ëG\h‘¤ÙT#]£Ìã÷jú½5†âj‹´‹Â*Tm—Ïß^ýþ}‹û÷endstream endobj 81 0 obj 3407 endobj 85 0 obj <> stream xœ•[KsäFr†>ð8|ÁM ƒ„QU@UÁ·]¯Cš Ox×šð…š°0 „¦Íi IQÿÖá?°òãà›¿ÌÊ* {†Z;6´3Ê •¯/Ÿú”•…ÊJúŸü¹Ù]þí?»ì~º,³oðÏýå§KÅdòÇf—ýö2š(ïî.Ë*óuQšFeΛBë&{·»ÌÿþêÝxÖË£¶¨êÆ9<þ®»¼Í»÷ÛÇv¼º1ÆàU•ÿrõþÝï×GWuaM©Âóù›ÓÃtÑØ¦ÑòããÇ>ýëcÿñGzÌ”¾p‘ÿ;¼™Î½1•)|m²›ÊΩ†ŸzGOÕ…1¯Â‹¦P~{¾Ì÷Ùã~VMQ«&ÞhO¤êäOC×gÚÍÇçöÐ]lö»GzÆû¢Z^kçáðæ¾©*T-?\gÜ SÖfxq·³ãØõụ+JW§kÕ|«inÇnï³aÌæ‡>wôðv´{JÓóªð¦¢ns:÷8âÓÙ¼ÏÆýœmÚñþJAwºôyÏÇtý]{ÜÎÙÔÏ3NŸŠìÍȪÑJVûp :Õð5pÛqêéËÚA<&ŠýÓ±7î ï£"oÁçq_7ªhœ¶6Ÿ²±çT¯Å@ò>ˆ·Ö0!utïv3OíÌ?ßUÖ»Èëm¾Û_Ý@'¾R&'éñÅm¡ëF.® cƒüÆìŽQ®hÊzQÏ1ÈÜâàåÒý”õW–ö6ÿéq;l†yËrü>X›l?l{"‚Cæ®ÈÞA¤í¸ú"_¶Um¸Ér#D M>? ›‡ìŽïPs> ´Ÿ‚~ È®Nú5øô µ§ìp®ëMÞïZ2=W•eäê Š¬}dKժЮ²¯jà6oÙ¦wSÖ ¹ øëÝþ@:tùó¢ÚF«&Ÿ®³vÊvòí¦.”ÖMpâ˜Ñm·MƒO¿¨Ú"I7ºtAK,Ȫ0‘Snzb?(Ö«Ê'^ÝÀ yÛäu0œ0†NIBg]7ÌÃ~l·dà_Ý-ýkPè´k·ÛìÃqÎv|’µ/Ékå 7Œ^“ïáÓ»ÊÖ­”èÅ(w×ÙC‹ÁñîÏW¾(U­ªœÄüDtrè“t2V8Ø Ûuí>iS%¸Oh†Í @¾°&bâƒqùµ||ÄÛœŒ›Ü¡©¬É_²‡–¯ÔEï>´ý>HrO|s«ŽÁ‚}Âdø7Ê6ðúEË©)ß´]?1" ÀhޏÆ?^¾û›Ûü¯Š¿¦È(àLþöí·ç±féYø–a•ÒKoà€ía32MÀ“çxÁýácÔݽˆ§øµ‡…¥ß5NEqÿô0¸¼û0ìÀ-Œç‰ÅŽxäJ?rT(´*Uôµ ¶EîÿOü8ü§2Ép7ó V•­£Ê—PhÊ¢Zÿ?ýòËYÀƒØ|?´Ý 8'32Ð``=(D;È®ª£FJ\¥‰¦¸Îs¬~%Xnf6äzˆ«ªÁ¼ŽqŸN¹ø·âß/ºþé욢« }ÔK+²ß̰¦ÿ‘"jNW!Xµø‚8w åΑk æâšÃD⑎]"¸­«] “•.tX„/ÜãHZØß)Ó"!H²ú³º¤x½E,œf¨¯—/”H²òžN¿åÃÿáÝå!QĘg¤k¿‡½”0à&«½EæÕd»5ÅÐö6Pkï\a€U#”6Qšš(@NÃòGdR*R,ƒ$HÎQd@iŠ\ $,DQ0¬@¡Ì,<ƒl‡)°¢:œcådÝÙSÚqJ©‰/y«áûèÂ7§ç”é[€I8U.R ó^%.< n(:¹¦ )¶”xgᢶÄñšSPÊúDbË[Qò5î®"e¥¯íåw éRhо±[QP1ð JС…uèšø5­Dc )žõ\•PXf–äËG¾º–=PÈŸêñ[1v#XW}¢ùª Ú€æu¸OU‘d˜"V†Hi˜¢éO¢Ôe4(.<wfKlLäòÔB±á[¶ w^QL¸3(b°ò”;1§oÁÚíé· —øu±p¨å†ux ³bã¢Uü­>õƒH Uz«TAκ9¥ ?M_g½¯(lLñAbз_)Ãɰ ÓœœŒ@ìÎ(–Ð`­åº!¹œP¼¼•¾ž(5ùÞÉ[ùŒH^ ÅÖ§_Og‚Ï-v˜îlÈæE_ Ö+Úqðf~FEk‰üY& [¦c½­õŽØçÓ×9@›‡EUg+çP¨9¥À6Ôé[š¬9­H'GÀÁQWkYQŒ`’"b äBHN, KÒ°Ìñ …åtò–~åŒ{ùS]X~v­¯…uj«¤w#ˆ´P”œl’%DŠŽ:Å[ŒHÇä[öŒbƒ–)8Ê}|ð/øt™(láµH’(.J”ê­ ¶Q×Ñãp{öeYÑ ”àz}ß0§ÏàýR(.ñÎȆ_$î! ¬„âÃ3U¬e‰Èüüé3ÆÔZÎ1uà}ù–QéÎç}º³<£k¹sú–Örg#aŒ‹TO£Lˆ<@9¥JíÖ”&ZYc$~'\ol° ×¢Ó ÿ„²Â?'Ø–ðçT§ø‡o5Í9E­ÏùîÕ>Üö´e¤Ââ%opÜÇjKÕVª;ËÄLýYŠ÷þZ’Lª1b®×e)%ŽIžS|öÿ!ÉË/NÛ^_Æú=ÿÓ½ØÄbøü½cak:Õ›ù/ÿùÚ«ð1:;ÔùÉ~Ç?)ïs±²éw’t:dÿRš w©¦§4õù¡³7Y;ލ7ýòBÊNà‘¢„^î Cë • ʢЃ/hT±–¾„¥QƒÚ¢"Núaœë;êÿÔé>8’ ÝF/õ3\eìâM5!@‡¬_ê‘À¤¬_Ç&Áv@Þ}KÏþ* €Ð9ßá«`¦€ï=­ŸõëeʦE‘Ã-.þ~Œ7·tÄ®3jDìï²6›Ž]×sb˜¸HEHLZ [K»ÛK{«^z±¡Hw5Ê**[C!h nÕ$“A$Š5Ùs;e¡Œ†÷ª¼}¶/ÙãqZ;0LíÕèü%ûC{Üfÿ2ü4ôWšüU¹ÂùᇠÝóFźñ‡z šýúk'ÝÔê‘®I%z% ŠF¸ ŧC>o€Äsߣȼ›ûC¶Ý‹Ò5RŒr)õn󒕯»PR{"¸F1—:´ò&*íHÎжµË¯rÇinïGn(±@TÄPh+›Wãvm©åÉw¡©ˆ°mËÊœ*•{FÛý#7¿`¤y{¢^->Úeí=i‹»?í3ú–»·Š"AS³ÛNLºÕTðDQ«’Ç ŠU‹á”EÀxÞ˜í¨¿EÞ¹øE8ÑË ä½Ü#¯_ºí†Þ‡žÛq¯…TI6=ÂË ]!팚º !RBƒÌŒ”@¼ @˜Ú•cà¶v¡ö_%°P/ÍŸ]û’q#ž;Z§'qB•Ìo·ïúÃÈÐ’=à…m8;™o«\rm6 jº—JÿbH³Y@’Ò0¥ÓâÇÐ Ô)2læl>P×vÞ ¾!#° ßrÁMn,.‰ÄÇ» Bâaø™ÁµÈþ{½^7ùD½Rãƒt{ÉÍ}j70Ó¿- L×$<º†¡=r[Õùqå¾9ï³ >À“âMlŒÓí¤ž´•t€"Ô$ÝõÃv»ÿzú5%6u¥"]Û«‰J¢S¿{|h§ág²ÛУJjP%ð·¶¿¦†a¢ð€fûy;jÕ T<±bp«Ï^r·GTÉnú,½§š2²ËG)O£¦ôHôBœ‘ß®P¾”¹ùÿTdßço_€‹Jv–,—•„°‹[D|î2P‚_0¥ Ò+¾¿âh%«¨ûS½&0jƒRìJ®h@Ð1ŒÓ£tóQqºÒžûÊïŧPŸäâ/g E=bO|åywž5);»–qM \©.ªrÕ DÅÊœþfœúí.û¦=ð÷©ZpçñN›%±ƒ‰>Jô¨–†äçVq¼.ƒÞ;¶­*Ÿ?þGà9‹¤)”Ñ''Qœµ©A‰Ú—ïø=\¬å¨m¤“/Ò|0ïç^BÝz7!‚Mw/‰/T­î3¬z/ÿ:cÂW˜c àQeºÄßR›¼›$S!.É-Ð gOòPµñ@ÎJÉðbžHÍÀvÏSŠ¿6ó§`”*«J}P[Ÿ>0"O¤É¿“Ÿ4ùèB¢PSs&¹åî=A LñõUNî=¯rè‹îc%Ú(V&}, o›/iPÆKHúö‡óAeÛÔß î†áóÐo–hÌJšp¬¦j­¯ò˜(ÑæCdsÌîÚ9ÍU¹š}…}iÅd!íec"¦Qd±< a”ë1õŸÓH¸Í“§Í÷aªÙ±¨E³wˆN…_ìø–ÓIJÂ)íhäü°?n»Œ§2¸p/ÀK…Åà’¥šõóEÛ‡¸ÂQú׳ÐÛ% %À<¤³`…õçKÃwà˜­—˜$[ÔñZ yCÛíqÞïbVψ×1Ü…XÔ Ž¥|á§¹»´…’Ò«Ì•œƒ‚rT’¶”¨Ð Û•´¹@W5­Àë’iéïÀ’¶\ ³-rÙ}ø0ÌHþ¦¡l×68ULGå-q€SkBå3_ôL¦UŒGÙq01³dE2'Ä›d»l1¡dKfóé8l>’`ÆNî*g¤5‚FÉ1Ïà ·„õsÌÒ‰OŠªÇàŸÔ!hì‚jýXTÆÜ#ñ•Š£/še™sŒãUÊ”âÂÄ–3ªÊzÊ´œÑ(.vÍœAî¾´X4íKv)ÕÀP±k¥†ý´Ì¼Ë‚Ì]–h©Ö WS‡¯ìöã~  )$ÕTÔ2já‘a.J3ž”•Þæß š’"µ`÷Ïçcvji¦´ðηʖÖÛu¼¯’ÀNûqHT›*…¹_^íãÝæÀæ·ß^l‡Ð³â…A#/Ú,b `œðW× ÞÊÆžL¢•+IÔyÿ«¬ð÷ÇN1<Å ½tWrÙ¶¢Ñ…YÕ Uh…Qœ–é7ŠI“àêEäP¦î[þÕv›µ’dšD¦“DqP³ôç 5ÊF$Ø}è%q‰ RÛÅÑÓ6ž[-+= ¼‡ünÞÂ2OL ŒrÕ’@!»øtì³isiëMÌ ±Pk¿Z…5OGȉVŸ ÀXOg)ý¨×ýkiÍŒ¯J#ÎP×:¢Ø—–¢n‘1Ðy—&UÄa™ÿoCÂ¥®H2!Ð!íá+ié E°«–Õ #m¼dX”=W¨Å)xq~ÐP+6ªŒ£˜$,4&ùBc'.€ÉzÕsHJy¸\øE SXÞS<‰ˆå/Ž…V³WK+–ýæéo¤HGÒ룬Ej~Ú™I2£B“'Vãðõ¥2ùrqIåø^v ¹‹é\ÃcìVS£í« %¤¡úf.׆IÍìazà}¸`BšKUŠuche»­¢6ÍÒûW¡¨#J¾I–`úøÍëÈšÖ4µù•>ƒl=I%•Q­ -HJgi'”;ZW–œ¯í~ÇÒç–׊ãj6c]H]®A0¡¥Å,ò>D_\ĮܨŸ®ú<–â˜H¡Úm½_(éµ¢ª6v#håy?Ìq{Ùt¼ÍãËPû™z„‹$àeßnSOMÇ=Ûu®2ÆUʱßJÐ"½n¾Æ%Ôtu² ïh'zpšš–"Ò×…õ©ÃPA´ªŸá3¿ÝÏ²Š‚ƒ?1Qâ?ÜÍ5´U»Œt|Š1×!k†‘ ÖS«œ%ñ‰¥1¨(ž^§¶,íM5kˆøì¿(à&˜tE«© kÇàH’©ED´w"‚ïÚMZÁ¡[á,b¡{}ÚvKùÉ!›öwósV-E‹Žþ€õÔpYC–v#À7 73é‡O2c±–ç_¥\1&£Ò®T™¯<$ > %M“ügI° 9þ„âkŽ‚oð®ã/ÿF>^Iendstream endobj 86 0 obj 5220 endobj 90 0 obj <> stream xœZ]oÜJr…±»/zÏ{¿…$†ÝM²É}»{óa¹Ùd¯Œ,5ÃÑÐæ‡<äXWûÃóœSUÝMj,aÈž!»««N:U­/*KµÊèÿ¹®þá/N=ÎW™úü}¼úr¥ùåìõ§;›‹·­Koß'¼¾µÖ¦™1ÉÝõÇ»ÝI§e™¿Úþr!§Y•éª«Üùù¯ÍøéÒŽ,µöÿ÷úÇöøSŽùþõ«.¾ûô×c3^¼ykµKunÕm^¦ÎéšÕifÕÝóUòaTO'zÃd© °ÿó´†ÏMpÛ×nßj8÷K÷Ô·êéú¶€ó\'Íi™ÕtP˱UíÐt½š_®o5ÞwÎ%óÒ7jŽj×ŒêØœöý ûÝäEZU²>٣ɠûDí¦‹—)6×uÒ.­zî–#­Î¯ÝšaR·Úˆa}sº¾5É#©±¤¬hÒ:ç¶j~¢óè:ÍÊíõ­ƒý¶¶É®kúîo²:‚dô ï¼» Ýô©åMpü}²ƒ–c³¨Ã„u“ÝyAW4õj”­ý1§± N“ÜL×E‚/Frè?0:³u’ª;<7w˹Y:¿ò­v§õŽ@º\–ÞMç~¯®oºr\Ð 8½„]Y³§kÚ´¬òä+þU»2s‰øX·ë÷ -G«™²J^`︃'ØHÐ öþ-dÍJ璘£j“Ým?= xUqHr—Vƾaͳ¬Çt¤óÐ|ûÓ¼¨óØ}9·² ÎÊ´0ÆÀ%}xk ¬[ØÕSuáx%¸ÿ—÷ª÷ªo—x–󌞺Ýguìæ€²NKSFðÚÓŠðӅ0WCsËv€á*$΋_¬$a!/’¾~Mx}ßÎgHæ*5ÝÊW¶ææ=¥<‰.A\U™à˜ï$kƒ¨ e#çMiB1š7‚c?¦ å[Ж£nåºú.Úînt´|ä‹7²nPa%g*òmÀÎožQS½J¢öÔùÈÉé¥:~Éø¥úP•Ì.Š?›ÑUeYµžƒñ¬š'áX”^ç2û(íŽíL*B`ÐM~‡\Y£©±‡§­fîú*‰DxÒÙsêZù ß«é¼pˆé'e×èKš­Ò¢./rÝo‚–öÝŒ4™ù[0g±± p›‡±o\Ͱ†‰¶HÍJ Š”›4V±ïí9Ò‡f·Ü(~Ð+êXÛë ¤ŒWè«?Sf½ódgzuVãcµPèž _6¶ ak#)•—ä9ÑpJªªržLóÜ=€)¹ŒyýlDì=ws{­³$õÂÅR±XY`p¨„R\è«nQÀÀÈ-—ª D´+WV½EÎ+õÊUaæ¨> Lg ö‹JÕ§³‰‘& Ãq›ê¨ ©R•!ìÀç(¤J_6Ëܬ¹êDhµ0V€·žšsª›10j=oÝú[U˜AÈCfFm0'©°–«¦+Š:Ùß¼ â¢"9ü= cå*. 4¯áwV'RlF‰ ¯–Q’?Š óÝ,'D©¶Ed앨٠}+3r‘x©úóÁçA^æÕúµ D‘´àÀÃò•kZÏ?Û¶å†ôf5TÈŒ&v+ÃæPšÞ,t¨ùØô½HigN•vU ¥Wƒ_y¹:­Öâš°ûn¨úq„|fט {"¨Þ5kþéE“$®,º›q†G½ê`DŠ@mu™ÚŠÏw€ÆeàŒ%ÊŒ&j¹WYRßÛ,´ŒþÁ[h4~ôîH„„tD¤{]iC˅ƱX{£vQÿܵýþ² OÅœÇa¥_I~_TûÈ-_' ݺú»h¥7½TÙÏ䄇µV9+ 6Y)RŠùâÓÁ­™¼pä˜Å j±`Cý"=U¢å(‹ïK1ô¿Û)û×y½% ú$ 1 ž¢?öAÑd®àb6@w³°{æ eÐKÂÔÈ+D/pÉ“xz£cQ ¼llOó4¥b ö¥BØ(Å á 7*´ëL œ„‰Håùº‰wî·¾V/ÎmHÕ?z~!–-Þ*ÙÂæ-±š­å,%½Ž¬lZÖkå𥠬]ÆyC`”¢xòßVëëÛÝ'#¼Q¬^-ÂSº†jûE–Q~W«!³ÎPÝßšÏC’¡YXÊ…nÖ‰b°éˆbе0¥Íò”ãû6[Û¨‘3/V&àêÑkàbe&Æ«Äz¹F½ ñ´uZP®ï>¯ÕoVÿ5v¿qÅEISOh §yz:úáLiQ­Þ·¢bÙþÚ¦™»¤|Mƒ]‡ŠÍÄEœ“²HóUé¼ÙµÄÉ·§fðó&iÄÑï;iUv-‘3J&u·¦%$sa­ú„ª [ ÍâB÷òù€ŠC3tÃ)Îã¨óx|&!±Ýº°i±%ªvüÄ$ËóL9mj×rhA9 "N Í«^â<·Îóƒ Ài&.zz;boƒ%É<+ña‰ŠiFI¡ÇC³:¶QæU(‰6Âðàƒ\l&zT‹ßS'‡¥ý$¶ÌV:4Nšsi6©øk+„W¥`•¤ í%4Û¦‹‰e‡*ðZÅaò›Ôë5Î{›±û™H¶Þ´,R€£Œ:¤Ò.4+L’¨qp=J™Îõé¾ñ-ý ãpd©jˆ%¸ˆòè@x (šy¼âåˆ0·Õ†u¯Ý[ÚÂPY—ã·#7Â×G-¼Çó8´Ç2ìó;¢â ð‘wH9 ry×Ò‘¶W •©I€7ûýv®’ªn–µÆ1c±ÉÇWn7Š›5*T¹ƒ`3áv(9Ã4š"‡³Ðç1ŲL<.yÕ.H±iäy—è=ȃü‡2šÀŠ)ÄY^Sû8ɨ@ÐPQ±‰iB´,ªká8¶kâÒÄðk‡Íç#§ÚÐ=Q®ÏË4ÐÀl ·8”Mõ›ózÏÙÛû„A-9"ƒIè–…/Ÿ¦~Vèÿ÷íïÐfÃÏêèk'Õc~’š‘sƒÈC„vY¸M‘1öE±î.ÅïòPª_ü8Væ›6¿‘~œ.7•6t¸éX_Í×WQx¶v›»ä÷2UOãuÑoÝäÈòòzbÁW\yD·gtÎôI˜†8"Ü7è,’†qVÚr† wÎÐY±6Jž6H;!ÈŽ¢ŽDÛ HäóõrñØÝܼó ‡ëXM%¥æÆ«y@0ª·<”Ÿtceü’ü=4²A…N—ñà‡ a*˯݄DMºt…^ádôE<¡%'ß´»¬üѽūn ‚NÇ'|©X9Y¨žÎrwd®¤Ä©Ëõ‘Õ.ñt— êô‚¦ê@eåŠÐ ;nÀãtö's¡ÇL±9—ówÅG_¾ ´{Y¹á–RFO”GŒ{¤»¼¨6ÒýËzƒ?6Õ¦ÓòxçÂ,ˆñ<Ð<‰Ž¹ë}#žå.ihq™.º¬F¤¡¥—7;ÑûZ@zAƒÞ²ŽSYGÎÓ†ˆ[õ6iÍUÐ|ð7É6£ßMˆTzÙ;ÅzÞŽ(F=ŸåÁÏ'ëÍ!Ñ*¶’UIo: éZþÈ>.ŒÐZ̲äïüõœ_ŽR­íÛÍP‹nrHÇÓø/ðÅ®•sÒ iR@wÂÐëÐëq¦w‚4X¤ŸÔ5ñÝ­–N*¾é. KoºbÞceR^›ÇÈØm.~T†º¿ì’”ÛÜCÞÀ[]?ÖE•DÑÒ Ýß|q¦ë$ðîr¤Œ ªóëòrÈ»ör÷I³o> stream xœ…WMoä6„¹øWð50ÍI‰"±§É ²€±ÙMïÉ 6²¤îÖŒZêi©íxþõžöºõø!ÉÞ‰ÃnCM‘ï£^Uñ3K¹`)ý„Ïêtû—ì0Þ¦ìün?ß ·€…êľÛa‘’ôd·¿õ/ frž*+Xa—Ò²Ýé6ù°Ù}ÄZ–jžå¶(°|WßÞ'õ¯Ý¹ì7[¥^É6¿îþ¶Þ:˹V©ðë“_n&¹ÕÖÊðåÇsÿé·Ïÿ>7Ÿ>Ò2•^X¾ü¯S¥áÕ­ÒŠ›\±m¦yQëVý0Ð2¡¸H­ño¦Ü(¶{ºMÊndÞMdžNGöÓ…–šŒç6•1ác³ÙjnMftRM¯“ÙÚ‚l+“_ÿótÙ˜ïdy¤ERžº¶oûƒ{S¦X+i¥D9sÅŽõ«éø\ñ_¤q¦5÷ {p;"½<ªYíK`¹:<|¢'Ï ò z6 ¬FV ®yŠmŒx¹±ZšsŸ¼cOǶ:²vt%¼ŽÍ…•‡ j‘ŠL'M?±_’»¹0…’\çñø÷´›FÒ4Fþˆ³ÝѳUR¢E,Õ}²õÔ&)§ëÅ×áø—Ïi%j‰Ò4S¨&JF§h®2-–…´au;Nm×ù­ tª¦ P&mïΛmÁSiŒ@&cùÐ5lè›ñk¾i|J˜LÇ”ª©}tev3÷£{f®šRp ÆÒ5§aPEž%[˜¦Zż“Ð zšÇ-%¦Í¥Ú£ÚU96#w­ܘ8T´&¤É~*/õ§œ€Ö+ë9ÑSÙ¢íåø‰ÆCì2Ë0Bb%ÐWÍyj‡¾ìºgcŽbQ~soJ‘ÄJa“PËó¹‚g© ãFÛLBÄ:“rY#&Q³Sé 473¶©a¾ÿ…á™Uæ«%Ý`0YH‚ò8„3@¶í«îZ7c,DǦKÙ{q_»'ŒÊ0†s—esŒa8@r3Q:÷™<–Û—UÛµS‹6±Ç¡­š— …¾„!Aœ"Ÿ3r Q¢È’úZ…ƒ×3;%/9¸VyϾ$£:›"ŒD ’e ë{0.r$@ÌZˆ•½4Þ'WA˜<ŸÍ‚4Ùb2iF5E=ëÍ ¬ûä÷ó"Z(YXbW…Eþ%H¹¼ÐGÔ„ÂèhÚ‡qlCÈÒûÏðgïÙxÂÌ9–†ùJÜ[™j.sû&¦¿"TÕõBÛ0|hpç¨ Ôcr‚¹µÈ”ÄbV&Xùgr,.Ö•þ˜4°« qð¼*ŠÜ$÷ÊË™tjöJìÓŒ´ázž¡¤õlKÊÐê5@üˆŸÜ`çhóé ²@‡àà í)/5\ÇÏáßöK``Ì<öíÚ‡KmGÎeœªç0U˜Ñ\-I§Ò%ì¯}å\ÆN– kf¯Ïàä)•*Ñœ»µé‡þ&†ÆÝáÖ¬f±>-Ãe:3S2ºãžŽ§Å¾Qqýx¢e> stream xœ+T0Ð3T0A(œË¥d®^Ìe ÎÈv†âendstream endobj 101 0 obj 34 endobj 104 0 obj <> stream xœÍ\Í\Ém?¹ÌŸÓ»¥X=¿ú®ÊM±“À6†WZä°Î¡·§%=Ó#O·VÐç–[È"Y_ÝóZ#F°XHMý^‘Å"Y¬/þyZf5-øÿ¹{¼ùåwaz¼Y¦…ÿßßüùFeÀÄì§z ?½}wCªI3/.NÁ,³uazûxóÃæW¶OûçÛWÆè9¥ÍßßþÇÛßÞ¼R˃6Ó+ ¸»›Í¯óæWß¿yó›ßýÛíÛ?bãÙA㯔 ³²azåÍì«f«á/Ÿ¡ñ·îÓãöþ0íˆÍtwÜ}:÷Çéôa?}|ÞîN÷»íÃôù6ÎËâLØ<=ÿiÚîvOîö·¯üƒ¶vs7ݲp:¨Yù}bn¹mr‹ U”ÑÙ9.JjóôÇ=•ž Sv§yúÍiº?"zgíÓô ¾€ýas ¬Âr‹ÂQN=ʃ)Ї œ;7 ÈûZyh"OnPì튣B‹¢ÈÑ£(Â4(ŽBŠ£U‹¢ˆÖ£(òµ(ŠŽ=ª§µ(ÙEТÈJzhœ¼Câ1ZœXt¡yÅžV(àÇÖ (²òŞСØcZyU‚\Ϻ…¹[ßGñäÅÞÞ£(*´(Š= VkºÓLë%ÊFô®Ùò†>räkP;GÑÕβêœ>V r”È$vŸ-;½ŒR9½ðË"óäÛèíˆZ” –l«-êB[&á¬s²§]æXQç´ŒÒg},r—½ã2ª¶•çÌu‰£Év­-þò Š¢Â,ÑÂuŽ˜æ½È±hBSô½¢{gü«(Ë–³Ž2g–sI.Í–³f…œ›ØœÉ„&-¶‘ârI‹q.‚ØUÒbþݤłø*-ÈoæQÓbëcÄ‘/- d¦áÁ¿kZ\"¥´0ôãg¦Å?,(&èÙ&Þlýöí­½°Œíâ"1‡ç ¦´r‹âw(ž›*Jæ¯%ó\ƒâ¹°CñœYQ2¯¶(±‰űªCQ†Ü¢(CîPœ!7(Î{eÈ-Š2äÅ£WQœ!w(Î[eÈ=Šs¦«Wu¨<+tùÆÒ8ä_ÞI¼/Ïeàè“GZƒ z1p ûŒ/À\;f|!Éø„’rÖÙ¡¢RC&!JŽ™htC¶mc8˶mŒC†lÓr–!-ñü(™(SºL´¢$mQ’‰6(ÎD;g¢ Š3Ñ%™hEI&Ú¡ØÊ{B‡b©(ñª%Þ× ØC;{rE‰··(‰ Š#G‡âÓ 8 u¨žÖ pdSŸË‰´(w–¥Y\ou™h¶¸!Í–ÙeÙz‡ìQ¬¼E‘'ô(ð˜ØqD¯ Gô¾Ðqô 77pdOnQäí=ªÌ5¶«Ù½4?j•ÈV™‚( &m¢øöoA]AÒ |¶‰e8š€®pT¢8±Ž;öî:Šmb].Ë9ù”%+¼‚r4BWPœ¹_Eůà˜hݱ® Ç»WPŠVMë£9ÈJeg³ÂQP®XÎꫳ" Ù¯±ªÍŠÊžú<ÁeÛP;H–Ð:IR:ïV¼TÕÕIÖQâ$ë(q’KQFÔ’†ê$—Û”8É*ª8É:JœdU®â$ë(q’u”8É:Jœä*~Gq’UM'YG‰“¬Žvq’Ër Jœd½-W,ç e´^f•ûÈ›x…ÉÖ ž=L›@ ô™Åû,ÿÞA»8TJáÃ-4|=|Š ÿ,-xkÐN þ½»)RB¤äÆ~ü¬e‘†@¤ƒÉÀ—ÓXAw–Ûe‘q:p } Eô…‰M¬ê2!ຠ¨ËhÜAÓ1*ü¬+çåD£ª‹…€È( ½øYÚ2°81Ú Úúõ-DÑ­½¢-Ü ‰§lcN¦ƒñdÏWP¼¡Ö Ê@ƒâHhp£Ä¥ó¶”¢H˜V9f”Ͷ·Â‘P ¯´e0åº&—Ì/ êÇ¢ÕUGÂ+#mØ®£0u¾ÎQ"áº& Æ©pehv\m‰„/JO(wf9—PfÇ‹C¤-©yKªP",G4î÷‚”… °PÄåÿ×ôf¹ &üyáIíï)@_O éû sÎ_ðoø€%(‘˜¿z€¾?rmûD…F.:ªú©ûJޝ Åû¼•l~YM¦ÐL sOÞ¬ ‰â@™[™B¨DÛ¶…³\Þ&jP ¯`¨å(§ìP¤hP°ôÌ[heez¹ÌbÌ(—Y8=oPÁŽr™%Ù^.£”å2 rÕN.“oê r©à¹0=åÒ°v©EiˆÿÁ (ç¹4ÝÙèQ) r\âråû”&Àéi˱EáVE'—IñL.«â —壉åm÷UØ•4ápÛ½“ËéåL.Ü|éå šQ.\ÒûN¸ìƒ&¼Vƒ\¸q4Ê…Û£½\¸=:Ê…Û£¦ÓDД³v(˜÷z¹Þ‹äBïë劋=“+j;ÈyÇ™\Ö ªoK()ɶG¡yÅ›‚•bʦ`¥9™K ¬‘+M¶G ¥Ù­4YVJÝ­4Ú`jQ©‘^ ðô8½ÄAúÇ:é1ŽùAú˜øžU¡$µÈ–ÓH{¤ÑÀ•M‡‚QËÛ£"ø´(±€ÅVÒ¡Øš[\‹ÂíÑ^.´ÞQ.±òŞСØc*J¼ªE9¯¹扃\âÉ Š½½EIT¨(‰ "L/—Åm¾A.‰V%­CqäkP;”Šƒ\iG¹0"÷riÎä’èÞ xhQ¸)ÔË¥‚?“K9?È…3Ó(—Ì`%³\‹ÂÙ°—káí¥eì ×¢ì(W™¥ ªÌäŠgüÅYA‡â5rEŤG¹J&Ò 8[éP=­A±·w(Ž -Ê•âJ3²§S(ª\F(´²e^)u˼ÒÊE¡Ô-óJ£(Ú 8Òv(ŽÈ-Ê•ü½Ò _©U®‹ÔŒfŠÇ³"“¢‹ ‘IÑ `›øµ×¶(>ºïP|z¥Ê ò+>žuÿGŸ· ZÔ%Žd÷×QË [¹È2/µÕ¢Ï¿k(ŸèÊÂ5T¤#ÒU¹q¦»ª{Ÿ8ƒ¹ÒO¯Ž¶OêÌr.q\^´œv;Z‹Ò%JO{…^%YG¡9Þ¹®¼,ã¬Ròk¡XБO= œ[òB¡8%ÇÀ•¦ùa¥,QÍ ÍDÙ)X9êA.˜Nyï§Pt‰L•¶ð~m¡èØZ4Ó\”õ£PL,ùW¡Aü²ôùd^áꬓ>° Ò+£†ÑVJ59ywe°A5—õ*M.ëUJ½¬g0ê¦ÔYSíšq¤uÚâƒè« š¶8ʵ(¾æÙ¡h%u©­†£¢ cØ#^ä¨(¿kQ8*¾Ày¥-Z‹\BµrÑê÷ÇEY͵¶øË+¨”£ÂuT¼ÎQ«r©sEšr“k(Êܯ¡ì‹–ÓÊåÏ,çR[áEË©¨èRzÒ|ͳR(‡õKÎ!òWK~³¡ér-ýÆ]93K8袵ò›Xìn %æ'ƒ7«§…v鈃üÞ݈ !2JC/~Þ>¬] Æç÷°Ô ÷ßÕ÷¥ñ $°JÈ'­xùè¦é€¢M¹ÚCˆ¤ò›X4*•[¾ÈJ xBÓpàߊ!2JC/~¶ŠTÀ>à6å®Ü Ç}Wpaæó2F(¼Í“@7f)([Ÿ·Å½C)ï º¶d«(¾Er¥-dž~1]ÌŽ¸¬p”¡ôú…> Jñ¤¿ÎQ¶ZÔG¹¹¶ÞVÙÀYGyNË®¡–¯àhyÓeUŠßP¼€âRšSƒÕq„Éì+,gI,çÌ —¸b9…æô¨/H;Aö„¯1ä4ÊL5Lù Þ ŸÌ¾E¨üT¶´P~üB(`‰¾”Ý\*<ø7žs²‚(Rr C?v´©Ññ}l(f¡3[þÍ/~j¿*¯ƒ*…R=c \%EÑ(·ÂÒòoâÝÓP¯V)W¿‰¥Õò›øîÚÑ©²”~r†~¹2¦®nb!z‘ öQ´ÓØGE‰­]FÑ ·j·ë(ñu”øÓ:J|s%~n½¿„;¹€ò‰Þu•øs‘cAI,[•«ÄÅ–£ÄÅŠ’»*}‰×ë%ö·¨sŽ2¬·å¿ÆrÊüv™£ ÒŠå ´¼¥¸´3>µåò¢¹ik%rµ¨"WAIõB¯?Ƕb7ï¾Ä‘P¢û—8JÆq½-±‰u¹Ä¾ZÔÇb««m»_G‰]C-_ÁQ|{U%N¬£$æ¬ÚD‰_/É•Q%®¶UâêETOkQœ6+Ú *iõâ|Ÿwë¾SónÝæÝõ·$Å…Âi³4 Yµp¨y·È ‘Qòî¡?ë©»Nà vÌ»¿¿uç—±t´òZÚÊV´—×ÒVf4£¼–”t¸E%:TlQt¨Ø£`Æ4}[ѵ2ÐaÁâùÝ8£ ®e#¿.([¿”BÚR0ï§®-¼0· m© ø}vA%ÝÊÀ6˜/4(,Ò‡¶´³t•¬¢‚me Tò½î!fûQ÷9sr][Æ…VB…ÔëÞ|×8´eõ2èÞÒËÂåõ {K¥ :^÷íuï´9Ó½Ãk*©CyÛÊ@¨ò6^P¾¼¯(_ÞÆTyß |t¯ÃFÝóÁCƒÂ0 m:ØhQt¤Ô£èè©AE:žêPÑØA÷Ò†¶ð ®éÛJ®•!£’ ƒî“ gºh-*ÔK®…–øh¨P°X‡lX¾réQ~‘ƒ­J×b¡Eá±´\+´’Šuòú·Òpÿ GÅxÖG|‘B— ÅÔ­èB+æ ¥¸UZ’™V(IÕ-òB3iÐWréL_xy7´š°ËRÞÎTšæËÝ•bmÙ’+´²qW(1ŒúÚc±’o­ïõ(²ÌEÖÛ£øúuEáæ({L‹âãÂ1Ú÷mÉvƒbOnPìí=ªÔK(¨R/¡A-]¿KêPŽß)6(~ËØ¡´tÏѱCqmPi{¿oPZµ2P¼§èÞ xèQ|‘¡AñE†¥ü {ž™:”R'¢ œke ͆-J™3ÝãÌ»¶TЭ „rjÐ=Ïä= «±umaV‡¶8{hQ”aô(Ý/Ku/YMEIæÓ£øÚUƒâ«Yj1\™BP‘/Y¶(ÎÜZ”U£îGZ‹ò%’Wšuü¤Ptó@Bh‹’+ œOrDkQùZEÇ¥¸ZM¡`4нô,?Ó)ºÀÜ£(º·(š:Ï Šg“eùj}¥èr%­Ò>ª-¼Vå‡>òlØ¢hÆìQ*Êe ÉÒS¬—5„ä1OÍå\5YÙ«ݳvè\D_ÇÔ ±¼d˜o_…\>3à_=VòTéeêUP1ŒŸ…9Y¯V_Ñîª8¹Ø q³zaÖT0P±¶¯ð¯åŸAÕv/Ü‚¨Y!¾ ¸ÜØ_xAœ¯øì¯åV{|Uœÿ=·ÕÏÐBÀµ”Á2©—-äÿ\ùW?ûÛ©ãoÏíÿ™8«Ü¨kS)ï)i,&‰—ÙÛWò|ûa?íî?bqä»ýáé´ŸrÍJ®þ¸§ýát¤š±‰KUÎÓÝýßís!ȉ"¦?>ý˜‹ºRÉË\b}­†L‰!×QRµv·?ïïç ä8î¹,>¤,µ:7ûäRÉxZÛmýù|Ü?O¯;Y§?ànR®ô Ówiè‡Íë[¼*’´Þüá– mz”š»Ú„ª—§Ö”}ÆÑ*¸¸yzÿ¼}ÄzªÏ¹œ§‚toƒ‡©« Oñ—"5—*µµúòîÍÝN{,?U¡rAìEXGª Œ5„©Jça÷ðéKn~:äâÊG¬³)U¤Åg‰n\4×`ÉçZ4÷ÉJÖš© Ý…Þ>ÎCý VÈýø°ý2‰ö+%LÛ žûûŸJMQ\õªE ìŽ[Ú°Â,ü8ˆýØÄÕb©êééyK••ÇĪ×&(BâBÙÓnû@u§-^&±öBKì¡h.ÞÂ’Õä˪Y K­ªÙ=`AÒ¡’.f}µÛÍö8}Î O³ŠÕ,¨’-V)ŽÙ†zË|óéÇÇ{*DÍö©\û|óšmFÏ¥ê1e®Œ»dK‰©TÝúõtüÈbxç½9°b[ê>ßo¦?ÝÃP<½›²,õ¥ëóöp|Ç.“k%g—ù†«çúÀÓ%?Ñ€½RÁ`móu]©Ÿk}Sý'l9 ˆiz­Žýô|bíÃj,Ví¿aR-桾0ɧ߽;aðlÛ‡ã[B)U ˜¾}Ë%†í\,ç5׎Çae?*#é ãÃ.¨á_{©>"þó¢jø€Å1uàõt òÐ!i‡å¡ïgªBÇZ¬Á é',LÝ€Á—ªÂØ^§ð‡Ë|ûJá-•è7t!&@åÖŸ¦­°ÓA«+Ãqx¢’â³[ÆrÏ(>…´Ö±z æ¹<6pÇ‚æTˆ8ºÍ/`‹ÃN÷‡-†°yzÇ _0&@Qx~̃ Y¾£`!ß›³ïÁŽû‡w2Í•zåxÞµ`=éïÈÆ,ã—ÛN¿¿ù\ ÖCendstream endobj 105 0 obj 6362 endobj 109 0 obj <> stream xœ•Z]sܶ§}Ð?HŸø?ÀôI'±3Qš:Ê“’ih.WK‡K®—\Ëî¯nÿAÏÅ@j%¹ÎØÛ" â~sîßE‰QB¿Üßõî쯯‹èvB7ñÇèòvg”¥*⦟¢_â«öž,Eæo»\ÁŸ¸GÅ¿¬ìÕ “‹4‹.¤â^¬.2‘ÈÌüBƒ èÜ„–Ø€÷×M‡K"6ßfy‘”0÷ — й”aõaŸç¦,ãör) •höçìÈDO™J€w2^üÜÞ„ÑéÁ™©²ÆW¨¯æ¨·»4©È‹<àNÃ+ ”OÞJòY*Ró´‘!lJ é+‚v J,Í·XŠmÚÛm°_‹,UŸUJ'f”ðœ I°vþ!pèB˜K¿÷6pw`~KÚ¼Õ¡Û7ÈÞÍp°¯[£(Ûž«Z¯íB‰B¹ðï¥(HkõiEsòf çòÉä]zˆÖR¤Ú<å 2@rªŸf œ©G=á@Pšr®”ÝP·û ¹ÔWŽh8÷ÿ±™šžiÏÙ®€ é :Îè,Ž˜Ñ¦˜MI´|ê½{Êä‰/S%c˜&B=à]hqËÖ X9—dávcÉ_Y 8MÎÖ²ÓF›WýÄt—áýY@¥¾™gÈêLϨ$uîÔNÿ‘ˬîÈqã9è¤îŽVOô»­ÿ/ö &iº)Ë+ÁýR{^­‡Ý~憡·QewçðÜ‚w8Ÿ¤ZHȰÙÂ_Vhï5»FôSžÏœm928 ¶y*%¾iÇ¿ûa²«ÖÕÈõ±ÛmÿµSÔîö]³ zõó îCƘøŽ…VbèÏqË7BJBç++%ÝÕ‹Ôíÿ/â §¦“,þé)¨I³ñë¯/¯¾…ÿ§VÿÀ—Ê"~ån‚tüá[§¿g•kiô{r±t{‰½Õ æÃê˳,A­*y?­´§ñöòzö/ô… Q×@Ü46ðŽ# XbA¸iw„ªúèP"2ËC¸eáÂ]ÍÀ2û5¥LDo$™ô;W°3ËÂS <à€5ƒ†J^Dù]0ÿÑj-ó®íªC4n«½¥, ô‰Õ 6(ˆhƒýTݪ³(•ˆ"E¶4Ó9¥½yþÆ*”$E& ñ{ŸÀJŸÔFãMHuùÌÆº •…É”/¨„”L˜-6,’b«Q¿­Y¤š×EXÆZjf´¥÷ {2’j[ÖöÏPtQˆ,Ê )C ­†áÍ8Pô!Tq©Ìˆ.9S ÃÓ¢˜si®¿ÊeA‰`Î¥s—@-{ÃåÎ3§ª,ç yçŠ~NJ)´ˆ(iÈ÷ðúæH*­fÅ›gÂ,^ü~FÏY®{vÌ-ÉË ÝYåµÝž±bÖÌíóðÖoÊsX=‰è§c½ÅƒÌXHPµyê˜”Ž€¦è®E èpiÒˆØöñFAÿ¸à•ɬïãºW½žÌ„»…L¡B¡L¡<­F[ ltgé"Kêi¤šªRÅÕš¹°rÊZ&5¥×kŽvdžÇCv›NåÉK ï@Ã@ê'ú´ƒ_ô9PLv†Fí3e6äCm»'R[6£T W¦3™í?ªÉ̃Aáªåuژʭ¤iŸÛ)c°Ð¯ OµÜÌ$~ÁmU2wP,Yî:=Úæ8ìšiKÿº³,Ó42ì\[Z¢y*‹Ç’ðݱu=yO6;Üå§9¼~$¤î&ìˆjÜXѧ¡6pç'ê½nŸ×š4•xö44‘mœN–¦~¦ÙE€îTåÞáÜÂøYJ5ŽÇÝž'r”…,˜½" ÌþP0ÍzÉ2ÕÖ†ûqäÇÌ~°t}Ž(“yìµf—ìg}X¦¶>’:­œïɱ§žY4’^R@LÉЩY¹åo}¬›Ñ×]‚æz±7.o—­oV¸@ƒ¦éÀƒ-IŽ˜‚8mkÃ;#\~J6Ÿ{L…ÛµZdŸ~œcð ã¬* ÉãäÌúˆÇ3åBÈ“%Ž7 \i HLwpcN¤/š­r,‹Ÿ7-ñSŸÄQˆœˆ^6T³¬0èŒ!øXÃâÒ®´žÐva¢o&‚ëÆšyQm\Zž™7ÊpkÿB“,kƒÔn¢ÝÐ]‹®#jI¹F¸³¬)«lfÁƒuX`6΃©*‹Oäû]MR+Éî©;8ͨ^8¢ô£Zž‘Ø$—JYЮ·C‹¶Q ‘Á°qŽ€Kƒ­e¦æÁâíªŽ¢òõûªzZÈy ââ0ë‘áêšwm…†]ˆªxŽC4ššÜÌFÐŽ“è‘f¥³’Bj5p ¾TÅ^¢F]ËlAŒ¢çÇ]’¢?á~ÅŽŸ+A‹Í#¢Çu6ÏW¦9u(ΠÙÅyÛƒòa náÎæKQDˆ­À®Ši94 lYº¼O±¡¿íÃ!½l€Ãfºã<-tN}WëéB"B¹\&ïp‡&gïŽ4Ky:¼¤yÑݲGs½~™•óHýÕf9– ›?‹e›? / óÐá`¤ÃÔ5¦81}qîCzÎHÏN_¾8+äU‘ÃNHR¥Œ_áö¤áðöÀØ|&ÿÇ–ôöðªÐøê Yrü9D±¼&¶á sl‡ª…öÚº\>)O¾PèxcD“peÝþ"Ã*çûVãÝEX·úâÀ2ŸÔf`ñq}ÖºNÒ"%ª/¦ê†§RÀy.Ø»þ*A¦êk1 rriMš¦^›`{ítä êp¯^>{SÜgS? A5îä%©±|^eÙO+§ ÂD‹ýƒGNcxoTFg·Ç[’CöRë<ºåcv>q ÃI^êª[Þ­n–§Ÿ×~„i– R»^Í‘ÀËO´˜eä¼Ï& ãÏê=rÁŽÌÜ Ÿ¥žÎA+P6v^õQøj~†ÅB,õ> stream xœ•\[Çu†`ø+:ðƒfÝv×½Jyh[Nlˆ±,nàJzgz¹mÎe5=Crÿuì¼ä1çVÕÕÃ¥#Y°H}S]—sNóÕ©ÓýcÓµªéðùs½{ñëïBóvzÑ5ÿÿûâÇŠ4òÇz×üæÈíý ~P5ѵIª Ñ´Z§æv÷bõÛ«Û¿BÛ(M}k] šßn^¼Ym~Ø>öû«c <ªV¿úáöu×ÖµÞtŠÛ¯~·ì,´ê”—‡Ãýx8 ïþŠLëéŒüô·¿ñƒ¥[0µ~¿±¾ A%jöû6KmŒ]ùQÝ*¯šÛ/Vëó4îß6‡=¶±ª VÍM46y³‚_‡f×Û¦{¥@ÊúÕ°?5Ç«Øv3auØÐjûtåü Àu3NÍîpß÷§áêê‚Ñ«Msw…·1®žš¯ãºy¹Ýîúý—S3”´ ­Š:‹òããÕoA¶Î®†ã8ì×ÜìÆèØF\ªÒØRµ*XZчñôмöœq‹ËòºÕ*¯ Y׿͸…Œ¿)*S<= Ívܧþ4öÍá¾tלôë«Û+›V/›S?½kú‰täéGÝF“òô¡_Û¦Ôi³ê'2OÔRËSïàšùýáØŒ§©™Îëõ0MÍš¼k•JÒáê·‡éÔo‡ii1ƶÊ$Ñíê¿ÿ÷Â,Rkò|®›Ç«Ô&µ_µÍÇ÷ã8þðÕl‰¬ÈÇÖ9èîFÅ–f¸z=`—¬¼ Å„tP,Çõa¿¹nþÀ2Ij@’»§«[ ¤Õ4lïA~4XЏ“ÌÜS¶4.Y•êœ^Î'4Îûó~š€ž;ÝZVßa¸WZl7û/Oð÷%Vr„94çi`}ܨη×¢h%`Á¼’•Œòw¬0Ðå±Ù Ûñ=m°E²ð¡KÀBk}—¬`OÍ]¿~÷ØÇÔ6·`ôzÒ8 딞‡ %®šzÄÚ´ÐOVZ<©{¹ñÎC¢õ¡P6‡Ý¸ïaÏç·'l ú…¤²8€u,Hyê4î†+Õµ¶´%÷͇‡qý" -í\ñöðv\_Ã$4å:ðOeÃ$ëÙWôÛY4F·¦¸°7(›0¬d`_&EðcGtW´‘A=6{ÚM³Y;¡ón¤]aÛ.ºbëÓö †?fذÉÁŠ´ÉC’¥µ—Þ[w \‡U'Þwºu6Ñÿ°oö»‡kv>¯_¢smliJi˜|^ø†{ß/Q #Fžð+p+ýÛ¡¹=öûé^d¤@±ìjçØN_Ç÷ãz¸˜£ `´Í‚û~õêöõ÷Wbù÷ýzÜŽ'ÚX´¸Ýãvø‚w¢vªöØ«ú×¶T*˜•¿‚ÁÂ’^0XÀÒÅQÁn•0ª[ï²®Á7^LW[Øxs¿Ù]í à€ÇÀ—ÞmÇéa˜ØÑï8eÑ pj{ðeŒ;íŠÐDF<=²àNÍ‚=ÝâNS]‰]CóÅ XRJV­¾ÍÞb—jM¨c—³<·é|>´Ù‘ž(Ö‚nV0?y4⃙hàs²&º]åÀ†K(êZ[éjØöOà1źU«‹ÈQÒb°à¦‘6TÀͬ<Èb»i›¿<À¾8Ší4ë‡~ÿVz9‡å¦p°MòÆÛ áŽä!ø 7±XùB‡{#Ú¼,ݱՃSň‰@œ½ ‡Uí#ì~ö6¶U‹ÕÜQ“¨|ÌSu 4ÔgçŠOC@g[è´±mÛæëýšeê ™ìûyê0D~§Y#ÄÐ^ú3HHÆšéFy²6pŒ:VÖF ºiòf^Á2ó@l±M~ÄFÉ"Tö·?UD7ªBMçG¶kçÁëØbØGÞ£ (®í*…>Ãq=rÀµöb’•éóš$ñúåëo@´8JH­ &GöDt\_t£ì¬aâÚ••xÚúÝœ…B=GÍ {`ð˜ì™8¦$ðÔÁÃë7^Ræ‡AÉdׄ†Ìê#x¶É%ìôkG‰rç C8°=¥…E$!7ï1Ðâ&ÃTÌ«°à¿?áwéôRYôîp,[rÈÛ»8ýë&ûŸäõ¥qÏ;k5<âδ6­.¶ ¶›HåÍŠ§æ‚“a@)ó¹¼b–½FþÏ4@ºâ ™7Áa£ŒŠ®çð¸#r5Rô‡“Æ}V¿¶È š…gáõk/Þ Ç•¸”9˜ƒQÙz@CNfõãy<7±Àƒòdö³uçÉ"AÏ-e®Í£@ãmez9°Cä­ÉÚ1Ç|bA5þ¼‘ýÌüMk´ˆsì!'h Òï8Ò#—|ÀƒUŽ«H-› CêS³>Ÿ˜D‚Cʧ%쎉lsø%Ÿ¾¾}ñg JÞ7à<ûGppöP¡~{(5»I@&›-# OôÿŒÎÂ}AàØ´5Œ€#pˆ€ÌTF,ö¦šûBm4.0’ÐÝ‚GeBFunm ±@G¹Ï=;˜}À±À\ ×%OEš*xÑÒe,ÛZÅ+U!#ŠÖîó*81칃‰sÕµ’çÌ«p@Ñõb¥ˆt®–Xõ”HÞ%ØÉ*#•¾¶/^cß^0˜G  â;ôù<¾Æ"!/:TeŽA4ÞÓd$PÐ#`±ŠdQ.„ü­–½÷mXê' õ#¢°?B ÚI­y`ĬUÓjž…$ˆX¦\±(;B#x¾\>åq^"ùNï–£ÏHä=Wìpž3õGˆÁÝGÖ›µ»™Ú±–édÏ!B–‰#¸…Þ»%Þ€< bóɰ—ª-ý=.° µ|Ê¢þeíi¸Ž¬Ÿö£{¼@’ø$Ì)ðœ;Ô *[ Ž<ü™jýz2õS.EÙ§YÎöG\è«j}ÕëÑ{Lâ‘fÄKÏ.[BAlö-ð”WÅÉXn FA”ÌÙÒþr(À^S»#ˆ4:[¼¯Yò–Ú„¼ã:JÅâeØį{Ù;háú¢MGöƒHuòlسĽHº$$JEÖREƒÈ#UmIªîëj9–eÎÙÛ2çÜFÉœËXàçiΩ+‘Ћ.t‰r‹(C‘=YJÅKíjDe+ÓIâwöëÎhÞñů; -fÿWâÿQ ƒýè ÿ—Š·ËÈb†8ëÏ%úK!'úC–C‚9Jôßû¾Oîî2 â.×ß²çë+’U!B²m+’Eˆ©8NW‹`+Že;à™*V‹h+ÙÌÅV `¶âX€ÀÁXW1œà+ùWˆp,Bœ­8ÖÜOæX„Ô 0ÙXQ,B¼¯(!ÖV‹­+²TQ¶tYh1ô"°ê)‘{¡X—ÚB“ž’`B± R(–í\'ŒY@€˜ŠalŰƒOØ€0¦+‚8$½<0»T° +‚jÆ*•l@]mD@À)ëŠ`Ù.v$çB°1l†™ôâyΙÙ¤©.#s:e)$=?…Çi½K¤òèl äuE°¬‚5k[,@@‹M0#âq±"="îÆr¬õ Ñ­óÁ¢Uh_,@ èùºçö½¹@ ¤,·ب½@¢<•GŸ!XÕSB° g-ÛTèT5zF„Uïk;œç, ~¿LÔWüªB„_ÑCd˜™_ÍjÏü Ã^#³)XD`U!Nú~U!¯ª§„M‘Ñù  ÜVl FïØX*D‹C~E3L±âW€À®èU »*ÏvU„\ØUQDáREY" -\ -ÎhF:éÙ3Ȉ͎¶­©Â7 G/ .Ô €@;«@"Ùv¡V3’©!ÝÒC?ÊWÔ K»¸Ð&@”øs¡V¤Î´l´ÉëŠÊ¢È§J,’ß+´ K†RE ÈUm|$Uõ´).ÇÚ”çœý{,s–6ÎÊœËXààiΙZå¨P u\(à  ó±bV¢²…{3¶vè œ"mõâМ)(UŽ/#³ãóâÔ²£Á~ÒÒñAnéø–3üYÌÊ*ÌÅë%³Ö·1ŸaV«$aΙïÕL²"ØŸÆÓ° B²*DH"xëð¤a2‚$k> “Tx¨!w1”¡ý ù'~‚И}'$+¢ñ"7îDÊ£§&±bò|Hê„bEØ&”5ê$ˆÇ„Ç:…‰*D>”ߥÚç) ³Jrú–lc©“„Q ¯B€ 7CrµÂ1ÛóÈì+¢°(´${øÜðª ^U=%,*YKø Ã&÷…D%,¡­8#&{!¡UI²í˜û`K„¼¦&B«f$¯*¡UEÀAXÕ¬ƒ jÖSAŠ.ƒÏú6ÙDIÇ.@„Sá3䀂nH¦[Ϻ BªÉÿ ÿ°QáT3â…S!R<­"q²/” uÂËûl÷*{p¡ThÓäæ6ƉÕx¡0¸HŠ'^˜PÒ‘=¤–qb"Ùï'à$‘;ÎmT¯Zúƒ-¼Œ¤ÔžøïLªÊ’}¿Å‚¥Ë<±º„‹Zt2«^EÓ½ïHWžR$„YkSÝGã+©ÏWªlÁ¹H¥VÇ<ðí¸Jv…åqÏ Ôz¹¤¢óB^x«K£R)DUstñlªR%˜BHRÕ·Ý¦Èæ‰Ê³IHÙ¢ÏËŸÖ¬Þ›¯|ï›ýátÝôr#^ÇÏàÚÆhµ[{)ÒоºÝÖt̲8âØX•kQloý®YƒÆ¸&XƒåA¨(S3ÂbÉÓ°‡)œšÝy:IõzO=÷mª›w<™®TÙ=S?Ósm.aâòW¬sày‘êwÔd:pû#Vk<žO×R¯™°òx.Ó!J!òât>žŽýú$£|S´º¨Ìs¶\ì¿Y­ÇÇ/öû͆§â]ã™À~îÙ|º óܪ ,, 1(‡ÂàóúûÍËuU ÉÅŽø¯ QD,cn¤Ê²ÃónîêÓº Tæé ESX±ª?©–rÀ¶ùýáØÐšâ5o¿WnÕS YM"UÍ%™\8‰•$3L6Æå”ÁVÅlÇfZÇÇ0ýH—ª¤à®¨ŒŒÝݧɾ⠻Ɩ*G×Ò‰.R‹_ýó¯ïÆý¯'Ú^¸¼o`yýOj‡Ãšü§qÿ×a}ºúòE$îMcXü诨 ¢ûR"ºè§ßîG,¿¡]ÝlÇýÐôÇ·g*M¹,ÆTÆå9¢Arìm¶¶‹’¤ŸP€B5%§ƒ”•àY¤Ô¥ö²³€-eïþi6mƒ‡‡¹@哲žgLkòÙ´±Zép/‡åÕ+¡ªº®Kµeƒ§Jn˜Ù9øê§¬b<úè… “zg̳…D»Qo4˜y.²d“„dbU}9Jmr¥.£´Ÿë©"—ý6÷g)™ÆÜuwQ~h|å’ÚæD³5é#J†.­úi!StÁýÉýEìœH¹Ÿ.ÍJ\)¬¶¤4Þž¥ +SÔ§õÿd‡RK+›Ðcñzz®¨/€å³ç™ªÒG«ÌŠ­ˆ ýŒ uð÷G,Ž÷ý:ò /O²åÊr [£0 ¾åZG3[DÙ6SLÝ[?×hžŽ#ÏÁYô.EÕEüJÉuÖr©xùR?î×[³V>W f©T Ý@H Œ§±êU…΋̀ž^}÷’âÝ'Õ¿äUšåÚÇwE_^ÏI(.ÖdÃ+¥¸ŽéÈE¡0 ¨mòŸ¯8]õï¦æÛ?}{ñJgŸeð?ñÄÿž²ü»„øSåÿF q™ëžwͤaמ Few¥(†øž^ ðH s¹b[¨½‰* ›Ì°¼«JQV¢Žé|'[MÖ×[BÍnœ&èõüÖÖͺ¸¨ÒFï¢l©Ò–)áaü¬^ú!L¤–úfÀz_~MÀäêºgÊ}?[ä{ÍÕ˜˜â±9EcŠ»=OT Sn¸:VJÃñ:¶X©ÔŽ7™Ô΢?Ä#œ[¾”²(EÕRu+9 “¨Ú—ºGáJµ .ÕãT)û+€‰îÂÂ_Šô5Ósq¹25b[cÒ`ýLÞûGn^ ¹ù^½üÌΓ!<3ä=·—-‡w U4¹“wÈÐ0å0Pí!8zÙ~‡Ý ¢ñ’¼…ð…ª>G‹4W2?¡¤F2›ka[Ù¶»,é­ªh™ÞmÇw2Šé¼^no;OKŽTFˆè(O<"°ÊWŠÒóqh âØgê`#r…ü[‰µ8hõþ@b†óˆõp’UCU xûÉ+uMðº?ÃÔÆðÕ©Ùˆ ”[Ý•¸w» GRŠ»ªh:Å”‹¦‰Ø“%9cdKâõD<÷–CÑÂpÜèÞ—Ã!Só Ð$wÒüÃðÑO‰ÁÓÙì§·®Î Y’7™ØQÌ× ËÃa|p‰¯ bñZ“€€W@Nq` ñœ/ Ä[D§Á‰|éC1êCÀ–n<Þ½â9ÉHÂ4@'=”ÁWߤ %¿±X#AýPfŒˆ3ÆË› DqîýàýuZô‹ÈcY¼ç¢…RnüÏNVÆ×Mà !à©@|†ï1–‘Éèe,¼0Dlª2CÇO*c u%iðZ¹–FAl6B¬c1ë´4'ÕP¬ôñH–‰,/ #F6Iò:»¸èØÁ¾¾@4ÖYÕ:¶‹Eˆ•§ÊèQœR®žêøNAáÙ> âÝrô‰¼ßf+Ìs» ² *î!ÛͺmLmB¶•‚XÙoøÙ%žÚÝBëJe‰á5ŒgD,숒~:¾W˜,Q‹§ºÈ×dsa‰`v_öŸïO.Ä®ÇÊ„ñ%\¶%O…O€XN§WˆáÔïüÎ4‹‹@—jĪ…ª*DÔ‰7‡Ü±‰âwfÄSÏè¯Ä ³:aËZ]ü—ˆÆ,|¥@¥²°¹XŸ·ULdo).¤ & _qX¸aìGS•·^çPÏ]Þxå#ˆl¼ºhCån„YÕñQÏFœ“%·‡H”6T°XnÁ-Ûà ^Ë~0kµK…2çì†m™sn£dÎe,,X²,±ý¼è¢Hu]8†‹Å;í*Àe I"vqçQÉV/î_pXx½ §µ¸´âfQK¯—ŠËH=¹Ÿw·€—Í$Xdd|·Ðß…;ígî ­z3_.P¶)t•0r^L*•3¹jµ¼òÊ· ù½ªOn]þ¿w @ÝËñî@ßiXóáÂ…ö“kýº×‘ß´Â/9PšHÞäÊÞB°­’w’‘$ó›Â”>>H>‰’ÄýéaB¦ËóÖuY­•çç<¿ÕÛàKÐG¤ë_NLx§ÓáX¸¾j¾_É]FN(è<Ó÷Ëo€ØÖ—þ÷WÍ+ìRnJHÞƒ—Šc•å­¾¶Á¯Âßðç>Ü*ŸOM hdŽ_$¬,‰âjfçϦoŒË?ßóyvgõúot’˜Ì÷Ot’¢N+0®Éi#y ôA9ópx”· Õœx½Æ:€ÙM/ŽçCÑß?+Bœ Ÿ+A”Ï,Õ`È©¨ãú=êîò•y‹ÙÛ’D¸ËiþòN%AsúLÙpù5ÃòJú¼@º»¦Žô'¹1ÒNHE'ôÕ>SÍŸÉYF¼«JÜ?wÓòɨ0æJß5âTû_0¹3_½`4+ ;Ìöò•ˆ™Ù˜oR¼zý’tª×Œ±g/:8Z¿úî%_@®{Ú³T’Q½-,ï$cÂk>¦nd]Z[ëêåÞ'ºä~ØŸSå~q5QV˜êœÕÁZbÙ­dm°IñÓ6è’^ýç•ÃðîüêeÛüGN_`]Sö1Ø k_ãÒ×NV›Eê’«è:]}qù GÚâÁW7_ظùÎsG/|+ï%á®?é´isP„m“ªlåË+¬uIø5)N.öÛíS&AöS‡œ/i€œ@R#}“çq~ãŸ.ò§ê&?:ã軇iØ£…ð¡Óæ§›rsu1®Ú\gA‰¡âÛ;$™hÉ/'Înš~K2ÁÙ§ ÄúþbóÄ©F<,Ï.ÿ¹{J˜ke‡iï¶Ú¦ å£RøÒÏ?ØÎàr¸ •b­fn âJæÃ¸Èºý“˦L<Í÷é+¶²[úDÅjùZŽ-ï–¾ çÏÍÃëª/¿¡åQ ö®$߇†7Erj5Èõ9Å5ÜÇ/}Õì_›[¹2Ä—Šs*˜?£…% —¨XÝm'­K&ö€›9ç¡Nùf2`*^¨ª&l”?ž‡Inh¦êÒL‰ó¥ ò@Ymú€NŽXÈ4§,Ì{0*Jëö²ãUë}™·óVnua«|ßÔ*7ånþHÖ[öö¶²>ºÍ[Ýʧ5ªKXNçcý»¶98¶âÿ¾øT‚G®•Q=ÔS÷º°ªýçÃjÆr͆ßå¸$|X‹}ö,ü½©ú EŸ0Ëç-þáóý§þ 1ÚXÿBG;ˆ>ñ…·ö×M.‚3¢±ªò?ùÞ˜<øÃq3®ÏÛÃyj³ÁØTÔ¥¢Äß?UÌ3·jÞ ~i+Ǹ²‡Òì~ñúǃéendstream endobj 115 0 obj 7761 endobj 119 0 obj <> stream xœ¥Z]ÜÆ•…‘äE¿‚/ ³šUE²ª¼OvÖ‰³XÅ^{‚ûNgÛéE™ýÿn_üôBð ™ÿc½Ï¾¼ÁM†~¸¹áž™¨D¡•Ì´Q…”6»Ù¿Èÿö÷Õ͸?û››²0Bá›Í‹ü¥»V2…²¥ _ ۟Ƌǥ-Tc­¿ãûóÇ«ÂÔþÊm~|õ°m/žVº"<}›¾ºVJ¥”ùÍêÕÍ¿/÷$Ц)¥_ms¹¨ŠÒ”âÙ]k*ñõíðã¥e¡ÔÇ=þª{xǃ… ÛüúüQ]DßýøÃC;\<‰ÝêBT*»®šBkaéVQTðÚÍ#üñòû/¦¬6ÙËïè/Ç•)JQ‹*ï²ýx\éÂEÿ³÷‡]ÇÞY{sh©Æ-õ6›ñþlîV ž²ºÎßÎÙ©›BV&Ä Ý®D]”¥VywtKꢑV‡œEÃ8gC·ºÖˆV£t¾î¦©=ö»§¬}Óö»ön×ew§™¸–RRa›B:³JøšÍšæ~·ƒi´‡aÝæl¼ÏÆãü0z3d•C»Ë6ÝÔo‡ìaÜm¦Ï³~øóJ™ÂÚ¦ÉýÜeö†5eÛc»Ÿh»s¶³qèð÷~Ø’ÙlŽª«Â–>0lGŽ)4×á’7T•A7ôsöHwÀFûGéjÅW»ÝîÓO³ÛïÛÝiº¨€ª¨kÊãÿû"lÈÛüju-š¦@Žç/רq¬KmD>bgeÙ˜*º¨ UÃØ:,þ?¿<·xþªÈ¾F0qYÖ…6UÈåŽ~ª¸€e´ƒ¼5!5®á äI“·GŽ éOCÿ6;<ô»qOÙc‹l8v}çnVäœ.¥ÑKwZ÷q@¦Ì#/zpy-uòfqSq6lgü‘ 2np=gý÷®/EID@—ÿ8®jp<Ð&%@ÁiB²ô`ƒàO<Å0¶Ÿ:«oL3©’å¢qô¶ŸŸˆË8Kûa}ôÕT•‘ßzgÉÆä(ÁeJdÀÐ_rÐ5`€2ÿji–ï èÆÆ½Í“ï#„‚©ß{ä_>FM‡Ût¿œ%5”S†âï¦V5 fÉŒˆÑÅÎ÷‰§±¨„%$—Žwå»nÃd.ùù’3¦1Pãê5¦%óñõtA<©òm$¿üóÄó/«ì·èÉŽ-@HˆÐòŸNðÚîÉs©:h¬Ë‰¯U¸f#Þ–žÀMs‡Ž¾uL ì%21—É&¨‘%€*|;˜Ah ªáT$-0ÏyÒ˜¢²"Á¥4_¿ÍiÝ…Fˆæ€Z¬ëE׫I:†­Ô*ú^m|Ì# ÖD"‡‚0'4m¡Kë›6Eû ´ÕZHõ6îy‡†XTõÄZ·§ÉYM Q÷ä­ÑB÷ŒOVq·ôä¾ 4ÄáIæÒ\¼N$àíÜ >ëÀö…Nýrêßp)Š"5µÚ &.zÇ T!c >cmaHuõ˜#óag@‚¸¢Nc¹’áI%4ÑÚ†”äéPÒ2ô@Ô3äuÀ^H6Z›LV­žV×(ù ­›ó/cÌÚ#rÜž¦H&Ñ~£–Šâ½Yy¤V-$I­‰2Ça4ÊÌ4z©š]Š!š{'o ^L@®Ü)å½¹äÛœüˆorŸ‚eßåÀƯu¡œ­á¤ÛG¬C*xã ÖV 4ÒäÈé&ð Ùóy}¼$X&*]o]¥/ˆ:dƒ èÿÚyïž*DqÜkS»½:Y n(mõ¬¬%)yu>|B8X Ž >C+jÀ_( û<èK 2j8ã4Ò> w§ã¦CMí÷^Çk»`Ýžˆ„¹ÄãÃH컘Tè ¿ê ;piOC©Å<+›í0ݱ°xÑc??dÌ{QuTÌýº ´¢D+Mš\4^±¸J"Õù¬Un*ñ!Ÿ1Ë>.„'‚<Œ^YÐg!KÀØ%¦‹ÅˆfÃïçFsdHbÒ<¸ý¬¡<¹.%%T?¸UÑ&EäÀ×hxçüèC0Q_ÇyX#Ñ þsØSÅÉ/0ÍSÚ)i²aã”økSªÅmŽ|w¸ûÉ[¾lŠ­¶í‡ÎÛ–óáÀ‚¤9Q¤ƒ#)º®h=¢¤P ]h&Åäíìl `MZo𜕇\gp˜h<ʈ'@ȄԌÎ赃iJü%•¦:c~ºÆ©X8¡Y&iäÔm=»HС;¶»+ ΰv“¢‚ëvàÉuÍXP†:¬ï:†~þv â“eçc릉ïIåÓççBòZR\ª…¦ºÔ’ÈÐFY…áÆ8 ÿò)µÈ €ÃÖBoð¨Ó?b¼waž°šØo2ïòtãæÝ’}œCz‘=m¶ë ×vA·Ý<ÉMŠ@gÂ’£s³MóÓüM¿é¦³¾csƒ¾»´ùÿ› BDî “mIÂÇ› çV`;ÉP®Ý??ô»î£Ckhôù!l Šd·T^›É€C5WºÐÔtíÚ£wO¥EÈü­'(Áƒ4ï :%) /ŸEVn ½þT¨_!#ò9­m—³rUéèlh²ÄÂȲ2F§Le¨žÞE…DRÁºìlj'BH5Ñ´@/ÀV¶NïUþØ¢ó(ÑU.(š]Phš[ï¹ì™k4n@<·Ú×ÎÁÔÂÌó,<ïÓBû §‹x>û/`¿;w'i¬â§œó§“O`"(ÊÆF0†¹ý4ÞÏíq1ÛÜž¤I:ïðq×ÒgGsˆu‘ýi¢|tEÜw|c·aF¶¸ –f'"2Mò—­B‡S"î.Ÿ%UoäÃn´ì½b ¥Õ{Élm¥ø#D‹öYUŽÛ# h¦³$à­Z:™2Ýßø“Œ×|^Â2ÖµÛHª¢ˆ]²uR±)l“ œ•Ú§(«B‡1çûÛçÒ'(ÁtõÞ³>«pú[=ID½”f1¯Ðþ˜È îiÒ‰¯ ÒàÈ•6Ls3I*¾€x¦L½ð]Ä»eÈã…üÄ^+ÉH†ÂšDiâ›Úú)¯ŸD^±Ë}“²§©¿—ßõû>œyÖPbv1诼ô§×öÜêš”†.u¾wóÍ.¼[‡R¿Íß‚äžÓÕAÿ(š£wÙW!>RSÐÒ±Hå'L©XáÙqÎÀ@i ¹sŒ‡Cã°Å†@2+­!E#Úymo§ò‹C™˜tl otŽÌñÔIY"‡ixç¬QqÄN Ç“}Wk4 ‚mÝžˆŽ|î(€(Q.!à¹kÀhž)cãúÙ¡ vôswªl%a° ß±³øYvŸ<ºBð¦ÓYÆ>wàÑp²Âðw<pTÑÔ‹ ÅÄ ³D}ªô¨é#ŠÎ;³?Ò…c»æi¼¥·Âþèë¯+!è`H:#ð:Ù?Üy¥XÇjDLsçGPj‰³¹;ÝÛ?\¹€Kú&&NTrÏËÝaárþS*ÎàâkH¯åý;ž½ £ˆ_=aé©vò’ˆ£U<&õTl±ˆ0(ô°uZd}|:Ì—_H…ƒü³‹ÇÀØcɆéòðG‘:òÈÇwhê"*žnlü™⻡ñrå§ZüЖ&V#ç•‹®WðÈ ½pwãêîöœ6÷Ãñ3ýõ»/ü ÝMc¶w¢ľq§×0”*þîÔï6ŸÄã2U‚[Õ2½(|œãí FEÏ/sg:•^d¾ÑáLÛ;9oÀy|'¢9 üöH‡„-«´¯"û²›X^a©>¬þh_“ãb°ËV:raÔÜâ,‰ow6ögpä6b¶åbžÌ¾DÛà#2œ‡ÄhÜó×t ‚^ÓÓÁ9×Ð×7i¬m*?n;D%*‘.«EÓMþ¡IŠ;LlŒGQJÙ÷$k˜{ÛTë›lô¹….u1]Y$øâL°‘qõ¦Ï¥~þùgoú*ºJj×”¥÷n2ê{¢û4…«ƒ>4ñ*H™E3÷3h"‹¹Ï»‡©ÐCMusï4`¡Óø D³'Œóå±GÅÒÿBù©­›ì€™’mý18¡’v<Íç#Ðrcb§~÷ O¤a å¿xòìà¼4†ÎÅÜžxÜ}à}˜~Aå6iÍY+`”͇¾ËrsÄ?}“°ñB’˜^žS†¡9ËiöYhħl:­XÚýx"ÛÏh®s†¾tâÏev#ɾX¤F¤îÐøæ>T#h"vût‡?±òÔ f6åg '¢&…Ww5ý¤ ûb%˜ÏÊÜÛ˜¢]`eeÃP»¢Ø,ùsÉw¾ý­Òˆ2éáþuîÈ9ß èµI/÷’òØÓ¸z\N¬®ö=kHò4—ùtrò*±l²ËÊu÷bÖoÓgžñ›‘‰ØÙ•?šØïn§©óÜ@””¼£ sþÉÅv4øy ]’Bô¦¯9`_ݼøOüóÖ˜endstream endobj 120 0 obj 4575 endobj 124 0 obj <> stream xœ|IcIr& ÒAÈ“.:ŒNïÖ ƒå»?×-[¦%¨F-)…Á » 0IF+¹D‘ŒŒ.ýkÍü±Õffu•ºÑÕýùbfnn›û“YÚÉàåÿׇWßþkž>\^™éÂÿ>¼úñ•¥“üßú0ýö-4ò‘·¯øC;Íqi|±SžýÒ¹2½=¼ZüíÝÛ í,MÓ2Ä’34»yõn±ù~ÿ´:ÞÝ{ïáS»ø¿wß¿ýǾë—ÉËí7v–—Æ›äÇíé?~<¶ÀFÞÀzŒ—Ÿþëÿñ‡µ[°,ü~Ò2g[¨Ù¿_¶glhç%@…?vË`àç˜íe:=Lßýnº<žž÷›éxºN«OwyYr2y±žÎwóâô~¿=\¦ËözÝ?Ђ윗óìk‡û[LÏOÓê8mi¾e™ê‹?^e"iéRE«ýôÝ¿½o6Ówÿúf‰-îÝ ýXˆuÔèÍþr’5„J83¤5,^O×Ç­üžæÒý>ó§§»û´,óýâôô¼_qÌ‹z¡Ï@x‡ †Ÿy!¹g™è ,稜™Ö§Ãáù¸»î¶ÜÓjÚñ€š«O«Ý~›6<í„¢,]?C‹ô1.£¯‹ Ëâ„%‡íñººîNÇåô·§Ýú8É”Ï+ ¿…ÆÀ˜ÃÃ9U¼M‹ÓaºVû=¶¥ù»`€þ*./«ó†à ˆ¥RzòDD`îóúqZ]Xª@zXª¢‡YVa½\×§¹óféæÚ(qÓ¬ÔÃú;ÏûýHÄÓé7†]îÆ‚ ga.ÓÐ,gÝb‹O‹¹ÌAwÝö<v›o.»ÿÜNß½½ 3ð;Í Ùî¸Þ?oTl»‰YŠÊàÃêò#ÎêvNnYB*_]ÛV7ŸÛ¼Œ•8¸ª$«‚}r=M@ŠoHx#lZ“g]ÏêúÜx»e†Â÷:®yé@•$åñ›‹HV†uUzÃFð<êŠiw¼\WÇõöf%),cRjüþt¹þÙoãPŽu‚KÞ:+šålJb]eiÝlµå Z“æ°ø´ÛÈR*ÓJ6šÍÇÍK[œ.óã¦Ã•°T¬O°½Þ“–-;g¿Ÿn5ùSÖþ¶×õã˜ì3è/£­^ßn q¶:‡íõ =À¦*±Ì¿¨‡ÃÓév=LÛC¯§/í"PG3 º‹6‡[Y‹@©:‡¥üj´ýùÞæË_/ÿÇò¯Û9õ¿NÇo¾ûwbOrJp`ÒûÍôVt·1enŒ½GÎδÏþr{ÌÝç™[ãȉO ŸYÿù¸H£‚H%u{ÑV‡·m윧j‰“щaO, Óáð8í.¸™H ìù\ªZ8œî@õçAúªèU… ðð€¯ù„(9âR[]A{ÓqxÙ}8îþl½:^÷?Ò?^Ï»÷ÏWü†ÎìóÞ aá›w  #LÄ8oxTÓùv™ôøýÍeúáôþ~FRÁ¦ú'žI1%/N—- É{*ÍËÙè†ÙîWW>ñÊÒÇÆ Dç~OBÏ—íÝ=(úÙ M®Â6ܸÖÍîr=¯ÖWšˆ“\[À+íÎtGàÄ–&ê¼w‹Ÿwzª-çj>XØt2»í»òxÝq¸é…Tçl€›çÓËî ÖÍuZmð˜pЉ \ ­+á‰pxMtÌ `QLV—Ëé·ÊìµAw,в#CU|ÂÁ £Ë–êPÁ†º¯ôÉLÖPÝo3ŸÆÀ—×$Ù¤âÀž«!kÄ軣o½:Àêy²Å–“Žª&N½°ßÝ£9ks ºß…/®?ÀY†hr¥¦}¾&IЏð›¥È>˜7¾mòÅ_±âHt›QËçt|ØïÖ×Û,Œ• þ)ð‡›+~ic´ý†F9¥Eg¥²hÀ ë*ÞáÇÿöÕ¿USš^À¢‡& ‰&<–°’A<Ë´g¾ˆól—¾"óŒHX&A,øǽ°$@`KZE2vS\íìZlSè/F CB/ŒÀ¢¤ŒÀÙÂÝ$î´…Ç»Œ#ƒ›¢ˆ¥é$ØÌ}7° „cæeÚ¬HÀƒæÖ5€KAÄA®+b°ãdá8bT:aYB•=.ru_ ÕA—«HÇ«ý«ÃuYÁ"ø8Ä?E2ªM^»þ™J+üó:^èã¼"…Ú —ÁH\™”Ò1{Ý©‹Æa'àÁ×b<’ß`âf·ãy€3(üÁË5"›Š[DKä s pPôJ֙Ǚç fDÍ#ùOà¯8|R2cUdP‘ƒbyл—¿œe)Â? LŽ"NE¾²‰iêʈà‘Écgæp‡Àædf*¯gÙ†{Î`z‡¡ç 䈀d¥q'é̈€-ãèŠÀn+yø ¨4 dG‚Äaô ¼¹šÄéœaÅYVÛmf9MÉÔ&ª„TÄéîÄó(±ç8àB/ØÐVn¢tƒdê¾~@*ìø HAIC›q@àsADU‚¦o Š'¢‰ ó‹„x•&@2R"»e,#bÑ‹¾2º%•Æh?|$ØW"üDyDï4ÄIÏY¥ "IùëÖV2V¾Afæ0 VF/´µ ©© 7¨FQ±J @Ò¨t¡c 4‰I´‰k*ÿ޶9²i mZ€[êÈuÙ…;•C-ÒqÌÜ"$’’¦ëƒ~÷…´SëÁ'Zo¬i™§êï¢ó”pÖÇa 0SHN7UùŠãÑÁÇ ¨&—ªB:ôˆW¡*AN䪴K–¸jí2ó‘Ó©:Ešª›EUÕýÄQÕAvT6ã qÖ_‹]V‹Kc—.8î 'ž)t9¿šrëÿvæ;hß³å ‹µ·¶'X¸¾Ùž`N»+º`+4Á÷Óå§»{·¸\·‡Þ$W[‘Ã%?c“Œ#˜LQôÁÀŸ‚vÀÜ\õ2ÞÜy<ò[|C>ƒÉ³×HÌÚ’Lë•úÜ,§¸J¨tÅ\Ýe)•º¸Åö8­9°èÐjnÖú㽓³ß·Ù¼pε¨Ù·ÛëúÛ§Õåò²¹!<ôg¡¥ÆÆµw×Ňóéù6r}íäh€›žB‹·Ý}o{\Stý-¯‹CÁk íåq·&_z}ÂðÊ•|Ç#m-ù”V_v?Ùµd/(”Tچݢ|,§7ê‚:fäò~÷‘º:%g{qëÈ’cf÷'| Ø,Õû_ì$†ª  '_žÏ"Û-°Ä~×;õ—ž÷¯'ðòQ²»ÈøûÆrð±wâýZPóÉÞì[%ƒ(úsß¶ ú¸È×]¦óúÓõúÓg»L.&yزöÆcM•V $p£9Ìmø.“spJ¢q‹Ö'ûI ‰â'!‚Ö žù¾"èòàÑ“*‚V5žù|Ö»ŒaL¼ø æÑž h´°2u "ÚÝ 2s ¶çÚ@3wÂ'?¸´d‰Mpƒxñ’Á?˜Áµ<’½"1ñmVÄÓ¢]!S ÏN#n눶ý\tµÑùòP`‡%`bO§î!7œ¯Å*Ò1‰N47³c…Ç2;HòȲ­0.TÒXa\ÖÑÀ˜tLö˜± 0'ç Ñ<ˆÅ*tê@óÂÇpÇ<âÉâ%9<çžß :…›E\ÉJBDŽ\­®úêS&AÄUÂL !VýPªN±§A;Ä„­6DÄ?òl£u8r~ü 8—ƱB®£‹ Œr2Cñš@g^–˜¹`_¥ $µ#à˜Èj¤)Ôj€¡‰çÈoGD á`ÈÃ~ÄúÃ8¸zö†Lõ³0Û C eDà\˜ÇÑ+âÕX®_9u™€ìNqêè ¼×ª¶9[5¨Y%±è k<ÛÆh#‹¨T$© ‰%ì ñ™”éÉ+Å|ä?Å?²äª÷@–>œzL±ê2éGFý#Gî|;€xGžÜù`‡5NЙ‘m‰Z©±´?Ñ€¡"Q-ÛúU¨ ¡otu̓èÔ9R>uˆðEÕëÆó7ˆ“ž­J@EŒò¾"-ĺKÆJ7Hfîb«s@›*ÌÕÒ/,Ù )E}T$*5\Q}+î’c_¼ÝhÀÚ¿`F«ð;ÑãN· š@cL’’ëÒI›AÏâñ˜ÂqŠLbA©úßÇZ¨¶q¥°¦ªý¸’dé:–+®ÎYU{©s–6s’9׳fö2礟•¨7 »O‘ã0¢œ=’UÈbXŽªd”÷yUåèè…Qé)Ò´Þ,­j™Èa¡NË€d›QïŒüuÞìKÔõ }Ø}²!§¼þšûÔl1uŸ`tkÊeØb÷Õ}"C4Ù<ØuNìfl³^Á?NÓËݽÅì¿É‹óîJ†.å îdÛR¿sf¿º8ÿæ2I ¬,Ãòªñ›9ëpØa9ÆéÈf$JÇ\sË_L*4Ps’ÜM®Q[Tï3/ÓV+ÑÑÂSÍI:ôvÚÝš“¤„B@Ód®Hb ei `ϸq™háÄ\í+¥:˜¨bV¼b+ÈÁ¼æ$Ag¢z¢Ì¿Ó¶Aø×2 Qت·JŽ€æKhþ+sÍIbê®§;z¯k°¦ [³’ í9Vf†;u}øÏÔœ]‚ºOèë2 Ž6ººÄš“´4OÄ‹æÙ™çkVÒŽ´~‚”†10½Å€ÈÌÇñ´Ä»Æ¬™ˆ²ðÇQÜ+bTä)‰i*6}EjöcIa@0ÿ,ˆfš<¶¨ÍIRž¾ï„8ß ”õî9 r5ß N¾ê³QYv[ÉãWIì˜eG&u§ëè ɼ¹šÄÕ9׌U¦˜É©²Æ¡¹(¨G¤fh±¼4'If¥Vʬ0UT†Â b¸T3’Äš‘Ôo‚ºÓ˜Ü‘Dž !¢(S`9é,jÇ«‹§=!Ve)Q´+ë^3Ä~ø 3¥v 08æóÈ@‚8Õ!Â͘º»A¢ôU*”›ðiÖU2V‘d˜¿€hFÒÑÆ!3 ÑúkFRPžJ W¬f$- ¦ ªW‡[õZÜÐŒ¤#5ÐZù ×EgîRó‘n)c´|£ô¼¤yºŽtSëC Ã( `@µ¬Óyª“_xžu+‡žl¢î ÇcƒðLªÊèÐ#5ÉÅnP×X¡ÕiPs©jË Fµýø5—«RkˆéûùUùHÙœw`‡z»Ye·I_q¨«½õ<ê—Çí‘,cpî´~ñeZ]¯`2cÉ<'åJ?‚‘&iLjÑÚꃑ}Ý}’–Gº6w¸Á†íkqáAKïlPEbñìºßæý<ª-nìË­ޱD×ckrM¦+.pÍ>ÆÆ«¹ÿe‡ˆêVW—>Øî–ÓÛÇÛ”f¬[]óe{Ü µ}¹5qç6§9Äâf‚ñ™»2r1ù/ëóîé:U 8”e³ïòâ…sb–æ«y¬Ýõ ‹[a’˜H‚ª¥&ggôRå’Jå®qu–4c—M==–)“§ëíËd÷­‡f{{ÌOÀžÖŠíÝ!b{º;X'¶7!@`½ØÞãn°ïã›P{€ˆñMžy6˜ÚÇí ˆlSÙ‘Hˆß³#³´!;Ñã= 9r?t¦àÒP;ÂX²•;D¬oB ÍG¬ïÖó›äy¥´¹ ´v1¿ ±Ø³óÛc\²`ÏFÌoBrd„ç\Waä0h+5¢1ꝄòVìï[~¡úñ)eLìï†8±¿ aΕBNxh+]½pLìoB µkÈcœÖÍÄ÷¸MRh~ÎÈKh@Ä÷x\ÄØsO檨uE.V–2<—!b‰{<º² ™ÛøÄ’¢®ÂžsSÚã™n(sŽ*±ÈèÁ}ü KiƱÀqÓÑY:Ðîó2ÃÈ_ݘEÆ‹´ñØcOŠ•DÌ2Z¦³+#"‡“'k«ŒÉ !3S  ²W ÷Œõ“eè9Rž¯G°,sÜaXÊyƒùªŽ^±Ê»¯Ä*'Ê;ARGoHä=×ä°ÎY¬rV›ñ,½©"‰Úx•–ŠˆUNI¦³¼ñÝe¥XL¬9\V™Ç5ß ³ô#¦y‡ˆmÞ}%–¸GóÉÞ xè0âe¥Ž¥¥C¢è$±Íi†‘«É0 xÇ+–±b›·¯ì¬ûTélS]»ðŠ%ÞøÕ!ÂS›”ï>ŠFjˆ—ž£JBE‚òíR_õ˜Œ•oÂ\¶b›{41iY§;.–pkT“(bJ¥†©Ú×ÕžI6LÖö0íe“ê.ð¢×“îð0¶ñ™åLjiL+%Ífľö˜TŒ‚ÌÜ$‰¤¥žXÑWnÚÖZ­¼p1ŽeC³jcSç,m0ò3ŽeÏÙšzÊéШ:ž2|òd’mÕR‡±*e€ÌyÐëyf jzSavÔŠ4ýWD·U}“g–ߦorªÚ.ÕÑ]ßϯ0ב·ŽÉ[íu³-_K€-¾— ¼m„ôK*œ—ëÇŸW8Õ`7Æ5n œ0Bo?»ýü+ œ0Ìâ&_bÑ'EÐåçô*ªËH® Wt"I œ°TxF¤h†À|©U c7?“ÐG i ÈšÅh·z¬ø¹“ÔWÿâ5Õ[«NȜܬ%NÚM®™^ʽð"¥Ä ëiÙ¦® `H£åÿ€ í¼8a]ç̈Η8É£©+ºO„Ü1hÓÈ$.pÊV°¬NŠ`hI–m…q5 Ž1+Ze+§r4Èèu,®!Db\E3”,–/ð²$j†u=-*40(s@DÖ˜"µœ„Ë~„¢÷„ ¥+Ô©Å#Ñ =séJÀ™’†m…4#çhG¯H+oѯŒÆ_¹(†‰¶ÖÑx§U!¬sέ¦`†D7U$S›¬¢R‘ZOÂe2´'J˜Ž{£«E"ÀÖ"»4Yz1‚Uu„í?Â`hMl¸À"(|«ÖÀ:(e¿b½6!õ~ ™ µ¨G‘Z¼_¿j·ç„©ÞR.$£ÑVåT‡7S-Ì›!Ü Ž{Žõ^PEê XÅzÇ‹ždfþb¸ÔѶBK¼/±#]éâˆx¥^ðëU0vLBÛ¿Ä;ã¸-%'ˆl.VêÛp±!¹.ôY´µ4©°Î‹¶–/%”vp±R߆‹•ú~¸X©KŠ•Qå^ꜥ ¦/Ʊðx›™`ZÛ+GB%êÍÑÂÙ@QZUO‡©ut€”^™Kùe§ÌÑLÑߦ÷fÑiUÏ„ÌÒÛôLˆU˵ÂN×÷ó«Jœð.RdY,¼÷ï 8…·å-"«ÖØ÷ Å"9«±·Ÿ©qÒÚÞ°ãðç´?]°ÔþÒ*(Øûûþ=›“ÌJ¶+à—p!F^JÍÍ'©ä8ûè$^Suƒ­ø‹Šá—Ó½á õ8_Nž°ÐF 3úè/ˆM åOX¶ýmæ§îý–Ï_É€#ØÔ°&Þî—’)ðáû.]¹ÞÑ4±>3A¥EL@ŒÇ™VÒq}\?+Ò˜Ög,ö)„q_®Äø‹ýôí§Õù[¬—øö°Ýí÷§›uÞúX;ü?\èb›XóËW.®¯ñš>C°;~xÞ]ûKæ dTT„—þ)¶×—FŽ7c<­]Ñé9íù*ûq‹O9çZù…7;øb>?x@q¨:-yÉh³½BãËT‹e𲜙?W,S_/@¡ºžw4ôæô™°o£ii‡ å4xSäV¬Ð˜mQüëêöÖKu¦þ°à_ô1)T¯­@é¿nãþhsȇw¯Ûåߪ—N¼K·ñþ?4TSÉv=¡ Õ‡$UÀé ©ñskþ^ZªFr×Óôtޯݣ'¬j,XÎù%ö ‰C­ÎÏ&‘¼s=’Ö"½¬~ºÃc*yRö0]¥œØÅ3l%yÁFäS«k¼\VØÂéJÝî“Jƒ ^çù¬pk]cU†»ãú†ätåÞ”6u¹évÄ’¸ãútæ ?t*ŒkKâíãÚ3cX+W–NçÕu{á LyÊd‡Ïu`†H ?÷|ãÊÐ4 ¼¨õFÞûÀ:ùz·‹Ÿ¦•Û–/¡Ç: ·çËtäôøLanWÈjMãfu]WÇ õlÜtâ ^è—¦ªýxOä8/¶g-Ý‹ >ÝU-V,vÜ,IUÇ ðïJo}¤‚樂?R%%j›Y7~ÒRÊŒ¹,ø´ÿt«>2½:SU-Õàñ^6.bOµ`qudyÀ{ê.¶IÉYÆ¥§†šMìuÅp'ìÝ–£û…÷y±þH/ ‰MªEã¢^Ô1¹Ó1²“2œaÛV*Û=kSsu[–*Ú5sw‡±JTjoÍ¡ayçîÊA¼‹šàqo3y®¬”Ï^õð5Áùß¼£f°êc‚%x‰àT K€ˆÕÌ>"`u¹äŒXfˆ€ˆßÃ$2Љÿ@$b?n®ýÐÅ—ÀÇd{Î$²Ñ±b`šL·¨ Ç Ýpä~Ø1@ ‹ÉWÉoÑ73ÍÆ‰kÞz1u$ò–hlK"âhåAש^EéA›UŠÄp Š./ ¢å>,¶«•XÝWBt8ÅQEfµÉ‰!+A0w&«L»TI“˜w¶Ô fᔓ"´P§/ ˆZI|X3SU_Ot°ÊóÈ—bФHÇ`®6 "€ãl÷Ì„ ÂÒe1§HˆÏœ"Ó‚diSXÁ:æUPt_öð)Ûpƒž3F×¹ºñ<"IF¯_ù"£×±‚«£³hXÌÊÈ 9ˆc°h]EÚdt°:jT£ )ŽéÌŽcC´f G¼½Å{ç˜áf™¬ËôC¯èõ†W;þbÖeÀŸÔaÐÒ©úIè ÒÛ2À¡š:lJ/xužZW…y¸9°´*7°(«Â!€Õ*"Hÿ%\¦÷Üd\Ö6Š„£üøÄI?Aâ6 ñ·i_9‰ÓP®lDðAX[RÆï)¢{¬Än0ßèi»ë5GD"ÒÂÌ­hˆÞj_éÝQ¦° uáÌŒÄØžGÀ\4z!÷šÌšIØÎêíBlN*ÇèíB"Ž*fA¬L3ð2F· «D ëò1½9èZ$uD@¯c.s¦‚ ºÍ¢²ƒnKÏE m É "Y—Lz {ö¢é6DficI::E÷:†6¦PMs×)–ÞÆ2øJ¬ ªkC³¶±2ç:VÎ2繞p¢û+IÇ„èm*UA‡Ñ‚LDÒÜ+m MÓÙø^©t›"M·E¿tƒF‰Ž…µSmE5YLß˯‰Ô`TšH;ó”ëE±)c¿ú–‡]í-—?»ôùcú"º ‰=ESvX›vüóÝúʯ`³§ÇÝ7â«aEJ©!Ðgƒ1ûÓåôôø¿2LoðELatàWÞíÞ®Cg~ÂçDÎT½‡F"¾©¹;\8e2ä1Väê£~>HÄfµF¯Žf-ï­âÖ©÷”è¹U.÷KÍýÝÊëÈú,1fü;;üw.À¾è“1ò`xšñÍÎi­µmw7W½¼Ù¿£³Ñ«Ÿ(¼Or÷fÏ;y¬›žRõf^0¥Èùû—Wÿ7Ü\endstream endobj 125 0 obj 8449 endobj 129 0 obj <> stream xœ­[koÜHv…ál°ð?ÈæK} † HµdÉ"“³³;X!ÈŒA`2T7¥¦ÝMÊM¶5ʯž ó-çÞz±Ù²v†_Ý|TÝǹçž[ú$R™‰”~¹¿×ûW¿ýÖˆ»ñU*þ¿ï^}z•ñÂýµÞ‹¸ÆE}p}ûÊÞ—‰,ϤÑJ˜JK¥jq½•üü_«ë¸»‹ËTV™Æ ×›WÉ•ýÖ?©’ºN•ÿòûþîÓ°¸]ÕR—uí®øîôö\V…ûæß7¾ßÞ5‹»µ‘*ów¿Kþvu©µ–©RÉõêûëšï)“e™*÷´ÍòAY.Ó*;¸‹ª®r÷åÇšþÃr©ÔúÏ»ýûv{fA©ý6ßœÞjd°Ý‡¶M¿¸óRgFf¹—y)Éjk†oÛý°*%ÞY•É箿s¶(´·k.ëܯv?ž-¨’¥N½O¦á޾Ï`W·ÊLf:×xU;mÛƒx覭À¿ÄtX]*™¦¹®“ãîQ4‡•‘u]¥E²Þ6ÝZ¬‡Õe jc’M+¼² «/«Ò½¯ÝuëÑ®(,Xeó}Þ?¿â¦ß,î§ï«Ì{ÿáùûß%có™Ö]é7ýÔÜ­2²–Ñ.RÙ…®Ý¾ Ù@Rü¶ñ1ëm@ß»DvWyNvß·1Q›~´¦½9ÞÑ‚6öû¦ë§¶ozxíòÅèR'ÃᣯÇ%䨨á1ð°þ<Áv -ê!™ÎsøRZæE̬ýx·Þ~\>EË*ú¢a'TRÑ>‚ßx‰fn§™Ikdö4ˆëç"S¸âÐptfE,¢Ç™a6lŒuÓÓ=ô ¥2ÜÓíïwí¾…qøIU¡ \ÚõbÓýªåÇ¥HÁˆ‡æÑ"fVÉx!¶6¤.s|H~ ¡nÊš=9n‡ãn#†¾]曲šCP·°½§èÚÿ½ðe¡,´æ²ÀŸ‹qr(ÌV΢;BÉ“fOxcC±{„û­\ø !Œ×4“Ý™«#(T¼+ , Sâ}Ï9lËE`^³x½gHwŒR¡Jëàæ0ÁeÃÍ8ìÚ©egÝ[GÕ…vß"îy÷(Ø«ßýçèôÃY)(bFo„U`~ÆÇ…A¸pžOxdûÃ’¥q寮üBl[Ê+*¯œZÀ­Ä™Æ¡SE5Ígrð|«@3=Åó8u»ÍVü¶hb €T+vÓÒ‹©4‚õÐߢ*O‹uƒF¤ˆ¿ø"µÅ‰É×"¢”VU¼À‚‘à¬4²ÌAÞBÕo¦ÖÕ']Ô¸iŽEb½ë4≟Â_Úïü JSSÒÅíüv3FÞrÓŒLN`òûÉZHçRç¡Ô€ãjë€ûÕ)®·-BuzðÁU@=év€Çîn;9ã<À}ñÛãî8:Ñk)k˜ y.«a7? Í¸ã>"•* gùQs ì/yKßP-Ýqä)Æ, U®2™)&*µµ©9˜Îx! Bî>î†us–¹©Ïªn½µ%J\}½RVgÉkγi{ä0æ9x)*¬e TyìÖ”W䪉ÀÊ"{½Òl)•¼°èiªÌŒÃ¤zFí¥xk]¨‹Tš\EUÊ1gm Ú©.ËÄSÑD¯ôÔ Ä4X ®`FhÊÔ81…¿n#nm™P&öä#<œ)„šÃ9:'ë†`¯ë׻ㆹ›ÄItZÚ’c!‹T(ٹݦ!>j&~½s.2½€ufu$ÏœÈk\Á+u…bôñSÔ´‰|áÅEÜ®bQxˆ°¸2s“pgr±Œ'j‹ê¬z6 4ŠŽ ¿· ƒÎC6lPÏC-Ù€ôZâ]ôeè¸k_ ƒÙ¼xž™Ã³%§ÄßC„XÂ,³,[ƒÐý)ÁðO¦UI‹‚¼ë>Úu¤)f^±3$Z•¼Üù ÍgEAl•ιЇH2STLn‡Ý¦µ}SV§¹e.³NYJs\Ÿ%‚…’ªù 8lnv:ŒâõnBPßmÏ\€%0?ã‚K[·’¹«Ÿ}ÛqwÜЈÀ´$—m¿A‰êÈH=ìÆÂãÜ„@¶Q²+Fº )+\Ö*[9×Ò9¨Ñ%öV(,q Ê‹t‰*Ô±xŸ¬2z/̳¾•â;‡ %uf> Öò´Ë‹€µUdÿ¹¬l²ôõzq+øïŽþ_ïA©8X’÷« XϱŠ\›,^PÚòikJ³^Sk4rÿ`{»Šr=4öçÍ]‰&±0Þv??ßyj¬MùkCÃéÚ4A%µ Œ7ŽÒÛ‹P>Î É»@¯=n+i#çÞ<Õ>Ô–HëÆ/,Äç'‘›œ7h]î±Ýk^ÙȦªµÛ# t»»}1N¨YHc²¼ˆÕÁ·{èÍîщáW6‰}Dsã¥\\ß\] ˜wÖÓjßÀJBé ÷®á6 Ý5îBñpB:™‡¦íT  ÊFÏ ,·®ü€È4z¼bý´Ô²µô\T¨.P!€_s5±½¥2oA¨œúözÉŨÓ{ô#á­C¤ø†Â¸ ¤‡x¤³E‰…Ö³vÈeË‘aûêÍÅbŒ Ô³«;­|zÙöœHu. <§2K®=ï²Öš÷ÇзÀèžÑcQÓæÄT‰Œ«MòzV_ ¸WP;[»T˜—MaŠß†õS]LT—~?LQû³:'2!¦¾hx ˆN…ñ;gMøT~:»K_S˜·{%0Ê=w^Woì&«€Ç;ç‹ñ1ê†ãÔî¥øƒ³KW‡MQÝ5®Y¦ZhN•˜X)…+8UM0£R„°nGUM½bØ¿†jYúB”*Û®;B·ûýS_ôÜüyWäH¥«@›œE¶V¦"øà2ª'Ôl.ıgeÁ3ÿÍ £,I—¯Ù" Ë²i%UQ¾{6õh§VP¸ˆN´‚l|šn•뱩Y:K® þ›{nµ§žV˼À0“f@ÂgZ‹Y×±ú…^€³Y°X»#}/Å¿¹¬A7ž†¬™–(öX©íKü³ «v­k@{é•D•ïÚ*Žâ-ÈÐm{°öÁÞµš?“ZûÐlˆ¡]¨²HâMZº0 ­G]°ãI bQÁgUUüItKÃ%}¨Þ Õj/J½äU3é`䮪CgÝÞÛ|A1޼Œ0î³Óó,t; )w®£Ïªð¶Æúï­­4{~E‰*¤+·Mþë¢QÉ"Šž¡³C”*²ØJ­²œ‹@…ksZ¢£8)×¾‘ Uˆ~êú£K±BËÐ=™Ã¾àvÝ g“;`©3>\º»¾{¹núéïÎ…V"©Ù ‡GûƒOêw²ý.e‹I‡gš4˜JŸËN6±âU^Úô‰‚=ó5M]vxQ¦ÒSÁÔW å¥Êy‘¿‘%ÿš×HF´ìë‰Óá Åló(¬B†‚_ûç*®Yœô$ÚØm§Úø½<ØœÐ31cœ<š «PæhC ¸$ªN“èÝÕ›W¤8XÐ)âÈð Ö¨ˆë@±¶Ã™¢HFÀ¶Ù¸´Ñ2¯g3„9º²…ê¹92&$6‰z”ð¯ÆØ»‘ÚYv¹)RQîÍþL¦67né€ì*6{ª.±±t­#ú¢:T×MXKeÀKÑ÷7ÞågûþdôR"HD¡‹ÙÆsÏLZ«ê©\%ŸŽ”õT·\òéVÙö9J^îZ;%q¨XèÙlyö‘íGs–™Æ¾9˜hpÜ}ûíYcSË`$$û¶™©1§—9.©ËÊ®xî›´*$=¬;M>¢uUW)þ•¤Ñ«·W¿'ٰ㬥SÁìTÂlËNõÿàlhê0ãq*K:ãÓÍz+š Ã~%huæí§e¦mÙ¹&¥—ûzL%µžÅÄÀ­VÊO½ÚªÀ%¯ûDÇá rì, 5N—˜F)¾ƒ·GÖ®g¢5ùPpZlš¾#rw`°FÇ2Ç•³1ðM×[MCe2/<°xü(à˜‡†F4%‘ÄÇü %™£ëÙ$᪇º#ÖۆģdliIŽj).*ñ-ÖSmd ùR™–™Y€áRuùMRÃên€•ejcÏðç¬*»ýÌ|+N£Ÿ>(`ªÎßÏÕ8Fõ2±™uVe‹T5ð‰Tñõ¯rrÒ­ÇøIhc=mJvÌÛµ®‰`®+‚¥eEXÃ2­O£†Õ²3 œšñ#…³Ø¡YçV“Øp1« º9wᾋúþ[Pt?©ÃyÅÚ¬Us7d-ÛQõ#fãf|4¨pjj ªòx·Û󰣨Ùl:K¾Ã,ƒPf¶:”$š.ñ4‹³U©>°µ.ëäÐ]úSi|\ši½ ^¼¤ÁpAôDcö“èw^ÅÙífãz ]Ç9ÑÕ›°x°, ê#Å×Q&È.ã@ô €>Íë$ ážÕ¯nV¾C³ý‰³+ø´FèÆU²ßýËBàÇ* te˜ wÖnªFGkIt5Øš)°¶À‘lŽ»†x:1PaQš-¨RÅ+k‡ÒâÎâOJ²ôr$q¢©bÁ'‡ jjΨ!àðÊ2£bx5Ü»gÎÜÔ»_«î¿¨ý~`øû(˜Ü¼<¹Ø“V;Ó² ͘#-ø,Ïçâ´OTßUÓ)„Z1ZŽ;Ça˜£3„ô-°ý›ÎÁ Ú,’Ga´Æ &Ø’qëùEÉí®oXìQŽŒ)®ÛRRXs'¾œ~{vhQ*HenUv>æUºŒ]Í­=dD$#¼†¶þÜ#ÝÝû =ÿ6 LU4¶óçsŠuGùU17[R3l%ÀØo—§ÍŒ²´DâΞX΋ǜêÓ§(š…¤!?2§öÿš*„ÈÕêÉìj¿§¯@rX†ìI¢åX§pÑž^8/Ÿ1ŽÞ3v¤Pd6ñÞ‡EôV‘Öd´‰¤Æ’Ï]éŸÊUÐ\Îö’¥±y¥8um²®üX<¹wAsÒ pìRL:&æ¶µ|`±Ñÿ—QÄO‹{ˆbͰi~êÅ÷ÅR…ÊCv²Ã|:±ÊÓÓ̱ß´7v;Ë<·#Q”,M‡2™u‡MüòË/ç⽪ ' ¶¶IômG`úõ“Ͷ§—ü»òÚÏ7ÞNÜü0»DÁ§á-v¿™i&g] óv#H«Ãý¡k¦ÖëÁõ“p>’Z×ù±‡-yìyéÜ£cÞ cŒ¦C!ìdÑÎtÒæsñ÷m¾/åe9£…$Âfy`¾ÎÇëþ 3Nbœ(±ðO‹U<Õùä9ß: IÿlÐjw6òÚÕYqÜEòQF÷Ÿ“B¡%Ñ „”/»î¶uñ_Ði’YÙËÜ—ç¶,¦AñMÆ¥ÌSK“åóæ(ƒ–AÁå{ùºOe¦ö4ò¥ŽÓ°o&¹£ÙÛú1߇áÆJÒü…ƒ•ဪ1×ÛÅÄé²iUj–IO,üüÈAZº6»;É «ÇhÌëÄ6¥q³A-«¢­Ÿ{–àW³#€¿ù`ñ\l(â´ð¹¾5- b14‡,g“¼Ð:ų¢sªöaV4rü¯2µ ˜E{ó‘p©ƒc¤#i”a#w=Ò)S«ŽYK?œ¤«\”9ù‰Ž¾ååÓòÓÒ )MSž3CI£‘ïíéËj~ú2Ʊ»áé•J™›pŸPYD £ ïìÛ—§ ùEÈË3ú•KS•q4Ú~þ‚ëÞ%ïW,Ë95¡ÈhJ; 0nqéJò祠oïT³|vØ(´û×…t¾ ŸRŠYñtJÏ~’ä|·Šµ?»*ºC•šæ®Aõ;ÏcÒ¸:9iÍžˆõÇhçlT` Ð*Km ÙòóûëWÿ‚_ÿ +Û˜endstream endobj 130 0 obj 5091 endobj 134 0 obj <> stream xœ[ß$·qÆAÐËý òÀ7õ·í&›Í&•'[¶q KgÁIúfzwZš™^mÏÜióW[²óž¯XE²gذΪa“Åú]_ñ~PM­UCÿ•?7‡ç¿úªW÷ËóFý þwÿü‡ç:.PòÇæ ~ó‹ZC”—wÏùC­|W7mЪ÷mmLP/Ï«/n^~‡µ^–ºÚv¡ï±üåöù«jûíþa8Þܶm‹OuõóÍ·/ÿ°ÞÚvµkÍë«ß^nÖ×n´“Çù¿~˜çñûïhQÛà>M+?ýô?üaÞ†Úà÷[ëê¾×–隘ù|ýëðf:Þ«ÓÛ_7ëB5«e:LûáQæ›[:94¶š÷‹º›Õëa™6Ã~ÿ¤N»Q-ÃaT§aù^M‹zŒW2¶©»|íñæÖÖ!ç«íù¸Ž›§¸ÊÚÚ˵úËr¦ãm\Ý-R 6 ±Y½Pçe|¤¦­;m’˜"ݶÎÖŽ®¨ Ö?ÛÎê8ŸÔvZN¸äyZvê5}á]í­Ï<Êå{¯‰_Wüèªñ(*êZ‘%T×[—ÏÞÍo¯„mp«._ Ç-ÿž7СnˇÝ{¶hi‹¼d:’˜§xóV×Þ¹$™>tñŠj;LPÆÿTqYgkÛwÉRˆb!1¨ qµ…(jUô޽­‚¬˜E¨mm]jµŒD×-DDvdüžíhxN#Iúa?<©‡Ç›jozSÍ÷ÃaQo‡…®Â6¢¡~Ý'ŽFØUÜÚÕ&3®ÎÇãÈö]{ß'Þ6ã² l°+Û¤=žÔïÑ×N¯¸ ÌÝ|PC4¡ÏõUÜçªy:žÔ|§ÞL#ó¥56í’a¼½é\Y„Í®Ym¦a¯6Œ®™¸{/n™ .aN'JGüÒŸW”Žî$”62ù„Ë}š|"¬ákê>Qz"Øt,m܃ÁL1´q‡ ’)eJbY.ÑaíåEAiº i•¯DèTEèDXijÿükÚÈ E]µ—(½Ùñažµç²xk HÑ n¢†Q ÅÔ. F·υàÚ… å ."8%Ô½P:ÔÏkµÛ&°* vù—!¨0…íË"ô‘‚-kË”ž×Ã6ˆÈ·°¦cžAq|–ñÌs¡PQ$6 ‹ôd¯(^NÏ_uFNÏg!å¦ÓÙ6,Tç„ÃŽ¿‚š1ð krì…42ÔòUS‹˜M¸ 8t}üe¥¯(×Bñ]ºC#nÒð¾(¤{±1BŒ¾¢ î¼p.’ ¹¢ôòU>=S`!ýåWØOä®ÅIÁ{wyz¦ z°~m……ç– >R¨ëcÛu™âl%QàeM¦D»„W„îBë}—%f8h€¢C²'E±²%½KJKÅöÅW†Š'±9{E} …ã§EëÝ\R žƒÍ FçÉš,ldá¨F¾¤ š´¹ä¢IÈ(Nü¥"@±úBY…’Jí³\\K,ʸ¨•ˆ%f)&)NƒG0NsEéXÅ háDZkÁÄÙP—Eó†ÓIÉ”> _ù‹@L;GÀ󊳡ŠnÜÙìt›y¾¿\ƒžÃ ¥—{5Ô(,Hsø@ñ"Ÿ–M%§«FeMã8`•}š–ï^ÎjšÌs Ä}æ¹—ðÝ Ï9å ä0Ï>g@I YªWù%æ b]ŽO‡!$ƒvµ»è°‰h?% ».f¥÷„° {µhÈB/âLlÏ.)kæˆßÁr¥ªXN#@ú(Xòƒ>Ârv£Ç»íöºbî®ë«okõÕxˆ3¬×¹J9ÂI®ªHCøK.2ßWEB¿eŠþã¬öó²P#{w>nNÓ||ÁÅ·†æ Ì)5p b[ú…ÕÎÿB3àB·63Š×¦Ñ¡«b“­ûÎS#{ ÕÎU‹ )¦[AhÆH)r}3öã hì­5Ú³Zý'7×Ô®µ¹½0&u¤'ÆBæýö¢ “Fu¾»¾W mw•h_ “ÍpTËiÚï8iBOÍöx8ï‡ÓXÎÛª·ÓiÇPåD— »<ã+k*›Ü½¤nº: GjâãçYë(­"DÛ`±Éï£òBjÅ›ø˶ôÍñ°{@ê6ßß邺¥0›Îdé÷Êf>¾ Ô²E§ñ¸o4ytªï˜<§O Èm¢m»Ì¬o%PŽÁ4Tš"9ܪÉxÒ%žR¯ô¥•c«áîÄ€ÂÚ“¨ì>Ö]lA ß ¤3TÍ j»B^ÁF¿Œ ÷f¿²‚µwÃI¬¾Aô‡ pÜ`¸œ7;5¨ÇÜùE¡¨:v¨éŽð¢»3ZÏØ¥6 :[•8´¾ËØRì{×ôîcè?W‚ýÀ;±•E½ÝÇ„zÚ@ˆ/ÁÔ ®ä.OÁÕù¸n‚ñÕr" &›ßMËi‰@ì?OÙôÖfd“²ƒ]u¦ÿ>RÜÐ]ë«7r/ «¶T'OÄI{´ù/Ô—$BãéÑž)äÆF¬æ£lF¥G‰Á:áx wúlQ´ÑM èQÛ*¢‘ó™‘zÔeàtÏŽ=ãA¼-„ÝùlÇÓ3ÒP£Øv…›K4Õ jRUkX‚Q¸Ø_ÔŠbÀ&dÿ]4·š÷g êÐGì*¸eoBŸ—,žÞ xV½ŒÀ= =C.h2$–Ìê!!Û(½ ôûÀˆqç{K" ƒªøb‘—ÇZ‰)çÊûPÛw¿4 ú&g²0Zøß ½髷Éz\! ÉÌ ¼¨©zaøJIÐðåë\ÆèЦ½ÉX ÜoŽÀV„Xã akõÙõíÈ5ÛkÚŒ„¾ª>aý{cIÿ ï7q¶–À¾oªÈlí›<ÙÓè…â(­ÚÜÕêëQ„Óf8mS_ŽòÆ}§“Çÿ|ÅRl›V@kùÎäÙOÿoþöÁo^UßÜÔêOä b¸±ñ]g~Œ¡{ªùl1¾„Ø|ŽûlꯠZÒϮՄ½f•ÄcÖ*³¡ÌjæÂ±ß&`ÿ‡ý°!gL¨!˜A;²²½ÿj¸¶6º vE °©Q\c‹Ñ­Š¦c2 .E’Qòôª[ÅÇÆµ²«@”µŠ^Ž µ3].ÏÞƒ•ÃêK …4‡ÝgqþC_SÉR²áu:&Ìíòqç2ú¹dCI8ùò{áðùÀÆ!yýGŸ“6]µLaâ¨#¾qZA£‡ÕXÇlÈzM*7f ÒÔ±øUŠ">JæF8yÃŒYŠä9¸To*œKQ”´Ã„Ú:×}Û8g¡$ì;ß§Xs´ØyG¢'Xz‡¨L¦.k.â<é9Z%e”žƒÔΉ§Ì9*“Èù5 N“Ö¾î‹å!3¦1̃|>‘°—œFrèVlÛ1—’∇jв/÷7?Ñí™/9묇^DÆ(oÐf̨VJ“8Þ;fÇEÊ‹V›®ŠGmÇ"½a¥ýBÅ™x¡I"U#Î[ÄÒñ „¤‚@ݰØÿÓéézÊ»P[Ò#õ­l _SÉÿB2£²!-iÖ¹Ê#o$…Ç‚ ¦$×^æ¶ÔŸ¼ÛÛ™Ð|̉P3æNew~<Å®ŽTˆ†.“³pÔz Ô]&ðÛÏ©4Íó‚þºîãó)H¥‹‘I«»ÛÀŒ##}RM¼¨‹‚ø¨P¾Ýßп;Xö@‚ªù0-äÎ4W§˜y>D£L£èàâC‹Æ"“_B¼OŠM‰÷¯Ï'~C­Š-3w˜0޶/¦gߢ©Ú˜z—6½‹¨l§72Ð,¯ þâ{ñXz.Ó—™5—^¦¼ÕÉàüH¯F8lGj TÔ÷4¹ƒ‘ÇSœ²eÇjÅzùŽaë^ ·oRs ¤å–b-ÿÇúê*¯ƒ¾˜ŸÜ˼֡Õñ¥ÈQz x°\÷•iÙÊmšŽ_Ï|qFp˜þ{ˆ¢Ôv>¿ÞϘqBµš<…ÛJä¦&%½)°«¶j«~/Óµ=d´mÖ°ß‹º'Ì¿.©­_¶Ä¡%½z¨5ÆÓ‰Æ»ç)Ê|O燅-ƒ^ðPº“äAÞÖO œTmÜ-4}y­ÑǼ–TýrÇCfWŠQÛ{ÉÔ2œÝÌ ½ÉGÑ¡,WÂNÜλj;&+pòz‚”ÏÕÆzü,Ôh#²‹±=ì¾d$ÆT¾’o¹rIW:¯r§òÚ„‹– ;K2F•ަŸ×Æ6k`EžB¬*©4ˆ§´—ʺø´gT«†vF¸ ò1Œ2o×4úóýǎ⓲ͼjc°šÁ/¬Î>&Õ–²m«¯EŽ'ñªl+Ow´}Oø‡yw\àHƒŸÈ锋z•ÎumÁÓ¾8·ÅÎø€Ô)®Jn‚üËË•¿þýÊMÑÑäÂŽßS5«—×õ;Ú³ò”¦úùo×U~úëÏ¿ô/Øs BgrxšÜ+¨bË ¢xø 1ÞJwOjaÇ2†ü”_¡ÎçTî·†‚îiØ/¨µ§áiŠ7ô–šÁé$Þ±ð¾4çÃ^Úk|‹Nf^O{ÊXÒžÑàÊdÐ FwXêëjCØäéé_¨1üõ ½ž„WâÖñMoÜfÝIN^§§_¹äkƒy7émvóD^vZÆýwGïOºI‚1én'y…Ü¡Ð.©‘rNH8Cv”в”·mJD·ñ$ƒþ:aºôZ1cº&L—¦ÿåÉU¯9SÁ\ÿ9ÇŸAZ¡üó9 TFlÓãÛ)Ü8³Kù‘Ø}]º0z6ZµÖ…Š“p†¥ÛºmúËüH`_¡çiÐ •nJΓæô¡¼VQ´$}›£†<£éq˨|ÈÑÔ’ƒ’°Iq¦Ê‚$|¨1T€{óƒ2z©¹“—Ì31³z°Ž:†ÊÇa¿Ì¼>ÚÍSª`¸œI6TýˆxŽ ônØŒ©­É5·Q^c vé²1þº¥ÉÝçd†4+Ž'&E@%ávNáÛ<Ì “DDgz£g­þc7r¡GOÎ}ô]1„$AVÝEpÿ÷Í€ÝÑèå’r™ÖŽjH³ºNn—\D.½ê-ihÄQo·öG£­gCôÍ!Ñù³ç"îâƒU1ç†ÂRž%¼HϽ¯‚ÚêY;±ÒKÉKVò(†Õ†BpBæ¾LOe#’¿ÉÐ<¬ß'Ê…«áÀïûî=fì™Ïjv¢nîR íáú9P 3}GÞ Ïx¶<xFP´hº,ÝLŸlRz-¦¬öÔ*5¦öyFv¸Â¡éÕ[.<ßù{#Ú¬ÿ:JšüùÒÝwe°ñap™ ÚøbñÏÏÿ#w/endstream endobj 135 0 obj 5182 endobj 139 0 obj <> stream xœ­][\I‘­4ò¯8T¯ÜEÞ/H<0b`a1`¯xðŒ–rWÙ]ÐUÕtUÛô¿´Úçkfžc{Äì®FÌÐ_Ÿ¼EDFFÆ%û/“YÛÉà?òߛóÿ>OoÏÏÌôKøßÛgyféƒIþss˜¾x ^¾yÆíìdƒ]gï¦\üÚ¹:½<<[ýý¿¯^þ ¾X>Nf]¬‡/·ÏV¿áßjOeí«qúËooÿrZ4wuíS­òÅ‹yó°.Q~óŸÛ?}{ûv³híóÚYmýjõ“«kïýÚ8·zyõíË_k²ë”Œ“Þ¶ËŽlX›bì'WQj òË?ÿqsüÓrfíý?×üÛÝí\{]æ¿Í›æu£ÝŸþx»9òom•_ÃjóÚ?]‡´ÎpøØá§—ïa›ýÝôòas<¿Ù=L¿ØÜìïö—ýî¼>®Óôò«gníM¦†Ø_n§Ëínz¸úѳ×&zeÐî@ ´0± Ô|µz·¹›No¨É½è oÚ Ó7«+he\)«›7ëéÅŽd³[—¢½ß¬ç˦¹’•¬ÿXL<¬“’mÑέ•ÑÿmójõÍÕÕu(f­_}öŽ—PÖ.gþiX†¯V»éætüìíãÃUYãªätÙŸŽgjvíJ\Ûš§k딊Çýùv¬ku©¬¶?¡/oˆIÛgv]œ#&½bŸßï/7·ÊÑèe±¶UyûüsøèöóËÝ’ï1¬=lùlsÜ.z±°3sÛ»ÒÍÍÓÃãùóóæ|·è­À×ú1NÒ3n7ÛissÙ¿Û\`a(@¶$*çÇûû«ë´®9ǰ:=\¦7§¡Mpë­Ò~àE7ÁÚop1®]WO­- M6‰ä,oÚ<¨ÇËþfƒÐz ^éèOÓæá*ݽMÀ¨ãé"âi×Á+oiƒÁ,¦ãŽ6Œ”K ^Ÿ·9¬¶"Üa­² £iv.B‡Õj£ÃiV¸½®MD§WØæË—Ï~Û:¥é=èæ_? ÉÄu®S*vTâaÂuºC$­A#¥JÜ7øHtCBDö³W$eD€Ÿ–P1ØOt­Ÿ Ê ÌH:"‚ Ä‘!ߨȰ*r?É*’pÎÑ®ãÑMU$Ð|ÒºÔY?° ‹F¥•ZžP¾àœ}ÑU‰>©"ˆÇžÅo±‘³¬˜âæ+ÄÄÅz+¥¼së*4œñëîÙ ì; ‘š‡ñ •²Ö,<4BYxèÛ³pŒ¸KHAnRPxÙf¢=ܳ 8ÿ‘ö07?çœj‰¢ÏˆGá9'pdÎ;žÎU‘2˜k!„:B2S:ÒŠ™‘$Ƭ«ÀQI8:ºHGI2zZGiUQºh]ÂÕš}¾âT‰–éìêêÊèŽùÞ‘\qR¢®ÂÊ^1Ü3žœuÖsJøÿfˆCI¹ŒU:»¢kW^ìŒ_"<DøüÎ $KÏY%¡!Iy rC‰õ˜ÐÇ.Ï\ÄÊœï/ÔC‚D–pК¢Ib•ЪÎõ1 $¶êŽK–÷2ÚeÂåÂûÝÝ;1°N¾±,?€dY{a͆vè±ÀÚ"ßX––~à‰3ÿOœy?ÀË< ¹"ˆjãØæ¬ßXžs ¿ŽL1= åtèTŸ2|ò€&K¶i©Ãˆx•²jäünz½:9­›^¯O§®ÿÒô_õ¢Ûš¾©Žå·ë+Ì5Ð|†8ëOÝY»¹*—Ö;&1yaæ™.­ov7Û¸õËK›šYßâ/®= Þ¥Øæ\uÓËØ+`vÃÖ{«#Vì-BBĉ½EØl€ˆ½EH)ˆˆ½è ÄÜ" b7Þµn@*[0'Öô…[‘ù ² î$q· ,õ"|èˆ[‹ZUÄÔêݸÐFå•x‘6+âp6¶è 1D1µí†ÔK‹€(ˆÎ˜—`dc·E‘öF©ÞD nÄÌZ² ÅúÉ‚‰™Õ+f!Ì:Óˆ“…u¾M°0£ÄÊ" Ó'rºY”%7Ò¢¢¨‰ìê…BCÏ;b_¡CØ®²ELÖez7ëÕé£m¶±"˜ÿeDiÕFWĉ‰Õ[91±ˆìVg£w7 a›³ Ø}‰EWX‡A¤oÄÄ1±!±tbbu¦ÛÚ(fHaX±§HšÂðÜ‹k@ÄÀêÄš‚eÚùÀzXgF¼ñÌ4kœ 3%LˆW9B#‚Z‰i5 bZ ­Ä´êô5E׬<0bHu>uDyiJã·-¤H¨EzÓj@’òÒÖB&*/a¬¸@`PîÖbc‚Î2¾û|ÿp»c ­A€Ÿ8RMÍL¨Í™f|s"/#Y«í–Ø.w¾˜6?6¯ñê~Ü@ãÍeBZ¼&)ØÈÎäEƒÐB5¯V»#òe»GWéæîî ~:Üïï„„ð!pdÒº¯êÒÄ)'ž2ºs§—W×xn¤šW_½ 7싟½ø }¿?W/î¬N’Õ=ûp]26µ.A³!;ÐGü(q>À”ž#AðãŒ;É÷ñ­“ñ?½€c… 5á§bB¨iÑôu4'Ž|ÊZÚ׿ýZ|Ø`Ï[c›ßáñævºkÝ>/­íÛ+WÀt˜Àš)à#úÇ`?‡2îžc5çøzsÞOG\Óíæ(ò‹æÖwHÀv:ßíßÞ^ Ñé8]NoßÞí¡)|šÖÙÐȃH\c](È:X°rŽWì’Ï´â×—iOÂ%ÅÛ œÇMÈy–¸lp¸p´ ˜ÌŽV 3$²-f‡¡ÇÐgg(Žúèïµà\È©/T±(¨Ñ®vgÔÙæ©Ñ7RÞœï¶0÷‡-Pæ5ÏvìÜ‘–t94~ظ§+dz1iõ÷oN&#W¯qÔìêÝž‚ ÕÙºz! y&G¯Ûö5,äÇ÷°%êÒ…`!†&.õP…À!žÕö¹ˆ5žYyk—X©žŽ;VGFAaµåŸ £¼B½}‚)ÓJRÁPÍew¾ðw°œÕ ãpÍÜ¢PìAiì/ù™àXþþ†ÔÂyØÃV¥ÍBÒ”ì\0°Ëƒ}õ‚å!bh{Xœe­·jèÄîA¶--¸‚y¢£KzNè"¨qZUc”XçPŒ9DU<‘‡ýQ‚eæçBÓ• ݲCp*7›ãôtUà̪8ú1IMázZÁhja\’ä]—ä>"É9‘d¼Û’Ñå­§—=jf â˜N`«Ç¾oP±²*o4fµLŒ¡ý‡7jp=‡½*óÓjQ†¹˜a3 :ðêwjm•éÝæaOƒ5b}zØ¿ÝãL©dPäo6‡õô%qE7€û.Тîô_ÐÕíë(Þ¨;AvVyÜs÷píp-{#dz¨ I8jäça³?^Àò9Þì¦÷Âþ°ÖÓtÄŸÙаìwk&œ%W°Ñà˜Î+içàÞ ZØ¡ K{s:¡$j¤ºŸ4ç{6„Ú}- µìÛýg;]K‹°o§íîÍæñî‚M=Þ|ºÒË™å@­?Þ™`C=îÎ?YD¢Ñ¾ï'™D¢—e@„ ŒüÁ”Øî>cƒwÙÔOœªœ8È™#'-Ð*á^‘ÕÐįå4F|¦Á‡ì àÂ+Z6ù ½AC,N u‘ý„RÙOHtg³ÜZ^ÁíÓñÀ›dð–Hä+.!`œ’ÙÍFHÂ~àŠ*ý$‹_âøÚˆÇk7 žï1€$Tú†[€ôÊQ?IzFǪ|µq¬bh>=@½ëÚXMZ©ÍŠxZ{j« ßgaÉÂH 'DÌE‡Ññ$H–oIªm^Æœ ‰Ç#*.$sãÐåhdôŽx½µÂôŠùX±¶ÑY02\ œÌ0r«&/«Ê'p’Ïh¡€è8jbÙÕ9"š‘†&žHÂp!…É)™ú1Üs¨<{+´Ì_17²Ø»u] VZµÑ"¶âÐJlE"»$ÅùèI¼×šö9‹­H̪‰EWYƒñD¼ŠJCÄV$Å÷D#Óñ6#à iG÷ pUú;q@ÄNìÄ(t˜~`g@ÀT¼,“Qf@$6"Î r€X•£@ˆ÷µXgH±·ÊE7§Ò7§¶fáA‹°ói@„—9)¿aãù¤ç¨Р¼„V¤…²W^ú$sîHeîf±a†–ÕPvºÍ°Pȱ¦õ¡HªVõ­ËJv‰”u£ùÌgWJMøƒèñ¤[ÛÏ¿K‡$·¥Ó±’Ä´s˜¯)ü ^¹Ë¨ÿ3º2ßXÖ®½0PÝ|,t ¢ض9gÑÛEæÜΚyÎÙ´ƒO„FÔÅÁB‡MƤ­Ð”ÓaD¬ :Gfª½7n¦ÊÑfJ¯!Më¡…:×2ÐO˜k½”›ŽKmp;öó=,D—Q‡š…7Êâî"ÚeV-Ä/N—[ñé8ÊI†Ó¼å\Ýl»iOG/‚iQã‡î oÁ<¨5Ô{¼LïowG A^{<`¬ý­q$~­¾FrŸ–è›k‚# nz¶·bÏ,91¸È^e ãÛt±,KÂDC8в”È®á“õô«ãt8Ü>Ÿ6wwÿ&O¿‰bÀr¥è¡ùt»9nwC„T¢3lÆ4Þ1YËPç·{˜.§…±Ž·þL:ïŽ[‰ÀBF—-–-+ýP[×Üì®i[ÔH-¤ˆÔäŸe¹\"•í}öÅææÏ÷Ó×»Ïþú‰š8ØÉ–Æ{ù¯}Ímî{$泿b<‰ê™.覧Ð2ê^®p8…ÚæÌö”3ø¸m!ÑVšˆ.a GêAƒÏdsn¼~þÙÝîR|ÆVn‚.U—œ P²=í¸1ÑE´ºª”–e°—Z- ÷N Jª“|ˆó¢ÓHkó° SÞy``º”¾cçí4"{8l0Ðõ°¹¹€Ø|³úã² HíÚö|YÃ&ø¾¹"ÉþõãÝÓ¢„ã4ž´úÇßþö·%«AuiïÓ¿ï\àxí=g2ô ¼g2¾x<öG˜ÿþx¡­ˆ¾úÒØ+Ñúèãjûx#Ü ˜Î00˜•ºàÛÆbÏ[àÂÁV2¸L…É`G8]¼Ü|o7çÛÏY>?¼ùÛe$¥‡]nÔ+1Çða„ 'T‘Ä1³[T çÛop I®~ø)®(®šAbµ7·'Qw¤ÇA%¥Üb‚9‰´Ê6¬p¬N¯7¯ïž¦{Žc¢Zφxà]ãÀÖ”—óI"~¨úa³§ÎÁÝ›)Aïœ9ú0jŠÙ>gY‡ëŒ×T•ÕNÒ®=Åc¦ÏCwÜm$bíZi¡‘œ™-æYOÐ÷{Õ0§‡í™•Êù²Á­Î]ð€ä‘{¥»³èBN§1ƒzF¹œ¨ÚQ‰C›B‹È;8àöýxs`¯ôrLLygÇÌ÷η»»;dÜãùyßÕÇítûäCш…ÒÈDåáÓAÛþÐÆ¥¼`\+¶¢ƒÿhÂþ²øÖ”MÒµ>–Ûî}-JŒ¤<=^ðÔã„-8÷†aX£½}Djœ™Ù]ÌyÌ~À#ܶÄãy§™X5:ðþBU½¥â™½úìAÓ¼\H-þêe´óeÉWâú™‚ßÌ”.ÂÆÔû*²L"î°–²Lš…ñrxz<^°`¸‡‘†Ä‘qWUÔpVÍ MÐEKbaOÒ ª“Ð*"ÔYWIxjû¿å ³”‡à¥'••‘õQJðßK9A¿k·NåDêuÁBúàLê)R°ùÎ’]‚)h@MÈÒñ$d<ó9/[p#Ý H©.3^­æFCHެ†Ãæiéì¹p¾lçjCòÏ|*;çJ×9¿½Òô¶ÍþÂ$cßÎgI7à ¬¥¬~Á°m(8ޤäú ºèW,STU4¤þü³F§æÕh5<œ±m”ý²Ùn™Ð˜ë% îé[êêâ©ê ÃMUåði™+Woô„aïs0ñÞì—6^KSxþ±ÔL ·8ŸßßîonÑ\&‘Go{ÉÍð~¿X8æ’[3³åØBõaØ<åàþÍÓ´>¼Þƒa‹i˜íêI-ËÍy°?›™¢48’ƒç›·§ˆ:Õ†w$Km8"`‘zÊ&öN£Ì »ž‚RÁˆ}¥¨íHƒÝ DUE2øFfkаR¢æšºô×/{öQ'\ÏèÙWä10.ñ»B#;)óí݉ÝR´H.FC$Ó²ƒ®ˆ[+sˆøÉÛš¥*ܳWŠ™1/Ãqn\¤¥åRc&8«Ud`æyvz ¢Šˆx~!ç) Ija=;OGª³ótä :9©RîÑå^fG?Qa–så G¿• "[pdBœÔøúBe!„pE¸G?!^WU‚p­°¯Žç< ‰çŒµFÔO0UFoˆu2º¶ @L3+`>¤ ,C>2C®X£É˪òI)Á?ñ¬þˆî"0vDœv0la~HDw+!\܋ӷ²=¸œ5`b€›õl(ò2 %o¾©*3fˆ•V:zGĉ8´ R îk”ͤð»Þ‘Èû¬ `Ÿ³x·`]ÓîIl•-ÝKß>Î+ž4jE"‰¡ì8c8PN(†5 ˆ¬ƒ$Õ9P¤— …àñRÞ9©úFY‹scLxY¤' €(ÈJ8έ ‚a–"¬^D:˜"eÏÉRžÛ[%ÙšÂ&´U °¾ÊÎ85 ÂM@„ã%Šꈗž½Ê@Cœªج¤ƒXs qÌ©Ì_LU9ÞRÆè&3Ú#=éâÉFµ­Ë ú$ª¢ÇX'éìÐÄ?ˆ²i|¥ªÆñ›B•„dYUGRÏrÀª $„ë»}¦*ËQûgªÄœ}CÕšc?‰*:DZRhsVýkۜ囘eÎm¬dÎ¥{r4¢.Ž:jPwÅ®ž#RUȰÖuTä7*ò€/”ž ƒÞ«¢ÓTÏ`?e®÷0i®÷æü~%àëG*zcGrº fÊ'Éhíeu$£B|@x‹j> ©c`C¸{u£T m÷[¼¹‹öÃ03•ɈŽY[Žä{“ÓíavBQ>ÊG“ ¨Ps¶É ™½Ç¸4€¥zWü̺©zÖ6|#v*dm V<*çǽ:ÿ¨JBÊ<¾÷åZôåÂ>ËO›5§Èþ(¾|ZÊ}}xšØñ…;¯ç;?‘-› –jÈ…>h¸¥|ùN‹¾5%Í@Ä?^)™ÿö$)×~ȧË/ò‡©èËÊ LÇG^)眴ïÑÏ ×¼7§»-\Çás³»¿´÷Ì|½gÆ%è^X>gfÖÿ—·Ìþ7mþë“mxìwùæJªÜ°Šöã·»yÖÿp»“»_°±¤1Û”jÅ´Ò ræ_­´øbv½a&ÁõKÐp÷DUS³¼™’È®í.O3t¤ÊÓ €T JQdÎ766EïRC@S¶}!@žf€k•;,!–nP¯O9ä0ZAãyš4=è Nó(™bÔI²Š€%ÄÑÆ9bäiBhºò4CïÆ„6RA½O‹´2™Œª˜ÃV‘L¤Ñ D"ROžf /BtÆ´|5É‹D€£™B©¡‰œ’‘¸Û9›(˜YrLžfèH•§\Á·šˆuF‰SŒ°Îëhx&3q8¤ÀD}"Uñ€PV e¾X防bFªWÊŠ9SÉëÂÙ1‚PVÌÀñjŒðSêy¡¬BX¶ª¡¬—­<Íથ¬B8s¦ZÏògå¹@’ÌYžTpÓ9ËC ®ú$£w¤Êè­Uð2z+¤6: F UF—§\ÅàxYÌÓŠïLÍh¡€™ƒõ‘’d(ÏGÄ¡™AçDà¼lNÀe7ëÙQ^Ê ¡ÜŠÅÕR.Í )Òª®ˆ‘§z+#O3@ÏN6¨<ÄÐGïˆ'«kÂ6g#O3’1ÛDWX&‡£o¢ŠJCäijEbiäi†Ætª]X‘¯L›v"õB•ñ~ŽÈÓ ½‘¼Å@ò–ç€üèe‰è=™Nt<ÍH@§¥7ˆyòNPº`¬sD“z+MkSúâ{jeÆD8OFù4 ÂKD”ßN´PGŒôœ›(¢YP¸]Q ‰îÒ¸’ˆ»ˆX™O¦M…ù–²ÍØKšRÔGC¬RMàQc7(øLœl4GêRšð[Öã¹è–±”]3~c‹M–§¡ìêÙ‹î¢ìB8+¦šÀbÒô5”]3|S*e× ý”xém¬Rm›³ªöÒæ,ß”ÀsîgM±<ç¢)£z t¢.:lP{åДÓaD¼ \ÂL•Ç(GsSåø Q˜+=EºÖK¢Ñš–‰T67jtÑÍõÎ|‚ß/s³ü˜ºíi†²ÛÞÄÍ&ÇEŷã>ø,Äcª#jLR[ €ÂjVm)B|l)BXщ1H,)üóÎ:]}Ó_»-åñZgÓ`LÒiÏ5ˆÄñXïˆS„øÑšêý¨5ˆðP­)Bò`L@R¯Æ!¬Äš"„Ô–šFmm7·…6oÔZ1Ñ›=µäÕ„P{ª#jORs €*Üóm†µJ\†¢‘#HŽ2@\;ƹd'`-z˜>Öf. s%Tw{Êã[a%ÌØ®¶ºnBϳ„0lBO¸ðV{ *Lì)OÁ ªãñ¹˜;Èã“2uŽ`Æz¬'Ú„Rdtm±äq6¾¦££³l`ÙC ƒ=åñµ!“ƒ ¾¡TË¥àñE¢Ñ¢ê€(E«ˆU *Zƒ)ƒAå£hõÞq>"AlÂÆcÑØ#¢vµŽÞ5¨z+5¨ g+›Ţ>zC¢œ2] ۜՠò˜:H†¢T„õ«Õ€ˆAEH ƒAÕ¸Þ *@Ÿ2j@‘<•¨ŸfR ˆ˜TC+1¡HæÂ‰˜ ÚÍ(@*ÉJGy°«h‚e0«<½´å³j@´œ¨5ÒÚR%r³ª#š Õ˜5 zp« åC;¦’«ô¬Õ‹Ñ:Dz¿i<¸‰8fD±Äª$ÑÖj€rMkVÕ€ˆUE­Ê\c5]Ì*@èI¥n2y|wÏ„Á¬‚9'RÃ7˜%3ƹÅ6sÖNün2âYTú1 þ†á›”Øšîý$Ïkïcá›Èa0«<¾œhæßà³ó±ðýå0˜Uí`¨:?_èÌ¡GÔ«ª^EÌ99µU¡G1V»BÇÇæêLï)ÐÕ^¥¦Š†žµ›i9çš–SdœÜ÷«VÃb™°Í¢ºÙ˜×~÷)2?v5f›: —ÅL Î7m&×—Ûýåô@Ï9|½yËžÔæžúÆÜÓ 92)%àô‘G³Æ?.0K ÄØfóK²àŽæðÓ/þ«—¿ýýÕ5Æo‚IúÛ{œÖO¿þÙ/¿ü½t×gWÑ…Tæ¾Ur >hš´„Óg8ÑѤþ†OQŸ_,"LðÊ¥çKåÕ›èÕ刃Z®5Jþ¥LŒO8ŒÇFã{qx—þW68Oýç- »•‡vÐî2˜óÀ§Ëþ°»¢¤ŒŠYQ?ïnòfgœOc3L]q!I³é°‘Lßk¬EyÈ+å,›Ýñ¼ÿ9^~›W>ô8NÒÂ7œö˜/¥éçTIˆ£¼Ûìéi i§ÉaƵrG¤†$¤çžŸrqþ»^áÙpv¨©±`í Nu~I…üᇛ6ò j6ÛÒÃOg‰¥à³Áix›cÿ/RIi×íÕµ”$inç§«k|:0™²:_v‡³&¢%L¸tm&cÆíæIÞk ¶?ÇÒ Ã6P }4 zŒ/áÛ+Kƒ»¦ÀŸ'y` ´Hhùt’Q†Ñì6ÎéñÌïOqZ)f¨ 9éø¢Ì2Wæ=~ònÿ¡&°=oøÃ¿ÐA/‡…8dÏŸ–¥pïitÈaÞ:›£$ŸÕDï I–+ÑûÛyí¯Oo½\Z ÿIÙÓLl=賋$VbVË,ï>Z7;††&Î0eQ‹Í’(<Ÿø9<îKûlÜÅÊ aOZÌ@‘%Lââ¾|4óãOؼF·TN9£ óïžý–ÃÜúendstream endobj 140 0 obj 9388 endobj 144 0 obj <> stream xœÍ\YodÇu† $̯¸oiâMí‹<È–bɰbY¢”ôt7Ŷ{¡ØÍ¡ø¯m'A’·œ­–{‡”¥<8ahð±nÕ©³ÕYªúÛAzPø?ùïjÿú¾ˆÃ7§×jø9üÿ›×ß¾Ö4`ÿ¬öÃO¯`5ˆ\ݼæõü¨lÖCLv4&Wû׋Ÿ]\ýÆ&FçsŒ0üjýúz±þzw·<\\ZkáS½øóÅ×W¿è§v~ Vi¿øh:Y•V:È7ÇýöxÜüá÷8È*زò§?ý'X§½´>þ~é£Î8L9¤áêèúüW_~ú»á´=¬6Ãùñ"Ž9'åÇa½¹¸ cNÚ,VËõæ4_-®n7ÃéŽ(×ÎŒ¾ÐƒkºÑÛœœ@«íû«åy{<œ†›ã=Óäma](›y»Q¬-ü5É_—‡õìcF¯ËŸ÷ÇûÍìsCŸ»Â÷åÝí#ÐK‡ÿ i±¼Ç½&ëÄýX3š³Ì»¶‡áúwÌßÑ_üí—SÁh=ÚX¹ÿ_sîçQþ„ÈñÅ׃ìéÒ‚Dœ Ã¥6L+,hܨT ‹ŸýFô£,d P› ÿýç—2cÔ¼Îñ]»1he ?6 ¿KP'•TXˆˆ] ‹Õyûö"šy ,Ù=ÑòÎ)U¿º>< KâJMÓÖ÷i% ¡iÀõâtNçÍÝ…V0« ‹†óíæDZ–@¿ÎG¢ÃjÚ¶; ¬V:Œº(ц¦M£nºÛãým†Ûåýú½Õ‘”O:¨*½ “ãl³Jty¾Y>ìÎ'f¿6£uº°qèÇW¯ Âí|cÿÅë”ÀzR¢¶y„öâ@Óò°#ÄÃ$Q{;Ú‚D‹@C²Ã¦ ä%ºÆg­Bü¡k W@U3)ˆû Œœå¨w%Ä]lÖÛsI9…À× í‹YhškëbZqw\Í&£ƒlªD”wB\²5ÊÄýÓöïï6Ãæp¾ßnN ·ÛÕ-Åœ&A ’©!ÿr·;^”pü±à ˆŒjnÈÑäkäÀðpbî€ÃÒ1uƒ< ‚øz ÐXƒKйæ¡o1í‰AEd.EÜvÔå÷Û5±w8=]\ˆà7û3Ã/—gø$ ÂÐΫ#$Žwçá¢kžÏ€måšl.b·­ãý.4f`Ê”´Ka"Ýé¤-O._ºÜ8`‡€,©Ê<ðšÁÐ^a«œêøÑ½˜éÐ^A•j’w 9oö ú¹ìíö¾òçx؃‡·ËûíòÍns’„¬™ Æ…Æß~úåo>üå\éÀPƒÑ/*týûçþüã/æÉlêgØÞ݇lÐj-BEFhÎæŸÎk!ú§Íy®8•‚!«lýH™pòÖ/ÖË'*æh42Sà›é8mÊûý-hêÁ%8L¥³_췇͉)é5ø­Ù ê ¨©Ô ©I¾PlXt× L´ñÛ›£X •Ù¾Ž÷kÑ7ˆâPß–@YÀ3B0K®øL Šèòír»Cñµ¬<}½)Sh.~>Uše D±aºøy¦YÄv:4®NO>yàœtºz©}ø¢eÑÉù]ý:ævyâ×ÁBétêü_Ašÿ‹âÛª¿yâÔÿÁZfê¦þ¸lY{]Ío’¿qoâ 9ââëŸL[(—”gjìƒÏ¹‹5O¼P¹Ž—üûÅǬS¡m—&q<7 ßg¡wTuÊÅgŸ}òñGŸ^ýê‹9] 'M7²æM—çÈú\² W2-¤¾ =ü‡§M`ã]Ãâã.­$Abq«¦ûß³êG°¨Oo^æÏ¿ÿUhùa²ú@ËÏŽû=¦³Ä»"­·õnR•~åVœŠ»¤w”¥aÊS“[Nm!äÖ9×ZEÉ‘†íIò*»­•H®h* TIl¨=¹NÛ=$7÷œ(u‹É‰ü€ÆrÆÒ!‘3BÀ{ør°‚$ôg>b©²"à±|®ñ/ žc}B2ÎãR'cç#ö…"!ÃDB4ûN@uYcÌLí +:åŠõ¦v2;æ\˜ÖÃI\n¥~¶9À±¾úô£ŸÌÖÇ‹wΖåaªK¿X®¥«·ÌñÊâK³ÉYV–÷7»5¨ùî”îx3,w»aO+p_>‚ñc!b·}+*ÁDóRR. ±úƒ“мÖÈØøæPÜeÀ ±˜ÐâãU ìzDÔa~·M.ÎGVEÜy»°8=Üñ] c»KÉx 1ó¦aƒ²'ä½³ 6"Þl8-÷›Ê¼ÕJæXÿ(—ðþˆ­3{ñhÃùq»ÚÔk΃þË͉.ϬykFbe'¼>!žøÛ<Å¢qÒP<< ®A©Þ\x˜¤T¯ü´û@ýcyY\ªRÕþ§‡{˜ŒC,e˜êöâÙ¬.¾Á¨9ÖËBïÃ<‚$¿ÞéÆag¥³kÒÂÍé݈Ãá­PÑéWxv¾Bÿü~ñó™è¾ xù- õ-I7Óíé3óiÝMxÝ_Øæú±^… å‰ ØÃ_Ó ¥º”X<·›Ýû|ãÆ@4鲞ßJYnÿvõ°;ãUž‡;¼f³<üLGg·8>€;?ÏàP3¢÷–#Ñ39y¬L^±ÊâõÈfnëÕs¿<ƒJïv`¯÷4ÝêXOHošª´ëi—tA([V¼h¡ƒ^Œ²nvѧv}úêÖ7û£\ú²õ*ØõâmõÐäÞ#> ñ–}ùƒ˜`u³šÊ¶æûݬ8£^þ˜ רðùH¯e£\¬ÌyPÄìlÆ@csXûó0ïüÔ ò¹0‚"+íÛ‰ÿvyØž8ÎÆRP==ðRJ¹XU9U2!Êe'úó犋<\ VvtgëxÃîls†!*Y|GêÀû ÉM½“ɽӊ”Ž4ËÓRÂ|ËQßJ•[ž]¿cÝu)lRø¤d°øÐ‚º’¹KAļ_ØŠ€¯¶_ ‚ïYñRKC6 Häú>! çIªÌ£©û ˆ‘êDÒT9³˜C*žGSg—ÆP5ª³Ò<\]Kšzó°V– FC"Wó 1D“ªs'šºõŒi§:ÄÓÞCÙÙ"¥ˆÆ™]æ.Ñœ2#…fÙÞŸîÔ•ŠiåXûªpÞ+©>ÎäEµ"8³Ü¥hHpÜ¥ „e˜*‡²ÈP—ÕŒ‰9©¹'¼ëDc‚T“¡[€$©Ï&C7nzÞ[º‹ÑËÇÒ} @´t)’¥{1½äm©Z©f%G·z-sto'uçä2s:9éR$¼•Fˆ/»ðiN^ê× ßgL‘`…f_´ölfH–ÕëWÉÈêu­êê¢)ËêNºø¤,‹Ž‹T3Ýzë¹QU41S•øÌõІ$©É%X•äÞ!Ôq"„ëÎ þ•ÅV¸Òš">{̨F9A<Ö8{){Lê§H’¯êê‰R›n_éR¤`ÄRƒô$Úꉆm®éa¥ÙKý2<äio¨H¢1¶hKET±¹Y3C’.E•{ˆ•c–= ¢ó>°ívˆ—y‚t)â¥KѾrÒ“@­³3„:„ˆ ™µ¥!шO²Ò¥@ !¥ï…H"O¦¤.__êÇõ+_º‰•Ͼô´ª,|žD•WCŠL}¨r7â‘¢df_5¡ ¥ó„_‘Gò¥ó„k¥XÊhåBOdûÂ[B! ÷ªx’‚¸\¸HœúãX7\,‡ï5È‹‡jJüz(¶ã#û„6Æ;ÖìƒÔ½“gs±œ{T¦b„;É9Ö–v8Í©Á{yÓy¬ã½·µ¬®4‹UšXi–1Æ Íu-£™f¯êI(§Cãêô”á“'S·¸x©}è¢eÙÊù]ýzö¬AͯSÌ2õiþ/ˆo«þ&{Ößæo²­Þ®  \—"ó+&‹=)éRlVë°ËºÚòöæêVR*GFYBËú¥Pò`³<¨¾/Õ¶úäàš‚s¼ÄímZ¼}æ}Н‘ÝÍÃa…/þ—»-$þoΜ¬lO˜÷¶ë¼Ñ #û{"ÄýöÀO0ÊÞî¹´“ñSêž/”•O îê!ÜsbCU]û/­¡¥ðb-…†Z4,×ñãcl¬©1>–P¥T+¡sˆ1¾:s­ÇöK›‹,Iü;EÓKñ‹.±xŠÅ¿OÞûxøòŸãýyÐK¯ÓSVpõ÷×tó¨$Ù(*ˆÅ1í¹C±¼ó|oÝÕ÷+¯^­·'¬5½ÚßÎ{ '”ÜaÁ/}P‡06±©WdUôî/(ÊãíæP: `Юæ-¸—RY£­cêGuZ™0 e’0ƒë©Õ£%;^ÞQYxLoް°§cysd»´Ã)®G^u˯Y>Þ/W`¶¬÷x8¿‡ePÍÏ>¡‚»$ýx³‚»:Ê·ÒWBgû‚ßgŸ \²x7;uÄpåz`µ‡8ݧj.üSøú¶šË[|±Å³\¯·ïñ+³ ‹ª%x¡$¥È<«¥žª£èô"ƒ=Ö²ö÷ê^f© ÔÕvðqA+:ýn—ëAJ:dÑRÕ’h%·=þüP+ä>®n÷»óæðžx6<*»žŠe1r­p>¼9oîYQñØ7µ’ÿª ,@ÈmIån€·G¬šËTàúË'Ï4Mj±•é)v5)"¥"ããa÷ô\K Ú–yõæa»[Ï}>¾Ë…Ã}Œ~_ÆtE´wjèßs©ÿ-`só¾žlµbýnÍL±>”¼ßÜÍ &ÓÏßåzç,ÎnssFszCŠq¨®@‡R=#£D£F韚ޖ_u¡Goµ­<ŽÕ'?ËÝãò©½U; ÈN8”Ø^âsï®äx½xÃeº˜­8‹ÜŸNÀv+á¸Ð}f2¨¹ö„8Àáw–þõÉ­ç ÕSq³ uo>¹^5—"þ0GýÝšï³òK«@}»vËK–N.X®bñõ¨À§™)1EýsÔùIóiñ ÝÝVü½£4@$&ñ ”¼ÅCG;ÂbÊ[µP“ñIªÆÚVÙCñ#%ñ°Ä?yˆG!B°l!fyøQ·‰ˆò=»ú¯˜í1ËC¼™¨èV«÷I<Ã+UõdŸF¤g*sŒHÏWŽ–•–Wx€€¬qŒ‘×O€@vN\—Wx€aÂv¼‹:• º/Bä X:Èœ~+Šen˜¼‹*ˆèÞE%D^á‹wQ‰<ÆyÖA“Ë.ðÅ ×Âh†x¡9ÍÀºÚÁwYÓ¯¨7Y+¦ºº¨VÈ„BÏ_á‹Ñn)ÖF§PW´_Ÿæ³ÉSDÞœÀê‘ÄÞ˜’|ÙƒL¢xZL¤'³â/'MŸ&Òõ`ãS@ñuÑÈÓ»ö‰¼¼À±aÊ3»¶hYXS<¡SË«;òèkk‘þ¦r®Ÿ®˜þšN`+È~"e­ ‡‚¡‹†ã­Òeys×%oîÚWJ^Ø‘Žù’ð2!â/ñ—Žfˆcï£äÍQ˜ ñEý¾ òæ®CäÍ]÷•)V)> stream xœ•\iÜÆ™†axaèWð›znÝÅ2 (;ˆCc`Y°9ÝM[}Œ›lM&¿Ú²ÇÇ}¯*ÒØ$¢§É:Þû¢~¬T­+…ÿ‘?×û'ÿö—X½éŸ¨êwð¿7O~|¢éJþXï«ß\ÁC W7Oø=]i§ëhM[“ª«ý“ÕÏÿ{qõ< °<TÝh /\mž¬¾â_óJMm“2ùÇׇ7?¯›TÛ’<ñrþº«/¿|·ùáõí›vñ¶µÑùíW«Ï..­µµ2fuuñúê÷Ó;é:edµÍr!íjÕ(ýè-šÔ8ùñí÷íá‡å9Tmíÿïõ×Ýí{¬m¾æóWc]h÷Ã÷·íañ&Ü6ÖÚÙêÒ…:FðQ] ÈÕý“Õ»ö´mCu¼©†Û®Zí£®•rT|¶Ág_­6]uÝö<ÙÕýES+­Œ_Ï»MuÛ¾+@W:¢­Öpº˜Iß]\º:%X‰wµÎ¿nªáX]À6]?À;V5F¯6uuu»í«5\òÍ…ÆmîÛ¾:6Ýé#ZîÒ(S{«Kmˆ"Cûï£M-‡9´tïîPmÕïÛù=á#^×8 ”|XrÇ5JåÿþÓÏ_J¨®ÓÈ[Xø°¿­ÚÃiJˇ¦öE9B²´µ7Cwªöü´… ‹ ¾Zñe醬 EDá@´ýþ¶æw…ëFûÚ!ŒcqkûÏÝ©Ýlt Ñòu¨®þçIIsõ¯¯VW$ ‡ßœOÈT Ô>Þ ÛãA”ÆÛü¾²µÏ'úôÓîÐ^ïºO÷yÃn¹°È…|µ5ɲI#›]€mÎw´E€’áá41¥d¸e2ùÚuÍ4u£-é*æ­Qµq™9oÎûî0ôŸñ±Ê-@MT@8²èlNÀ’ïnNÇýâ^ÉJÏK€ÛØdï÷ív·Ý,€(±­ƒ%¥Z=C9Y¬Ï›ovî»Ó¡ÝwßuºC,˜/šT&'jHw’:šÕCÕ®‡í»6+‘ Df³ý¤,‚–Y äÝXM$SλޑVÔÆ§Ç3GVžìþ~iû ÕÚ͆H®›‰±¥æu}_í'¢XWÏw;±={°(ø&˜« ²­c}hj­Ê1ÀŽTÛýÝ®C>NM *4Ú°—_]‰ñ­t.¿õ§ú»‹K ÒÉg[²jߢR,¤Ú©¾;öÃRã-h¢ÉBµ>î?zaU‘"S7†o¾.ÃmIlÁ&‚EË:,³uôÅþ,éTÙk\Œ¬ø©â+hÉ@.®Œ§=¨Tÿ–,‡jsä‹Ã[È»Ãq@CO4²pÄ$ê¸zÇ:ÔLü1¥Œ.Û‚‚äcÜí6|c¯@jÊ_­ÚÃÃÅ¥qó¶Yíd@¬VZ,˜ µÖYk³9FÉý¢;¬» ­ÐÜXP‹áDËСÏݜٽ€Ä6áQ£ >¥§âBãi3 M^¬&/ÚÆ¬êŽáÇ¡Ý @K›Ñè?¯™`l4êYUÀQ!ç¶žPÞÿŠHµKÆdm)ša /Á¸ß,´6(]肃W<î6àP«ã¡ËÞ^ì¨6pÃøË†”m”A)ÍGÇcE±É¸üa÷€‹3TªÑƒ‰T€s lîÚwp]ô™ðÇÓöÍ–ˆúE]}9Tw|$‡Gj2Y|ßm%t0ãÍÌ«MÕ.¨ ‘G ~iCdv ÒÖdâ Çå°G(„¹ißv¬ƒñ-y¦‹QØuwœzFQé) GÈû‰[;g'¤òüö‘´p 㔬ûwmßß¿':jb~÷â·| ¦Nù:ª@Z[W_ïoŸ¢}9TwE|Ž¢Aß3F-ìÄ,N©š\>ÿþö£¸y<}@xUðoWó`Ê€ƒ©ÿZr¤¾Ñ³Ì|{Qä®OÛk2C`@|lÕúE]pªZc°Ú’ñº4 °({ªk~qr–16$í‚5n޻Ʉm­ó=üþY9wâxKw„'.Áó^-y±)h…ÿ‰nλj{S‘â†þ§lͱHú‚ZôɰýÜ@fØR°Übû„1wÕwŠ™ÛÝ} &œ] Þ®ÀSÜ _c€cû9¥TˆEkÚ¾΋•Ö€óŠI¤Yà9t…WJ0 É@trÒ=µí »'—à|Íê9j ±ù©Åó…œ=b€åàè' LÎíŽY5à%í¸¾xx¢C éùgÁO|òÆÁ>d Ä[ù¸ÛC?´èCPHèTH9p±‚ÆP^B)yäÂiÌ—}Ä×ÁYß™~q&_úš^mÜ4Tú@$±nÑ.oö|`Ê£oÆ”‹l­F™JŒ¡SÉ9èD-H!‹~2µ¸øZ‹)¿:[¾£GòĤÛX¼"ìž4·÷㦭 Ò£ß^õèt '£?бcéìÓù”¹÷s®Ø Œ…KÚ%¦œDÎ&g®Q°6¿$Ê‹°‹Í¡}pIÙÅy¢O Øe<7-6l¶«•PL"“X¼*î$Ú›í«?Þ ÷-íµNXà(®gÔ@ÌÐÝ~Í»„—“0—ÌžÂ$=Ñû~t‹¥Nþ F+œÞS$10TÌ´DYÊ@]½ÂW_\=ù3,BuÿDWdЀ}¦r>ÚZ¥j?EÀ¥jǰÓùò4A@c Ö*„€€ï°ñøtO€„ˤ&/¡:¬”š|!€å6 ¶á'´g¤ºáE‚ΈÇó&ïâñN‚X0·›/£ÊN”9Ñ%uÌH k»|$ .ÜÀù ‚@€—u>pjÉ'¦+ø€ñûä’(?¥ÔøJ&8ü™tF&lÚ=y‰ë$Á ïˆÄºŒ€GJrÏ$¬ ™8bÖ5)ïˆgâ&\OwÁÇ þŸÈwá…aÁ¦™QH©çœYp„¤: 2ÙL9áÿ)a¹ñŒ€ ²q:¤÷ˆ £e$•‰ü D(†+·ˆ¥zAïN²™#¾iAX0 ¯”ÝG$Éîå-gd÷²&g‚°`Dð)^Nèù-I¼s4z0u3J0€äÓèÚ:&±Is"{æø" Òø|% ¢xe É™­ ©»^ ‚Ð)ƒ‘|f4òVÙ½ =æì-ˆM…èFÔ“R›ÙîA‡f¦"8žÙ¢´g ,¸¡ ‰žÑYP2Ò4¢lˆP‚'?e9$|…b–Ì:eYj怗UÀØ9B¡g/Áu}–67@°rI5ÿ« ¤!Ì'‹ˆ€^‹a ©€F/͸»¿D5 }£ËwÎ<ÄéŸF$óÌo#6hD”¬l‹dÄd^‚²’ bË%{¥˜»€h9Od#^C” r’l°Žb< 35°"65¿¸0‰DðYÑŒcß\~%VÜe•è)ÌŸðÞ åZš ¬lÅrE²wˆ4ü D0nfý#˜={&€‚5³u¨Ÿí@Äó™³aåÌò g˜{$>s“Ý^v…¨ ·B®lÄmÅ8í§HÊBæ-»êbȽ¯³ÍCîy£©Ñcdjõ‚X´be`8·z°•ÛùñÐõkÇ64l ê Qõ?RÃV56¬õH¯bõš¢QL Œù•Ò¦ƒ°_m[C®R‚©°úÑ'¦À:§ãï7&°#°Ùn¨®M±iÓ˜fÕÝíÚu—kAœ›S[„*×ç!· Áqº±eHMˆ8mÇ¢52¹:Ù2–W°œn‚…àó${ÿò×gœ÷qAoJת¿“‚Öj’æÑ:6AºýXâX]*`ؽ¦¤Ädõ@ÕÀE›œ]ò9Ù[}óòÅ_¾~þÕ‹ï^üçÕ‹¯_~ùǯ—"°R¾´ºÃ;NÝaO£ÒXm=`•¼¢Ö0¦Z­(ýaz'±ZåJMùáj;H{– ¸à—õ¤…ÉÜF…G ¸xÕþ,„µ›Ê§rñÒEÊâ´…@röÑc2PtB9ÆÍ¤_ÔgΖÀ–ê“~QIëGÊy^½Üîvóf€V›œæþ´ì§Ò‘VÝIJ›J9©ž¯…Z¨J‘åçü¼ì—Ú1G|{ÊÒjÀ k¬höÛ=äs§…JZÂÆNœîvç¾ï6U.9Mœ`nFa¸ãŽ1v•[F”ðæ„¾ë1AFr½Ì¥.ʽ I6fýöØí®ëçw·®Ö®0ò§åØÈ‡èl),¿GHï\Iqÿñ?ÿý8!'U×Ô2­@&©"d ©]o{)ã°|€Ï˜vãßËAo$½´ë8“Z>öS‘ÜT³Ë´†¬)·f)5 0TÉ]½—ï“®.6FÉNä1‰.]·ëæ4–Ã`ŒXšfý‡Z›öX]ª[ØÜÃ+ܶda¥rã1T+=¿¢ºÔôÕ{}Ù¾{¶ï¨èÛAŠÁd¦Án|ÓKÑ&`hÇWø 2Ø]&z¦K_­Û•椗Gv~ÑÚÛïoŸ¡­¯vØR]ïDå)1Éfp æNÚwDÌScACá Åx…jÁ˜†j„€c¶Ù‚„€ˆã°€ˆw,ÆXø©0‰3o<.62/ƒm‹±…$²¦'<‡6šê½ü%ºØíÇxˆ ¼,DFšVÑlŒl­R~+!8!—Áñ'›ø’:fÄàiT“o°ÖŒˆç@ ˆ½‘zškxAò‰é ˜Z›é%P~B©É+BðYQÒ™° c#X' æ¹vPL¶“Ü3 ëT!NÖÙrÀ†8& Ò# ûÚEŠo-ÆÔšŽO©)Nžr¦¡XÚbΡx{Êñ& ?=‡œÚ%ŠÛ ÙJÛ[Œú­"Qv/oY%»—½°Ð* †Çù49¡—· &çk%y²½)- `DHމlÒQ5ÓÖÄóS—¡¼ŠÇió5­™­ ì ÄbÎ7a±¹jˆ—·ÊîåKqöˆSSÈ® ~¶ûˆà@™ a936Áåë}$ºÂCùŠÅLÞú9bDÝ!±ÔŠ«#ÓU*Sd0Ð)K“›–Wëàí‰\=_ \,€kêù_1H#€m¦Ç uД[''£úvC²!7è-ÃùòÑœØMÞR¢œ™¾²­fÆDœžòi‚/ÉüVb…2âR#+G‘€ ™—Š ØÙvÉ^~Xâ."ZÎãI©0•V †-¥ñsDgj`Ugj€‘ì(˧‚hÒßñ?²UQ`Y<£Il‰åê¡á•ÅÅaé\Fž1$&ûïÏŸi¨5]§1|õq¯Ø”3g ìË™ó3†Ï<î…åè† –_V¸âÔfŽ…œ‡B¹bœöSÄf!$NM¹wV\s6å̲?^AŠÕÄÌ­ ¬cçV¶Jf‰¨é:ÿDõ@ƒwL]89WL{Ývêú—«hiŸ~±zv06%,{tû—6·Õ ò é±Â¶`Jºðþh¼+½Å g8Ž“YóW«óz6bø^0JŠòáÁƧLÑL çïÚÝ9a-æ{4hJ²û.ÿÙbQQ!2V“»[ zWíFbhH#bÉ6A.ò¼ @ö€ã‘—dÆ“]ý©ê$$ÆÑ8L»;rÂaÀ¤0ÐQ{öÁöx©)éëNÍ}Ò °(„ÚÛX,‘øwÕI>¥}ç2¥LC¤ɘ4~=‚@¿>âäÞÐ툩Û,¥»)a;ıvšwé$ùÝWûÛêøI.ÿ`vÒWmõv y4ÐÖrͽï˜&}`Ë©$¹Æœ¢û„“EÈìj=p~q¿n«¡ç,×·‡-Δq[}Á¦h_WÏ{éƒÊnrl¸XàbŠ mʰ¨ÎÂŽ7eŒs8µ‡þ†&ÇyVˆªEÞ}·»yöK1âÀÃmÛ“Ðáh·úGñ OFvw•Œ=$ð63.‹N¾[èNcq2,kÓÈ縲Âô´¯ò¨0Ö!ÓX0s&O óìé²= 2o2bf­xŒVÊi Ó<µa‡üYNûf)„ÅûÙÄ…LO’úœÇ‚dN‹Y¹*絑l{:@RW_¤T–0àœôïSÃöfØîi„š«.L§>8ÆÚ†íkˆ—yßv_­o»qžyý– ÛƒL€iÏD5”ï³çññ÷ÛÝŽgï³Ô@J=(“ÕcÂ#›ÙVèfV""kq)éy©„` =„¹†ÚÏ-†6Q ìÆsGØË<šG½Cé®XA\ 66?,Õ[7ÊC•Ç“Œ6…$!º»óÀ#,ç;šW@jÖÕ×ÇCœÅ² Î|ÃVÏ9 VpãYPjŒ-Êèë8vŸF9}߀§r#õF¡aû=ù¦ráÆ6…&ä€Óø™ÐC¥…œ5äpVÇ\H³¥4‹3’Õ”+ !XMSèôµ 8×þ@Y•&D|ÎU´™tÞe50Xš­œQ2\+¨ô†²£@ˆ·ºü=ˆ2n%_ÑÔò©â©.à?€Q:™‚;ÉÚJq«¥ŠdT“møâŽMôtG,3ŸyR”, ‹rZ¡“ca'6a˜™³££gCöŠÞ :’Á6.h™A/3(’„ŒSmA è7ˆ‚@,l°vÀ TopÔM-ÅxPÁ¦•Á(šR˜àY’4ÈÀ ÖŸàq Éàin¦zOEyiYˆŒkÐ[ô’’±‚²LÌ­8Dlà+r/ M—6唟a’´ë‰ Ó(€k‘˼“h¾$Êtš¼ ÄöAºÌ QSÐ#¿é½$ó'‰JæOa¶¹B#l‹… – c„ s ƒY‹$`Öc°¤eÙ„™Ñ”âÎ`ö4åŠó˜­¬EAhFiÊmo„—Iš–é(ˆH•GÓäAs¶ÁªœYžáJöt/®vÁ²Û‡0uîXxØ‘&‹yÚO‘<æ”gWyPhz6æA%öG³—‘Ñî%±iÙÎà:ff÷p«ÆÌ‘Ùÿ¹ ”ÀA™q8ÿÆ5¤kíº6üÚ ÎSÇÉʤºñ¥ôú†eJIŽ|"“'@úi7ñÄÒRÀQO½ž¶“´r½½Ã†!ÅâëÝ” Ÿ¿Š‘$ QjM r< "©:QÆoÔ$qÆ!¬ñ{ÊçÓ©.V4;ø˜/Tù㪱"åð ³2øÎùe-Áü´_¼…™çSVŸ. Z¿”)‹ßo‡õí·üÍñ|ï&èL€šq¥%@ªSsJ|ä‹E* NRzü‘Bîaü÷LI%$oO×[`ôIF?ý¡|ƒg'mßë\Ûxïã°W’ñS/Ÿ¾ÑqEŸålÀßoiâÙ> stream xœ•Z]ÜFv… 8èɯ  ÞÄfVñ£ª äa×ÙÄ ÖÙDžÝ$1§Éž¦E6[M¶F“ídßrnݪ"§e; dk4ÝdñÖý8÷œ[|'²TŠŒþøŸÛáÕß¼Ñâaz•‰Àÿ¯Þ½’îálñë[\”+úäv÷Šo””i–[)´ÉS¥¬¸^%_nnÀµÆ_Z¥EiµÆå·Í«»¤ù®?Ö‡ÍMžç¸U&Ü|wûO륋2­òLòõÉß=_L§™Ìdå¿lÇÿ|7ŽíÛè¢<Ã~²ÜõãŸøFiý7yiS…ïoŠ*ÕŸã²,5¹¸}|•¼i‡º;t‡ñ»ã܇‰ï^ö £Äío_Ýþõ]r»)Lj­Ê“Gg»T©©¬åË4—†–¼KF±/ΧÆåe%“VŒ~uºÏÈÔØJ.÷Y¾Oœ6&Í2©qY%ðß0ìSñ»؉yߢ›è'܈U¬TÉ˾ý¸¹©Rk¬.“í[ÚÌÐÎ{|XàìÐI#æQœ§ö ïó2αEª«JÜHå¼wuõØÍû«~tËüí]3Οﶇ¹ÿ|GŸ}Ní¾»ô‘ÍÂ^¤’¼—TÜî[Ñ5­3–°´ÆÜóË<5F™å ìËêTU«8#}(ušçÖ„LzO;¬û>쩨ŠB&Í$Z÷mR©CFÜ%6~i³ûò&GTð€ß3²±pHàWq¤ç)(mÈÄñ4×÷}{‘Vy‘fÚøà'ð“ðN»p6«Má/«Ø×Îþy_ÏbD`kPÑ´»úÜÏßú謀[S ½+è£"-%0¬Öc¡kqžÝw2-L0›*Ù«ó¾s9mëÔdqÛÉv_³± «†»T^¸ÛZކ„#àÙàÈ–Ó¬0UòîÜœ;•¤ú×ÁÊ ñ.ÔYвu²©V¶ .kObæKeZ©B-&pen÷‡n[÷(‚÷n{(<$ ž3wì¤~Š¡"ÃÈvòé<»-gâˆßO~SXª(âJ¾þÙGy–æ+qÕ^sHcÑä*µyéÕU{ ô¸jÚûóeðu,ŒJ³c¯ ñë[”B¥%`t¹¨ôHàRÑᇮ2Œ§z˜Õ¦pÏy šž†Š<-sÂd¸w{4™ˆ¥c?‘Z¼!ÞkZÊ â]‚Ëúî-je•«¤íŸ=¦¹æÇUxZD½$õ;Π„¯oTá.øËô/Ò¿ò±‚÷/Ça jøm‡øÛîÛKì½ ·Ü0 ;IΊé–× »*×"¤V²ðŽìiýɯO úõWØËãJkM®5;ZJ‹¼Ÿº¡ëëaï4?õ”D.q |A¿ÿ;ƒIxpȘëÃ,¥SÌÑ…GÅGñÍÓæÀmªÌ$ÓÜ.;7°ÆfV'OÔ9¦nšÉÒ¶`ASO{ñmòý%xKô^­C"_]ÿüõ·±ûž­2©²±ž©ßÈR 㦄eÙ‚³¸ß¼uYZXV w¹Ê2HlRñ÷##€¦ˆrÙ,«mƒÚ„ÄeRǾõHœ¤éRnß_šJ+“eqƒóé|ØÖs{±Ñ"îÔí0•&>ؤ«Ø6 ×ôgß•r›Ô"Œ˜(4^«Lrtº\lëÜà.×e…©ïïyßh1©^¼Õn4:™ç`±@ËÊ¢§›kñнwí½ÌuÒrñ:%2E¹X¬‚19:Ô*Q YãË\Ä%Õ~ô ¼Ÿ;BE|>ÔÃ}÷pϨþ܉ÃèQwæ`«V1p¹öEƒZ?ÍnÈξgÜ÷ýüzSØÄ¹ç êÃeéÇYYt©üƒv‡¨«ÒE•\û¬¨ ô½ÿ_V\¬žg¿Æx$¾\Ø>ãXø#.ø³«b5B³LEþ»˜z¹`@}Y© smŽöZ÷©ø°‰H!Ú¨Áõ‚A””‡¶sѼçd´:-í²EéÛøÃɨb)ûñ|tO’Uå _ÅÖÙ ´Ù …d Ä©&È õZ¢ÙËO‹Ì]ÒOÀÙÌâÑ*¹êçÓ%áÏ«4³E4Ú*ßý±ãÉíÒW! š`Ó*`ôÃyhHÏû…ùµŽ39?”e`3¨2æ"àÅŠ§[ÅÕˆ¦sÞÁî ‰Ö·¶37Á.tóÔö»à(`âÊO!¨ýT?M0ÅÞc?¨JÃ[ïòl¸tà¦2Ul*¥ÔÑ]©øšÊ1æ8&µ4“Ù‘(8*+Œ!‚DÙŽç úÅ‘‚ÖÀAüµxÜw—HݲRËøh¾?¸–RQ!Wsú“ÕŒ¥JfÛh"ð?‰kòÝoB]»ø¨°r¬“rueÊrU`à‘¨$6 ãG¸U¢»>·h^î½ö~­Üé°'áþ­©á| ŽŽô9E3TQ¬5פ.É4þ:Oƒ/NÐONí17-Ó1$Uû'7|K7O Oà·ŽBQqI^ŽžCüE";¾d¬¨‚óSñG¾%AúR!'níʬJäÉóU›ËŠùª—¯HFx<(æ<¢ÙÊeLåËÔ¨¥vÛS·õÂ….]úAØÌ9Q ŽF^íÛþx<ƒ§Ù½¦¸O Ä·öÐzP•ÓT?f„l8(ÌÓG/£ƒ)rʳs×.sJUÈ“(¯þО&O¿×47§Z[©`Šë/&‹ã“8¯p•·­Ý iôýPûns 9üH’’ã¥ò.õ P€9$”! °6f;p@?&"ÌŒ­yúœøß(] )‚NzÆSïob³rB“ä„›l¸ÇyFU@‘ À˜ãBÄYñ¤â_¢]““Ì N$ª¥/Uz¤×ºÍè5$/@Ù‡_¼•|ý"uJž9<ÖO¬ AפQÿ—Î]äKKl*$"Ø2}DoA'£ÍèäÙHó /-¥]ÍÈnÐdeèQ[?wIíí,î¦ a\?!r†¾ó@~)m–Ù†1웎€ßÑ@ç¡zzKÙ~î‰ã»„ê˜80Ƴf4Ö- Ö¾›öLš+v´NØý¾>uà–d’ãÏR¢sM+–Róýì '¾oúñOÿóß—‚Ê9 ÿ¼O]]¼AQôˆÔeêgý`ÇQ³Ã@ æî¥û2Ï#ZFd«Òè¶Cý ß“iL÷};øQÓÏÎ2º’Ìz¾-Â~G¨mʦy܆‘Ñ*x¤ÏƒüY YüãÏ.öÝñ+ëhˆ´ œªàóØ0™üD –äU¡åêe~oÂÔrÜÍÈbj”º¦€x<5¢öõ"s`,hòã–¢Òn6±ìgÈ5_Í%ò(ô÷ä“#¯JlGï=ßCŠ J A¬òJ›êJÅ:g”U–HÌ1¶Gpè’ö(utÀ,(ÔÙMÍè a… bM QFÄûYªf¦´‘9“Bá‚@œ#Ö„Š(¨3®*¢öèCÝ.—Æ×#W5ÄT¹\ìY’.àÈ0¡+‹]2ß#Ô5Ÿ Û‡‘ûO©Ü° é?ø9Eq\ÈÜe`Ÿ þÈ©û3,>¯ò³Qƒýc5ÄŸ—ªèÑEôµoÝðlÒœ·màK&j‹Æ+Kª'åÄdžÇÃ.Q7 hÌ|`FWJü1M¹Ÿˆ :ég韭Ÿ·äF%§¥’Bd‘ƒ2†–hX¾ 8C¥KsY+ á#°ŠCk†¢°XÏçS7 ^VdŠF2ØbÿÊ ~OјÏpXÿõW×á@áÃqYy\7¢G± s#$&óHO›,§‘kœ0î«·|šÉO‰ÕjE¿ù˜àèÙ~eÜRx€?ﱨè”–#ú"‹â*rî•Ø(:GjVªùŸ‡ýëÉW…ªœT lýÌ¢ŠÇÝY”tf&œE¥zbžž‘ÚºEKv]°ÌåýŽi&©ú¨™$M*¾j[™t,!¶=·PXåëëÆÍ: GÉÙ¢€|Cø€%²ô‡Ÿx­]F34@¬‚?£±¡1û÷@ý{Ô݃*ji+qß*Nom“ìfï ”I'GEá ÞæýÙ¿{âÞ¨YÊ{ôo¸”4°‰B"ó3#/?ñhdIWæÐ&yOgeŽ×Ïsx›ÆáGµgG;ö£(‡Ú“{oÄ’gÅr ©goe¬œ2u<Òx$_ÇÅ!ñSHÕÆà¬Ë8Ï•UV™‚):,@ìE˜ºp_õ®BûÉôÂ&~ƒÞKàéšRE•„“dcÜKhÂð±Ã¬“Ÿ×@±«Ev7ÔŒšvâ“NغœŠ>Ù½÷§cy´œæ3já?6ôVÛ| ÎNÈÀ ²ægT™G¬åy×.3Ï÷¨­ì<úQ%HX¹†ùÀ <Gã©’)±>é$÷çº<6 sŒ¨ 'F\bO\"2\%ŽÂ]K¿Ih’{ï+טË&òìxÐAÏîL5i܉[sÅåˆcõþVCGì=éW÷*Œç#»óɵ_.{j0F?«z÷"”¢±·òßܾúWüù_‚·$endstream endobj 155 0 obj 4514 endobj 159 0 obj <> stream xœí]ݹq‡á0ôž÷~»Y@Ûn6ÙMÒo6$’> Ƀ|ÈvGÚ¹›ÝάÖú¯í;ÇqÞRßd÷Œ>FV ‚XÇZ²X¬*VýŠÝÍù®éZ×tøòïÍöÉϾŒÍ«Ã“®ùGøÿWO¾{â¨C#ÿÜl›_>ƒN Ï^>áq®qÁµÑ÷ML¾íûÜ<Û>Y|ÿû«gß@_ Kç±k“ó0àÙí“Å¿ò_•Sj}îzýãW»WßígÃûÜú1géñ›éðЦAþòŸ·ß|u÷j9ícÛ;ý|ñó«kï}ÛõýâÙÕWÏþ¹^“kDZë…Û휑 m—:÷ÎU¤œ‚üñÛ¯—»oært­÷7ü«Õ݉[¯Ëü§éÐØšî¾ùún¹›„ÕÆÖß\‡±ÑeVÃãUj;7¸°Øß“`gJîQ?ͳGèxXíÖ»WÍñnÕÖLJåq½ß5[ÛÇ..VÍrwKb3¸V5¸BQÙ®Wõ·Í—ûùr¿]ïà?ooWW×̘ýâ¶Yï˜Oß·y(Ò8”fÑ,›—ä½kXU&Úwû#ÍÖÃ*@‘BÚ|ýõó¶m¿b Þtú6‚¥¯]Oa‘·s§Úàû¤dïYëͦÙí›ÛýËc³¼ùîaMºAǤ‹xmV‡C³{ؾ¸ºmF÷^¬î›ýËæð¸>ÞÜ­°LRé[ZlŸº6Œ^u´*£–¢Õ¾MÅwÍ‘”àb;LD ¬¤›ýV•‘̧¾øI×~ôì ¼òç‹çWðŸm×%·@Ë̶Z¡l‰?ÿ×LIY}ÌÑ%šýióšdsíc”íÔeÇvè’2ýÃ÷ïcYë_µÍ/6Ç»ýë»æfà J}v  ÍÛæîA2§nXìOI¹ ‡íjw®cÛyðÃÅ~½;¢úèï»åñá÷Aaõ+´I×C†X0šƒ¼¾G!Z¡KE:öÊý‹Íj ޽zùp ½²G§Æ9µqð® Mnò¶Ù­®T¬Çâ°1a›[p£›ýÃî~ƒ²¾f'Kqàéšå±YÃRØ?úÞêÔö´^7ް1žòrü†Ìfv×úX”G˜`  »eÝ/oŽë›å¦mþmu5‚šCAÀ+ÆA4)Jvøàl‡/na ¸EHa~hcH•_ƒ\½‡}N»†$‡pažbÉ6[‰z\îB­ ë#h Ã83ëê.¤vkqäk¬ É6:l£.ó`¤ÖT7Œýâæ[Ôó¶9ï×7ÇÍÛ+ð€ÎÁÒI´tH.Œ²Î7¼ôT…íÕ=pÀ­ÿ”W ó £V[ݳ>؆zƒî²qØoVÇ•-’<'¶£Ž“Ä¿Ãu»>Pœù ©Œm¬òï )' ýB´àCª­ÿ|±|ýú¾$6„oGËn}Û‰õ´¼¹C‡–ÝÁž^,7`âãú%ò‰CÒmðW4[pY¾¥õíHZ1w×FÛú¿ãP(dÈ©ÌL{´¹ÆÝ “½¸_î@ œsÞÊ)ûÃW‡ãòÅf}¸c§¦©øUôŽ—sÛ<`K½X‚‡ÀÄà_„,÷|ÐdŠP8Ø7%¡@ž{ ¾‡žía7öÿžCÁý·àŒ{bä~– oΆZ‚$ͯšÛõ-m¼ýO qt‘1º…"ýãÝj4GƒzÒhû \ 6hŒCwT3TÙãVÌïÇv,æWiD€f´ç¿[ƒw½^>ìn0Ë(j»¡Å0ˆÿËÇùyç`ÅöôtSÜÎNÀh+üþsœÓƒ ’íŽÃ| g™a>XkU¹ÿ3ã!y@þŠ™…‚œ³æ£Us·ر+qå%w«@BžXðBè4»5¿"—tà¶gQS™7ín{÷”“/¸l?3ÄñÎ|ÌgK+Ùñf ᆤ,2:7ǰEÉKÉ3 t•›>¼ŒP”NËz~˜g]>vµ$Ã;M0tí;8²rA>Qõ~·:@?RØ8ÂÞÆ|ûxuàcLaq¿Fï{ŠØÊÀ$ØÀõü0gV*TÄkÅ“ò ¹eصæVÓd™uš™rÍà˜Ý ~û‡3l!5¶’d&^ÖÜ-)2§Ôcšâ% sgn¹]ÂV"‹g€O¥A¸¸ÝÞ}q˜ùè0V£ßï¢Ï`Y¢Bð„˜CÉ TL ð< æ.#Oc”è”›‡Û›ñÑÊ€}óêÊa†ˆ€uw¼oL›OTšØ.ä6ª] 9óõ\îT×JfŒÂþ^vóOÿ}u€€5clñ’/R ª…2Ç=¾šÆìûÖ»^V=ƒ7ÈwÁ™)jßrö„ê×C Þ<`æZ ꪚCZòé C¶êÞ½Ÿ øë½º4ïkXK]Ví7‡™{±ëqè3ÀÃq(厬tË¡(*˜ã$¬fð‡jëŒ  𷍆²²dƒ³`s¿ÁäcåIÐJiùf¹Þ,16C”r:E›€?!¯òÙÃöŽâÛ| -ž3‹£Ê:§%Æa¬’)Öøßq!ùNÔ`ÓÍKx­Áò¥4½µ2ÛU½5J¦¹[R0ߡȿ„EP°Úd¦Ã®‚ªä{‚Wpô€<鬤FuÞ¸HfdL‹Û§ Ö|¼p‰µ5`S$fƒ8„Œ¹ÈÁ…BYÞÀÆìfs÷enÃkÆØl’C Û|3õã"»*ª-íœäE©øW¯Ö;:’¿z}oFPÿé‰Ð7Ьl×9Š,IzGІ,î—¯¤6+ÜÂþ„¨)b~Û@€½ˆÌ.*˜ÃØøTâ«? 2(¡m·Ç: f‚:JÛ»åA1P9b#˜3;­„|6F]Þüd«ì¬Øø-¸îOJ–›— L°]î°ÂEèÊZüÄèZõÉ/¾˜â Ò.DÚ¤ …eH€;¬·ë´|}ÀÀÑfy6d`]ŽqÍcìWJŠ7Ëûõrw¤D+*E9*@a‹îw|z#ç´lëx^âõ÷?zÍe+Ôg‹åýñ`>@Ø ‚A6 Ö^`@øc½ ¥¨^ðçK„Ñ,±¨AD÷EiPÜEÉ 8õXYVEydT¾ú„<ÂÐ| .3C«,¢œÁ´n©‚ƒæ£ÖýX4´b%nGš)Æ,ñPËEøs}º Ê b‚8¸y‹jÿú5i•N—äl UeƒåÈÛæå½Ô¡ƒ4Êî·ÓC¸êc§¦üãŸæÛ×Tã¼4ÂÃÊ7¿ÿá‡Ó‚FÏ¢9+ÿó'¿~â›Ç'®Á“@‹PÕõ‰ŠÌfû$ ~BÙ<ùÍ™^J ýðÞ^]7çõ±gzˆ‰]„±ŒÅ‡3¿7ùu.ï>š¨æRÊEsŠÀdße*Ðp®?œ™,ter=™P>i2ç õS§édcŽøx¨šL(Ÿ4ž´ÁXœì‡3“Aâš©Q(Ÿ4ÈÙ‹ÿ8žv0R …‚{+½§ŽߦGŠý÷/)ô8Lß!”³1àqel®£€ÏSYðÄÆö«r°ì]F &‘zg<ø<ÁpÅâ· +¨0?·`YW´™ ?ùÓÓ鸀Ç`^Çݯ^o>~Üh{ûðz8NÂ>f(àÞÇO™òõúæÛOGñ~&kü˜‘Û»¹n¼.±kcˆò§mÛß^™“wm†h×zrÚžºz¡DH9Mz,A¡ ~ÉÚ¢µo`Dòa¬z@¬jÖ¦9hS:ò®C— ¬UsHGˆÖC¤4Óuܼgƒ¢£ûÉÅ£e¦=ð¢ºvèß›F#umûÔAÅb•œÑ5^ö5‡ŸŠÿ¥=Àñÿ–¿±Y @€«‚¥:á+%C 8UéöÃ’i„D4Bz¦®F€ÁèšèS™  :kã΀$ªc'¬…µqê/„’´Ç£ŠznãA{¨ˆÊ`²† wހȲ>ìy×äwÞçlƾg- Is˜–ÞÃ?}®í:À‚ \ù¬)¬JDè m T~HøÚ=2mƒÞ—0H–ÖCÍÁÚ4Êbù¦pË„znã•B{¨”ÊaºŽËŒ;Od‚À'ÇËŒ;5ÁY#¹”.îñ7ö8„ÈJµ×)ÁhŽ·ƒ¢ÞM¼N â2àJÝX¹TMœnÄG¦U1´cÅ@›ærBPÑáêO:Añ8A{ˆ„Ê`²‚ ý AÄ€µøì;Ӹ뇓Oò‚¿Ž¯õ‘ˆgaŠw>ku$>2B…E[ƒE} óhCu Mˆ# ¢Üm,m°áðŒâŒö€iCÍÀÚ4ŽPJ‡ïî5…C±žƒÛ8B„Ð*£2˜®â2G×^z|äéÞ˜N%€$ ×æÙ¿ á‹Jÿ#>Ý›¤|¡€ŠHþZÿ¹ã PôoQ_ÂóéJ½`Ëä&€u¬:@ jÖ6ý+EÕ' T»:CQ¿Ê =TFe0]Å…ú‡ €Š^ï|Ñ¥Ðäm­P¦ø€¯»ùZ¡18ô”Ða¶¥ :˜,ú‘àIÈU#RF iÃZ#¨Óz€CÅ@šÄ»K;’˖ѨҚ?·q€J =D@ePË™"c‡ïL5¾ómA>|ú,ð³‡Èâ ÑÏOՄ⻌›8H¦Ú°ò%¨…—Å•Ÿµ‹D*PKHlá ms%¨‘•ú€NQ¼D…Ð*¤r˜¬âB?©Àý@f<ë'aÒø¤¢åÿÙÀ3ÅÙ¬Wåi^~ åL.LK,ÐàßmEñ®í î%ÏÅO€=Œ†NžË#iƒÝROõ“uè¹¼2Úæ)h€P£¡•#Îenã•A{¨ŒÊ`ºŠË\ü*°nl»tYù\¶û }êC½Šk$?«ß˜à»„_3L#sÝS9†RÔ®™+'³{âÚªrŒÈÕ—õˆ\mÏPŠV9¨áuŽâ*…öP)•ÃtºÆ(õÛ_áXì/ð¡# ‹f¨|&ÍË/¥œžæä@Å‹ŒD(´M¯Ï¡¹ôñ_"‡¶çâHÚ`ÎÜsùd=zª®Œ4‰?u—¶Ãã ’µ}Å_Ú8@$°*°0¨å¿ÌW²ãÚëýHä|íuŠbðq˜“‚ 1ð¤×ŒT,›ý¼hÊ‘3—øÊY x`”1xÎT¯ôCfS%.h¤ºO\òXÈ%‘1Ð6O#ŒÒ³µ”ƒg nspGˆÚÁ¤ÓU\há‘‹&ñùs =§y$ï`âTй~0… ëÃw+Ñx×(¦Q Pcz®qŒ¶uµ…ôa X]eÕg‘A{˜ÔÂ`ºŠ‹Š›« Ý2Ÿk3|Üö3 ƒ>fe™QN΢¼ë¨¬)V‚š'sUdæË\7UöMAvˆôˆTxió*AŒ£ÃÕx:A1¯Š =Ldf0]Á…ƹ2{çnÉgŒRÎì70ö¯”©Q¾“‘Ktñôg¬µéü ÛCzx®PŒƒ¶MŸ…"úPª.ÃjRh“[8L×q™Jñé"1]×öá²g _¡‘¾Ä;ë…¯²^H*uaVx(âNg•AûŽ!{1¨QÔ™A¿™+sYP4ŶÚ.qYa ´]ìi±†0Pcé Åœ*ƒô(R3ƒÙ*.4gäÂÃüÆâsâòòxÞy ð…àݘ[?‰NxXLžê?÷.”žJ|/(YÂ.p|KÔÓ{†çÖÃ3|7Úæ9h„Rzá%:Éä:·q„J¡=Lná0]Çe&@·>íøÈ;gÛÇ'üäåBR±¾1<ÚJ9…c„PÉcAñd<#ÐWÕМ Ü£Ö² an£^“`eí‘J+kÒÔŸ xø‚j—á.R¨¶ ¤}óÄDÐ*¡0˜®àB³EÂÚŸ ˆâ·H5©§OØ>ÔëÃ+Kæ°6Ê)JðCÒÊ”F[ŒiÅP>ÈF0Sú °X{x†ÍÆÀÚjL£¨1„ƒÙJ樬ÉBX•QLWq™9„b}ÿ ÌYsžKbSR±Š3t®”Óãïçtcm•Ba¥†N±*= v.fÉ ®µCbìmV±¶YE)ªTf`:—ŠQTía2 ƒÙ*.´JägïGç7ÙGÂàßT‹íB7ÇÝB9-ÂH¨oè{ꪄßÀõa`Ðë¢Ã·¾¡Í°XÚ¨×ÀÀÙzxÂÕÆ@›4ö€Ÿ¦4ex ¤[&à6P´‡H¨ &+¸Ìl¡'Üý)gVŸõÞ9ð]–æ¨_)'ÇIôlüÛLY(l |—S±ÔÐ1"¯l™³›-3cz3¦µÍšJQk(1–Íaæ4)´‡J)fë¸Ð é“Qÿ™#¾³¤ÉÉa1ÕÐÍñ¼PÎl:| ‚<Ú;HëÛšu00”và þ†Á¶´Q‹Ð¸u Öµqê/<ÚÅ'å2Þe~ãB'à6P´‡Š¨ &k¸ÌJ0ƒùË0…Öux?Äü:È:òL8}„ãGÇØ4_¬¸Ñ1‚VÅŽcìJó™Q¸©>3J7Õ[[U¯Õœ2ÍÚ¦{B{¨ÂaºŠ uŸÅ.Ý݈ åœöG†±Il+BÄx )(˜î»Áw's5IkÀ@[h“& þDè *a¬Ñáx¸ã« ¤DëÁƒÉ .ÓüèåÐ{†Ü*]s(,”3 +:‘¦ÌBaeDÇ(TT¥&,ÊŒYUf «Ú´¶©S(ªå ÚÒ9Š>Eë 2ƒé*.Th:…‹Bc7G±B9§ÐÈø¯‹äÛš’ðË,GF~í óÇ1¦´qµPë£kÓ8@)#;¢2  Óª¸Tí¡2*ƒé*.ShôrÆŒ Ü_„b?œ*Ïôª 5Î!«R²'x^*õø AÁ®F` ZF‰žËàç¤ØfD)mPbêsj˜ ’*kÒ¨t!@„ ÷tÒP&à6N "h‘PLVp¡’@ÖY9_t šF¥œÔø ™Ü©(Ó(¢Í‘ášisd@Wis`Èg=†„ÆÁÚªO£¨>”ƒªKç( U)´‡J©¦ë¸L¥)ÈïuûóGÅ”Ôiœ#D¥œúxæ'ð¾Ãg¹TRJÆwk}vŒÏº?YÇ6#8iƒÎrGÏ:tŒµ=¿<[(øD×7Æ #üZfà6P´‡Ê¨ ¦«¸Ð*™@âImVšÝ ö á´6Ê‘SÅXÛSmdHLE¹ =Óæ‘¿’6.v ØVz ë mó4B(1‘Ó‡HÛ°ÌÁm¡Rh•R9L×q™BA‘Ÿò‚="?×@¿<ΡŸRNMÀ‡©˜Y Fвچ4¼ÖHùAç £t¦íÐt+=:Dv…4‰?uç6>kÈMÈ5 nã•@{ˆ€Ê –ÿB½g>€Mä.97x#[wîøäŸ!ÅBÁO5ÝDõ1±S™î• º‹ˆÑŠfG~…°ÒýèØ‘µÇ@0°0жi_ ª=e ÊÕ)ŠúEí "*ƒÉ.Ò?~^Œ0±OÀ*œƒ‰ Î &%wt(Qis’ŸàcÄÝ…âéì2>Â\íCpŽ@œ¶a±¸ÇªCG °0Ð6O”‚pY¾¦¤&å2·q€Ê =TFe0]Å… ÍŸßH@Úú3ÊIf .9r”¢~!¨ò"A¯¢ÜHà¬ÖþØ9µÇ€è®0fQ¾Tu:\U«å«ÚC$T“\¦z|üI)ã2¨òÕŸÜ] ”SÕ÷üÕl¥{£ˆîzþîÖTÛ󗹕ò{þv·ôào{ m›ú"ê3¢]›ÃôoRh•R9L×q™zùúwÍ‹Jûù…r›{þ²V©RT!ü=eQqY«”>É,ø‹ÍÂ@ÛE£JQ}U—ÎPª2h•QLWq¡BÁyŸË¥ûÙw—J8uhïN™ö"Êó^™(×÷ÙLûÞ ¨ÓN@Ÿrж©ß(¢=ã Úµ9Lÿ&…öP)•Ãt—éßËw—ïN~þM¡QNÓ£§/òèMâq¤®LÈ=Q€¦À,|å gĸ‹ªi‘‘œ2à¦L@ý™õ"žèê³2´q€ˆ`=Dde0YÁ…ºêÍtùɾìçŸêåTõ?rëÓ8ò[è…‚Õ1è.ÐWrô¢¸iF§mPMàíJþ¯0Ð6O#ŒBY°p(Ô•9¸#Dí`R ƒé*.Óèê½jü§z þ¥Äò÷È—§%-~Œ6LîvÙmï¦B’z¯ò=y®¡ü…J ×ÿŒ>M©xÇJuKä·—°£b·g‘aQä±’¥ô4Ö¦œ‹\õÀU1ÐfÏU¨Òˆeª‡vÇù'Ð6`J‘PLVð˜éˆ2ý;ȱÁ–u|‚÷}ÂkÓÎÐw»R>`ÕóÀ®»ùCG¹±§ÇƒüoÁ‚R"×±“â}e¿hø¢2“/*«ï¢øåÐN‡èòvÛ֛厮½¶›În›åK¼8Þnrnäf/~’>».°\ÀF·Ò>£kó\tvػK»ÆVï½ÅÛMŸáMòK¾DòFîоÆß7HåþQ@QÖ×EîV|lîbOho—ëMs¼_î/í#(W’è‡óè§tÝäzw8.w7««,÷8¶ÍoöÛ]ö´¹“»>AÐÁ®ö+¿~±ºŠ‹7å¢=½N£´ÞÆwÆñ­ßxŸS¹„½º ¯ïë'÷¨gШÝr÷¨Ê =à+t¾üø‚·éjSèúöçͯ¾Ïs„0h—¾ÂTß^!öOCÅ»PÝY†÷šïø· ðg4èwÔ~ö%˜Rî™Å×Tì¾ÂíÝnîÀÙf¾Šo–;\õ†&»^„°ß@Xü÷l,ísx…· ò¯Aà£Q»n‘¯Ùƒd[ýj^0׬oW»ãú%Ý  Ù!vzy¾×ë'Áë««DûÑGºèo†—«Î;p?NnºÇ{å*PØå½]1‰jKîaÞÍÛéE|E"T™(8(Î6 ݇·´¿Ynä>Q¼CôV¯®Ô}¹Ú­~L[»ºŽoH•û¡_\é…«oõºü€!Å.óüÝôß®ñöKY.x[îýübÙç‹úÂÕòÅ~óÅAÌAKJõ/Ýœ1ÈsùY—þú…Œ¼LTU2'¿]Éøòã¸7—ë[ù¡ŽÁt¹ªêám³YC|¢ŸßÀRÍ»SÊÃ;«íþÕ¥ýd„]´ÌÀWts}9#ûõ“ÿ€e.endstream endobj 160 0 obj 7338 endobj 164 0 obj <> stream xœÍ\KÉqÆB6°àÁ¿¡nÛcpjóýàƒdK¶C¶$>„U3Ýä´¶³Ó=ËåÏ–`>:^ùêRÚõÅ QßTeFFFFÆ÷eV;©YO ÿ#ÿ}»ñõïâôþôBMÿ ÿÿþÅ·/4=0ÉÝî§Ÿ¿‚‡¬AäÕ»ü¢ž’Ÿ•ÍzŠÉÎÆäéÕþÅê¯^ýžMòh˜Ï1Âã¯Ö/^¯Öow÷ËáêÚZ ¯êÕŸ¯Þ¾úuß´ós°Jóó«‹³ÒJùãæøŸß›oþˆYãQVþôç?ñ‹:Ë›×ÖçÙÀ߯]˜cSs²Ó«ÐÍÃòî<ýò¸[o¦_.·ÛÝöü‘[hcæWÿúBÏIy|ëÕß¿^ýlº½[ﯴ›s6qµ™6W×ôïVËÃîã´=Lç»Ítÿ@Õ*Á¼Xyüã;Ñf¶Å?·çéÃr¢WnûûÝæ¼™ÎËá´=o‡éÝÃUœs *®Ž{|Š[`”¸Í 4¨é´=¼ßm¦5 n¿9}]›lfüt­ qZÞ“v¶:gnDÍ98jz?’5ÜÊ;vÑ»ÎEÇÚ{ìÑé5þí¯^üÀ¦3¿~aŒï›)ÂLÍ*Oû‰³ËÓŽ‘ìÑq¶‚Äf=jmUÄ&DÀl[zÄÃ8Wc3&ÕfÒ°j¶‘ # !p³á'`’à,n$è‚|ÆÄÙ_ Ç$õlæ”ÇfTíÉ£×h:$Ò°] Ö`_EìUŽsª€JŒ‹i*‡ÙôƒD@ùÎSÝ+âp•ÓœuAºiÚ½ø=¶Ó°€hê œeœQ¦.Tç$ž:«‰'ÊÌF\+“7;FŒž¹ ÜÆ Ãßr¼3bÆ™iô„ä9 âæ”†·‰'ž5lŽÓ³Db˹9ëRžIäeD"?ã5Ǥ1…wl3 ûò‘mnHÐl3 ÑIï ‰Ò{}+ié½ö•\í]#EéÝÌžßʘßiX2§)ž ÿ ÎÓåÎαƒMoéÖò|wˆš Éóµ,Å-GšZð¯ ÄÎy\Tà<{y«ö^XKq|ËaB¤–•,N˜?ö^‘¨xµ¬6[ŒuB`åIØÊ´DXPôŒ.aRˆpYjð…$¬‡ì‡ ‡…[<¦)Y ±‘”GÀJ+növD $ôðÌ¿/±æG|€dÌ(B~à UÛ"*—(ŠfVèÈ¥>„»ß ei+WF]f§‡™jH™M@ÊŒ+ÉA¥é%SI TĔلÅJ9ˆ3—8G] Žç-öx^RPXÈ" bó¤$ŠÄâ x+éEø²Ô‚¡Õ«²+ᵉD÷”úg "Q†ž)—a˲ÁAñ”IòŒ¡@鲿͔ƒºg¬§<ÕµY$Œ}AN-6—üªÍå#6×¾ ³³Í©n{²4§ŽÛ o5»¼«éiß#¹YÖ¼U×Dž-ÇOKä`íF-é¤å=4Ì3ÐNótåÆÌ3ˆFªf†;Ö̸MEòn‚µ©f¶6Z›n.*Në/ªª×«·Ó›Õ&“´º}7O¿çú¦ "QŠÊÛy¬™ÁaÎäX ã‹>(òŸ.Þƒ6ÿïü×§ßys5O¯>UQbõËe*D®`–2õõj{8Sñ›uv«#UÙÉi»Z?ÞŠp9@ S/È.¸ ^C Nu*°ôÚŸ#»”ªÛývýÅfûþî¼Ýœ^Nî6‡éwÇÓfZkøÇ~{€r|Ùí¸¸OØìyZ¦?ü {ÌȪ“ÝrÞ~‡ÌAÅ&À?N*ù!Ú‚ÿ@#¶˜” ׿+\ªýåüØFÏã…Øó•)Á*€0Æñ~õ×ÞÖT—ÒŽfœ+¬ºR%Zÿóß–'y ¶=ÜnÐS‡—ä¯~ºÀ¿·»Ç5 ™2a\­_¶Ü¢î/º¹‚¡D«Ýêã´Þ¼[wçyúùG $_•Û@4Sˆýò 0ö TrÐPñ ¬ Å<&ážF ¹ËšêèÄ K7¶øzµ_›Ã¦ Z¦`­¯x’o®Àxí‚óU³ÎtSÊd ãËŒ¢N¢ìAœž—.7W&—ZƒG³2åLJo¦ã;råb4ÄfXw§—•Õu¹lÁet_¾>ßÒêáÅs1sIÉs/qdüÇÚÒµuP˜Ñ*ôïKjØ!ðÀÍEKP „`j„éÀvú°=ßÞmNÀPwÔֵÃZÖÖ Ep€ä~–•%cKpÑþx…´Fÿ]å¶à@BJÒX#õåyv¡Ä pà‹á!Ã8‘T úbH¦:çâMØ ¡]'}ØÜï~Ü›ïŽ~Ü›ëíéüãÞüp·œÇËnËöñé8ðÙ4`Sži½Ã^¯b‰ºFè¡êt¸¡_X|‡‹'J¢à ‹'Xkð…Å‚ú"Ââ í¡ñ„l§Ðx@ÜÁ—m„E. Bä¡RÖXhÒ3D;±XïP;[žgÐæ²õwˆ0yBÙ#T¾kGÕ¾,¶H#Õ± –ÆîÊ(ÑØr¡ò€¤Á.OTR„›y®T“u¤®ÔXÕcÝ[âyWèüå|a¹m{Á„Î7¤ÐyBxCõç9,t 3&|žLó,t Œó ˆðyà6K©Þ÷Pñæq~P±#Dø<°(ƒ¨Ÿùày6JX&ˆDY$"ˆðy@HæH,8œa› ijÍ’ØæÂÞµÒ¡//½—·H†ú2àñÒ;G =b¡ç·°N–ÏòLÀ¢ªóFEJYJo©Ì~6yD¤˜Dó¼7¥3Aˆ®â0J¨%£€¢8ö-Ce‚¤{@4ZßÏrÂ*`D¬¼UzoˆÐúî-¡õäy#Hðcï I¼æj6›…ÖB§è  ôŒÐú†ZOEf¡õmÞ ­‡Þ3gŽBã)¢ü¢¥!ö"ľ{Kˆ< ´öz$$ì„H./$9IÈ=Yè)䞈Þ(ä¾C„Üwo…²N‹Ÿ ¹osQ¨|›¯‘9-TÖ`’ŒÔ -Û 1%·À[”‘ ¤¾âˆ€” Zl¶¼¾ %#Ürß!±zÃÖìkjËžñ%÷gÚqe¤ y]Ø=E¸»xFQü¸Â¦i¤Ér˲ïEKÙÏæˆ¢hévƒ(#uÏKY«k'({×—Õæ’mµ¹<£ÄæÚTlsª;¡ìÍ«ã.C;i¹f©}»'$ù>¯£&LTó:ê ´;µüW–ÿ±C¾ÁvÜEþË5Û…Ú»îÛùôEDOîýké½AÖD…õ[&ÆÇÃŽNV`¬¯¼þo¨:Ïs*•ó÷Ûæ`»ãé}¼ºÆô’[ΰPŒôú æ¤âþ§ò`êŽÔÿȃO¦6Ð>wm=ñ«Ãôï»åv3ýb½=‹BÔ/^9¨çeöÕë…£&™‰ˆt·¬9sˆ°qÑ`ö”Ó ¾l÷hÁ¥^Ò7¿:§ äJ˜h4伜7,5r¬‘XD¢U³¦¹Cz¥æI™:ß=Š"šp¿M¼ïÁäìkÊù0õß±Šv‰* :ÎKówË%ØÝœs¹=àDµÙmßœ^NÇÎò2÷}IñRuž K®6l,îø°}¿=Àj–Q²4J,XD6´Í©b·œÏ¼ï\[Å¢o]îïÛ¢:r£w‡:“J¶§’ï 'ÈñPô 9\áVÛvòvÆÛ»ã*q9§ÕÜ/qDËéô¸¿§Ëç»åLO‹Ž…’@üt¦ZwSmI‹ÌÍ\VÒ6§ét‡"šd?àÉÑÔì÷ÈeÀµºn¿ºá¾rÛzÏ“·i{`Éj^4N™LÙö\:=F#2x©Â_ŒÈ´ˆ^¾¡ÆÑ/‹¹ÍŽÞéénj±þËçÚ"ïh…Ò:ÄQq$ êÎdªã¥VÐýÅ cCÅ'B£·é/(¼êJyµ±óêbpeÑ„ÈÂï¶ÇÇS¶/·p,¸œ<¬¾|~ðP(w° ï—5Ïåzó“ÃVÎðÜÌE×ÙÑõçφG4’[°„u݉yxÎå›ÇržÅ¼Šx-b]&ð€-$ÈE€¸RŽã™XF$ åDè€GI†e0:´Ãv¢©íœˆ+Eù^‰ŒËVçÞ÷VSätócaoŠ„Xó0Ë«Üϼ5ZfÕ é³†¢‹Ž2¬ò2!Aä‹Qó,  €Ä2 9I–y,zøqbs”è°°ôÈ€ïòøVpÒ{í+ÄÚ;G‡O%±Å<àƒK4®,Ï|zoTÄH$"<û™eƒ†(¡®–€!€–g, Ô –€¾e¦û=Ât¿Ÿeˆ[?"6Ë[µ÷‚À*Ìqx "* be¥&‘îjïby͵8,6ƒ¿£Œ"¡)zevXBö(K´TÄȚ÷(2qný0ïð¬x /wiF$æñ"Ù¸´ÂŽH1¯½DºÃ¨‹V:ŒX©æhé+9É‹˜‡5‚"Ä–ˆòH¥1"_5D‹ÌÒÞRe?“|1Ì NóÕ!2§€”y·’‘¢¥åX"¡"¡Ì)T”<&þ1HäYÆSÑúÂÃA2G8^"ð#¢‹7ðú̱Š ›ËŠãÇ.e^ï6•µÿÊã3|dEH”qÎl6˾gMæìg³u–˜z¿X¼=0>£3g­Ö Îc_ÚT›KžÏÕfyFy¶¹õyžlvFvº;4¯Ž» ï<˜Ï}ÍRû±%Ê¢“ý»æu7û¼ïN]þ+HËQr[Í7˜cÇü]Ív,üabú‡Ý –³˜w›töÉ}BÌk¥‹y¥ p2e’þ˵0n+Ævõ› á' “ǣª0ýókX|¦)LŸ=¿~^_ M_zî ›FROä‘sܰ`)äϕ²UK‰žÊw$gÁš' ÀU&é´°)C%É»!ÈPP$I ©,+-x¶×ÈçIÅi»¿ß}äû&˜ƒª¢Ô‰o×hëN¯AÑÉ•ïïð¶ÇÅÝHêºké3Òà|y†w—^‘"ÅKÿLJ'þG cùYd€ew:ÿ½œNgªèûÙð„}ÇÝ ìòŸ/§›GѤ—i½ýÛ «°nV¨Þíå²qF „tžþž½t žúFœ$DlÏWÏÛ×´uü¦Lã‹Kë-Ë|)&`ßgô€ˆ}˜nêžS)7¡•çñö´ µ{\ QÙ6ùt§ÈBFCÁoú,7» ®\êÎáw$¹™™D|¹=Îà£Óôfµ7W¨Y€]«™š Kpø:žÂ8Ý”Aò'¸Sã}8T+XÝÇÇuÜï0ÁÚ¾ÉÁ+éâ¢ïÏo®*û…X"qÑW§Q#µyEd¼ˆ‹®Þ5yfå &ÁN¢Ûlx(±žð²½ïQìIM“ã£*‘nOŒÛ…6—šK¯%½ä)Êø Qãì‡Çý^ª]yÛ< ²ìvxñ Qžp¿oîÚÙ]AuîJV¤Òˆ:‘å4O?ƒUu•åf"¦ËøõÎvGjÒXr)€£EÇeâ±bÓГ-:+]ªã`EY{0”1›¼$¥ðï³Ýr¤à‚TÎvð¼»ûÔG£÷¹éÇÓ# ü#ǜθŸ€±Óæ°þâøî‹Ú¯qÔï~yø†'^p[9rÀ„И§ßË<ñRä(ÀSU»rmšN¾“²UŽXîïyQd\ÛÝõ¹kîÔ®N ÖõàZ‚ÜáµÛ†i¬Ü?C“&0ìýUm瀇DËá·ìT=óX}y8>Ÿ[°B®Aøzué,¾$Ãá=‰jÔ¼{ãÍÒí-¤Ä«}x E]fœþ¬cýQþ ï×#hõ=‚œÌ× sÏÌ-=…Ô«œ…ýF Ú÷[Ò Stq…—`å&°O™4ç²b´Î´bàû>Q×q°N<×1Æ©\dHÛ_¸ƒòåp¬›FÛ¶4©x9¡nWh«È¯÷Å}ÊèâÓ£|ù— ~7˜4wðx[Îjo§"ÎÅV?ÉfP³4ë1Õ‘9Ëö ~HoDËÑp¿Ï«É!‹\ªÍ˜Rë*ÕºíI×Ó§¹x`ÉÉ jðìt±?U;åHLN®é(øßèܥ߲0sÐ tyÀ먨|Ÿ—=gÒûê,qÙ™B‰ÁR¡ª³QŠ1l=]…ßÐàíêv{¢³†ã´æãgÓêxÿ\¾ÂïklÕÕ?!+ã‚’Ož*Ãh‡”aÜcN÷´Z9ézÿàøp.5n¿2¥Ì¡ç£|·Úëº|ÆJµ{ônõ=ÞXXê¤:¼!™ZêöIÜB×N >™Ø|¤â+ôÃíÝñ´¡¹¸‘)n MÕý‘K•éë±X),-íN%¶d€²'‡ Ûg)Ô â7UhÖjèbD GÄÛ%[G‹ŠJ(@vø’}>¡´é%ÑçÁ33‹*7“éÖE†hy‚¼ã="ò|ÊøA5?B*rByÜs#›EÕB#"Ľ!VÄy|)S»VÄùÚŒu¥#Lâš©£ –ì5©Œ€De‹bŠb Î)âKZ¤yD‚KŒˆÁ2-JP¤}¤ùª¾T]®E™¿œ(T²Re¾!F”yDdòD™G„'O„ùŒ…O•óˆ$Kˆ¢Y9¬8,jqšÛÅ:¿w{ÖœwÚÔdÈšœáD—Ï`¼£8)Sž’ùù&ÓÍ ÍWÆ“CnXdù ca/;‘å3*‚ܰHåÙF±XÔôŒ2"7\[, >£ì[žaåìò ¿…’7w^ºBY¼tN‘ñîœgûH”Ϩ¥“ˆò9ÒõÕÎ) ßQ4uNdò »æ oÖP‰Y3Ó¡¬’3j½á–ñ´•Û©¤bn§L0*…ÃJ˨ù½WÄŠ$ßÞ²"É£ÛuAH€o½WÄ[^j5«ÉVyœ«l9jyb<],µ¨r˜T@äx8 ­ÈñmÂM.Þ²’+ŒˆïIî ÒŽ9¾CDŽïÞñ=;º¢ÙØ”>Œhï¥r “†Ø’…DÏžODŒG zDÄø1¾½$Z|u°)¾Íá½ÍSEê\êTæÛ–T- Ç!ß¡¤EéÅŽØÜ†ž[-2|v‰”½j-*|‡ˆ HÍ´&ŠÇ)"”ˆð8'¼tU*q¯ey+á1¦9ÔgðÓŠ%¢7’Ò˜í<ÓýéŠôu(Ž%DJÞÏÈ…¸áòŒN’£j;ÚóÀkO0ºj±$ôÔ,æg”‹kWʈÅZ$øº T^ì&´Ã`yQölRà;DxDx‹.¯Qç!ƒÇ(›PKv©Ù.–LV² ´C1[“ Šþ%µU¤·ï‡éïx‘˜}[õ÷–Âò©Þ^2^‡r rC¾=Vié/ûü°ßŸQ:=wio“ýËöt>>àÔÝÇ«¯^ÐÎRè8~N:ÈŒòQ_Ò¿éã›C(¶^*XÚ¸Z˜¾Cžª·“*?QåÿóQîߨr©ÈÎr}ŒªwüÊß.T˜•¸½Ü‹q®*Î?ÙmžÑq'èÍZ.EúŸNˆ…=IûQfõù–EµÛa%-Ö1QF‹âY[îUÙ ƒa½kß¼àÝáMØt<Ô[Äø=¦oR¢ÙãDï¶9gP(÷w7ÌÖÛ‡fèÕuÄZ³º=ï>–ÿä„/4HBÛÈ5×vßnõíãæ º0¸²»Ýù²U¾mFz ß6#_ÁaWG2õ4ö©f]?ýöqÙurÈú§-¨ "¥©ÁÃ/…Ÿö%ŽšÛå wzcgýŸcµ•¦xÂçæý²Ý}Ïr=^]D­\{¥j@ÐYÝnNýÝ›Ã-Äù×÷ËùîëóñëÖÞ›Ãß]†}ïï«OÊp§¬“ù‰ Ä •õãHë|æºäézòœ@/¹¹fù¤gz¯~ßKLà÷Âå+V¥Û÷¼ø‘ùôn©ß;‘ƒ'V|3«ï!Ò×r§ð ÇSF>—pœõp¯¿¦JËÐ|–8•ôHñ#q4õÇ„8ü͆8â·Ô#q4ø£q4$ItÄÑÐWÔ=§Âkq¤Gzâhêˆ‰£©¿LTˆ£Á½¢'ަþêD!ަþG!Ž€˜8‚gòHŠ~$Ž„ôÄ7GBâØ½T]ÃHËDõÄžÊ#q›ÕHMýU©Lým§BÉ;q4õ÷Q„8üQ•86·âئ¦Gƒ?û2Ç6åBiÆâHÈ@ æ¸82Gƒ¿KÓGâØ#V,FÞßÇâØ½%ıëJˆ£©?Â%đ숣©¿’#<±óDÂHÉÅq4õ·m qì&ަþŽN!ŽÔÎ@»–…6ôÇn‚…6ôH*o¹‘8šú[;Ý[f$Ž„ ıC˜×tØLÖq¤¨í‰#vˆ£©?6Sˆ#-†8bGâHÈ@{$”vÌHÑ#q¤¥ØÇ`âHÈ@{ÄJŸÚêˆ#q$Ž€„‘8Rï‰#n Ž˜‘82Ç)s‰È@{DKÃz ލ8–¬Õˆcq$ 'ޤ‘8R†ˆ#eÑ8¶Ü+Ä;G@ÌH ˆc÷ŒGBzâH Ä‘8¶¼_ˆc÷ŒÇ®&Ž]OB ˆc÷ŒÇ®+!Žä®ž8v½ØMzâX’Ò¾Gâ@» .ıËàBûdW‘0Ç.»0qì’‹ÇéíûQÄÈ0q|ç5dšO…é˽¡·P×Ó‘ÒöŒ®ñvÔÕûGúôìt^Î'¹Ür˜øè¢ÚRi>¶ïÓ›Õž\fÑø^åîÂ?\ž=4+ää«7WDòX¹F„§iÝåkü%5[¸Hkû; >ÊÃ(äÂgúÁ<:&F… ‡œÖ+äÄL±^NG> stream xœ¥}[\É‘Á†Á‡ý õ6McXÊûe?x×ZK†{%¾V±»H¶ÔUMuuEÿ댅÷Ìíþá5<Ôxýö¿çw>ù}aW[܇Ðw¯O/®þú×—¯ÿÏ,·o> ¯o^\ý†Õ’Ú>vôÇïÏïþ|¿y=ô},½Ë¿[_Oû–å—ÿuóÇïß¿;lÞŽu¼¾ýÝÕß¿|cÜ»®^¿üþõ›ûä÷¥¸ ¥Ýl òiïšó_ìEë-ÉúÃáüÇm;Ü>Æ¿íõïï?“à>j7µ¾Z÷&»?þáýáÌ¿æ¸ëûŒ¿¿ ½î}Š»W©ìkõž½\ó“!î«ìöŽþ—à‰/®þÃÛû‡ÓŸÛŸ·wÁ§_ñã¯|`aR)¯²sü4É3‡}ЦþÝúýùúð¸ûŇÃãû_<Þÿb÷ûóßmúøªÓ›¯|Ãwý>°°!¯ßß^vÔØ¼ÏÎUåñe½úHu‚æ*ÈÀ7½yÿð'y00{ñtÿ²ì{­9]ýð²íÏ>AqXT(&ï®nvï»/+<í}¿:þü/»ëû»»ÛËíýy÷†Þèeßb‹VøãG,ÒÕæ¡ÈWPOK­\Ïbm 1ˆ:Ukcùmì¾í»™ãá|cš›€Ÿ×÷[›SEìw¯ñ'σ•±Oˆä½‡¡¥Ð‡Ûó»Ý6õ„45êÙš¦ÖñÍîöBFsÞGïÕL`ìGRÇåéß_ßÏ»ÇûÝå>Zü>wD(ís#áúöí§t ”´®“ô&؈úîêçwÇÝý=ýÊ‹vA$»ËãtkOâÕ*XŠÃ¶å}ak‰Žš÷ÚqwsûïŽ¤îž è{%fÐgj ”€º»U¥w}ŸÊOè¢í› Už‘>Íe@ƒJŒã÷[sˆsÏÚCËQÌÃñÃÝsèØïDjùxÐá©’çARah”cí¿åðù!r{ÞNï÷›Ö$x¥…/÷æUL FsT+ ОÊzÀ]ߟ>ÜwŸv—·×ïE `¾8*ïw¿ùõo~ù³ÇO<ü ÚuS#f»Ún³À"zƒn@“ßÂð~ÂÎc!­íSRéaçÑÂÀ¹Fõ+W? òÁ!l{êö5$SþwçûïŸ5€WÑǹÇWßá¿|ýâŸaˆ”²û“*ô%å3é®ä³Tßf¤îÁ9ß1’ h”Qrƒ² i Pkd&px*±˜Ö¬˜¶Çš:LV•˜ºñ‰î÷Ž fU~F>`¸ )\l){¥À`Ë$cŸä­Ž@Ø·¾㬦 ƒŠ;é«"º´€8,¸BûFt­ÑsP¬K'py–ÔxEòé^‘IMw/~‡åTÁÀ+©N‘À¥p]UTWL8•UW»5°±¢`BŒ TÒnÚ'F ÃžÄ’å‚A(©-R¯èìÍ4!}_Q¶Eãð>)T¸9ð[Dl«§} $ /!¤²”©ô °¶¿¥Ù%n3 ¥2R¹ÍñŽÛ F·Ô7H•Úí-˜òZÌ®Z;F"襅YÞêûÂÝêò¸¤Y €½=±C_€V5é| À`» -3¿ÉqU»ÃR2¾ºA"ð˜YÅÙA‰$Ë[V»!0äêúŒ»¤äµvC‚ã±fF8ÚÑÞ  ›®¨I=ãÅT ©M†"d–0&z^”^³IÌ‘ÃÀwµ¦´QJA±" ¿¼6 ÝôëŸ0`Ÿ™a ( í`䑎=C¤tµ£€¼0Ÿ¾"0-Æõ­"ƒÓä[’öYuHò‹ž¢ºDõíÄ )’z“’£XÀ@‚êÒ9öB커®¼A"k/íÉ<¨Àƒ:CȲq&É+RU€¤Ù£ØÉ$€9Ê@rGã7'5~×Ä'2`ØaóŒg³¤Z×É›!'ß•ÙãÒä™Àf2ü? øº>ƒ'­å€‰ûµ.0hm³zàlmÖg‚´Ùê#á67›ødB0¡n&šl2ð—Ì9f¤«‘!7™]yN‘íÇ\yN‰ç£áô^°z('®^ªêa‹¸¹œß}qWapXÝVñT’.Ž…JÛ åª/î Ká™®ßïwÿô»† ¢9ã£Ï‘c'¿}û ÅCÂZÿIŠ «Yù"´¨ðº‡ ìeGho Nyþ‘ r°`QŒé8¶êƺ’V»¸X­¹áÒö% š+3!åy“qUäÈŸ¯ãêØ¿àNÜÞ=~‚§‚oì}íÈ`®¾eòz%%¥«QºÚ@.Ü*Òªhh® ó*†€¢ ’3ö´ˆ•(Èñ˜íµ‚+>Dš•ã‘”TÕzx=Gˆ2ÖV¨Vz†ùUO+—S¼" Û\Ô¢”‘LíQÎ:ÊqVq8ê©—ö4Œ€$ëECòˆrVD–•´"*#ÚféET§i=êJLbÓ["ù¨¼u£/r%`f‚)o5$+omH8©Ê[!få­ˆT‘Ó°î.‘ž•3´Jœ£Ð’@J&ÿ0˸BZõœ£¢ÄµWquÑ<ø4ÒFUo×€¦AÄÊ:®dQâÚaÊ‚0qíÀÈ«’É4µ ¬¦Ãôä7Hâ6W¥©hjY£}}+&©ÝêÝiílüh“2qí » 6Þ噀Ҝ¤aHQ/ŽH‰,gž.¢>»ƒ-‘Þ'$¢aV‚½ˆ2Vx"Æž:¿” \&­)¿Œ°ŽübEpe­Ýå®ã-宥 ÌTGí‰<æÌG›•»öÐ’õŠv€·zF¹«!Y¹+¾E–™•»šÞ³r×®—´¶R¥_=[TòÙzgï• 6 µd-c6Z›Ög€úµ µm©«µ`mV?ß­ÍòLÍÒf««i³’X›Lª›Y†fôd5š—:͈’Ø6ûì×;ØYùõVJ³Óäÿ™ü_ßfþ·ú?´·Õ­-ü: ³#ñ†Ábkòþÿ‹E®Õ”žþŒ‡F”\VŽ÷ü>3ÊÛh 1¶û·›¢À©W”†^Žº<qžÊù|·†5n0éžëýeÛŽ‰P|{ý~÷þp³;¹¾}¸á³$ÚŒ²c‚«õH²ã:à¡‘6…yçý[fÐ`cÌcË ½í÷ƒNÐÆòµÇ>Àïnÿ¤ÇF¾nŽ'Òhkêãíå81âÐaþÀ™%aÄ"Œ˜d²1 #&™RLˆ Á1“0bBíÆ$Œú­àfº–ÉÿÇ,#bZ€#¤ßÄgˆ¹…^™qa9Å+‚£%&-"Œ˜BíF<•ã´.µÔS_qÔ÷¤½¨ŽÆsŒÂˆ Á3zaÄ„ DDÚ¬½ðâGO½ø¥!±é-‘¼F¼ÕŽp¨- &Œx Q1!¬ÃbŠ¬ÃØM®Q4&ŒDóOLÂD)äMcFzsäq'Ù·H^yÒî%"Œ8tÜ’¯‹æ{dmdñœ€0§@„¬,:çh&‰Y1 ‘%…Rس°T@:·9 “fõ°A ·9 ÿØS]<Š_ßiƵ.ܦ„¬#:f—f~+ÑŒFýêò ͧCIâÉ ©‘åúŠˆÿ§ÚIï’‰w ÒXb1ÇÁr\Õžz¿”qœ ñÌ%MË€š}fÄË[V»!ˆ§·„’e¤ ÿjHæ1§v8µY1ôËáÓd½ªO<(&¯Ö¢HFLo‘eFaÄCï1«Äpÿ»3âEŽÇî@\“r„Oˆ0âé-á¿duuEp_U(=l-RÄ' #¤ˆ¡«E‚Œ&aÄ"ŒxzKñsHÖwÑEþ;ô5!¢ÓTï0݉RrTK0$¨Ná-òHÁ«N9”dA:k9#&‰Ñø NGM…ì5C^‘jÒðæ}CÕrÈ6|Öçym}²Qį';`án}ÖßU*ýâÕ6–å^‘#ÒØ¯v^µO³Aç•ýü ¯þ­ð«¼C`u’¬Íê½µYž©MÚluÕ$mn6Êì RÝÎ28ó'kѼÔiFºZxƒÔ'¿Hc ~üÍNÃÿ)2ü_vâÛÌß@~õ5´z µ…_ň£Cï‡bqÆˆßÆë7õzK?Ǿ®ò,`Ä¿ühY€z›ÕŸŸwwÍ㹎H1ÚÉÝNonß=Ý>~üÌÖ®w´^FÍñ+e=§>œ#Ná\#ÄEù¶†,e<$1*ÇËýÝgÔ3ƒY(ÓÆ˜£7/5ÒáÓî|ÿÄ™".O@¢­‚ÃYb@/NÃeN¼ïMoÛÉK„ QÙç `~0t_…Ä!i¿þÍ/w¯ïïï.ŸEø`¨Ìáa8Q7_ÿG–¡7ï_¾’8xUÈ>7 †dJ]ãMZåx“Ýýùú(LFÝXD<Ãä1rãÃËW¸Ñ]s¹:<<>}ƒë‹îº:½?oÛ»´ÉÂÆ~õ¼ÌýêãûÃã×Þ‡5í£ƒçÛäǰ "¢ít¤Õ|Ï‘&nÄ/¢ú0ÒÄ‹D~ÿò[Z÷\XÕXzñUŸâjw „£*ø8‚§zëcª§nn8$ƇàiÉòøx‡±j‡ëÇÛëÃÝî‡ÃÝÓQÂcpb·(¿Þˆa4߆ 3ÕÕý»‡ÃéÂKÏ”;žâ™QÑñÁÃñpw¹ýßÇí)HÛ§Öli)Íæ¡…3wCë³e)°HŒUTU¾yº½Ûz\ZXÓó+S—-Nêôþîö³µiÌSß]}$=WÑIby?ä6Êxþ kʱBŒCvƒih®žÈ{# ÏL§æ†ô„HïÝÃ8Éx*Ç,p–ieEHÃr0PCÞ¢0@’Ì Ö…Ì3 $éZÇÀ”¼ºp9Ìk‚ƒQ‡€—©CÖyE€§ÖaûV ôkB¤&î'ÏIˆdl1̨Ñ+ÈBFpX0þâð`šn°u¡8!#ÖM<¬É‹¸¦·Dì°$ì^‘¡*š¡°,‚2/ Àuœô3Šöœ 'Šö¢I4‰®Š¬s‚ËèÉ3ž—&A*F@e ¶â’1<¦,bGÞ´j£Ö‰¼2:Hgû“ÎrÆÂ:g0¨F¶¯éü"\?ÄÈbîEV†Wõ„Tí Ï$¯®'6H•6Wµ TÓ‰R»½…'k]x¢'ˆ˜r,i!¯ FˆuwyBiÔ á­XÎÌAâ„<\P%ÌôšÂÔ6dŒ8šKÍqùó‹vñ¼~Ö6П­Ë@oMV‚™"¼ìã §?Ë>.&'-lUVGb;-†áf5 ‚ ,ÈÁþ{^ô[»Ê&WöõÖÕrÊŠÄÎå€/àà@ª¬Ç[EÖ{h]aE2…‡¥›‘­bBŠø,+@la!$ªå`P!ÊOâúŠxáæã-§ãQd\šu]þL~ÖѰñôSz]Øã q‘U¯@Q=ââ;™—’jÚŠàöŸ ^šêyøàѲ!¢ø ¼‰À›_ V.¹ëh•‹1A¢ëÄc97ÉóxÏàé‹ ÕºM^ JŽòŒgÏHãgBc 17p'{óŒg4ÊUZZëÂ5« êi½µYžÁ¤µ. I*,/áÄó‘.óO)h†ÁÐiF¢N/mqÙ0PÒâ±›ãygx6C᜴̳x(¥¬N× ,Íûºž³h¡Ù¼âk7í­¿Ž_>Ê+¾ße#Þ[h;þž˜ÁÍEþ¹¾{ýtwx¼½?Ãʈél6·»¹?3{…WÁ)ó<Ü}<К‘ö\tˆ4BʾÀÚ à]íê£Üõˆ8½è¡ˆÞWHãúÒõáérÜOlV[t¬[û2[4ï–õX§,}`.iÎiåÿ²eÅèÑåÅ—»Óá¼û +â6ª=¼C¬S‡íXÖ6° ’eÅþ@×m>ðR &8g×xp¼ûÃí -E©&cIcA\X‡»ÃõõÓ.³˜ÿSx¯(|&>t}ÿt†%Í#-GŽr3¤Œh¦¿P_p¯oº-rIÃ’þ°»œ`ý¿»9Þ>}óÍ–臭 Æe4éÚ‘uZ¹—…Ð^bf+1\jÃã·×ÇÞàÝ’³XŒ Ç%(Xàƒ-ùxu#  þÁšj»çÝå“\+hfrW—Ç#,¹øHL®˜Ù픫ÏÏqyS—e¬®®ÿ´1 ‰ÌU{Zs}. c=ÆñÖD¢Áâ¡Ô0¯yìfÈßžº÷ï\øž¯Ž “Ó_¹ÀíJ×G+uazyúð®Nõ ‹²{Xõã¢z³ ÅèQo76þñþüx3$'F´ÉÒ‰„nYGÑ{äE^ã-{(Be7º"‚6„ñqÍiB0¸WzZXÉÄSDÕZXE[NÖiˆT|&빞{|®§N)-‚ÇçU9™"Š©²²Å3Á˜µãÓ‰ÕÎ4)bÄ£ ba°¶ ˆp*!…åÌ”„t¶BŽ9E¤Fn3ÎM\W-Üæ éÜfŽKE„÷m¤HíöVïR»Ö”ÂjgÛH®HíNV¶‰Ù'õ«Ë3´_0Ic EÌ‘Îbfšm€ž+%Þ·™˜ˆqµD/ab§Àv*ÆUíghsÁ±Ñ® ¸ç1ëV[uƒ$yËj7DϹÆ[AÖ¹(w'¯lGíi<Þ†Z›õ,,ò~Ù®ê†öËÀ¾»ÚŠ!EÇ NFEÏ‹ÖÁªEb@¦Èià⮫=Å ¤œ ëÝxYœ¬n±ï}EÅž"VïyƒtrGà|’4~B ª‹ Ó#E–zɲ(±—’Q2ÏU|H>+kBD¡1¨ÒqÏzƒ)Ù«âT¡¥³3b&uåÁ+‡‚xis⡚:â–Ø¼‘ÇåÉ* ¼9·:b;p ñù@i‡ C VqèA˜wØ<ãØx©Ò¯ÊN® IìøðR¯<ãÙTÆ4€nr}&'vX£œì¥ïVWªÖfuÄÉÚ¬Ïxi³Õ…f#3ŒÎ€21 ©®ó Í9ÉuóN'ûSÓáO™±Õ™'d «3Ox)nñy ˜ËÃ=ûÅÉ`)qõyÝ<œ!S_³àM0 ÷. Þèo®k¯_ºÿ½°7vÃO²;Scú|s}s{}9¼ÝžÃ`ܦ¥bxæ¾8†u湤‡·×0’O÷7?V¸JøÏe5ñyp!ŸXìb™ÅãjËgg0XcYÎ`0l#ÿÈ ÃË7X›_ÝÈÑZdŸVnoÆrfÞà+ÆÊX‰ÿw²ªÇUK½ú„û v\´»¾?_nuÕ€›×þ³tÓZûfwÿær÷ÚgÞìB#®XrÞ<.¼ô¥è–"8¡ ½µð*¼©†µt´ó‚׼è`õ¢Å óD h˜z\¢ dŒwêü„—ŸJƒ ‘ —Øpƒ*êH`ˆœâHû%ÅÔ`5ÑÅ7ê¤D(Dº- HÑDº ˆEƒA»SI](3á\‚ˆ¶—;šÆ¥H“…,‰œÆ+*îì,úgQÇjàäIXÂlHIB˜)zzÐL4]§ÇN.9VSÒ7äÛôˆîçºDgU€4 Jtž5Ë<љ׬ ¢#Ä av¸ÍÝ}ç.ÚŒLRØ_""–…ûÊ„$ û‹8‚H`l}0ßK/pÛP ýÆiAÚœÕ,z‘ÚÒ¥v} ™Ô®uy „ÍsrDi!f¸Ü-9ÜÃÓ´Y8±?|}9 ™'çèf¼w™u>!oY"1_È e€H”S§[ÐSÉ©Óáµñ¤b|ƒTyKkˆžŒ·ŠFb—‘x@«ÝdÇa1Bk³!¸Îk=4ÝbH¥g¢šŠ!ºKŽ™%ÞË‹Òè¨Ä"¹ ÄÞ±a+¥”¢ñ†dÔ—’¢•¯í$ >‰úà=ŠÄ'YÛ2!mÚyå^ŠÓh8E²Emé[¹éðT g‹$U-`¾ ¿hj ªÍlYxËnƒ8)Ù¢D ±xOx‹üP¶xϤÍáD$6£ P>9¨ÿ„l×ûyARWi`R‰Å·ÂF‘ªºz ¿]Ìüxò¢ƒ¦Vö㙚Øpp³ÀºNþ,UâJeŸ‡Ì–Ÿ)‰ eÌűÏäʾj”“w}Ô•½µY}pµ6Ë3)I›­®ä¹ÍÙÙÄ'SÂê:µÐtãñòP2÷tš=~D¤ÏÎÜcdc˜¹÷¼C2»=E†ß+âÓÔÏ`9yõ{>š—+Vy˜ËùÚìñ ‹äbbÚìü!¦ö¥ß¶1ûýL¦0€…«dj J¦Y¸„™KQ Bš¹TÆ” e&Sˆä™Ke˜¨|™%[„Olª¸ÄÇèTqCúì€Z ‘SéDé¾ÕȨ̂¬ãSˆ0Q>…H˜éTÉ‹ìÞè"äŒQ!Bª7zd°ñl5+7yÙ[*vãT]‘‘×SNeˆq*DJ…ëÏ[ »ML!*R—鬀¹êTÎSJÁÄi<îå¯Ê ¼%38U ™Öâ“Ú•>Ú0,¸k‘æaXb–Á¢œª`¶™4sªž‚¬ÐxNÁýä4s!”xZ‘ì¥ÍÊ Ht¤IíöÈ.¯u¡i¥™S‘¤ÒÌ©P.¹Ì¤ e—ÖA`ˆºDúÌt PWRÔ¯Oˆøu#UEýº‘ª¢~}¬^|BÄ‹«ÏžåÖV»!JªÆ[JªŠÎF¡Fí†è<3¬ÐÚ¬¤ é “E%UEù·‘ª(©BÄ¥™T™ÖT!ai ‰B{Š$I9J«¢´j¼¥4 ûÞ7…BLD ‰O^Üðž™U)´13ˆD9XbÄJ_2^eB6^eŠ0eʈ*ÔXT±‰ÚؤdåUQ^…o•yꦺòI™”Wa4´Œ]ª¯2Äx"quÄ9 ÝPb…%Ò06ÒDï§™XÑo›gx{™¢+Y#Dïj¥™4¼Ï•æi èŽÃx&ð©ÉTNà“•©.ß­ÍꈋµYŸ‰Òf«ËñIÏ V61 ©®ó Ï9ÍϬJþTJ…ÿUÊâÌ•ªgÞòº‹b€¹¼–Å¡™“AÇ¿ø˜æÍÃòodSt£2-l ½Ž¡üÔ&$öy’†Ò,9aß]®ßsLÕÀäZÈ_$ ^*#éîùpÇ—$–?”†±ü—ow­þF‡àN\ô5]ݬ1K†L¼\j l°!ÛÊH'óýË›ž»å-YãÇçÊ (õ%Na?±¦¨ä>#ƒÍåË»’?ð¼TN'$ru˜ÂÛ]àÎÃtBª”ãìv° ­ë՚Ý¦Û Â͈è¡I Û˜‘ÌÞœÞ¦ì¯ ·õ|€Y ÷‰v;Xß v;8±sÖuÒv7xý“´ˆ€ÞÎìf@;@P Ù¥`^Ï‹¯±¤ Âë^DÆ¥`GÞ´Ø¥` %&·¨w‚ˆ&gÞ5Øec*ÖÛàÂsîOбGqÛÎnÓ=ùÙý@DoGžEª·Át瀽í[ØB†³Ç²›gù%+‡n»¹.ÊÆ mVë¬Íz#¸J›­®¥ÍÉæ9ñÿ*ÒÍ,"‚m ‹:ÍH¶ ÁY¦å:.O^›Ž†bX½›"ûõ½_| .*Vç†WW`iÜ×ß&Áâuæ¨7þíñíMÿbd¸±ïè20‘ÍWHì»K3ǤØRÜC)~¼(±¾H;õ1)sÀx¨è^gÅ×ñ®Q—:Ÿ^bæçšÊÕ·r˜Œ7{ç{š²)—uF“ß®oïðúñÛ{¼Kz<í8œ™£Ï”.Î̘À1t{D¨^ðº&*·34õé,ÁíøÉ…éÉëãåe¼êò$·½¥t%Iðñ–BZràç&Qï¿>ËuP×çg|Å÷öt¼|»¥ã Ó¸‡yz¿Í¨‰ ²Z²2ä–E@7@%Š6Z,ƒÞ†•[˜¨Ò–¬ÖÏnºc{:œ?í—?ém؇ñÍ]dàÉ?_f»x«;ÐËÀãˆÏS0ÞcΤibè#6¾(7žnÆê·(pUiêÃe :ðŽ" ®>e|Î_–~ Þ?Ýݬê¾ÜÂzãöç“¡P"üƒÜµv£­rÏúî Y` ¢7ÞqTB†«8‰æ†u¾ùVòáãO·ì? f5<]KFüÝùé$mu õ‡B¿}¼ˆ¹<­­ŸBWSoônõù¿?mbª1©„¥Mýë6(óeŒÛÉšûtú²Kß^ù×mtËr±bZáú£†]lšŠB4“"=¢©ørðü@4“"À$ÑLNˆÐ#šÈ —‹ÑTü„T4/o@RÕÐ4NÈí?Á«tݾq!Ìú)øŒfîÍâ„Õ¬IœF1Îj 8qR'yA†H¥nk'D2¬©ø ‰h*~\cD[Ì]ÐLÐÖIMl’²WLàšŠ«&ZŽá„Ę&p2DSñª+&œÌªÓTü„NQàÖ"š¿ W…Ä¥ù›’§%ä,uOËÌY3ž–¢±i*þmÿLO¤M*çõXÂ(Aضæ„#Dò7…Äë„Ty¦±ýizü€9øŠ …ë™|ƒ4n³&Þ˜3m$µÛ[°Ävk]ȤÃàˆ^jaæ·Ð°¸[])‹$èOM$"_%‡¾"²U0 é{ 8hiY›ïex8i¾ÃÝ\r¦ä× B©®gõbŠÂ å-«ÝÙ:žÞ’ÄMSkAJ^kHåq6 ÐÚ,[šS˜F1[U ~ó ¯f¢ˆ¦á§·È$5 ÿP¸¦á˜ø41 ¶ž< Ø pRФmšIÛ4^’Mdky0„ö˜”)uªx IÙDmkˆh"þ€©‰ÊAñOˆÄ˜Noš*aMÄ?´ i÷‡¦&D´©i÷Câk ’¥ä¨6`HPmÆÆ>Hs½“pÜŠdÏúÕDü“»ÒÒœñÓÆ’mk"þ ©& Þ6TÈ(4ÀŒ°4z5É~Àl¯N4)°ÏÄΆ£‰ïCâà_*9Ê3ý&ÙïÖÙPÌû'\1ož ì§F9¾s×G]¾X›ÕÿFk³<㺴ÙêrEÚÜlÚ“é`uVxªánuO§éjdµñTmŽÉAXyó< §§Èð{xæ¼úŽ0_ü^3/§ÈÒÀ¯Z¤á]îDÒ‰øcv‡›ò¥„Mφeðvs›©Ô@椘ufR°£91é¤hbR”s¡Rˆ´™Iu£Ët‚‰"K™¹m'—™LQºË4OÙ´»Lë)1ƒ¿9%&—3§Äd&2§ÄÌ3™¢¬™m&S”5³Ìlвf¦™Y'òœ³”ÙÊM^yΈYg>µÑ•%ÄdlNˆ™Ú̧©3B€ôWG>Ìd“îog™˜F>ÌjSùȇYÓ"ø–Œ.ëþvÅ3ƒ‰OáNNYTWêØG>ÌŠgˆcÒ® –>çÃliâS´ÓHVØ-G%,ûRšxíbÕ R¹Í}d¿tRûœ3¯oÅ"µÇ)8Xk×ýí(µÏù0[™g¶œÁ@Úȇ™÷3ÓÀœ 3µ¿Þæl˜­M¤Šö|s[ V/Þæl˜e\$A·A”WÏÙ0{›HÕôÖȆ)³AKS6̾Adžis6ÌÜ&REûöLçl˜4‡´9&!udÃôl—Õ²aªÖëȆYeÙ1gÃ,+‚áÌi¢U2gÃä·F6ÌÊ«•:gÃÌe"R” ³mÂîhN†Y&bEQÎ2çÂla"V㥑 S„\æT˜½M,j(kBD¡e$¾”‰zB’”}sÙÝ»û§ÇO˜Õòr¼{û3ʙ؀‹_ýåÃÝá–¾Šz<ß?½{ÏÛ±7·À?éîàH®°»»=w§ÃŸ$› ~Æ>…$) ƒ²[H'-ÔÉpxÁÄ/½»Úï~u<_Ó~ûl¸ˆ£\¦Óý¶÷$›m¶BO_ŽrRYž?u´³o£"99:?û6*íZ?Úq8ßì8¾¯ôËÝ íÀL ÉÙŽªžLÀÓ®Ž;ÙÞ§o÷XÝ?l/ÊÑ÷vSÙ.> î’ۦιmØDæˆ_‘7ÁPÄüoüý&C¢d#$‡4æhІ wÀh¡bºr̾Å_©Ö<˜ÓŒ?|„ú¥ƒƒ÷®|E¾v"Â!K*Bðôœžào ÕN×»¨þæHít#ŒQåIŸÈŽ3`õ¥”¬º M]ôUô™˜†JÚßé+¦€H<, x³ŒòI5Å„à­½Ü Ù±¬‹A7MNãw,„[%ѧ3jo‚IÂDIDH+Ιhš(.Z;«IòÐ葦ßlrtOž†uFèÀq’ys”#`ÒKó”G€r­É7›<Å&Nún¾‰6³~³)ð1"òͦ@ìãÄUhŽ™d¡@ÐO‡UJwABæOà DNû©jÒù„xZPQ6Wæ}(,‡?:ƒ³u KɉéÛŒÐ7gGºX¶ EÞ²ÚI~0ÞJ’”ÄáÏ3YíÉL¶'#Ô6'9'eõ¦+ªÉt符bHÐOÕd^°à˜èyQzì&±Àеã&Ý $.#Jb ‘Ä„ã%ÉBijýÀQä‹wÐٺً’¤„Ø2âd˜ŠS?èF¡^€HR ‘Öé-§ƒSåšöYu$áÐÓ@T—¡™¾½x!C0¯‚ø*±CŠê2zöB!«.3æI¬Ý Ù áõCI‡Y*lÙ!¨û0Ä«4RQ+ßÍK™MÂwh‰—!˜PŒ?òj2‘&ó3¼0 ¾éw‘ï)bÉò}¥ÀKDäL׆ÿo¾³ÏøÂžj”ã#w}Ô庵Y=p±6ë3‘Û<ê¯}4˜N|2!˜P7‹|!n½ªs:ÍHT#«~¿ºòšdb6W^3ÏGÃé2¼^f^¦&¶Þáej0W¬r?—ó5ŸiŸ,]KQXœ¿¾®?ÁÇ_ÑY™óµýú¼eÜ`™JÞ¾ŒzœÜŽ´~ö¤xY³†Ÿ¤³xšaŸ*Å"ûó™ß¬þ†ÌoèAºŸyïßÓüÝÕÍ·»Öe\öîH'>F¬3…JŒ VB’*lB$U d£t :¦E·d‹! \¦ë’+ŒønÛmK˜Øc9½X9yÝÊ&3L˜Ý·"ÉÂRà Cô ¥„ß« •Ë)^‘Šmî’XdBdë”DåH²°QNkZW£tsÔSÏíiÄÖùö¯W¤|$ª•ˆ%ÉFˆ¯ŒH›µE’ÔŒž‰È›ÞÉI¶Õ/¨-0V$]Ø@š¤ $Š“I(Š«É5ŠÆ$_ t%Žo^ Bß-Dò…¥Ð):p–}§ïÍúéD øº DK&ÍGE«’bâl„°•EŒ?Ä;ɖ𶪤ò3xc–ÉáÉ…Âu ù]ŠÇ#„­¿•W$©ÝÞJEj·º€niílôõ&iaæ·ø[“Ô¯.ÏÐdgi"‰oÉ‘åúŠÈö[ÂoÞ'„´BHËÚ‹ cÅqÉüMÚ¹äHÖ>#¬}Ò2}ÛfƒxyËj7D¶§·$cXÂxU’×Ú’yÌ™Ž6Ë6UÂLv)³õªvhó ˆµ"[bôYf“Œa¦wLP ‹…=G“ü`dQ}ƒ4)G2†Mˆd ›Þ’ü`duyƒP„=!QzÙZ&$³Oª’2ŒZØ ©jQüåaÊ»ûŠH°êô–ÜMr®Áú.º¨’"lèkBD§5¨Þ}/5(%{µCœêÔöH¥«NCá6OHg-I–(“-ùÚ¦#.z¶ðRÔ“’Mμo¨Šm”¨#¿H%Iüzб(Š~ÆW¶Ÿ"Iº}?©rÉQžqìýŠ$K¸IÖb³At‰½èôŒgOkå„^¥ïZWèÉÚ¬ÞØ[›å™V¥Í6óð5b’˜Î„2;˜T7³ Í<èÉJ4/uš‘ªV–‹Ìßæ×s“o~¿Û=û?C†ÿëâÛÌßäÆö;ü {A–~¥¯Î’x³%{ÒÛ^òèè yßïw¿>ã76õs+x~mgðúp9ʶ£ÿ|_ð[ݬÅlÎ~þ’ÒmW ÜɾãžÊI¶)D»xœ“hwÊd½,½égŒ,ßÖ´ïŒB’½gÊFIréP÷ ÷Îü*`Žõ8ÑóËõaûu <ýʃ/Ëþïáîr_îÙ”qÂbœ…["oåÞ{Û•' ‰¤ñT9YªæÈ™Îh³C¥ßHhì¿úŒÄŽgÚ¿Å<ÕOPÅßåDÛ1êH2¹w(ZhɃh:á'ÜHò½ý¤ÑÓ5fVǘ^Œr~å%/󉾋]zwÙ Á»[ÐÔéƒdoƒé,&í•ÓÔÎ÷näã½ì®ïïžNg>$Ø;—ZƒÞc¡ûÝÿ8ß}’pmÚ{º’s²®ðaÆî|8iDZë§5§©˜¹¿”X|îO8d¹C›DÕò»ŸÀ¬xï[«ÝcÝ™{s#1ùù9ëßïþó…}{&¹É08QžúZ¢u ” Ò7’g}Ä$Û=rRw<µ/†Áò3ÿÑGíÌH®ï>íèø ó­_?µôË9ìömÂ/@³8‚–V¥‘Ü1„€éq\œ!µì8Ïh Å,2wÂ/¡`1YrÇP°˜â´ "Øqèfe¿ÁqšRHÙ7~‚WNøÙ–Ú¸"ÅbVÅ…9æ "Gˆì(¢±õ¥¬ÊÓ@]ôU‘H.Öþ†{zÕêÁÈmŠák”ƈ¶—;$Yu1H´„Éi¼¢âŽ’4f«$"ø© Æ$iÌ@’$!„×T4݉â¼Ö†çÈ,^W!ÐèÙºLøm@â’¤1 ³Øä6˼8JU2éæxB$iLÂŒ>©Íú.Þ‰6%Ï ”g€¶¬â)û.óÚ¢ÇR.’4&a6²¾"‰\©Üæ"É^~1o(m–1”ŸÁ­~Kr} ¿Û»Ö•‹ÕΆÙ8‚´W¢…"Ψ[]Á[³,ÔôŠK,d&¼‘gªšt>!ãÌ1¾,®DY€8˜KN”$i.Ï6}hV1^cÝ MÞ²Ú ‘ðé-ÉCb‚ð¢sÔnHŠ<ÖÌG›e‹–”Õ ›®¨&Qê ŠúS1D¶ƒ !³L’3f(=U“Xâ?}W[Ê+P¤ É3!’/f¼$Éa “0VsCqµtÑ‘L@$Éb°e{nœW;J”—Š#Îû‚D‰oŦƒSå‹öYu%9ÌÐÓ@T—±˜¾£x¡x)9›(’T—!²ŠQu£´y …µ%]L´34¨bÐa†×Þ{JqŠ„®ÒÀóªÙ£ØÉ$BÕF¡Ùqäµ¼äÅ2¡±Ï„Ìf$; u”¼YhÞ„©´’ ¼²Ät[¾Íþ¿xÏ^h<ã{ªQŽËÜõQ—óÖfuíÍÚ\Åogi³Í5=p›£Ó‰O'êfb¡É¦p ²:§ÓŒx52ŠAž]y)l?Õ—ÊóÑäô^¯ŠG3/S [ïð2¸œ^ýÎÚÀ¯[|L.Ir²Ä1ש֛ë/->õ,„6øÀHm±…s ]º½úÍ‚¢·ä+HÑxM9]ûã˳ww[Š,ÁÖ]Ï®¹è’ÓÈÝÜÖ”-L.a­qw{Aúý Ùõ¸,¶{€PÉ݇-Uª¸º?ë1 Ž8]ë\ýü¿±Ó´„º<î?Ú¥ÖûÝÝññQÂwðP–rºV”(ðZîóËÅŽD‘!c!þ“ŸÆÕÈ?òг¾7e²>ÃzáeîÏÜ[íÓ÷±@*Û‹— ý—¥©Ê¿AËß–ºßÈõóOHzºÒŒw§ñkNxIùEjôµa\’Ò—ídéŸ_ü?8Q‘šendstream endobj 170 0 obj 13366 endobj 174 0 obj <> stream xœ}K“\ÉuÞ‚VÄöÞ—WSˆŠù~xã-J¢ÂTMZ€Vuw]šî*°« ~¶ä?àóμ·¡Ç11ƒÁW7_çœ<ùåÉ×_6nç7ÿ‘?o_üúÕÍûË ·ùø÷ý‹¿¼ðôÁFþ¸}Üü÷7ðQ ˆ¼y÷‚úMË;»ßÔw!ôÍ›ÇÛÿñòÍ¿Á·M>-»”{­ðù›»o·w?<|ØŸ^¾Ž1BR¿ý—?¼ù§9ë”w%:Ïßoÿn™YÝ9ï|‘çÿý—óùðã¿áGÑA{\”ŸþãÿpBß%åë˜û.Àï¯SÙÕ 8|æv-nÞ|~±ýÃÇž—Ëñô~ó›»ãõ²9?m®÷‡ÍoOŸÎ·ûëñ|Úœßò/÷ûë?Ÿ?oþpxxàB†X î›7ÿóÅöÍýáå÷ðKŽòK»P´ÞßÎ(d•8ù]JEw=ªÚåóñz{¥óç–cª»i9ÇÛóã‡UvÁÉo¯V Û®¤,úØ>>¬ñ³ ‹ëòë»óÓçÿ¿”wÇ˺í#åfº[¥Ž Øä›|ñä:¯‹^oûyÙ<á¡ì\(Aïðx~‰&TÊöüO¯-‡í,¾¬yȾ’ìï´6¯#€yígõô²AF¹æ-Hp+™ô]t½i6!eÌŒ~só2ízK>n¿íoŽÇëJU=fö#U¢Â7×óæBZ m×R³F¼| m±ÇííñÝé?ÃÒò.‡¤†ñÚùi--·«)ZŸ »‡–n®_6û§—¯Š-Öíû‡Óuó– ùÍ›¿‡.füÀ?A.¾ìZÙTèv;ÐîãŒÔ]ê›D ² ø3•9 w1*R"y=#mç1…fƒRÌš‚Hð;GüÉù„´‹òÏŒ”] œOñŠT¬r€Z¬ŒÍ$S}®õe>ÎÊ*àO©^ª“wZž´€ÌØC uW×ë®#Zen„ëe EÄåY`S*‘;˜ã®‹ÚzxñÌ© æÁ)’ña×¥©M4XL@4è»U±‰¾À͉4úŽ€´K €R ÄÄùƼóa!øØvi©èv•¾«‚€RÂBí©±* „ÀÕÉ~WËÐý »(ß4’3"•¿)žÍF&iDI\g@ —U×y Ð{“ b-Ié©Rº¥ê^J·²z²ÒÅ6Ð&¤†™Ry₸贃 –@¡7$7–sèK¤ÀXËHd­OˆÛeAZÖVé(Žs†Q¿—EÎúö I;·ì^|à )’ÊJ7$ƒ—^¦ˆätSw^–nHsÜã†Z#Zñj,Š€Ï‘‰È0¡Sô¼P;˜g¯ˆ˜|Éì¡&$J> þ¸DÀ4ü2BV£++ \ñ¡µ±± „Á LÖjØq] ªAF ír_H7–iŠvR²KÚrU É/”5U( ªt'ÎÈè¤E\–˜!A Ý6šá„%HÁx©LæžýIúZ-dÛè-ŇRU€¸¥†|<}“µ¯Õ@½{³ØéâÏ“öPg_}Èt©ÒðN> s–á.ò{ˆ4ù&¡L£@ê䋦o€ìúe>)PÛ§²b·:«.Vgý&H­,ðÈ\çf C¨ËÁ…üµ4sO3ÒÅÂðû˜f‡Žú'ë1‡î]æAÉŸ!æøÈކìháø°¬\–È¢†XëoM‡Œsét(A_«$]à&à³q:Tó»Û}ô+…knØ1¿J¦ürûç-Íiv ¡Ãvžü‘æ(ÿúœ"Gag,T€Ÿ ÿÛüúæxúõõéãaU†Œ¤¬ y»ý~s¼lNÀ4‘µÖÚ·û§&®—ýãá¥G‡°Ým~{ÝÜÿæðD}ªŸsc “©¤>ž6—ÃõŠÕÇŒ>)…‘¨‡<¨- -Î÷¼ýt<¼P¦@½("êÍÕêÁÕ-“ÛÜ·»?¿dîà;š…ݽs†ñ—Úó±Í#| N¬§Ø¶‡Í&L¯ÁwwèàÛóÓu4÷ö~zÿ’;à\øÍ…j*î $G¦ž0“€ê#•;ðÓþAæi`qIç; ýúûÃJoðo:aÀy¡Ìn>–wÝŒs!Näѽlš\Àø&f±@ª¶ÝfÙi5ötˆÓ#&¢~¿Ãì±qÆú Ì3g¬ù°_œJò~ÔXz5æo¨„¹(ê".§a`Ht5šÐSÁtÌ&2>!QL«F¢Õƒ×¢#²zðZeÎÎóvU=™zÈ'ùÙ¹Ô8\›!sý~§iË*ÎTüpHïR\+¥â ®Â‘×v›7÷@þ$ô~¿¿{KÜ ç¡—‘‚×€Ü^‰ÏzÈ{T>{fcÞÞ}Ô1ŒµÅxF˜7ûÏ?~Þ?ar¨Ø¡šRÂÃý¨ð/p@®AôW›ýeCUÂ@F·Ð÷OöÇÿÐÑ j9dzÅLÎQÈ¢-€œï¿¿l¡2qÎÐFYû÷DÕA_Àºµb›wV¶5–€!C÷sk8ɱµžãŒÅڜӖÿû:fc‡$|ù_íÇN‹;`^-Cß ]ŒYð›‰kÓ7º)IÅ´ˆ‹{˜[v6˜ug“ý2tÞe¢ÕlA‡t™0‰©OwÇÛýõÀž¨ÔZ OT6×3O% w¹”F&A­¨8¯/f3Ç+Oô¡ÒpQÂÓüÀ& `hš{mRÅó 2ÏÛB ÛŸŽ4{GS¢VÌ¥ÎXÆ¡€jë&:ÍÂ¥“¾}5–H&`€Áåþ5µwѺ‹öûçãôî“Xh)MçTçÙÌÀlJtXL𴏿¢e·ZR=æQ"Ï4+®ßX¿:¿Ú?î6 ¼#޶dr0«fÛ pÀ*䯈žï¹]s}Q¶0ùïË„À¡[Ö™;ðLáÏ/Éö0¹¾Ü~¼\dýqÿi|Øß<6ç¸&yAGuPiÂLµpšŸâܳ‡0²çÞ>¯h/lKïÉšù¡á¢ƒÌ§I|›[p7/_gÒXÆ óéþxs¼ ±UZùÂß¡ |û–ÉÿÊ€|ÂÉÏO‚éCäÃÃ7rŸÛm$V޹ªëŪ6®êoO›+®hm?^i•b × rÖÖ ɽdûn{}µ9^eî¿´¼‚Aòô­…H6pDÈú¾iyXT…øùþŽãrÝ?]/«žÿZ$‡~󇓌 ஀kk¯yµ¬#˜+ÐM‘?+O˜® –¸Q•eOê¢\wŒ¶«XhÀC†í'ö»sd?Ÿ®0ž}Y9>ô2 ý {?ÕsµÏííGІ”!ß툆r&ßÿÚw\¥ñШ¾“(ÐoþB··×ã'^Šõi{xàåЄaqõ!¦Ø®W_‹ÀP()ü¼ñI&?–Š‹Ç¿Ýƒ×fMAƒ·wë¢ÿ@ï}Ú¿»n— ¡¬:Œt”Q1îî\ë½ÑÀQL³'z F1¦ø×-­=»Úü ƒQGùE1ÿ‰ã;sš»Ýæo/Ïâ†Xœ©“KÎI'ß~7Iâ›ñCï)Õ(-jñîÌëÔÀŠ·2ZìÐÕ(ÊX-^ƒí6$Öÿ/ÚÀÅ⸌‡m>ïÙ›Å@‹_[­<ã XKD6áŠ`u!:]½G_ÌŽÎÃÌg{@7ÆQA˜hyÛ­2B“¥á;ÝíO0RsÇF”öDjNˆªþ§ý;Ÿíˆ°@æö?“i8õm!³ÿ\·“ޱ‰~|"›ÄE˜±*}úZìò­/7¿ûÝßý=ðÀãÃÉ,Ô˜¶çDöpW€ƒázû¸¿n.?|`“ÎÙAçéºÞû±–Õi~ØßþønÝTŒÖ%õÿÏ÷àBÿðŸn?a&kyØ7§3[r¾)¨þp>½—–w#ýQ:Èái#´QúšFÅý&ʃe|Å¡Àü*V3áÇ›óOÏÛÛ¬½¹Æ‰¾{|¼ûм,½ú¡ƒP¶R¨mÑ©ƒŽys Ãså¯U1Ø–“›áà5'y‹Ý™‡Ó^wУTÐ @¸ï`·¿;ü ‡4ÚqÓK‹[ª&J&‰VÍiI¸ð”7©‰[¤JÜš^i·„VU‘À5!@ù‘À5!PQ@$p HÁH@*=X>'Ï€È|†Óa@$r¢£ô ÅYI¢|(CHÁ:w™ó¤IìšDõ‘Øõȧ%++b¸—ZJÓ`B*Ö¹JðšLò‘è5!s.½&Ä{F´ÎÒŠ"!”ÑÒ"±…!1Ke’/¾^ë 'êwLÂש¾&„uèLBEt­ŽE4&ñk@hsr*Ž9BÛC@ÒÀÑÓ6ŠYö_^êÈD!D؇îgÍÇPD«ÿ£÷Œ°•Á(„D"Ø€–t—6 -±Wm”*Há²R‘:¤K«ZÈ<¯,¥[ªÒ¥t+«+]¬ì¤J 3§[òbã]¾©h³4 j‰€¤Êr}‰HÏzHiî$¤em…—¾â¤?[äœI Ä£'Ÿµœ(<¼@’¤²ÒiÅ©šD±iÒS%f=JŸÆ}nءֹIˆ^…¬WµƒK ˆdµC$’M©È2›D²‡ÞkW‰Átœ¬'’¸yÈ&R––iÝÇSsŒ]{ Kßâ¼Z£=ZÌðËfl —dÁdrR*iHV*™<ò¹(•Dk.J%AóÈE©$"¨è\”J&Ï#×`ùcDM(Ü€ˆRÉ" ˜¹*•L\(åÃ.‘†u®jf†¥’ˆªRI˧$++“ÙcK}U»oÎJ%H³’|”J"‚æš“RIDй"¢u–V$u]ÖÒ¤Ú$6R©ä“RÉ•¾¨C§PS*iHV*™B:“PF«c)•LF@tO‘†\´RÉ™.L²§ÉöB?‰ˆ J%Sbç>i>UѪºœ”i{!be™©@®J%áYÒU©d‚’%V¥w ZØa’£§ÔÙê¤ÎJPìºBª”n©º“Ò­,p¡ZºXG/RºRÉÔ;¶™Ú%ZÅ}•Ë~`ˆºRDªg9ó 5uœ©Öû@î`„ÉAj…ċ‡Cl©ë‹œqõq…DZ&-ƒ•ä’%••®HQ*i©ŠRIðòÒS•8ZéÒ¹Ï ;Ô:¥’©Ñ¶X²^ÑPÈ@ß(•ˆRILE–Y”JšÞs7‰9öY‰cáWHà|²RÉ(•©”8¢ÕÕBû$?Š›…—Hsâ“”J¦F{wQ*‰NosV*9¥’#•RI“sR*iºHJM_":MJÈ¥¯*9+•ˆRIì¹ä‘’G”O\!‘µœ”J¢Ä¨%%=©f¶ð¤Tr J%ñK\ÛFT*™*Sž•&ÂŒƒû{T*‰îVßðt‘*mçéæ,ã^æé"M¾á©Ñ4$¦õÓ7‰iý”Oâ ÞTVlVgõÆÙê¬ß®ó(+0õG‰éH(£Ãêr”á‘7yóR3¢T2;'ã·úõ삌Öê׳u†ÿˆú¿,ažáo²l†¿Á²ÊÒ-køË¨$ôÂâ5*y»÷øé_Ù®ìö–\¾¢¦-æÿûí+@¦ˆQCpÍÄïΛÓyCáXŸ1òzû€k(Û=¯}_nŸl¡ËÎzÊrf´ØìöpÚèRë<õÓ.ÙÛýé' ±Š¼*õûÊ™C\MôÊ4ô”Ÿ¾¿¬k€tÛÛ‚ÒÛÓùhÝ~}ïuÀ9Àض‹L¢Oœ÷p™X¬Ç‰‹o0ZÏ,vB2³XBM¶úP"͆ßtÏ®ÖãÜÆD"Ó?B2Ų¡S Cƒd»ÃH‘νÉWGG@èâZ€<¢Bùï$âý„żBäD¥j”cN2òiÍÊ xÊJOAÚPQátîÜ„T̘£e‚äĈVYÃXX6”#4³¼,•Š·‰z&]a„¬c0¶ƒ†x¤¥‰õ—L¾KÛ­,<*ˆ:â`u–o\—:[Y¸H&#ŒŽ€20 ©.Çspâ%ÞéÑþZÕ¼pŽ_Îg]máÌ¡k,GÌåá kéd°,}^5gÈ”Ç/ÙÓÛ0ôéžÞ\o@eßૃUý0oÉtjB²®/óîêÁ§Á…ñ)BRŸø!²0>û„Šæ'¹†ÀÛ´¡ 8æG?ª€^2ôiÌ&¤ÆIø"„Šì'B5òQBEˆ«¡ Ï FEH‰£"cúƨÁŠq£Ñ íÈ£¥jÞCbS*‘¼Rªµ¾hjF-Š¥ˆRª€za&•ŸJœŠê'Np‹uÍx}»OœŠÖÉ]ŸeùüܤŸÈè§¢ÞgÍG>‘3º!­Œä>uCZ=Áé¤qª›ù>q*Z…I}â9´RSûÄ…Bä³ $QAÑZR^"ÙIé–*')ÝÊÊÕJw¶ÒWûÄ©hM3ø‰SÑš¦_ôƒ]_)tÂ}0 Iºšc‹K$RX×Xµ"ĉUÑj{‹œc&$òz÷¤åÈ!œ ÁK_–¥mUQS]_æc2ƒCM¥„CAÃG½­E6 >«¢ÕI'V5!EWÖè4ÍĪLïÆªh•œ<‡r(hWã¾;!Eò º¾lˆ×õeKåt59¥Y ÄŒ‡¢uê°B"û$¥UTÞ'^Ek¾ô2^5!YWþ,UÒ~ªrVb5t¡4jèkBD§J£ ¥Q¼Ô@¼äìÕ qªÓØ#éÐMòñ+„÷T±âµì>QZ§& Wb5!Y¥»y_Y_޼ëÈ Ò6ÒDû[|Ÿˆé´-¿ ™íG‰ í¥!Ϧ„(àv¼Þ'ÒHfk±Ñ òñáù>ç;çƒsÞeYè± OóMß`m‹²Ÿ¨ÄjŒ&ÕÕ(ÃëË…—@Œ[MHU++IÆoóë¥H7¿^N“ÿSdø¿*¾ÍüMáå–Éß”dÞN‘E YPm„Ä;HVO±–¼^²}F²ÞnøóKÞ‡({ž=î‹^N á6o`ò¸”Èit¶ñü°Ž§áÎoÛóÿ<‡«ŒÞVªï8ÒØƒïÛƒ^ €§UËi IvöžG^ ×K x_b;Ø0¼¸ZËF#qAŠîÝ<¿O[Ú†Ö‰wâ' ¸g–yç@”w"‚ÄÜåˆ ƒöEygÅk=¨J;€ÒQÚ‰¼0†ªÙTŠ›ùªæVÝáˆÒNœyuù†éNo;gÃÞ²BMqzs2±È(ëDÄS6Ê:5›Ò¬¤DsWl&›:"‰®¤‘@ÂQÒ‰ˆÃŒ“’Nœ7´ÂÒ„¤>Κ™´ç›¸F*•zRιÒõ|œ‚–”sR”s"ÂúK&Ÿ"ú«VÇ*êRΉN¸ñ– 0ÎABUʉ¡º{© ÅTšyÁôJØfÅ¥¤…¾qã%«›}NÖDÿbX¸9€¦L³â¾T˜hVÜb‰€r¿ÊñO˜€TÜô8Í9þ+›BË–@áB-ÌœÛ\FËE`;h@3W‹ÙeÃIšÒå“J‘ÑÑü¨wÅT¾°LyˆúÒ&û ‘‰="ÌšLì1'Mà‰ý”³Lãg„CÛ“F;]1´@’¤ÒÒ¢ìr¤RvYq^æ’£ôp aXܨ³²Ëæ…ÐN‹!•ì]Ùå@”]"¹ô³òÈ \>­*9+³ˆ2KLE~')IJêi²ƒˆ—:Ó2„OJ ãNJ,¢Ä²IDj8]̘Ì")±lx Ê+îafÀU5í¼ü“á$%qØÈΙʠ†›"hò…'+¾žl¿CGª‹ªçöZxÇêg“ÖS¿ð\O+÷Y²„tt—oR\ 4œÏ `²8¤ÇQ"‰H³ÓnŸ^»á½‚ O?su€¤…kÁ|òÒÕÑM«Kç·¨á/#’#«>Ž`÷½Åõy–Á#…˜!ÜœÎOx† W}ñНÆGr`ç‚ç4õ‚Ô^”"~ý´:²»óÇë‡W9: >ªØ9øˆç«)×ãõrxx÷|aÇ—fGŠ¿{8œÞ_ïŸ_«ÚÇ1íiù¶7Þÿê¢.ßD—oÁ™!^p Á¯Kº~ÛmË  .y­œe¹¬ë·ˆà<ÃåbùÐv º;㸽Ó6ºfŽCÊ#%ò ¯5öΛõ0^€è£y.k°w º€‹ˆ£|t×òIÍÊâ­”.é."‰Ú®+¸ˆ’®àöÎéZUC0”ŒˆÖYZtáÀZ4œn©TòA—pWú¢pzïïÄ‹ïx פK¸ˆ°“I¨‰«Õ±‹Æt œÑá…~ì¹ã¤ËJþœãÍ&{@m-5ýçÍ^]V耗ä:i>Э¹•5ÏîÄÚ8B»º”‘¢,îw„i ^H–X”£¡%GA˜+àu®e‰$Ïu.Êý°=~…4)ÝR/¥[Y%[éì^ñbÖ(5dFH7NŠwù†· NÒ0DÝ$¦ò‘åÌcÐ@Ô)âµ°¤÷ áfˆð8:hÒWxpÃß²_äœ8ê5#›´9z6#ERYé†(#©”¢ä£ ÌÿFé†d޹MvhuVFH×Pf¶ÞbH¥^ Œp Ê!ËLJ Mï)šÄ{ޤ -*¯$ù()ˆ²Â‘J9 ~íWǸ\RˆÞ©.\rŒì’Õ0¢¬®àDiDe…QV8R)+49Ge…¦‹¨Ðô5Õi ¦w/^Ê®Åo‰%¢¬.bÎæÇ¤¬ºBxÓ"^êS¸%4ˆ…¥…QZˆHžý1åL¶”¢v©/e}(ñ*ˆôoZ}Ù~‚’2¬+y¶ ÌŽní¤É7‘­EGð‡=ÒøÆöZ#`0qYbD½q±:Ë7.J­,ç¤ÎÅFBTªëQ†h"]hÍK=ΈÒDDZ_øõš¤Ç›_¯|’sò† ÿ—Å·™¿©]œüM æíŠ•æ|~ Mt¸¶‡bñÆóM¿kí[‹ºƒ¬!OÜŸ¾ÈÅ Å®îy»ÕË>£/zÁ¿³Cßo·»Í?N‡§ýÃü=ôßHÊ×S@užsIì6Ê%é,2ŒKW±NyÜ⃷§ž…h¢µŸ?ƒ|Õ3èrã?Œk¥|ýÊÿ_I{ü¸énóyº `õHĸó£• ˜ÃWnS(¸Ó¾NW7=îOw›‡ãé°Ñýˆ$ `‡>[|ã6Û]PC½ÈrìVª¯l ÄMÌÏö_¾Æ¼)³û—ûgo>Ø£¿^oÞcI=Þ%-¸z}NÕ[& qêÉT} JÕ[¦½Ù'óÑ6QªŽ 6±y¥êˆ@—Ž a’Û2‘܈0͇È2 JÕ[¦ÅùˆA'v­9¤o˜R¶B§q(¦êˆÀp10•WˆRuD2å£TÝòqÍÊJH~¨¥LÕ[¡øƒWÒ \l ù(UG\_¬M©:"Ð?Ñ:s+p-E„©ºJlJ%’ǰd.ôET½•ÌXSª®ˆº´µˆ“I¨ˆ«Õ±ˆÆ”ª·B»Æ#†Ê’ tŠ"bЋ·šµJçfÙュ~ð!ºÝ²5:è9k¾ѪîÐÁkb‹ bex‘ Û-ñFÚ H•o:[bÐ-x_`„·âu!YJ·T¡KéVV Vº q1KéºÝï` bã2‹ôŠÆ$èÞ#DŠg9óî®èV#¼¹‘ô>@׆»è°AúŠ“Vx´’9gO=}]´Œ÷2¦’$••nˆn¸©tÃ%ÞøXáí•£ôŸ™ìpÔY7\ö@› ÈzU;d£Ã’1/Ýp‰©È2n¸4½;ÝpÙAOä9œn¯ì.²—š/ùè†Ëè†Ë‘J·W¢Õ•%âéÈ-!òð…­eBèò@IêL'ˆ"†Å¢õáˆÁÕÜ—ˆn¹©tÏ¥ÊcÏm¡ D’Ÿõ5#¬SDXïx¹t[!ErÖ=—Ñ=—ØsÑ#‰ù„%âI¾„x©3é #•žNþ× y‰èžKDÜÂc>ž¾Ñ=—x t¦œu?%^‘¾ãè,ââ:¯HH•vÑ™FÊYƽN>Ÿ&ßÐÙÈy4ht~rþ¦ÑË9Ÿæ¤íVV­VgõÆÉê¬ß8©³•~žë\l$,¢‹f£Üb”á Q¤‹ê¥gDw^â=»±Î~o¥å¯~nçõ ÿgˆù¿Ä·™¿ÁHúÊÿuóvŠ,jøËö_bß!ñV£ê±ZÝÿÕóBô€Ò7Ï Ñ;+z[ßùéŽ(öfO÷sᦈíùx‡ÒáѺâêöð«Ÿ6·ç‡‡#^ŒxÙìTëm­§ýãáÂWTܾ•Fþ›×ðãÄ`<ùÓá 3^Gw±[ù¯]ÀïðÓŽXºFÏ^!Cò3®´ÄŒknºKêü¼ZewÿîOߪV¹pÜï£ÏäÑÜàvÿáxÝ?lþõOßäiÞèù¶NfÂ;! /!àÚbr00¨˜1ö`ÚFŽ™ÝrÄÕYt)9V¦Š„dÌ£,œŠï4Šx0 šm¹ëB3rú†ˆ tò)’3íŠxt0¯9HN©Õ'1ùÄ`eÑ\j©¯Šj{±VÐ.N@ä©&B(f×™ð‚n­³´Â5v°£¥N^©TòÞñ@¶ÖvàèùÞ#À"ÞÐý†”®;ÑaS ñ}Ðz¯¥ñí;$¡©ôb„.·ô’3;æ!ûàØyýǨVAxšÞ‰V#;F@x0A„­,xpðØfäoJˆTþ&ðˆ9¹!T®sÊL…bÀxØ ‰Rç,ÖR‘Ò ÉNJ·T9JéVV.V:[G(NJOLx#íSïò§)Ó$ CœX""HsPΡ/9†L¥“Þ'„‡ DK,ñ i§—¶4ôEΑ†¢B“ÔYËS/&©¬tCäXô”ª0á%É;AJ^–nH ÜçÌGå¸. ´WެW´ƒ»c雨Öbˆ &„,óBÄ"{´£®WH‘| Þ ÉLx§T‰é-µ½¯Jô‘(-ul-Å'E&¼€P´¯•(nˆcŠ7//-T¾i?U9û¢mW]øÂôvèk ªS_LïQ<Ò@œäœÍIªÓÙ#ù¨:Qê<ÂZö‘ / û—Úã"OòÐkŠ'QÄu•Flæ}CUÉ“m¸ª=.&îË®X/ðâ׋öÐØ'ŒoBbûq… & ž=›“G0Á5ö~®2™$³µØh€×æÔå7®±×ù¸Ìme9ouV?߬ÎU|x–:ÛÈÓ=×Ù; ut0©®FypW®óæ¥gÄ«••(ã·ùuÜ+Ô~½T&ÿ§ÈðU|›ù›RØ~‡¿)ѼÝ@ÜœÏ/ ¼¸“ß±xANBxà ž€øæ]K0>ë]K¿ák¹‘ô=F — Ùj|÷ ’[Üz”k¡ï÷²{[íšíTØ>g¯hJÓ£ß`¯xµ}óãð{›/Xºùxݯâ¥m\v“ê¯ø•.º)V7´^®@¡õÞ¥l±òç'ô±Ù|Ø<®×Ãt‰ì…üÜsŸÃØëK1¾e“ lâÍù²Þü 噈ƒ5Í×ó¿1ûSˆ ^V}ˆ`º!Œu#W­Ž¬Ðo.ç‡Or?,˜©…æU*c3Ê[º6öxÑ M, ó›‡Ã#=2A¡tV<Þh”ú4­Èr“ÿþáa·ùÛ‡ëýùãû{Îk˜׿FnPã«!­ê230S¹|ÿ#L¤67ûËñ_³8<½ÃWÑ`®¯6xMëúövQöÇl7üiéçý?ÒöýÍÍ|}õxﮤ—–ã’#öo·Áœðîxùð°ç§è¨wá.i7æVÚ»Æô”wÝOz…1¾þüH¥½Ú/§ï¯§^fF¦y1ÜñÅͯ»ÞÖ¼œ¹.fióú >#~xú´¶M|Òbž½å‡ôîíÓá+×£!!·7°aX`Ã^L1[eñÐõò’ëé¡k0Äi"ˆ‹µÐ™Ʀy"hLTx"ˆH KÀ%Ò¾–€HOŽHLˆta+ˆ€é ò /ç å¿ânµ€Qhvþ´}ˆ*Ãm…‘ox²B‹‰óaò‚H¦œ£ ‘ÕBbÁê5!õš6AË¢:©™¾*RpÚܯO¢‘k° ˜q2¤½‰­27¢Õ œCŠÄ*­)•ïò L𢗂«24¤5™Òr1¶"˜xšh/[ —Ž×s‰0èÓ€a)¢ÑÉûYYQ…"¢Jwây Á°šx,1Cšºe0&Âq+$±Šk•É>û[ÈÉíl85kì/C^"Q…©ÚÂcÎdÕkgs2<¤#*îâÐt|W¹®¾ l<ÕÉd˵ÎãKõ:Þ5:.BH“o›Ê*˜¿©tt`Χi»•UºÕYq±:ë7Aêleå.uN6ÊÀ`R]/v'–Í?=N@VÃÐb™:¾oÏ]ºÇ»F~Os{1‰SSGƒ¹,½WÈ\¹_6í—PI°¸nÏÓ¾v¸»Íûý7§}ÊÈ~àw\ä!èoÞ]FÏÆlðuÚ/¤ï–``Àšù¾Ýéa—¯ñ@eKˆß—ÿ¶ùýÇ3¤œoãˆß%›mìåIã·‡õc$M+ O‡_=¿—ã¶§ý+O¶U{@è—=Ù†Ó¤ÊôdÛ?ó&"ÚH!LƒÞòŽÓ#nÖ‰N0MÑã¥øÖ…óüT³Ìxp‡‡íýÑ¡wºÛçî•îW óɺ[Xæ}ü¢˜PØîaz|w¸€ ùѬwç\Ÿ:^y~€ÇmP­òÜ’ÇS¢2˜O].Ç÷òŒvõóƒ!›ÓÇG¹J9øŠ›¾ø ¨#>”}Øìoä]<ómÏ|Ы5=÷n//Ao Ëó ø”>ƒåíÄ,C;<´¢À™ïýñý=´Š­}èôd”H——¨JÔ‡¬qGÑé¼µ!’žð~è+š3ˇÞäÞüñ"O¦8Œ¬ù‘µze O¥Ønµ·0eý/?l¦¹€Â{Þ‹’ìa«³Ì—Ê´ÁŽÞ&ià=·ú”9®ÈŽÇqžŽtµ5hh²<_ñ‘pþ½biU7:‹{Àlºè+¼bÞ!£ ukÛ/¸Âù#+°s#o14¢}”,êÆ¥¸øüU< $˜«¨êH-¼0¤fOõd Y曡cŠE†ØW!CˆVŸÝæ·ï ÏÝžOÿéx{•‡é>°Q'·û§ëñöãÃþIûÆÙ¼PïÔ,úÒà.³%ë=XQ™Øb?ïÅ-,„Y¨+9,-„‹~ùRíò<-óÂcoÅGs€‹©·¾øèGNdA/ú¾¦MÉí³Ôåe}Iº,¾zÊI’Ά;Õ)¬ãå<“‡1^÷{æÞ¸·©À'Á’ÆýS΂nÁñîXô$èûpc™?çHb‘ƒÙ:ȽU€>‡î;ï…µ6ù8¬ð‹ xÅZ?—;Ü|>^îÅüñRw¼û¯Æ•õ'<²ïçŽÉ±(W¶»ñRÐï_ü_jÈendstream endobj 175 0 obj 12321 endobj 181 0 obj <> stream xœZM“ÜÈq _s÷Á:ÁáÑ„úª°:y¥µHI\KÜ ;ÂC† vcf@v7zÝ3ýjkíà—YYtI9»›¨Ïüxù2«ÊÊBe%ý#—›‹_¾vÙíxQf¿Å·?](ÉŸå&ûî ƒ< ®n.Â<•)« gtæ¼-´n²«ÍEþóÿ,®>`,Ä2¸. ¯ &\­.òWák\ɦ)uüøv{ûÓp6]7…©›FFüx:ݾ’/ÿ¹úðöî¶=›m\¡Uœ}»¸4Æ¥ÖùÕâíÕïæwRE]—ZV[/¤lQúR}ñ¾ñV>~|×n?œŸ£,Œù¿MÛÝ=Ñ`aâ5_œNuEÒ݇wwíölæ¥Q®PÖd—ÖΩ†‡þÒe˜¨  ›]=\äWw]¶çOº˜ŽÓmØ"XǘƋð¾]gÃMv¸ë†•‰1ESšxÏ¿½Þo÷Ý}·»³“Õ¦¨t5¡â#Œýay×Xüláª,ìdžqùäªz¶`~M¿¿ºøÓE «fðØß]ØÒaL“9㚢l²ÍLâMa›l$^AÒ¸fÀô†$uQ' ¶‚¾i¢ÄºÌÙR¸½HE›Ö©ŠŠÇÀœ.HÈ($q´IÙ‹p>œÙ¦L(Ù!iõ,ËpæQ•#ˆ(µ™Kªèe•—üpì7D|ÂõZqvšá_’$üƒ¤:ŬãÎðÏ'´‹’“Ò©¿Ä䯊TÞ*ÊZ¤–Syß­–Uû„R?amo³~ÌÚìýñ–†Ú¦ü7Ÿ ‚ˆã¡äK¥Ãd%“¯î0ÿŽÇÝŽF"§Øiú°?0s„WÙD?¯óUö~AHQUMþH44[›M·=ŒÙ»woö ÌîÙÑÒ¤·û…Ï»…Ëï°’—Í»=CL»È,»ì¸]uûìû›Uw“}÷ýëßÓàFÍÄWU Ì×yö&_àJP…ªò—YX‡m*¯ã¾Ýâg¥2'o×ëGri!Ÿôq¿øç8qY:/¥ B˧’¡,ðXÞò{Ü·ß,ž=ƒส© ”ðzÀÑÛí øC?B›nÛÛq¬ NÝoãùÀDÁm¦ó‘J>®.]T Ú¤’aO*9¿‹œáTá¬Óé[3ƒö¹†€¹uíf:¤£ÊN¾Ò´Ó%¥JWYì±Ð”ª­ÊŸE¡>mfS—¢óP${Îx7×ä—¸*ؾ°ûU¼@ݹ:V3졈©¦I¥^p]V'}D ¡dŒ–®á³¼+ixÓo;R#;ª­ ]X6ïÖÃíHGêÂé@Æ)O­eŸŽÝxè²὆m6m¿³‡»ÇlÛAÇP5[s;D[ê‹9h©P¯Åݵ÷8°ÆÏŽÈ»3Áœ³‹ž®j«ÒÕÉ•èör+U]QŠtñì%!2½ëoï}G'íÂpª êºyàÕÁ”JEû6MÅäpèhÞ8Åk!è Ò\±*ÔçH—V.ò‹âR´—Uþê_óýë—ä+N×ùËÿx‰ÿ±ù¿•j~ª™«ñòÞŸ]ó꟮ó—ÁtèP¢RÍé<-‰ûýá1 ÁIlø0S%åålÞŠAô,4sªV³W/žë ò?~B,vÛ%Á%tRÏuþ<ë¦Ëá¡ö¸ÎªËÞ·c°TeªRìI·ðÁè-Eòr/P«ëús83öÛÛ5†’Ù j(à?áT«°¸@“nƒ›El[ÙÁÄÎëü!» ñ)ÈXlÈ´‡ã^ºž`>ãvÁ¨ü0Í׌² ƒ;±óáCÀ~šËC*HÔÙ²vj&-Û q-§°(Ó´‰Ã·í¡¿]r¶tèã”[k?SŠ êç áÚ”ÕÌÄPwHs˜çÊ™®˜œF P{ iS1› vGbgÙënÝ/Çì&8he\>l2ñ0¡¦ÖQ‘÷áÆ~jŸÁ°ûvÁª—Ts!%A+ÜŠXÓxDP—Ýòbž(˜vqfK¨CƒjïV ~µ“»®òõ¥uÑc!ɸ dó›é ¶±[¯†MP‘¡Nš ±/¢AÃûqXw@ˆ›N,æQsü5?{3í“ñH¸G‰äeÙj/},—V½ÎŽK¸¸6‰×¦àŸ];&šŽ– !pCp¨v¹ïßeèF±IàbÐÖÑ}ÊZ¢WN¦ËHæýµ™²ïáP+r›è›{Å9>ĵ9¥¸M’r:í0ŽõÊ<Åê*(F†ê©'ºíÿ,›Ñງãnш™‹ìå!»‚(‹/#ué‚CÜ·¬8_;îÄw E}œ³D€@¶ëÇ_¥p£.L•².X{Ð×vØ~#@¯ìyRÊÏö&ü¥Bï+{_cs†lÒ+ñ'[W¤×ñð¸†vCä9¯Èeú»)†9~Ûfj?/‹ÓÆ,>)äFùúó‡æÞJøt6š|øïÿÇœ¿üÕ9¦Œ­aÚ_×Ù%Á½$Úâï)ÕRù¨ó_ mêT¤¤€OOºÌ<è2ä\6Nð÷ëüÕc¶c8ËÆ^¨-M‰²ªRÐÞdµzê·û¹æ!6¦Iáuý4pRe@;7agiQ'P‰¨å\CADoŽË;æDHMM\@Ò;œ·ž¡êŒ»2Ë)ô¬]?¬âB$„D5ÈÙMýœ¦ .½ÝÜ1ù9n{Žvò*ÙÊyõ5§íÛCŠùï Ä pM¡6úÈ»$ø¢ÖŒ˜N;úYÎR¸S"ìù§ÈT•šúݾ'J†›>I'˜JÈ5aêˆ{?Ï^2%iß#xC¸;uB¼šbUjpß~ùqý(PLݨ2Ú*!†Ý PHGÐë»$VφŠ_Ÿ'ÿSR¿]ö¸ srÐj®Y8Õž+ùdÖͰçºíxCÁ³ûØò¤¤« ôm¨bt Á£ð­Šši‰䜡Üü‡i’ò¹z‘í¬§=®CèUU“>LUk°6è@™Œ'T^XT=«ar6JEÌ<áѵa¶âФž”"gµ3ßÂç ‡áxà@UVs.U9….Ñ©GP£›Çlói ëlÙ“ëŒð¹ Šë&1]~_xgžÖ#âs™X 2>?ŽwdÃÀ qçéÉê`ZVä ¯PåùÐŒ@ðö¯„»:7·õ54·™SºýÙ+"HiemÔËÏÿõ—sDV¾ˆFxžý©6û·þSOùŒ´ ÍŽÓ^CíCðšLð±êbžK¹ýz^Á¯‡€¹\YË)`¦¬8FãÀ xÙ`wœ-=–¼õW–Ñ0QÚk”«ëoQ»×-¨dV­nQŽãÛo§r¬á¨ pÜÚ'1´`J®A»×Ü3»gTW•TÃw³÷{ . dR~z8gºˆºûÂtï9‚Ó:‡KüÚe–3Óæµpè~Å´`8ÆÊ'˜úwkÎ^ UêŒÅó“²ôôpG¢8ž,/[]jjã¢I¡;ƒÒ„ͪ Å m„áðùC¡4jxpœOY ‘(*`Óu Ì@&JYvE ï¤Wˆ>:-ë¤×²]I8쎡0³–(i‹$øË]ì¶XõÃû§Dš«K?]åÝ»u0K!Jóå³g ©R× ¤0T<lR[On5ˆ¾ímê³uS¶°´?•oèhÙª}¤»BªUËR;»_í”&Láž çÝ;j{‰úËx\”ÏVT¼éÙ³¸7‡CرQ¾Y´ ¿EXéѦä‰$B!@Î.æ Ê¥15§‡çY{{+äÎNî3ö÷éRÝúqQQûÖZÑàœ ëÚ5§«¦8­U^9VÙ8dí:y}ÊGÚÕc,º7Ãöp7†Î‡ç®oŠ Ž.â§êµž}CáÆ—=)aäâ!%bÀØov•…ÒÕ©/êceýçêcÉJ¡eôÔL9Þbãßzžkµ¹ârs–Z™0ÀÒ}ÚØsR¥›ýºã³½ZX:ä3RNå§Pìö<›ƒ›ñ0ÚÛÒÃM2·Ì¬L{~Z‰ÛÀóÉ‹—mXÈ-oŽk•ßÄâ¼)Œ«¦âÜJgX~2Óu…éw-Uú ß(§´· ) H»b´RÈqíþÐ/ëv&à‹>¡í\ISþêxmø£q ½5U‘ÏÑ?ªV¤»±Ÿ5tHw»#ô íÞ€¼†è«øÍçȉ”PvÆF‘Mèý(úÐTÐÂõŽ zÜ¢8‚‘ —ٻ¥7Fm·xõOÀÜ>$tÀz“ÊWºtàôû‰úËj9N§†×fÓæ*ÜI£ïSöðfÖí—€§É¡ÍHÈ>EúÓZêš‹)v€}ÒÕ°ÎÆGÎŒœ‘ÇC·)²ÜMV%èãÀ'´"|¡ìÔ¬”´©eûí8!!3ÀSïZH÷}·¨¹ôcnà ¸v~{ìfžPÍnWÕÂߎÛÕ ôÙ{HE‰ª¿qN;›þ¬—ëVGoû>¿ª 2àÒDd‡ý¡E&äÍóú錄THaÊ5'Y2ôc§ªJÏ‹»]êÜr•©j ½$˜mVµ•ÊÆÈiý=·M©¿>‚”Þ´kÐXÞò¯lN4"ݤåüMs7é†v@6ZÄG-øósn0o“´ZOÇ’ É`€ŠÍÙ.¨›ÛTNÒÏ0S9ÿ´&…W´¡×˘8‘仨2œHt‘½Kë¥:CeÑ4îìuAÈ Œ’~´7{GJ& FkCÌàW‚,¸ýÈìô1+ªæLx<)ªhŽ·±6B8TÓy¥Ü”ÊKÉÔ\ÀÄXþÇýÀeñ¿„¾ÊyÝVøFÇw¤ï:Ö.õ;¸·…8¦`¥_.žg¯^P> YDó+OÔÑÉ6íöQêv”nz*ùBÝNM Ô©ñž^Á7FüsÝSá5K¯nú%åè:š—êŒ7ù›ÅÙe ýf1Ž¡ÄÄ´CÓÃÏ“¦ËìÅ¥ãNT(Ùm¡Ï_œ„$S™Þm‰OÉCH“J]S¥ ¯ÑžH¶^#qÆÊÞÛ¯E{dæ_•pé©áþT­×¬WÐÂ~#øü͹Õ!»™rÞ  ºöù*ö‹ÙƒjlJª¸:]+Úû©ãÌieG­IBŒãnÝ/©ül‡~{šÒVÐhm kgÏá•ꯥV:§^9—÷Š.¢¤›ZHŸæ}Éü‹Áx½“dŠÙ:Ah!×µùš,{úCv܆äkO^BIÇí^©™3³·gxƒrÓã{cåùˆ20½ÎR¸Ò#6Œ·> stream xœ¥\ÙGz‡ôž÷~ Ð0]wÕ>î½¼ë8J@ÙÒ0æ1Kr¬üÕ^gwã¼å;«ª©Ã6ÖücwßUßUýûa\šaÄäÏõþù?|‘†·ççãð+ø÷íóß?7ôÀ ¬÷ÃO_ÂCÎ"òòÍs~Ñ 9,GW̲[Z[†—û狟ݼüOx6Ë£qéCI ¹yþj±y½{XnnsðªY|{óúå?öCû°Œn4üüâçóÁÒr4£‰òãtü÷ßÓWÿ‰¹ö3:ùéÛ?ó‹uØ[ÊÒÂï·>.S2—Å»áå»ç‹õýv·N4’]:¯ KÓM»žÎçåðò~â)‚Ó•Øj(òÔ×oާ¯¾\|ysµ——¾Ž~~Â_ËrŒ¥XÅ.Ó~X¯v»áÝêîvÓeÚ= Çýör†É¦aóø°Û®W—íñ0ߴݯÞÒúǼ4ÁëvòK×i9üî@à•iñÄ`˜ïÕb8;º·v9ަ¢ê™÷xbŒËäm¥èùqÇ4µ¾’s{à]ù¼ŒF75.3‹Ìyûö°ý«õêp¢‡°´¡äFt¢9‹ OË”«ØO <ÄàC*6|öëáñÌÄ—AñÍ•æ¥Ë%ûïCWÕìÕâÝýt˜nâ45øÅ×´^Ѓ±iâtdIm¡¯Çóy{·›n̪éãbI¯ÞZï— å·´™üìxs ÖbLÎ.6óÀÂX² ü̻ðŸö°ÿ[ž_< ûÕ£9¦=(Àðx@A:?><4BO—a}|`aM l’RééÙñðìèFŽ£mÓFbçi{™†ó3ØŸ_ ïî·ë{˜ø+Ú4,Å(k׊ë¢R9‘ÅÇhî:šW9ZíöÇóe]³¢?¯FÕ·ßÇÌPÕä ©Å¼ °=W—ͪU–Þ4=š@óx0°ˆbÛÁN¦jHiÊ«é¬]ztØ/sm—%£þúíÕ»~u±_Þ€† ¿$AI0Tî€,fŸÙ?ýçŸË¡38‹¦+ß}|†åõÊtÛß\½“@ðKTCz¾¬.Óù'õ™BL¶ŒßÉyiYvJ‘}‰vÍ `9ÄÜñ-üçŽdßd€âÓn»ß` ²µyô Œ* ž?,¹nYªi:>0Ûlgþ@ùèf¥Tœ s),Ì4ýù~uÚÞ‚6á“ ¢y J´õýêðŒ¬›`ynËà/ÀZ—xSÛ3XÌÕé&ƒ“hžÁŠïéôÁufáJ5|1ò‹›åð/çéDÔ(1¸Ðæþøùp¼ ›é¸[2 yØ `ýÑôw:ol—å³=Ñ©d•h»e•Ueñ © ‚ê´½ñ_ ”]îW>ÇȨx·xALY ¶l&¤&¤1ÂÁ)ÎÊâp<0‘3u*ûããOZžJ%ŒdôÍ&÷žäK“Cµþ_Þ,ßsP,ì ™¢â€]´ÇÝþa;5S7›ÑÔñ1Ê2žXP9y÷À5õÿz…Âx¹§—€…d lurY…(+‡èü>»C³$g©7£eé¶±‰D:«r>2¯LIKDTkxÞñjP}t54Ãâ]]‚ªKE±)²0eû{<öNûTSŸÃBei»™¼¼ ÙçÁzº)ðn p1Ëá—+ãaÁÔĤÌüãÿ~÷?WŒn+—þþï‡WûÕvG¦ÀÁñƒíÏ¿ -ݼÝÀ5| îû TÎx¥Ã«©’ ¤îa·Z³‘«¦;¯‡Âf@ÛeíêDÀ¯z‚ý°~Aœÿøx¥ÉÉ9¼¯ð×_¼|þO°ä‡wàV ÿ2ÀÚÀ×)þCàuР"*@< XðÎTŒ8 @§HN€€Š9Èǿâë8°z”81’–†Ð‚„dŸ1°\ljF‘Œkø;G îKˆã€o˜Ël؅Ύ㚤ÈH{y€˜e"ú`h£HÀ‘-ì¸".0¢k–]ÀIlç;d 3Šé[ò —Eh8ã×îù?ãØN0<€‡ ‰*²W/<´•B^xê=ÏïQµ…Ï„Ÿ%4šhoÁ½"¬„ 3Ú¾nϰk™€‹~\Çy‡{d®&„Î&!‘çriHFúâ™Ò€$y&±$bôÈkÞA"Ͼ®½B’¬¹¨tÄQfoˆ—Ùë[p»ù\i¬³‹t k + üV¢=Ó¾Š<P*zjTÄ«$&¢ÑÙ–9’ͳÇÂ|ïÒPB2S,’Ó8cÒŽe6r ÝŸ!èNϸ :®+oÕÙ+bPÏgo(k„DÑT¢Ülö†DÖ¹&‡ºfî#g%éUîX\}DÞŠ´TijÎÑ[$™°Òf|÷F)†ò—™Ç¿ÍWdœ5¦GàOkfoV† R—æÚ+AƒÖò Il“@Ò½¼Á7!A%*ÐÓõ#”9òèæoYÕS¥3øëyÎ @¼™ñ«C„§€ß]ûÓÏ#ƒÝI¨HVžâ~\µcB7GÂÈ\Ä¥éx ¢q $áÖ«%©ˆ«Ô°ÕúÚ¤ãlX£‡’D#ª`+ ¢;Þ²MhÏŸ’ IöزaêCž±lýÉü P¤EO@[¤îËV«ƒ~î|. ßQklëšå™±Èšë\`çy;ž„r:4ªÎO>yÀ’eS­Ô¾G‚Jõ>Íìz*¢ñÕ®C F§S³©öŠ2·7€˜¹ýK©Z;Ef+ÄU,UZ+M•:<‘Ó„‰R¥~ÌÖ¼ ‹æ_/9BCo!Ä–LY|1íV’­Ã^½2`dâ>B€‚¾ûúx¾œkŒßr °~ã¿ßã˹:¼[Š6hN Y$qN û0|×%cÇ»ÕÝv·½*x4ž#ˆ§A‚‹Œ‰I ¢#У^Ô§ÆçÉq6ðEó‡9Dh)´Œ,ú>ò7jñÕâ;÷Æ/$¹ܪ“OB àâx˜(~„Àâ‘…£×µ„ÊÓ¿žkú¸³mt ¢Yˆ‚Ÿ$ú^z Ò” ¹…`cáÌ-‘ˆ3¡`m[ºn,œŠœq†c,eáô;ÚV@»VcRÊóäY&D>¡mkâô´êSz%ëPCžW”›ï)O=>PPÎôÇ¥´‹ér’øÓ×làȪäZBøD*5Mužn’$K ð"· á ‚íËvòÍáÖ­ƒ'\6M¼·‡5È„îoì2ù#†¹œp6ÏþT…tÃü„Mµd!¦nUÉ W-[‘¨k*§W3ðè]†SÜW!¢ŒÚö,iy¿lµ ®gy|<<ža;ª2”P e!i i8­N´ód  æ„(ùv½8gÆøý& w3ì¶»ßß/b—{ÅÕ™f%–XX‚·§Õl#æÕž†Õ— @Ī%;žZe%ä–anñwÎàÂ,„twHâ ‘o›öˆUƒ-#Ÿš/Çža†ŸL—Jàh‘8Ò3Y†)˜ñßè¨ÍËÀ€>üsÁz?B‘!h š$ò°Ì“A$ñaÜ!S| ó€X Ú0£Ng€3¼I“q´ÞìuyÉ€aGä"| ‚¯¬H„£‘Y0ïÀBôcg›Dd 3ZÕ—*Écf/úšQè= Š`†£í†dËÑ6"¼ÈäA„˜#Òde4Ê*Ë¡#"ÙâÙ!.#ù¯DŽ2@)ÃØÈ^ :ê¶cMÁ#”ˆIŒ€LùÒ±¼X qˆãä’ôûp`DH¸ŠÅ˜É"b9x*èËãÀˆP¨]0’àìÁ‘GÅ`…Ê^f†8^1"$Ã}†‘8êäú­2¹NŒ¬““`½yrËvI˜ñ±¼«ÂP¦¦£„H>£ïŒÄ: 19ôÙ©Ä©™á ÁJf„§‚9Õ  ú¶ŠðÈ»ò8‰KÏã(ƒ1ŠœiZÁøb>{CWÝ[žÃl$»Q„‚ênvE‚cU«Ø–ìØçG^ÇRËŒÁ¬½cDLlT€”¡„žá6¥–[‘ƒˆ:Æ‚WHÔq<‡Øâ8ÄîÞ²PŒôÓ Á&óˆã]Ž,&âÔ ް &pñ%]X’0·eÉ d);$qèÓ^Š¢›J`pæóœÉs0ÝøT‘ÊËä•ßNMPEŒ ìT°ÂJx‡ [-žH–[‘ȼÀðZ2ÛŸ4Іa@LK‰Y GC’jimŠ“DÄ :<áƒ+z•{£Ü‹¶`¶ƒ [}Žn–@’îšÎرÑÊl願¹€‹È"¢v¿`8Íë3‰ðÀ:Ž ¼ñ:x¢uÅbÐs[1?3]±N…¹ã ä] TŠ^&tžÙUwHÑJNŽhµà)²Ü4 žB±¤³vI-™Z‡d¶)5mé×÷£bj‹‰¶¨úS‡7wo\š>Swåî[К’A¤ Ξ•`~=Ay~¹v›óu|ì[þ\ÞèË[‚®¼HP·P¢VM~.ÿÓÃeÚüäj¼€ Õ5—ÈWÛ$@2}.*}.þ &=Bá`M£øÖšÁõåàÂbó¨Õ&?ëQÙ w7Zƒ~¾øåÏ®ŠeØÒdj0ðÝ·×Õ|CÙhþõÅp÷xV»“ ãèÊUpÒËVìêàÖ‡¾EªÁÝÔz6œp˜™²ÕûÅ´«8û°ûÝôöCÏ4–Åjý„nþû;5¢ÿö;iU¿åðRÂ%ç|GL˜Äzo›Õ“¦$l׳ðbø„­`# ¦úüWŸkAŸ<\ úLÒÅ÷_o7Sͯ`™Å(q¯,ÃÝê¼=c¹u8_V‡Íê´Ùþ½P°¾”k˜õ™ÕpCÕ?ܘ@¥Åœ«­hà9£‚!ı).»’* 8´›WÒ`Ðõò!ï[uHªÂvõŠs˜LÒ¦$äϬ3†IQéÿ§ï¾»îÏè¸óbxïm‹¢JÞÿþãŸÿòñ×_÷©tL—ñæ±'¶Î¢èuaSÖ•~ßZ,ͤZäý¤Š÷ Wï«ø®jÀ¨ß ÜذÆRúÊ1q#ò5ótÝUE‰ŒH‡0:k©®ã¸ò06ÄAzFt‚<T’Fä /yVD@~IRK@D@ŠÔ7­£z­ÞÖq¨zˆ—ì¬u”M$H¾Ø:ÊòÒ3\M´0¢eÖ݉<ŽÍR¥mH’*m{+JM¥.]!¹BˆØQŒ¯/6)H•ÃsCˆS;y:¤†µR—lˆ‘úY{kT=U:›\÷.¼Ä›¿:Dxjr廋Ô##'•„ŠDåiòl‘ØŽ }Ü’˜Ë&H•)Fúe¼Úã\XÂUKR£ÔÀtÙÜÃ8$cQÛŸëò˜«XÖ÷1«î¤Â6¡=“Ë IöeÙ²EϽXØúÂXŠÃì4ˆ–-R{{Aæã`-t>Ö'Q;_êšåyÍm.°2´fcõ$ÔÓ¡Qu~ÊÐɃ–,›j¥ö=¢½Îx9¿Õ®;å´V»Ž>=NýS¤Ù¿$¶Mí "fnÿŒ¯ÖN‘Ù \•ý&/¬œ#Ê1¢B¿ù¾*-õóôUÚ¿ã› üæQ£6 OÃauÙR†½dq6µÿþ#ΦQ†Åȼ¿\­§k'Óaæ#–9™XTÔ8 ”:?óB©;Š"Ѹ«b$P·Ö$¦{¤sÞéƒi­,½ï¾ÀÖ\*û9Løz¿`·“:æõ?Té0¨À¨®(¨ä¸vH`Ç•jâ*J€ë,z„ Ñý ój,åïqìòqœu®uxtHH` šNOHa2–Kô 9XÆr™‚Ɖ22 Õ?\!R · 3²#ÒÆ ¹ÎEÇíÔ$EíÝÖ]P½Ã£AIäðY¬]UÍ"ºfÙŒïÔI«S£X{K)í:F‘Ž_¨ˆ]Â\aǵ!adÇ•æ¡äÇaJyÅ8*y0…È #$ã3Q²”ÆqÉãj™ó:Ú;ªyôüqÜ6à©1^jê8ï¸æAœ·¼*z0ÂRæ¨èHÙ1N&D?ãK"Œ² .zy.¾ì3C¯–GIðB9‡Ù[ÑÉìu®ëì,Ž«´ÂÀoQÙƒ÷UäªrôÔ¨HItTæ`:Û2G$ËL³ß;„J^„d¦>xœ‘G¦*ÂldL{_!‘˜ŽËöH–·êì‘´w÷–eÇ•(o‰a>{E8/ßËa]³¤e‰_űô w¸ÒáñÀi©ˆd€ !É žׯ÷à*Å[ŽàTæ% í‘(ãXv\;İãÚ½5²›j?fH"7';YZ:ıMò…W@¨HR‰ ÄNJ(sD¿º·¼ê©ÒÙ[Ý»òEÍŒ_ Qžz[ùîÄJ5ÄÈȦJ‚"£ò”K jÇd®x…Dæ2 FÖÃ3& ÆŠ„»¨–¤"A©U™=v\Ä©ÆIn­Z`Ä®[ÕIQtÏP„‘T÷N–ÍI{>رÌÖûÁøXZêià¨2{†ê ³q¸ÒÏeL]³Úù\×,ÏP!d6B˜b£›ªóS†O¬4˜j¥ö=’TʸÒÛu*…Ìì:>æöO‘fÿ’ضjo¸ÒÛ ˜æˆéÇù1¥Ï¥oѱ㚧p7eóÇ4=róØk¼6ˆ©eM?çhÕ-[]õ&jìî§bZò¼Ýoñz0·^wÛ©ûÛz«èÒ”OU=rkm´±=¶ê)Ü.Óáò‚Ý¹®D|fw«—ÕW”’.Á`Jz5l¶3ñͶ 6@ «½}g°â?KÖcJóWë{iê²h#sÍÔ¯·–Η#÷BZëS»ÚLÅì‰W¥‘®ÙïÞ§>œåz` °¾ÕF’òÒeçcXlðjßE*N·#¥îÎU»HÝÝá%ÍæÿfuA"ðÕcÀ]¹vø]»C¼¾ìž¸á7¬Žx¹vì.9$ÕŒ¹fÔ„˜öïã­‡Ëj{à‹k÷Çóå°ÚOÃê°þ…… Ž–:íÏ?—€ï†¶€€o¶bKƒC‰ò9½Ã+ÕzU¬#¾áªï;¿¸çËp rIîÊM,ù,ô’ÅðÊU.§-]š¦‹ªï¥áÑÑn­q¹ëÙÄÄ¢äbƒ€”‚˜þ¹»Ã × ¯®Ÿ6ª‘\ýL¨=µêq~&eДV)Ãÿa¿L{½ÓÜ:yÑÚÕŽ@|– MÒ«{<½ß8Œȧuºö¼B ·»ÜßÞ#ç©ÕñÙãYÊ\בíˆ}ÌŸlá J¦|,°½¥ wÛF)"6’½@)£›®ÐÇ ê—¤ß.¶Ï6|ìÓ ÜÛÕœL_Òûö›o®?8vX9ˆë‘›Â(ë5اR]ä\wï§Ò_Ú|¿­‹lŸßÜZ¼‹eÒâ·¿ºîórøíñ f=`pµŠy«(\Py¢Â^¶E¾“°™ÎëÓöNôƒŠ~Ÿ\ 6$KöC»À}|xäSB?»½©]¤«'mÔ.㇛ÁÕIj`ó˜´ÛyO‹Ã±&_2¬±V;Ñ´a¿µ‹ÚakB-Uk…íX¶îVm£f^6{ù”£X¹ïodU¨ÅÏŽt@ýíg?×òŒ±Otî#òŒQat4ºü!ž0±~Å£/Q÷õþYßôÖÊÁu‰®÷C R…úßýåOŸª’ƒñS,¸F¹}m„ò@p x.k«†âGšßLUÏfd«ký*Tkþ†ÍUQ¹(J'W-P?>Ðk›Ç“ŽÃå´:œßYÁp• °~ þEjþñ&Sk{‡Tì?ÞUŸçGv,¶¢l1 èj_WYL§»•߯uVHnã_¶{ióìr|†Þ7ÓnKV›q«Q« ò¶s5žÄ›ÔuÞqÛ¤ñždìÌ^Pƒb­Þ_ÿt™ýÓì}ÍŸ’/â Mšo³Ô…³ó„Â!R3zŸtn©µÈT•ýÀ¹‡ÂÍ;NÛ7OºUrûÞžðn e3z8\{©]ï¨N.AÌxùzGßœ9ßoä,Äûå$lÛ·ÛËjžíÛgr)eÙ›ØÔó^…Öq«„ hjb½]óÿivxMý÷ÚRº^ œ•¥k8Âï'°†ð±TÞ…qØ UêwtŽLz,Ešfàè©ßg ­¤“) ­ãZN%ìÐŒº£Só5üØû|¸|L ÷Ûóð%¯¼Êh;ª×…B÷mÔîÝâgŸ×»Ç 9íë{ý DLÚ.±Xu~Ü}°p^IÆò"_×HÃØ–ªÆÜzͽ£c€»Us®Hì] ›lÍÛãu ú A.aql1C ]ËNüÎ…ÁŸÐnA÷wøñ@éÝqA¥øóLvaÁèûÐ>à5áç]ªßø©ÃƒÚ5·§"–x ¸µo7<>Èí«7\gwôò¯äq@jsx»E:À¿`dÕy¬r ’XåîOxŒBT N ¸Oןëù ÒUÄgM(Mx¨oØ@lÒÙ {ˆ³Gg>ÙñPëÕ†8Àâ £tT÷©¦Ýbf"˜Üü‰ÃþþÝð!Þ[à'qÈáBGž%  .Ô¯[ïÙr‡=ß}v[ü¸Ûx‡×Õ;-÷|àIšã'¦NÍÖÑ÷®Vî~Âä  %¼85o´8 )L]~BÈ6ÊŸ_k &­vàà'®å ¥:¨›WŒ®œ—¡³‹:‹ŸêikO#öÀ„êâ€8M[²i›-¬êêZ[•&¼#[Oþ¿|Ó¤é›H«æƒÂÔ]Ú"Ý?ñ·“0ŸæÚç>ôpkÔ¹8pV …$a‰—ΪÌ`@¿Z…IýÜGì>÷QÔ__`-âÉa xNb9É=¥¼D0ýp¾È¡usXá(caGZÐEÖÈûÚ#HƱk óX¼ÌƒÅ+ÉÜÖ"-aˆ8‚V¢Y¼+’<"Aú/ÈÒ· #a‰¤±—#>RÊ…` á„8)M{¬0È3ܸäá· ãp#ƒ§ÞbœªH±¸!Ò8EH¢åxið©ãD[çÁµ¼Q.C#bˆºüä¶!ÆôrE¼gD—,›€ÓÈÎ7êäzC£W{KÈŽ¥x£@Ç+*ʃÌI;XE°V ; Ì¿\É„¦®0·¼ô6y¼m@ÏhdžÇî"X–>~Fx좘3;61Ò æñª’Ÿ±½a©“®:‚°„# !^ú{œ×^$Ïd–ÂdÔã ÷ aGƒ»B²¬9ˆh`G`¾B‚Ì^ߢÏ9ÎæÂtš ,Ô×(+än0ìó"àEžÙš)ACFCDD¾¹í¤ÚqCý]s„:xáîì|ô2̘tŸf>0vÔ^!`?fÊ…]"ñ qòV½"ÚÔÞŠÒ FÝA‚pçW›½!‰õ­Ja[³v aW²,»Ê¼q‹ˆSY©ˆvÁà[$—!K/XåzHJ1L>EFXâ©Ëè eœ(½` Ò ÖÞòÒùE=Wsã AØ‚RÇ×’Ù9iÖ42XF¥ OÈ(½Oñr磾äåª_#²uãÂ¥í«2«C„¡>*Ó±Qê 2rP1¨ˆW†bó’­LˆãçaÄÈš«–·ªlØ÷žÙ^Ú0Cè.†"vfˆ‘ì$.©²á—õÈ|GUlZD/}ÏŸÁÆ-A’ì+²QsródžnòòxÇÏŽ¼sõŒcƒUÇñxñu6—A׬†ØÕ5ë3£¬¹Î…M‹ž)¦'  •ªWç 9hÄJµOûÐfòboÐöxä™AÇ^•™ÝS š½`ŨUCƒUê¹ÝËÕÊ)Ò/îǵ€R&,ùQXIsf³N%}$×ݼ±×/¸5Ê`®²}~—;ù´jÍ“~ Y¿Æ#Þ;ð-Múa[ú}=Žëµ„5|vý™ÌŒ&_=¾ëô4þæLAŽû‡Ç ŠŒZˆÓ˜g_®Á‚â~Ù’Àý…{‹Ü¢xoUø¹*“Ó\…ȳOal0çõ¸ã[.xsÔ·hõNnÖ´ïÖËÓP?ÑÝWѦ58Æ?Õµ†‰SêZÃÐÒÍjËáwô]k÷2¾¾þ H±Äþ2ÕŸ¿y/ï ™Ž´Ã¯ bè3«úMÃ׫ÃöLÑ”~M—“ºô÷'0o÷|L¢ÖÈÊFúfÉ’ñ àŸžÿö}Fendstream endobj 187 0 obj 8450 endobj 191 0 obj <> stream xœ•\YGrA¬!ð'ø©ÞØcpjóª<ÖOÚµ´’m»Ò~ ée±»9Ýb£îÇ¿Ú^Øüæ¸2³ª†CH ä~]™WFdDÕÏju£ðü½Ü?ûí¡¹>?SÍá×Ï~~¦éFþZî›ß_ÁC«÷Ïxœn´Óm°¦ ѶƤæjÿlñ×ÿ½¸ú žXöªÚ€«Õ³ÅKþ5Ï[›”É?¾9\ÿ|œ 7©µ>%yâÇépׯN~ùËê§7›ë~6Ú†Öè<úÕâw—ÖÚV³¸ºxsõã=éÖ{ed¶Õ|"íZ•~t1E'?~xÛ~šÓ¡ZkÙð7ëͶ6oó»éÐÐÞýôvÓøWägØmhµ³Í¥óm€Ã£ Û\Ý/ÿáÛfßow«Óñ¦9ßÞÜOÃ|í®õÍÕ??Óm§<ºÚlÏÍpñ7e’Ï›ºÁ‘]kºBæ÷º9¾—.B›¢J~K½?ž..M«”NÝbßÍöLÒH Vq²#\1ЊÍòxX®o†íñÐïv÷Íy»ßîúS3›a³nöïpeíLkŠ6¹6æ˜Ļ²®ÖÁàº/šw·Cs{^Ÿ›ž¸4Ñ´VwÍ¥6¬Û߬O8—Mç‰Lëñ¶wšýú|î¯/€O´›u³Za}j^/ÞŠ’u6³SÁs6kóë“.ÿÍøî”<óœVoõHC^CöûãXq‡¿zÛZ—å€äbÛi; ëCÓŸ›·é—È*TŠÀúMYð, Zß‚éo]_L—ÍPW—ƒ&ÌœíTëƒÍœ}µ@gvq@® pkLõ­Œ-NpšÜì÷›–&ÒøÀ%;=ä´ 9}[¿s³Û>]öè‰ÎÍÝvØÀXdÂòH–CH‹Õ¬’¶ëÁ…†³ÎÄV«âqúHD€;Êöœ Y«õ©ÖEé3cAj €ÝýEI.‚1" "uepæ J¹Ú®°öœÜχ¸Œ'ÂÐl¸0Ô´4 )ÅÁàÓËÑAò‹¡í‚ÍôAS”òÑ->1ªÚá<4ÍÓøÜ;P!â Nºlo½§ Ð ?Vc{„C¬<·j›ßƒ÷îwçã–œ8ƒT–˜\¼ÑÄ÷÷C>­@=ß? 5R=ãEsÇ«ÔCü´üˆ“Ìæ ø¢S…sàšsny¼Ý­Öw ÞT‰˜ñ #Z@ÜÐÈ0cv€q‡Ð9àGDÖî!?@_áào®žý”ÛûæÂ4xÄ‚QúÐx뀩©Ù´-5;Fb´Ç Òµà©g  HÀ¿é:D DÓI8O0eßz|&8Ø&#Õ< ÑÅOÏÀß„À¿,ÏãuF:¤9€MMX]¥ŒX¢ÇãnÆóÀ.òZÀ\Í;Õ!#ik’]âˆ?x¦gÄàÌà(cA”e$Ó,»pàä§;DuŽÕQ™ó½$‘‘¼vÏ~Ĺ;Á:ˆâH†é1‹5A{v9Ö<¿;ývÿ—ëõð~·j—3ÚBNÔ%wbÕ(ú é¡‹~q·ãœÝGã«k¢“•D²¢¤r,š£|¾×—«¦vr?žÚI¬ áŒÏy˜€ƒ%'œPÆ^_]Éâ š#d˜Âie~]Æ0‰Aaeßxc$,®ˆ•°˜Ø“G5±Œ€é$*&À"Q1!Þ!"Q1 pã4)Ó€^ã3X `M„HT xy†¢7@ ‚1<×ñHr'S'Q1!Žè‘¨¸Îã\Y+ñ.µŽ ¶±l!bfˆ„Ä„XœÖHHLˆ6Œd‚e F\pݦÇTÙUGe® ‰ç²B‡XK &!qE¬„Ä„°üTf¦Çؼ^¸c˜xþ ® Äv ˆÁ ¤ ÛÁeÙ©hÀÑyB$ TÓL„Á T' Ô" !`$DbˆH5󹓀ÇJØ…¼‰„f d-äµBsEœÐ,á/Ä–AV/È)NGÁa£'kEJ^u#¡„ÂŽGaÆ+êä8ˆ&&Pq䄸È|6iŠˆû‡Õ=K}„@ú&…8´ -f¢xf8ü¢ŸÌŒwsSR×41®¨ \˜š[J2*¯^'qå$ ÄŠ‘Jø[W!–-®èa¡ÙI@ üƺ+ÂÜMÑ#‰‡i)¦“x¸ŠÝ¦Ì08ÊÈgØ”U*ÍÏóX‰‡GˆÄãQý’Òu3”M+Õ¬,#ÄŠC’x˜(Œ„جPp i$®€Dã1 W&›Xv.‚0ûVa¨‰EèVœQE´Ì,ÑðñÙ±€ÙšâÁ„9z °‘P€È–e\¶5•X·„Â#DgNÀ¨4ñÈZè”mMulÅ:ý7léZBa 8²7(τԱêh =1ìÓtʇhIÈÏ`Âl&§&ÕÓg0ñžÎƒÉùt-LäÉþ=šåHoât-pðD³1ùø“S¡0uv¸Ðƒ.¬‹Å=íLjÍÁŽqc‡A‡ù„Î=ÚÀ‡ÒÈñe¤:¾ N­¸˜'N¬å¦ŽoJᯊ„ñ6B1wK$ AÚziÕ#‘p‰É(þöö‘ð‰.ÂéÎ?¼?|+ ×H6ׯn—Ÿ½d^ ·|ÿ ä—è<6¨.WÛæðûþbLZbŠ»/1Ðg·8žÏÛw»5ÆçL‚Æ &S ÷âvTbxÁá*ØxxnkñmÙßž¹êA¿¡s% iåzüŽÔ®wk‰Ÿ;üÍ> Am¢Ñ/Õ»¸6" r 8©·öbN E»õû˦ïj¹bM…_ŽÅ!‹Uu©×4ú«L]»ßlz ´c‘í‡ã %0¿X=ž>pRdBÝ¥©øXlùì›{¼×V…Ç 4ñnt ^%K˜ßí£“W¥‚•S¥×‹×3õ«‹µÔµ=KÊAlªŠ¸¡Ãž«AKÒ×Üîî›ãͰÝoÿc=*úPEeØÜž¥–0˩ùÖÔ¬úõÔs´¶¹êò™ÒÐâx{¦úöñv¹i¬>¶ç˜”­ú}™#¦žÛÃpÚ.¥Jt©ÑòM­¼Þq²4ê.Èe/L‚u.ã•-a¢ƒƒ-IU+tUµ°ªz$9$ðÊ‹c³Ù^oZ‘Dm9Èë]‚'D"þt:îo†õéù¹ùÃÈ=îšZߟí3Ð>JŸØÎéâù3ƒYH¶Œãõ©ßÏë2#­[ÜÈrój6žâIgCÕàŒ‰ ?ß®OÛ5—2A¯N´Eª „ÅÓÝ‹ƒý8Á÷X,WAå‚Á²qÛüÛf}ÀáÄ=í|‡ u÷™šR¨Vö²JÅnã¸f„é"û‘¯Ö«íp<5l*Ò“Ù<¬Óc¥˜'Ê%Bά}©ráÙ½žowê;lËY¬Áз°>ˆ¾6]<¨«Á¹Sî9Ðo}z¤ž¿h›¯ohÇ¢§dK›HÏÝ!ÖaG6ÓâÅ ÇKíâ˜aÈ¥53NÇ›~E~ŠëÝpò§"†ìä]iDÂÎ6½õè8kv`gL]Ûü ,—šŸÅÝ…í:¾éO+pkºçǹøt³ë·‡£»Í=<§â4ëø9™ Qjv2uŒ°;¤K¼IÕàø³}çbçÌ FW¡Tþ¿ZŸúóZƒ ªgl ÑeÑÄÍœ“à©á÷GK¡øs—þêìg¾€Oðåù!wVrNË;ôû5Õ•ýrX³©%çí⌖GÝ/ènw[8eóÁ‚÷¿¥p¾EEn…gº‘F‹Ÿ‡WNh½¶5¡–p ©†ò˜‚à,Ü¢#kQiÇrÞ0z 67°¥Ññyß°²'¸Á‘ìŽèÈŠ†ïâu*–Nžó–Zw†Ó€)?ëËqÁÍWjÔL·‚èØxFf’§§Ó bmX•VÓ‰Äð¶btgx¼žß?ñO$ ‚*¢ž £ Pé§tnߣ™½hF&í[O¯o% ƒ”²†ÇûVÔWA PÚvÚ^‹°Ú%²›«$:âça¸Ÿ»!U‰æ#†ÖÒ2Àú“™F€—\@ñçT+ñRŸ÷ÀŸy}»þÊÉTÞ•4ìÐ1z×¼¢géZÒ(¼ 1 躖j}E:©Ö«Îc~ìí!/Û5?~ñŇÅË#^B€'På5¬¥ø|)y|ßôXÅ?@hà{ªTX,WÇ.Mú†òH¬Ž%åË”﫽ók̺!H>HÍÖÊ-K¹ƒ½½œ‚7C½´…'gL¥JÒ(ÊBa—¥Ø©@Σ6ÚxÛ|?È[Ø#ÌçÃ[H^%šµp¼ªòšªáì´ :ßÝ ÏmÎ7'ØÞƒ—m°†•³Ï¿þçýõazXº ^p‚ö=LŽjjÃâ)¿"wË]›Æ™û¸àKí²[’¸F¥6U®‘ÛF­Øvç('Ę|„$ŽÉ ípxØ[F"6û‚ޏ ànéø8!ŽW@‡´ûû΃GNÊHÀg0ì ŒX<(™¡ÌÐÄé "öÉËóx4ƒav3DÊê„8¢Çq´U籦¬EÁ6íT =£>GaÎH‡3cˆP‹3ãVmÉ4Ë.Ð×Owª"ûËʱ:*s¬¤32’ºg“Ìrp^LÐy¯I‰ cæPÒ"CWKZ$æ8Ötصdé©ëâÐß; µÌLi͈÷NQ^6’Sä:½S'yò‘ä|‘ªe—V'a-s`Z‘Ç!—sØZ!Hàg`Ϥ‰\ñ.öÛây-Lmfˆš;ÑIK7E:%«—Q“ÕËZ](«³v8¯duÇÑ9 Ô¡AûJò U°ÇÜ(ˆMDÄ%æ³ISD*³°ºg¹ê÷&$vyZlEñÌØ=&3s_áÁÆ“‰…9¼˜"`5fºzA¤R<å9@ÄŠ¥zÇG«WIJÍ=¬4Kªa“öŠtíÐaÆ$ÚR)˜Ò(ÒL°‹ÔMäZ#É‘çD§¬Qi†x™Çsˆ>B:ÑG£‡ä¤uÝ ¡U ±²SÍÚ2B¬ø$Ë:Q ÑY£¸ÃÔarÑ¥ ‚a¾ŒÂIOøŒíSY`À®'ò!"Sí‹Ü­x¤Šh™¹ËšP—eŠQ³.~Lø£gH`)cÂ(«G¶/m²Åq,yMñ$Ï*ܰ±x_2Bº™» Û2$"Ù ŒøuŸm¯‚§Ï`2 H}öl*ȹç€ãIÈÏ莵¥œ :öHõ•ØkÕyTÇ{¯k)ShÎ~>šƒøðNh.'O2L3¾kd'§Cáê씡“=Y—Š—Úµ o©º‰_ç÷±_÷O§‘ÿËHõA|[ñ7ü.ÌØßÀZnê¦þªP½1Š£OÕß…àÝÒ=ª×ë ]¿–KzëꛑËM¾ø®m¼FõA^9ä7Çð¢gT%ã ï0”¸/Ž£çžkòèð•h©q\sÍ×ÛQOrõLi¿®¤H5xÖ}°ë—“’0W²;=z;hî¨Ú¢ÎEqVW+k¦1l¦rÜM­Pñ³y½øÜ›m®„ÓûÍîA.#?½¾:µ°½RWëÅRPÃÒ‚¯o£bñ•›$k84‡ýæWLø­6éàÆ[Ù7*¡Só"Û¨“6º>œ¹ç-7vR8ý°]RÜŸ ³”±$C‹¯Çýñ´¾9çýÒDDëî¸Ó£2v©úQQ0.<Ñ;‡+•¹$Š­íµ…#wjŒ«ŠÄ»=ò\Ã[íǧ»50Eºf(øÉåœûÙn¹¦Ö›þÔ_?(†b`1*ô†¨s埖]>nK‘æxØãËìûÓö‰ä„|JX¿œ\Ò¨²µøÓ×üæ‡9qüÕƒáø°bÓÕŸ—ýƒ|<¼$ðX‹¾ý›å蕤ߪÒ{€9Œ¤ÿÕâo[øƒ}0XnY|= ýrƒ[=‹ }®?tpõwüÖ/hý _Ï¥Ò¾J˜Úî0é_S{_gÄ\ÿö ¢‹X‰)~d'ØÌÖº|Ä» *ï™ëüÕƒ—ß¿ü¦m¾Þ ›ãí5WÄj~øöܶ‚ kXÆ.iû+Èðñ³ àZà¡YÎ '¬+~rîÿþŸGsîÅkÑ¥<ùÑ+û0öÿ‹Mär1ð¦Y­Ÿ¸˜‹ß à×hÃ’¹'O¯ç}™ßRøùv+¥qlN¥ËlÆÛìKÀט+÷_ð«³x3š*%ÙQ£iãìÁ.î›Õk”ùc˜¨„úº®ÏMœuËJ³Ë4ãòñl“ LˆaI ýî+vä&%¶l1”dºúwµeäx;4oßî± ãÉ Á&Áܧò R,Mió‹“*¶èªŠCÇ"WÀWÛõùùs¾êÀ–íú >jÏD°Ÿ2«è—uÄþ[fާÚÔÕŒ^Ž9¬O òE¶y™·[>$1ݯÁ¾õÜIesƒv«L éãwp”ÁŸß¾ÝòõxÂj'ºÅ¯6 î6Ûå†zõ@¥öü…¼Æõ¡„±Üóñ§@0‘7ØÞœø™;²†>Sƒ^oÂöïðŒ(rXq#‘´¾åŽŸ?^À¿ÏÂ1¤–ñ— çÁxªa¿‘¦| Ñ^ï×òÚ©íyo'–p>s|ãÑâõ ø>`Åj}^ž¶7ܜɟDÁÞùvù÷Øù²:Ò=¨ñ¨gjÈÁ–Îûæ|#,Á—#àÞ>]6·YÔ"ûcUpÎgì ÿ‚9×賚u¶ÃÖúxBp^.éuk3j‰Aú¢P=nó'^^×â‚Ù%ê¶Ìš¸Õ 8 nr\ckè)*›ùØï@~7öÜ’°]‰w1>.ú†:SØáacè½in‡üD\%æaÞWnÄ—·8Ÿ„y ™¾¶7büDjeZ_ûlmgIßf@vz·N=z>ù¼Â}óC&w¢ÝÃÄ‹~Q¾|Þι:svwìÅ™¢3ÞŸ%ޤ{ò±ï#—8w~¢ð%ïW», ÇêÅ¢³XѰ À×ïBÁ:òe(OåìÁ¼º>r(tž÷€OxÑ~/ŽÚŒ¾6ÁÖ=ú65îvG¹Å×å éäÖ%£)Á,Ÿ#Q˜¯ðæ^~÷üÌܬ_:ÁO³r%'(^e(;ï·÷3³ ÒÙJ}Õ¹#Ã ÖÆ¾(‡#Ý¥¶¬Ž^g”O4ÉxhŽ®yl'²çŽ7Û¥8 j¸ÂïÄ4w75À¡qVo@ q·Ky©‘l»?;ù¸åîox85Ý!UÈ¢‘ÃÆÖG8³¿c_€¯?©4rÒ‘ŠÝa=wºal]>®ƒOð¶jöž¶@N¦tÑåþv?jÀ¤“ ¿Bu8V«§spRð×N°E•;Oñ{ g eš\9¢ïKY?Êþ€p×Í-g1¢¿ØP[kÝÀ‹_U õp:Âÿ±|ii}Àx}´ph‡ÕŽT½t?ýùÙÿ¼®¤endstream endobj 192 0 obj 7286 endobj 196 0 obj <> stream xœ•[K7’†¡‹Ð¿"ç¤jŒ:Í÷Ã7m¬e¬˜q/æ ëRUµºÆõhWV«­íõe¯ûEÉÌ,Ƀ†¬¯™d0^ŒøÈþ¥S½îý[þ\í¯>ÿ{ìÞ Wªûü÷îê—+ͺòÇjßý僬!äöîJ>Ô]ò½²Yw1ÙÞ˜ÜÝî¯_^ßþcSzçsŒ~»¾z³Xÿ¸{X®o¬µøT/~¿þñöÛéÔÎ÷Á*-ã_Í'‹½ÒJ‡òÃÍñ¿97?ÿ“Y…ý([~ôûÿʇ:—/o¬Ï½ÁÏo\ècŽaªO¶»}‚ÌÇýÃqØÞuß½þîëî»Í0,ßm™cÜ5DënÿóÊô:$þîõ¡;žÖ›Sw>vÛýÃéúÅU4½rN×ý¯!³J*,ÞóNsŸFu,6Ýù~C«Ìé’ 4}¦éß,ºa{~\ž·G¬s ±ÝžE»Ö®Ï9L°‚è×7¤§ÃB61l×›k­°pN‹—Ý·øöûóf{¸_žÎÝýrÍ’ÜhåzåMw£ ³\¯YMŠÊ£0EGënyè–çóru¿ßÎÝð'×ò€6Øðàá¼Ù“Rûûn{¸0¢Å°Ô,õÛo¿_èÙÀ™0üü ýðëÛ«¿ÁZ!tOð½o¯LJ©‡¾",Þ«Üí§Hì]îv‚D:ö¶Ù1˜ª z'ÄöÖVÄB|ouEh^“ê4YõކXÕÛ(ˆ!Ù€h8µ ¾ÏeŒö‚Ä>;™'ÈÄ3ò̱÷ˆ§]D³8¦Oy>jkÅ>Ù¨Žñ¸º†&Ö°! +ü™ úä©"Ë&~bf%Dù©¾&_‰ÚáA}Ö˜Øjwõ=M” ¦l¿ŠhזŲØ/4õd±S°ÌŒ“5<‚QÐ75{†l ˜Ýˆ<äºËXÕ3bz[ÆdÖ3!QÆ ²âϲ Df AÖ²YdgEf âÙ‡²úˆä²zû*˜²z[+„¶ºøF¹¬nz/_EݧâàbÔUgAÐèP·¯Œ¨ÙäM–µ½}‚P$‰¾|êS %ózßû4›ØÁÙ.$ëYp‘ÕËWmõ†Àóãü+×§¢wS‚ÔõÁÏWoˆ7o£6™-9<#ˆ#¾yŒ®¾RJ¼Â~ oÌ~fuOUcV’âñð§pø2ë½#ð =ÿ ~à«Ï™ þ]É Ùeñ•6¼$פ*WoH*õ>ÏXÄÎ> 5D«’qŽ¥¹!€8=3ÖˆTƒ©F7%ˆ*3Ûæ1Õ øŠ“‘d°²Vº@‚˜ˆ.òD -$.ÕroÊ—%‰4$Ve ³DL3Gãk°9Ça¬²k! JBw5pàÞ~>Æ:vBbÛ{v2³-),râ#$ɸµuÓc ÃeÕ| N£8Ÿ®æækÁ#ªÌ%$aî4«øùZÐ¦ÈœÚ X†¦Õ‹ó…ÏœŒÒ̶ü´Ÿ¹º€f =zñŸ1¡ÇÀ§Ò$ï 0I{¡$µ–h¢g×ó ×@sd*ÉûGE8¢u^„Ú=+‰ùšŠðè’Z¿]]VH*uÚ}÷úP‹P‡]+xœ^Ïvù|\ )S ³õq5|þ÷¯_}õÝ×Ïià¥à¥ »Ô“¯no_}ùÍw_ÿõöû 9|‘£Õß/;”¶ëͰ:mß²$ð‚± á ËœÛâÝývèöÇóö½”Ǩ5×Çn8~Ñ–Ê\ö‡H©ôù“…²H[—|µ;ßßÝs‰º:ÎËíaàû U0L}aEe÷©TêÎ…Šèî+’`¹Ûžñ·ãIZˆR§ÓDÈ«¦•»<÷AÙ ¹AR5¡î—‡5ðo†íêO?¾dq¶‡óæt·\mhgÚö|I"™¢Î!4ÕBËÜDlÎu|{~¤)Ð1/úîö~sâ> ;¤<Ó5R¯Š­—z1t‡£ˆ#^3Ê„Ër?-?@´å¹{ýbßñ8îR0Õ—Þ‹BZ:u¢t2È%ªNX:Ÿ#©†eÞoØüþC‡>ÇSˆ¶ÌAÚ®'ÞÅMÎešÅi{}7—Ö-y[7¹¿û¸Ý­ç®‚Lšƒ½Y´¾J9m¨¯úLº&ã‘™mEod‰ÒÏ¢CÔ ºìioœÂø,.ØœþÛó½t»³2à­No§2‰Cì·‡5\Ÿ•¡¢5‹õf×ï&½ÙÐmÈiD3AQû/" P³@7,÷D¶v&]çjÁÕ#M|]ÈàÔz´ðÂ9“† ÿ6egdcxÃb3 5Ý?ì¶wxµórø™$ß/ËwdðÉXxCÇ®5ky%îFÍðú´¼;—¬emˆcÖúâ¬Õk3 TüMÇIt"î‡n¹Û¯QT¡f΋§™6ÏGéÝ‘ò½61ºô·×7´C«rn£éïh!`›—Ýn‹nXF¤  A”#Ûí6CËÅÜbÝÏ›ŽWZè¤E5IÝ•$%$9t¥-ô£c#0çãr…Ý}èV§âd¦jÙAd Ñ-–‡×¥îÓ6Ʀ{ºß}Ý9íT7ǰNȈPÿ‘÷såã‹ÿ: QžXqÇ4Õ©&|M IT+?gnЃĜ“ ¤ÞŸ…1”`EÔºu ï¯QDÆ 0 …,GÆGΧP×ÙÃôH¶[¤ÖíFœ0 †ÔD«ÔÌö@‘ó²{Zøÿ%2ò{Ò„ŠICŽ·²Ž$å¬SÓY?ž’ëÍÝòqwî%ƒf’‰VÒZÎè¯OH€çížÎƒîÛ1£“0©ÎþNB;ùê.‡3¤zÙ½îΧ­¤d”ËÞæºÔù…שäe~*¤|Ù+Dˆ1ŽìUhüÛ¡¯.­cØ.}÷—Ç3<ý®æ¡C¬‹Nuãðâš*vGlo½VÀd:Œ¹^¡9‚[®îñc‰Å‘¨(8{’á 9DÙ÷ñ£¡Za¹kìÙ†Åb’Ý[H®ã/ò£S¦~¾ZâÜD’bíP!ÛY¥äÐîÞ¤`@þE¦Åñx|`é¨êkZ^?+Ž_IÍ1ÕrÑϰåg+{ze¿<Ðéÿ†¶ôb]|P¤,2†”uß.KÑ‘Áùèk@ˆ'Ž„"”‹õ‡¿ÿö?—„Ò{¨ncs*%Ûk9é©*¬UÇâ×óæ ,"¿v ±5Ëþ iÐ[/VE"ç°DÛ ôl\äN ™>ÝŽ!Æ(¯ÝžÉq÷û{ömÛ»jTΉ‘<ÔQ3ÍáÚSf G„>¦Úž€PŒ6†¤þg„,Ý-€HŒ>-l#ަ‰®M“¨¤kÐÑ`‰ÒÄA[Æ0»„rOdb8Ž"‰Ñ>ø D ·Æ%š&$!Ú4ØB]‰›Þ¦Žщ¹x=€Ò})œšDÚlc³h—bóƒ(ÏÐíIøÃ¾ ½14DÂøJ¿ÐgÄ@jÕh®/FBY…É+$ î·’Fñ?B@.n_toÒ"zô±øþñí?7«óÄœvw[¸È‡ã#ºÿÃy³¾~ÑôÕ}þ°<ß~>~ƒ~Nãžcžçã¸çåúÿo6§ 52Û¡Ç_?b “„…sBÐÂâ–ÞB˜üt{jC®Ñ­ ö·Â2e;U%&42˹ @®È¶!fî‘©£Ò|§¤ëŸºúz{>žJ0·vïewCQågŸpÈŸ ½‘¯o¼R‹çè\Ñ—¿ŽëJªÑc†ví1uµ7‹çÄ5âDåëóæ×óèNcð|L°Yž¼9LfeñÕ'9»šZ³î£Ü¢éæ%·TÈüéQeylt"¡ãŒ«Áµ9•tN¤ÿ˜ÎC¡kÙ§˜ÜœÓ‘]p›FªVfbLIHÖ¾½H³`$¾Ñœ„Rò:ä´a¡Å?Ç—eT*Öû‘ÓPnXÆ-Ñyï·ÃöínSƒ™ÿt‡D’•J| äûœ¤è¢ù’üA¶mQR#¨ñÖTm{?Ç gqwÜQÜ ÝkéòU›Yîž– /â&¼ˆ¶BF å¹%äÆŸÆú ìøÈ„- 1¿XmèÂêúÆÐ™¦Übÿ)W‘ó Åcɦ¾âZ†p É)FjÜ>[ÉÅÜÝr»º’IQk˜ ²mrñèßõÅ+ˆSÍ 7|c´KÂÇÒŤ³#•Z*¢š ™å™˜S6GV>Ï(aèfL}]‰©®yÇÓöÝö°ÜC—ñrŸÁ§¢ÃNd :¤Åº¯E.N ]ò†z7ò‰Ú*E+¥Ýî6rÉöÑRt,ž–'¾¤+“ò°ü„ #©G µ¨­:Š’óx/ÈNy}R5òH:9e. ‘rÌÓ륑žE£\Yq_*7¸îûåîÛyy*ɇÓº›|PÜ}Ù=ìù Œ²6¾þañÓE@7scVÿ|y™\mðâ‡ër@J‰ÄÂ#æ~ºLûÔN9ÝÜç”–+ár‚ÿvgUçÌÇ¥c/À_pö:5ÕŽÛ’úùÝö}¡sõÇÅæ ¥ŽJ¾;ÞäÃT‡[âø*g¨ dx(&qrƒ±áŠ3¹PX>+u“&²¡ñ¯%¯ÕDŒ8 }£ØtÄÈå9R4ZZ >"†nÆa¶Ž^­†!LQÑG[™Ù!¢ež†Ð³«45°%’{fr›êWuõ†ÄÂè_Á—RU»®ó·ãê ñVB­9`9æ‰l•­x­ÆókG¾¸I ÃE€8$1¬~fð«¶lÉ!W·±숄2qvŽDáu'_aqéI¡Š3ŽÍé#Éš™˜Qv“±5 y¡u³ç·—lñ$ô6ˆ"s‚h!àÆT‰Íª`z<·fpG;5¤Ù’Ž[[âÎÔ¯ ¢Ëı:@B1%¾á$YKqG$ˆm™Šb I@aªâÔ|?GtQqÈ5ÓšX4ÎÍJŒÑ%‡.- éÞ@$Zl*) ±¾x ñ²uלÆ0±•¤•J¦£÷»<„.åh(yŸ^yJþict*9ªÍ£½l¼­DB•¸$ô4J,c”/·¥”)C]ÊN¦Ñ‹Ó„O:#ê™ÍÜî)„È]38ݸæY§Ë É[-Ù5¤e»X3YÍ.ô^GO“ Vj©­!Sùþ=f—^“ˆn!¸P»wNß)÷G=?–·P™š›<6#”i¥Nûrwˆ!‘çô|¾u±»eciQü§±”lm”<âÞèðÙ«ï¿|^ÒQ£¶xÝùI ÿVÒ¯g~a‰Á/ëØ,¯”æýò¤I‘g[n?ØUk£"g6·òš‰Z]6Š6ÛÅ/ÛS­ƒÍä1éÀý©áüë z|r+%³DãÂm2÷»óâ‡Ê‹PÙIz¾ŸƒûT#X¸^ÏTGäG÷Ó~»ß\KO¯ÂâÅ'h.g³Ð\Ô GŸ˜æ¢ïï—ï /J¿šÒÞLÅò³ýNªhªäüäE‰/$·´•¡ß#Éí}ꧨúÒÍ©œÒ"Ðã§ò^VÙ¾½r<—•Þ³Ò;ü–L(L:‰Xˆ¦4¡é}g#ZÊ ÝßœN(ŠÈ$ˆÌ÷º<©Aí2i#Z“ÉÐoV5¶{h]q ÿIãÆíسÝ×ÛµP£+eê>kk˜ÇwDDs¿•Ð=’¯¾ü¹¼WR­‰ÂÖ5øô]Xgq|Ü­ë›Cåb}w7>é…àã?"ˆ,M ]g¹¤yYIúE™H”ùµ€ÓÍRLáaÓ§ãeÖA àT}`ö©«x»*¤ÛäŽE+øÅj²)Žntå WÿÿF·„Èx/E¦ã-9·hô2Ïåß®þAn†endstream endobj 197 0 obj 5822 endobj 201 0 obj <> stream xœ[]ëFr…á`̯ ‡«îÐlö'ýæwk‘‡»FÌ‘43²%qV¢f<ÿz³H€<æÔG7)ù^{7°ë["»»ª«Nê.þ¹jjS5ôþ¹Ü]}òï±z8^5ÕøïáêÏW†¨ôå®úí-J$¸½¿’÷Leœ©£m«˜lݶ]u»»Züõ¯oÀ³ëá©“±xávuµøJ~Í#¥ÚvM›ünÿðçáâõ¶«mè:}â›ó×]¼þòŸ«¾{|è/Þ¶±nM~ûÝâÓëkmÝ´íâöú»ÛëdêšVG[]d\ݤÆ|P‹Ô%§?þø}¿ÿárMmíßöúwëÇŸY°¶YÍ95ÖÅv?|ÿØï/Þ„¶±6ÎV7.Ô1šN̰Ù?_§ºib2‹áÇkè†éÍbÍ&icíu6[C\ݾà•UÕŸÆa×›e¿Ý¾Vëëºýò±7;yÛ`±!Úé}y½®¾Ý߇ñ´ïÇõöõÚwx9¥ÅÛj|Ü«þéé ¯»ÚfK°+`–ÉCÞñdËaÿ›å8[ªzÙŒXÅ£,⦠¶j›–^kkçU~1Än½«ãëõM‹LçÇq½«îøåÔáéìkZ‚«½›-aÙŸŽkš«Zúû±za[¶] §-ì´Íª˜ºuîb 8c[tY½bNRšèëj³¯¾úò«ßU°Ôõ©»¡l^á_š¯Xù¦mº:ú„ïš( ¾<®÷üð/iúÒïÏÍ7<óæþµÚŒuu{ 6¦J)»ß=¾9ÎFäEP$…EZA ,h6èjlm’ÏqK³¾%ñ…'¦X¶fñýŽ”Â/­¯] US›&ˆBoªÝé8Vûa$cÁU;(c‘Š&69¨,«Ã8]dG ÃFùÇ~üz¸ŽjŒ— ~1djübØ=ÁÒû•Ü'#CªÛ. ‡–üt–ÑFN×ļ»óU{¬÷¸–õÝØ¦ ¶ÓÞ5¢*’׈%a\”Ù ‡·l#áÖy‚ºúí‰ýB^[öبáSî?úì›þ[îHM¿ø²Âf“Ê!¹ÅO#ÇÊpç¢Óz_wQúÕú “&Û¥¼“pž#ï—E¤“íÜ4^¶*ËF{$—&5»¤1ˆzx„—}¶Ý’Ëcß²Ça{7Þf@ïž¶¼lcb»ø‰v¦ÚØ‘YrØŒ@£ýC]}õZ=‰#tÞ"Â÷‡ àvÕçꯎ±PÍßÁà­qi±\ïĵbëÃEf¸É/f—ýë_þë/—Y êMøþn×o¶Ÿf§nr Ú9 }GÐ! ñØOˆ Cl ûæãõ„ +1Ðf<õd¡ZQðo1úñu k=#îâ+ŽØå‰w!g ªŠwÕÁN)‡1"p̾ `¯Íø,ø•¦D î«ÝÀñ“o±îõ¶ õÈ:Íä½€>[ðÅ“à{† ø©‹VŤBö$ñyWGSy¹>ûƒ¾Õ¹’°_¿>^öªû`›Rí›YÀª4Ÿ ûõyJãœdRÀºn׬V°),áÔ•UŽ©7ä »Œð"ðŒ¢Á„9 Ü ;étä½°ó*Iñl q5og ïÚ4„×i¡»o/°S€yXƒ w;¥¦ BìŽLÄ1T$£Ð£kJ¦¼·m²ۘ=â ;ÇJûº$š5*Î9k ÊúM.p…¡"ÁõÝ®!$™]PÌs³€@>á"Á¶efÆõóÕÕïOZ†̳ißoKÞµ¦.°.ôØA/ûCzÁ‹LÄKVê‚úæŸß Li|š¢OÆû§ €Èó¼ùÓµø"î‰c*ÕιláLfÁ¹Üô[ö6™"„ª¬mS¨}a§„¹; ¨¶¸ºà[ò–zØì÷Îc¥ ‡}EÝHѵÓ8â%ÕŽ¢îÂYs¾\"èí”–¾=®§\Ç4¸kávÁ^h:'D+¶ ­z ¶!ÂERdƒzmÑÆ·ôw &ÄŽÇÍâ™Iô½G2TafA9¹ä%N§Èy>cùª÷lXVò•‡ ¸Ÿm‰t<0I'€¢3Úß4°Ð%ï¿´õj”(IJ eÜŒÀßà²[¾/*(­žžžêlHÙÉ£í2è`¼ÃÝf<ôä}æf"ºÊTÇLð`´ÍG c–ò×äVR0%¢cµÚd:çÊZ˜|dã/Ç­b+Ë@º?À3N„ØvÉþÂõÁ‹¼Œi§ò8<Ü_àSˆÑç'vw§ÍvuY¦vð¥Lé1b6ͨ~%™Üˆ·Oé—”Ž×ÂÊQ!Á ª/6Ï#ØSâ¼(nT`]¶×»Å#I Z€ÆÂ7±?ÊQHRNÑs­´ÜžV:wÒbõ–JÁ 6,9.‚!Ç`*…%›?¿FÔä‚ðS^˜ÈÜ-…,»?»yV;Ûeò&#Œ¯GàðÌ«šºµVGc4;Pg1<í¥Vj»Dt¼82]æ´‚sb¡>¦ìCD¡QG¸3Ùƒj6H´€ã¬ÀÀK#‚1¹ÈºúYŠkëà&–’¬|µ«÷[)ÈSÍÅòßs`â‘È—ˆs™¨C¼ÐyEy5 8ƒÆ¸h&Ó„FÝ„B•‘Xg™Õës¶pÚRñ oôÔÈq¤š¿0aE­Ñÿ¥O\á^8¥‡w„öW¢5Õ3Bõ¾`%%¶/¢ö±_UƒT"¨·<8ž™VHX»¿ÑèWÏ=\èAÎÔ<ê rªäëˆâîƒÕAö (ÉlÚ4cžIÝ*WE%‡¹ÊT?%(aPÔ3…@pS²ä ‹èæäíy³Bfe{0I©EútØ(9*A>¢ÕõŒ Q¹Ðt €I]‰~«ÿ^òsÛñùbù]ÉÿÇ[ZÂP¾ÓäÂÈÈÔÓ8KeÔ{¢€Ž£`ŸI>\1]žçµ-¹XÙ|ë ‹÷Øp9X2¥R”±s›èSÎâ­k‘ŵ(ƒ;¦©¦A¤'ްñ5픂öIÈNJ°ÛÓç4@ŠûÚç‰ie’yXK¡KΙs-½qZ,¡<ŒäîCc5SÈ!cÇrŠŸ5òà®E#;«úöE:6iÎÙÅ;Þ-6Ç ¦ ^ºCÇ  xOåç[}ŒGä1€Êz»Ý<0!Çë|®¡ô‘Ú‰ë7¥Ð„5?Èi‘‡ë,Õ\6ìT¥¢âŸ_àhëÓÿÇ3ÀÂÏÏN$ñiÒZö £Ÿ›2Ý[¤¼M bÕãfG‘³* Á°æ§ô^áj2k>Ìf•ÓlÖmó‡õ8f“pžàf4~9jGN•‚”±;Î/4»ÉÚÌA¶Ê¿¼ÁóáóþX>(¡tÖÖq6€fè["A݉·Š.I[@±ß§|Èî&Ç*?K¿˜ñH§§ƒÖâž2B!ur̘›RUÔ“sPyyÍvªÞñªw{õGŒBõre*`j¯IÈFlDÓU»¹„Ž©«­H¼«,h jï,‰$ð‡"Áºl2xÛŠ¤­[ØH¦‚@ÃÐm‘¾„ßHæE€ø'A‡°Aª“Jµ¬’ sÅVÖ<“xY3$ê0fs.éZ½¼…¸çsQ¤v @`«³Ã­¢H\E­N±u˜Ùbñ@~¥qbä¶;—8àlžš÷|&ñt¤È’$æ‚×D FTH ÇíldH ð¹$&³-Žñ I£o•Ù‹Ä"/œ¿)foUüùì“Äs¬Íœ°¬Ù¿ëfuA\7o þ# Ë®R$!‡$ì–°eçÏ6 cÿÇ_ÕÛáKþ\t ¸”=—À)ÌÙK ]V³ÚØØsÂAŠ˜©e™ Þ"xËÔ{Ͼ‡¯n7r‡þÉ C&S*Îå¸?:ŽØò³#ôݹàKó&·ºúŠn²+g^¼¤’py»6ë¤ ¹Ÿ¼8ïcÿpv2ÑÓ…ÿ?Òíüøú´¾¤šiM¥ð;.›§U梭uTûôŒ÷Z©M’N+5’P‰e@>l‘›1±U>ío(ЃР’XD­tHiäÎ<Œ«YÐ*swàé4,RT£ƒp-DOHa(ã¼FƒépA2‹Aö’¨•I œð2 Й‚a®@JJ'‰cµCÖ H h¸KL%ø+*¤•$º^U€Ž ÏT„ ñs;Í^QsûFÙØÅ&q¥æ°‘Y­ÔŠ$8­ÔH"—Ši¬nœ)u²MNëtüHPbå‚d|D‘RU…Ìl…9Ìö% »0Éh¥&'gû¬î¦Uªå’0’¨guÂvLJ¿]'Œˆ$QŸÖd@ÐD ß³"‰ÐxßûšK‚®Ù«[ø¶ÑÙ'‰ÕÙË[mÐÙË\(áóìâÕ®ÕzyË2!µ:}„K·ÉEШÿÑ+Ä>ÈÈB'IR^쑳xÏg’À¼˜$ÂÁ=˜BÒÚéô¾= ÙK!´Ó“› ‰Ñ·ÊìE•§Oo­ÔÈìV%R—M³O’ ‘VœpZ³W.ï©0⺡H"?cÕU&I£áFvKÄDçÏ6z…töÈpé²7…¹ÀuŽ´V›$^kµò’ÓÒÌ7±nφ«XUÒ²—ÌA1Èj­Fkó,1Ù“è(„'j´:){ö–OžÅÂ>­u qæl§fÝMB1Õ;(M§#{õIâ2¤ÐÍB(è¥sÅs ]˪Äèš„•os ©/ +[&q]±†ÉˆÛ–Ù)Pÿh¨ñe IBq§HrÐ4F <ã:)ÏI‹êŒgYS\gó\Ô: DEeÊÉ Íž1‚UÓ81‰êÓ\Ñ—5g 6eÍú œÜÏ÷ä5Ã`9ñiJ(F½H-œn<Ö¹O»¹Äd'£‹™9˜{+U׿žÊɳ”?I îAâÎqÆJ=7Ãêï?Gžóþ]µZë©Q”í3I­æîP ¸ö×j5:šm¼óǶÂ>?G=H"òC7‘¾õ˜¯¬äˆÙU/5 ñ t^6ñÙVk¶íúx”®˜–Z¿ §| «=>®Íí2ĹsSÑtæ‚wž×`ܾõ¡ëf¢NS;êýf{É8Û¦`¾¾;Ž(ÂúÃJ[ˆ–{±a;ví¬°KÒÀ·¾ Uã³Ë}p Úð ·ËQ»U6òµ€¶Fyû—*[(yãà7¦q|ûú¾¯5Z+nFjªÑû9”‹þn³ÝŒ´Hª4ûåòtè—¯ÕsO × "‚¦”s‹{¹ŠæW´)WD»r“ë~­@÷3¯¬`ìºÄ²ºúLKQÀSiº\­øêž»y©lB•¦dùÃi|:ÜÎ6ìõÒp¿š÷0qûxÚõ{™‚húÔ9›ò]{4â:†ÒDº¦®Êü™5¨Ì·TjÔÅÝiÔÞ ^"mê£Ð±ß-ò—tAÆ~(Ý›1Òww×y©¯ÚiÁ7—Üi­û:ˆ¶SZ*ÞÛp'¡Hz[í$<ÝÔ•^_M`Xl²ûì«çÜ’ÝL­ÂzMÖL÷½Gn}î«/¾Ö{µ¦ÌûíeS};ÿ†xz[½Ÿ[üå¿/û¸Zþb3íè6¤·§K¶ÎHËŸûÍ–3©î’i÷ž~cÚÀGþ~EÛ˱¯rÇŠ¶b»qh;̇[¡¥Goã-hø¬}W¶³¦à%}¯Æm²Ãv;PK1ªiß>›ªàj¹WZ#ŽÃ§Ómý¯þM•üOendstream endobj 202 0 obj 5838 endobj 206 0 obj <> stream xœ•\Yo$ÉqÆbac0¿¢Þ¶) K•w¦ü´¶Wö^ÒŽaÁ*6‹dkûàvuÏ,¶÷É~s\yT“œ…$Hà fåÇGFÎOÝЫnÀÿÊŸëÝÛßþ1t÷óÛ¡û'øßýÛŸÞ*ÐÉë]÷÷`ÑHùp÷–?T]tý`’êB4½Ö©û°{»ú‡«±Q†úÞº ÿpûöãêöOÛÇqumŒOÕê—«?}ø—vjëzoÅãWÿ¸œ,ôƒ”—_N‡ÿþép˜~ü 2œg0ò«_þ?t¦K½ÃO¯J½†×Ö÷!¨„ã†~ ÿXøÛç·«ï7»é͇§ÇéÍÎÓñéwÝÝf;áDj°0‹áÍÍÕµ†Õ›7;¹ÿkeqìµV½ç%’ 4û¿Ÿ¦c÷‰6«û!ód5‘{]†EúhÞösw¸+ÇáUŒëStIfÈÛl¶¡MoMHyÏ»Íýé{¼ºÖ¤Õaž77Û§Îbû”mVSwžÇ›íÔ}ÞœºÏt0e|oää«ãøøH܈}0)–íwóú¸y<ÍÝéa]…>?ÿºÏG;nn'Üu7žOòfÝ}ÿþûïºÓoF÷1 ” ¥âlLO1u÷ç 6³¿ï@yº‘ôD§Ðƒá >®fÞyðF¯„m~\o¾^#ÂØÞF·úz˳wº2Ë:f(ו7øeXºÛC7®RŸ|Ô~õ®›6h´ô}P>ºN |¤Ãžg0ƒÏW0-(z»½EÁÓw©WÕT_”<òùÇýá á- võù?Þ~÷뉎ÿùa³~#i‹GªŠ¡Õk[Cõ0ŠwV%Py9n¶'GÚôütu­Glô«ù4íà(W…z€Ù&@Póf'b9}óÓyÃCëtÁlÜ€ðõè4Ç5ÚNß½ïÖ`B Çv6ëqžf9Žú`c=Ž ŠgS¤©@Á&d˜@P?oæo>lϸV7?Ð ©A$Þƒ~tóùo×°dØÈêý»*¹Ý ±ý< C‚YÍÀªí–ù×j_7#šåáê›0ĉ»‡›óf{{0&gŠg[v¤ÿ`6êð ÷{ïPÇ=žAøP”ïãŠ÷IûÈ{ÀrÊúã<³ žNãúÑ e 5€(ó4$óž7 V%îK/¸/KC~8ŽÈØoËLóÅ©Wˆ?Žôá7Wßý|"QÁ—dü$„éÕx<¡?ëÆn:9Þ_)ü (õD§eAØþÍâv3ÿˆ8ÅÇÔMÄ]<¢c)¬gl£…Â@@(rtðtá"¸kŠðp—Þ¡ø­ž=–W†Ák)øë$ZŠŠùxDCJqp«ÃýqÜu#„=*„LÁUü|âÏhÌ|L Fî¦Û1úz0û|œi~w±{ˆkÀd3À¼A«¿tm±å°ùr`€-jñfxaS⟾ûO PÁˆýDWwZ’´ˆ›¢•ð$/ F¬sbƒÂºâ ¢°Albï Ê‚ÂGnª>Äh¾¥ç=â ¢ãµ䲃A¸Ü;ð(r\É(¿šö€MbÞàDU]Ù5°ž•°ÊÉâ~¾™AqO#|͇åõÑb8{×m@³?È~Åh¦ýµ+h¶ÂøJ"!WìÕôÞ2¶ ®mÈÂ4é—ª´l N‚öÑ,ïÝxyäÕy>p=ñ.(œC"ŠVÒÇPué˜MÃýÙ7¨1 T²ó ¸Ð¨<‡¨ aõ²*ë‚^!ȽAe½[–„ „±þUÉ‚`Á„6—a°N½w&}Yqc ¯>sÔdÐõd¥!Wñ0’rĨ#@Ñ ‡ }ÅN)»,pÔ%aFÉeƒ(SG§sH®uŽt!|;!,Pxz¼Ù€“‡óC´ì<¸º§Ž(½Ê°aÕiý;ÌX(ì΂¡ÓJ%mÅ9Ïk·K,Š‰Ø®=0ÔÇ,&v˨㾔6Þuõº;ÐáÕa—ãrú±÷à@ÚݞŽ©ÙÌþ¼ã°”CåÌÊ(Loã2ÇõDÕ‚dÍ@ .­†š ó¡ÏÜyG‘V“•y˜¸‰.‹=3Œ ^ü` _²I wž‡#àÞ¤¬«×AòÔëI“ã²É‡Q‚8*fó¦f9QñqÑÄŽã|”¼à­}§½é¥Þ([`÷×Ð×Í‘Ç{Jù/ƒKÈšÓðÅØWÔy„TnG®¿ØÁ®7 =ÖÔkgÌrH 1‡Òã:Ö`wŽÂËQ8dí„r8âU×¾ÂzŠlfL+5·YlpèUkƒŸÙýW*®¿,°ä’Ž MÎ÷‘á£WO¿“Ò`,•AƒµŽØXÏÿ\0 f‘gÀ@S——õ¿Ý?AZt”:beþÇRIfµÎÀ¨±TÑdŽ9œuQ¯FãAb<ЃŠ'„¹v\hÊ=Ù·çªhøÝQv 1\­ŽDVg€Á'D¾;[KÁ˜ðpMmX„5Àe–@zUª‰T²y8Ïï$ÈÇ€'&OÁ ÁŸÇ â¢6wmônWœîcÈf—á3¹&`0©†Ç/z– Ãÿ®E“«Ÿ[0-•“õ©püBHÄŠQú õ’)èÄ<ô±+Yaß}Äï¾ûðöpï»ÏoU‡.ÄiÀÏÔƒï ˆÛ¦nË@ T n*0Z Àö %:¤€µ¦ÀŒ(^ fŠÃyÀ¯É< ¬‹Æ€<S4þà Ï“Àd „JD h4ç™SÄÝÅà ŠÂ?嫈ó8ØiZ̧Èk|>© ™¢éìC>EÂR(ò¥–)gF)瘒÷,§ƒÔË“b©ß-8V¿Êœ‡€+©Liäµ}ûΔ„p»†ðšä¬Id¨ ‡’ÈÐñjѼ>pH›L 8PÐ …ö+/pÞ%¡ùWù@ aðŒ@q˜I…*ýUò@I"Õ€åh¤ a ÅóZ`š(¿&JbN%ðà'i"xu9…ñ²ç„2 J’=ŠÕ²çÄÚaçdõJI²zù ¸à–kÁ óêŸ~R²CÇ_…?ѹÞ†7 Ų&%)æ³NKŠFIÊê$÷†¢p÷D‰Ì1®[B>©N‹™AoüšͶR6Äñ%ÈWeõBQXæY|…yeæü ï–«ŠSlsUóžA&ANášI{E:ŠZ²¶Še›# i¦#]kåkfŽiA•uÞx¶Ý†âd@w³ P`ñœÏ¹|ötAñˆD1<|ï–Øa •D' ¸¬Q@qÈ ¼kLKŠé“Y~¥³f>Û!Ÿ=ËÂb¦ºW¥d™%Ë] þŠN<3XžhB¡Ä,S£‘Çd-wAq,e (ÙO`ûî…BŽiª[RLæPL‹ÇÄyÒ H¨Äâ0à¡™‡bƒàúmÇÆ„:ÖHB r®‘ f6‚cÑ(QøcY[²7ÊÀˆTǨÀ¨UçÁ~¹–Êž3‡²g3XÙsYkd϶xBñ™«—^= Æßf”Úµ—µ (>,p=8±ø‚ë‘wjð/S*þyÁ¶‚70Yâ¬Ó%ehçùáÕÞ…šŸòo;~,{!#ÄÞ«nü4>»¸ÉÁÝ×itø& ÿåÕ€ÂVˆÝŒr«Wä·Þ…pކT)A§J]5×ßt È­$$õ%íâëŠ?5àˆjBÊr ÈUaÈvr?`Ñý¢˜n|“½6qvw,Wƒ$§‡»rÿz’Ï9ù×[‰¶#¡Ö5Wrý{.ó×bß=n¶[:ßÙ ït! >Óx.IÞb¤‹ËR¨«-èX¼‰èí(¾­” ñ-R n3‘ʆL¡ˆÐD*þe h/PŒÄ·H '‘!RÎ1Zž' vCö1H|kù+ (±4ÉÓŽúl$ÏAóp|‹‹{ŽA¢·Jqß"EÓ~´Ä·už¡¬e‘§tRŽo‘âéì6Ÿ"Rt%–…3ƒ¯Œ*ï99¦ä=Ë)œ—ø¶œ£k·àXý*s|vR™ÒÈ‹â[Èl„¦$¾-°î$gõ"C_8X†!•=‘˜æh (M“œ-û m!…Ó†÷ ÏkAœ—3ðžñ4<5²z¥xY½|e“¬^Ör¦¬ÎÚ᜗Õ5Ç·@‰èãé\IÆPîÕr#SPå+£˜Ï:-)žÑ(šå^)] %2Ç,5¢Ð<ƒœB#ۙѫ]Pˆ¿”‘‡ê‚â䫲z¡8Žjš¯,Ç·@Ib©–£ÙfõJIlsEëž {[ X”i¯/”HcTÖ–L Ql)¤™Ás|[å\áØÀÈœè¼Õ¼Ô?¬Ý–û°×z£BéñÀåñn’–,µè0¤Ê¥#ü ¶¤@··Ô‡éMºU¯Þ•·¦Ë†o¦ù> ðÜÆ¬ZÉÅ4Èžo® Vê¬ÏœpÒ*}ÜÜo`Õ.·âlö§3ìäSž„ój®'ùçi¿žÊ%kú¬× âçÒð"?1™¶XÄ<á•…ã¾°OÒ¿Qym ÷¦ÞM§^ÒÏÅN!ÖI>¯èÊÅR¹ã=<"·¥=ÄãkƒA½A<×è5¸@J+Å(N#Ý_h X)ÀP¼o`éÉ- ök¬/!BSZè£ÄRðªß€+•iÐu$Xv][OC;¬Èw 4„²0Or±8‰çi±>£¢ØTŠ•Ëü(ѼêÇÔNcm^*£ø*ÅÐ~MÌ' Ë 8vž‘îVð#­8EDŠ!E6,'ÐG$õ¹¯ÊG…åx „Ò =^ÂÎw¦9Î+ÅxΑ"“ÊXâË ÈuKT•çt)xg )R&®“ŽŒ•×Z¶'*ÁéF4‰Zm=¦@*Jz’Ež¸ÜG§0"QEP1…”+QÕ&öð'¬,òÄžÓÄÕGž8ȸBIÊ1Õ‚bòŽ«E¢²¸j)~È‹ç¯¼É‹ç¥ Ð.‹“b¤0Èâž“ÃDÕ@ͧJ<„nCN‚fLTÃÓÌb BŠ˜qix¥ ‹L¡`?A¬ä³…Px›‘™Â3ƒ©ž§Pîxž,`,ê-,-a|¹z¡X)xׯ@—bf»ÊJëê…â ›ZQÀ²e+uX”U2¬µ,¾á‚5))ø"ÒœVã6óÊŒ&‰ªƒ&Ù Š—yLä´°¡N ›¯<'ÉRvѰ¯˜bø”ƒ¨I¥˜ŒB޳Âä(A‚Mrø„††hNƒŠâp½~4ˆmfë(ç.2БÀ*§B)²Ô1ËÛd*%‡¬™àE”ØÏb jñB¼ÝJñ,[ (Þ ç?Ñ!X©µà¨%l@åÉH«ƒpœ4[ÃȄM’9Ñ{%æé]f(cèŽK1%äSŒ©Ä¾-!Ϭ,Ey^³°kÜOè5xâ<Îyâ’l[+q– ŸUÒÉZÊEþÈ9ùžs)È~°2¢Ÿ½©/KW~ɈY/’lÃÅ{ŸWúÃÃâÑÖ º±ì çЦ Wc6J:¶8á-×$mgCI³äýñ@ÕôK®ùöN'y‰)JSåX<ȼVt[–ólŒÓÃvÒœóßr<–jy&80ÇZKàJÌE^¯&ॼ AÚ6ç¦Ýœïûî¿Ê£˜ºÓÒ˜ÖÉ%¡N _±2çÄ\åjz?mÀÒð)ÖrîÛãøù+|ˇœòÈ5á#”¬­\À'±¶Ùýqº;Ï¢öGi†£”ã=nG΢±-Ö–.h#Ûk+có@„^SbE-¸¸Ê¯!3ÒÐô ;y—<ÞÒ[Šñ²]wh»¼¹;×Ï^²¡âÕÌ` 뇾ûÎÔawN­f¾ŽÝn~¼"e °£íS~ѪÞë½Þk¯è¡-5o#Ÿ6ûOòªÀ4iÿáÇ«\x†ÚŠä…¥^#Uûù¸»yª¯P{Xx³㿘üZcyµy“õ2—†bI*qßq)Å·¯¥ÀˆÎ¹ÒƒwLm¥Q«>1E+¹¥U@ËêÓ…u?îüƇÓÒIʉ09‹áõv÷ôÒ™ÏrŸ~Šò‚LZz}¤Êïs7ðòË],ÅȃݯJÏl0¶y—¯¤5»Ñ³äî}Ñ“ªƒwöÝø©T›[ô‚埥 [ Z\N}¡HMÍùuö·ÒA ¹;°›µ¾;ï7?éIïϹSþÚF|+a›çhòfÁ[ª¤Õ7Vì!ƽ€Äx+U¤¾û= ÿÖ'‹|VûËÏ¥a ¶4ë»q³Ÿé;S‘× Ö-8sQV'•i_ÌBjZ^Ìžž ]ù§²ôí³Øöi-€>­­5pÒ.ª¬ÑËãË8ÍÖîùõfÜÊŠö©3>5.oî~åµì7óó¢WåqÈËï †ö®`—0¡ðC~I‘ŸÏai#Ö6“÷û™»`Tjš¶±R j"#s V¸„YZ­é·Ç»õ²Õ)oú¹lòÁ«@¯Õ…DZ;å—tól«º†‚/VêÇy¡ ,²•jÍÞþ?ãsendstream endobj 207 0 obj 6645 endobj 211 0 obj <> stream xœ}[“\Ç‘^(ô¢À“ÂyQ°ášu¿Øáywå¥ÃÚõ.á,ÃlL70MNO¦{â_ÛÞ?à¼UVÕÁ…’$Qà|sê–™••·*üy1[»ü¯üyszöí¿æåÝå™YþüóîÙŸŸYú`‘?nNË}^½}ÆíìbƒÝfï–\üÖ¹º¼:=Ûüûÿyþê'ø`ù8™m±¼Ú?Ûü‰Ûz*[_k¿üáþÝŸÏ«æ®n}ªU¾ø~n¶%Êoþ÷þ§nßíV­}Þ:ÛZ¿Þü§ç/½÷[ãÜæÕó^ý÷qMv›’qÒÛ~Ý‘ [SŒýâ*J-A~ùó»ûŸÖó0[ïÿ²æ?n?¡àÖ·eþãÜ4o•v?ýx»»_µ„Õæ­ ~yÒ6g[ñS· ©,¯><Û\oËÍÓ#6òvëM.ÒCÛ”7¯7‡ûërÚï–·ç»ýáñy,ÛZmÞl—WÐÍew:E­ú¡#Ui¨e÷ðpw<\–ëy9.—Ý;¢À¨)µQß> hݶúZÚ¸»Çëqw÷bÙÝ]oÏOïnœõÃó—qkL(Yv<¸CL­?ìí¥OÀ:$°Q {šÒîéz>í®Ç›ÝÝÝÇ…–œôex±MÙ—CÃÆé4dõ:¾Í 8u4“—ÌíœÔ°L~t^ðtRKßÛ¦Ö˜5ÝÃd/äµ8¢³#B¬ÇKô¸»!CìÜËÓÍíç]±ÛztdãGê+­¬êîƒCŒ–?à™|!`¿»'¾K)NZpÍàÈ.,ÿ§K#Ab7]lëFw¯a³•^a–ä/òȃð°Èª0~‡tX‡RÊ„8›³]š³ ¦þÒÍzr¢2E±å;’Ä–'ð”Å–'­½”Å–'uDÊbË;´í°›"¶< »)A»)x–¥"Û…bКIEly<ÚÊøžµ\.ÜIân ›¹©ÈÖ±åÁ©‰%ß;ÉIljt’àmnˆ§E›6@,F,y‡¦iEÚ‰%OêrDÚ|yQ]bíªtêM¹£Xòk&¡žrh3&–|G’Xò„0㜒& ã¢Nü)$Žó r1¢\€ÅÍÅ’wh]Ç2Ѽf:Y:_𤳄ˆ%ïÈ´)#¿ÑºfnŠúwxªAX²Èà!D,yG ™¿qlÿÃñ#«@3Ï ’x,—eΊx#s»Ýá1bVH–ѵU42ºŽ½ŽÎ‚c–ÑÅ’¤â9‡ËªòIÙ¦‰ ³ˆš˜ÀDvuF䣡‰çÂ6"…ÉØFÃ~ ÷ØJzöl£ˆ'ƒ§³=‚ºB¢´ÒÑK~h%–<‘Ý ’â<º"­È.„:ç,–<1«Ê¾Ö¶ãRÎMTKžË,–|gz¶J1Ë?ÚÚd)΀—>ÄŽïH;^%1Üa‘]æ KÖ˜èÿå *JbÉãÌÈòI)69 –L±”Ä’±ä‡V®mÎFßdÚš’ØíOi¼LFùmDç(~•]% Hi¼„V¤…bn¼ôlÛˆgîF±äac:ÅÔ¶™g¿5¥¨E|£ qTÀHv‰hÛFól“§hšð»"zÜ´-ãØ&¿a›‘¬K'mÅwäFRä¶É»þG¯¡Ì߶ɇ~Œ“¥·±Ðkhsn8êœÛ7Næ¬g j¨ÂkŸJÔÕÁB‡MöÚ Êé4"± ŠÒ¤Ê“—}®ªe4LJOÕz€øYË !2k½dUÇ%ÜŽýü–¼¹ÌDÝ –| 7ŘðK xþ ¨I€;‡nZ^‚ç=šrßßž? AJ†èŸ(¬¸¬s?À¸åÕÿx¸a܇Ççß 9Ü“QÏïw§•Eˆ{Ts §Û ·ž4°º™Œ8‚gKúÃî²| œLõÇãõŠÆîyÙ/w»‰ütïyiHbcÚ(Ûîr¼Ó¸Ã.oL¢Œ 0<àåáîé"¢™{ÛVº9_.GlpØc‰7ÅëÍÍAÈ#×ÔÙGY[Vw^Ä·wÙ£“½OU™ÌäÝÛ¥(9‘"àûã›ãSf/«äiE5݃=]½òÜbæùÃñzËI@‘éÖ±ª¡XH õ!ñÎÌb›ö$ô$y˜mœ´(±lD¶ÿù|{~ºÛ£NÂÜãîÊ)Oa;Jô ‘ýæŒGé¹ã»û³Ì Ãö­ŠÄ¢}K;óB“8?ßáÐX/%ð 4ÆõÚL¯4xèCÇé ΀ èŸ*gï$"UÇl+Xj‰Ï÷›(èåx]ð<•hø Èžþ©iºÙq(Ê[6»7w‡¯·¸uQ[Üï9·Üïá7ÀÊŒõÇõ¦†½:Ýòr0Æf—ê½ÛБ´-Vƒ|H_Vï7o·Ë÷ãg²èÑz³ëP,ª±ØTÞÿ[Ñ9 çÆ¿ZµÝ&¿ø¿C›ÿr›{¾]þ #+±‹·dâ}ÉH#1X- …`Ï5Zî±öaLYk| •ïjdô j°_H›T AWÛ^|aŸ€p]†½^›Ue¶i“‡G' þEÚ¤ï{]ðl”­"#¨@})gÃwº˜Ãòfw9Þ,ǽ؈ÆùÍ+(¸€( _¥ê–iO c½Ìj+9?¿LÍe=¬Eµm5Xq Å¢ªb{BŽ X °U÷ÿCWšÐ–+F†s‹Q àÚå¶š±Ö‘ìÏ[³ZsòšÃ“-¤æ7XãÙìÕÛ#–›õÖ1úC ˜¾ÑõµIéŲT­Ž×‚еl$ÔÁöfý\Ms«ŽÚ¹9àîŸ ™îþ©9àY32ƒŸb§Bfü\ÈP»…ÌÏ‹±9 ¦ ™é‹©™:™ ™)ßâ§B欙 ™iS!3-r*d¨J§Bæ€çÅXÈ âçBfBÆBæ€d,d&`,d›ÁÑžš ™›ÆBæ€6ÖTÈPN…Ì€„¹9> ™‰8S!sÀn*d$Ì…Ì#Õ¹yä 2’çBæ‘ã\ÈL,Ÿ ™ ™ ™™c!3!S!s@si*d&d*d.d&d*dž,£Û¹y‹ ™ ™ ™i†c!3-k,dh¡@𠙉ÈS!31b*d.d&d*d¦~¦Bæ±g.c*7X,e¬¥U˜ ™ióM…Ì$NS!3!S!óˆp¡í „}Îv.d&Ñ ™šS!s a,d¦=12²(†BfÆBæ ðÒ‹› ™±S!3mÇ^È<ýˆ…ÌŒ…Ì#À…̤q¦B怖ÍTÈК ™I…O…Ì€„¹9?6ñ‘©yD„—ˆL…Ì"eˤ«¦B怖ÖTÈÜtW/dž¶ï™ ™)s!3iÊ©™´éXÈ<(`)dÄÏ…Ì]Ú©™©yú†Š&™ ™©ç©™©yÔÿ\È<~Ã…Ìc?\È<ŽÅ…Ì„L…ÌÓ7NææBf"ØTÈ<uu°Œ…ÌM9F$O…̃*—BæA•KÙò¨ôIs!ó¨e¸yÔ2\ȼBÌØÏßPÈ@i7ûÒà´7þ‹ö¥‹µÙ—ÿëx]ß='¾‚`¶5ËïÓ‹¨›ÃÃÝîFã_Êü Ã¦åÑŸ‹³MÎR/Ì\Îo× $0bÇr‚Ϲ:U\x‘뜎Á™›ûõÖGÉ;cÑèNB³T.ebxÈÂHd*KÊŸbŸV2ªüÜÙšEoÍkîwÊßibÚŽ‰é7O˜ƒcãá¦% ŸÉš`j¢ä¯—V4ªn—$ïëɳÚì/Ö™8fÊW|ØýQï$w¢¬¹Âa‘03ÆÆÖõÚÎøuB†jÒK§±\¦D׃/íæ\Ô×ÃRú6H®|†€wX{öÛTv¨$¤ŽÆAOÁ• r»‡×pÑ:¦0™w¾ç¬uìS4’í\~:¿ùTH©/ò³TŒU3 G’$º‹RÓ:í®š¡ë²Ézn9D*àÑ[Ê·‡S›±ÈÔK¼,ê@ =zæ÷)%T(íC%R÷~ ôßwÛ–:øRú¦,¼Á´œ&Ø>Ã<¾ü€;^Öéô¹þëBL»ÕV*QRÚÅä–ÒÆJ¾aàjÀZ ð¦¯xOëp8Ç$)-âüæŒñ"Mž»ë:ŠîHŽÿGÿ÷Wb V'饾Ð^*A,gùο½;,@‘ÇãAî€[¬w/Ÿ/hù>.KÚ¦Ïä[ßrÂ÷ˆu8/3Þ`=*ˆ»VXÇÅZÛåX/q:ßKµVÀ©†ÿErmz/~‡•”Ç£†™Ãò?©=ÚUÃûû?Ê‹¶l`™—m+$Á ô¸)œHi»Tƒ3E­¯3àmظõï>À¶@íCÅ «‚N[ù²80\ÀØ;Ö“èöÊ âX•³†z”Ô£·ë×oÕ`˜ër]ï w¯,^ °J¿±øJƒB/F(«<=Ý]c†øñú-ë:¬šÒ$±‡cQ8¾{„åî¾AUù0<9ÁpK‹£q¬—ü±µ“c‹ö<¦rËVk ¿ c¾#ÍtÁMX)µÊè>å~7i_ ”ð@ì'î~Ù]–¶H¼¤N-X¡*`°ÚÓñ.R i3$ø÷ßɰÀÈ|-ææ_=à]X=à]\=à±Èoй2?C¯d~<€ùñæÇè‹)æFL17@VÐÐcÌÍciñs£L17Zäsdõxf~<¨·z<€1æÀüxcÌmlÒîW4617ÀVÀüVx¼Y7ÅÜ™ âL17 ßêñ@VŒTç˜ÛÈ޹²z<`ä8Ç܈åSÌ)æÈêñB¦˜ «Ç™bn#Â17B¦˜Û„d}õxÀ8ÇÜ™bn4Ã1æFËcn-X=@DžbnĈ)æ6"s#dйQ?SÌmì™#.B1·Åq™(­VÐæ›bn$NSÌ)æ6"„PçWèN17@Vxª¦cn´'¦˜ óãŒ1· ðÒËêñØ}óã´{ÌmúcnŒ1·à˜iœ)æÈêñ@V Ÿbn€¬ðXÄVf„Õã#ÒxV ˆDØHWM17@V4ÝÕcnâ™»~õx «ÇHSN17Ò¦cÌmPÀsdõx «Ç™bnÓ7–ÅÆ¯ ž§˜!SÌmÔÿs¿á˜ÛØÇÜÆ±8æFÈs›¾q2çÕãD°)æ6uu°Œ1·¦œN#2?0¨r‰¹ ª\"l£ÒSdõxÀ¨e8æ6j޹­3öó7Äܼszåhob±o¾œÓ9õÇÀÄÃJÕÝׂôÝÅúÄ›mÿq‘稰®¸¹ú®©þª MÕõŸÞJ§wôÁïØxoaŽa-Xu–cé â²Ï t{sûiЬH|5/©ùU_¾×3câRÕ4Ù¯(o¥Æ.Ýö¨j¥¿àv:?ëÿ“×Ë€eú:e—ñu4ÕÔ*Ýrr£å²<´‡Ç̶½8@7KЗózss¸\t$;Ö$äTúøh}onîž.Ç÷ý4‰Ö`‘psÁÓܪ¿­å£÷Àê8?Xé£×…ÏÙ^íêCÚ¢óôã§EDZÇXG§úõ…åp¡"x½èѺìO³çÚíÏ;ð(xA¥¼7¦‰òè·ó+~htÁÅOEýfw¢[Wà “«æyŠíU:¤D’ÇÉUÇêì' €w Jê'ןN|$y|]NQ¾ûcèiHupÛ3}Ã+ ¶DªlÄ8Š8MŠ”æ4!‚åð¯(u‡¯´$E2ÍgBÔš«¦9M%b¹0"A»Ix˜ÒThA"ÒܦÆW”oØÈ/¨L¹>ÿKÒáCq…4· °>úSêÐ =4ãà /“Õ7"†Þܦ‚†(§¹Mˆ$ì87¿ ‘À@›0/¡ävl·e"‡Y#×ЪQ=7ÏiÅ+:Ì úq„5ÏI‘Ò<'D˜Né…QçyüÚ\§{Tª£ç–©øcó›pò~¢zƈÎÈ8שIsš &ù&~c:‘ÙÍç,κ0 ‚U±âÎÑ#TüÐ0å ¬ÌtôÐͳ²L5‡÷3PxžÍ/Â×ÁÊ DT›¸Âƒê˜š`€å úÈ“b©‚ÁD«|@Om ‹ïH³ɉiʆYGšu€#›0!ôj$#lÿâ³CAv„Ém‰6L=[º =!xUiä(±r…xi¥£+Ò¼¤ÞªyIDAØ'ê£w$ÓÖêòÖæŒJ%Ë*¥$¥1dO9|ÊÇi^¶ª,þ5ü¦®dì"Ú¡ùD¸>·B ÷Òœ¤”æ#i›Ò¼"”‡2#xK_V”øôaX!…ÕNiž>2g iž½l‰k(ÍSêHó”z«æ)5—btåÌD‚y5"ÌOD˜çH³B"÷œ›§Ô‘æ)уkEu•ÐÇϾ¤,ˆ•9{ü±Yôø"f¬]œ¯¤ðª^]nd'¡ÈÍO‹Vn.îËÀ€l,J¿@9, dYP¢#$7×Ç{?(uÒó%mÓü–}3"1д¬oól_ž§Žš»0…ÚÉ&ê^©¸:6è(A•U’ª£Óˆ4¿¨b\Ç »¢ûF]Á1wiRtЍ¢ÄÌŠ%XÖQÑUk ™fø×9F«¤nÑΙ}0ñ n‘ÚK¯Ñ/ú#g4»9ÎÑõ–|À[ô®x6b%i‡dl/IÂŽÙ7ÎaT­×Â~þý]MQ>õ°\®’©‹–Òl_Ixpvâg¶#ÁöÎu¸‹ö[IäbžÿrÝʕ➚ÙÐu8>§§Ä¢¤†¼G¿§Ýó˜­¬ö€ímåµLW¼‹wïî—›ÛÝc8âr¸^˜ â7}DŠ1q©6æ×)¦×™{Ò0ºž`Ÿr†ý=»}+—¸ß]ïÅÏ3s^iýžõ†æÎõU½4„ø>,¦ßâÃ[;¦WKÿ·øà7zNüzýÄu)¨85‘ù«® y½æ°s¥IÁgòú»}"¬ ¾ß?Ôg¡÷šC·@ò¾z®¨ÞSµx»ÀIôshzºÐéw– 0¹4ÉŽ*ÁËeHºDÈ9y,÷®¿ ‘ÂP· &'ÞPÒ)>¶rz¨û¤Ï"„ÒïnïWÿ½yŽ’ãB™{8>´z!sJ<þµ/í¹…ö´ü'Œ#¨Iα-r~V/¥FÑ fcÁý{!Ûß*kEãøVØG¾>H~¾<Àª¢KùÇÑá«…ÒEªìðu$‹Ã‡œZy€ÒPŽbÚŠàŠ‘-±Zðõ”„Hg©‚ñç(Ó!M(:ç¾{ǧ@¡»€X9©*ú^ò ;&å$p?bÄTŠ : ÅÅÅÝCÄÓd\3éµ£c±Ë…Ë”S©’‹ñuYAe?cåF<Ê0 XÁ£Œb»qZ^Ö˜ê[µ¬R«·¢cZÄ6`àŸÑèpfÅÝSS²ÒÄÜKJžÌ܃cªÍ0 ¯\óg*{¤säkJ-s"X’;_ưW­„$“Ç Ìqcß„T¹áh0¾¶’™ÙÊuƒï3Â÷e Xñ™'WÙ >Ã.ßp4Þ° ‚EÄ· >L*߈3@ñ:#ÁðœÑaç~¢—Ñ;’dtm•ŒŒ®c%¯£óí!”J2Ã(­*Yò¸®*ßàù0Q£!˜»„œM >× HrëÇ$öƒ$²õ_eÃ5Ù&|Ëà›¤eê8ÐM¿ ¡Ûw#=ÝÙ›(­ttE¢Üzë­‚Üw4¾Ê& rñޑÊû­K¡ÎÙËÕ8é/’ݤH¥ol“•†Ä"·¿!¹ªÔ8q=F¥˜a¥ùäÚ䩬'ý¹÷Ø/÷{+'·QæÂ ñä×#· fâWHeudåÚ#N6»/k"=Wæ(Wg¤]NÓFí²9´Ë°ÊL`؉Y" íê™qUtQG²ôÜn½v¤ÝbÅMKÊ(´k¬†ÞDšÏ,FŸ@æÌ.(¦æd³…Èâ úR”ˆ"¹#U»N{&ÁðíR» –·1¦Ý„ÅEzh«ŠWßXü¬½°RóíYƒ)]AŠ|cYTÚ1ª°°2êß`QâܺÄóXè6 ÒqÔ9·o¬ÌYt¿S¬€r04ª®Ïº‰J,ª~: @m"†§uš:ªÀ2)tP“uÒ{tµ‡ÊvV4Ðˬg°õŒL“ûë®?bt‹a3ö ñ¾¹uî‹>a³ÀÀ%ü»'ðÂÖæ¡˜ªÑü+ -|juêyÈ<á»rTjÇþ ¾‘ú!Cù¿\ñ¨VSy:¾»m••Ÿ Hƒ®…T½ô¬ö:äþ@ô')<Ð{ÎHMØþÖ‹¡ÿ®žûÝÛå÷7Ëïßru§4ú«ÅÇuÙâ7òv'/~û :`·»þÉ¡™ßYüË÷ò6‘ùòÔª3‡Ù{‡¥eìlRÑ"ž0º@tÔÄA±¨³‡2Åö†âÆ¿KªÑ#W|±®|(×}¨×ò`Îo›ßëðÙÃÙíG€Ü^¬5gGƒíêèè‹Ã‚°³|ð ËÀow|CQ‚ÑJšÙ£ü#åÆ8Y¢ë•Ï~H ¾ÀW§ÚßH„‰ð˜»RŒxðX:/¯Ã¡ðî‘$ÛåOX‹ ~e{¬íüø³:î\|õ”ûvÏ}ßÊÛõéá=zV¡:ËÝ]˜>‰UßT¦ªžÏ¿<ûÿ*Î*½endstream endobj 212 0 obj 9511 endobj 216 0 obj <> stream xœ•\Y[Ç•† Ì ÐOH^îÛ°õÍ­½Êo±ÇIÀ†c+ȃ" ®Hv“›¤¹¨Õó«g23@çlµ\v·Œ lÖ­å,ßYêTÿÜ ½êüŸüs~÷ê·?„îöøjèþÿ¿}õó+E:ùÇü®ûò 2)on^ñ‡ª‹®LR]ˆ¦×:uoî^;ºzóŒ2Ô÷Ö¥`ø›Å«·³Å»Í~Ü^]càS5ûûÕ»7j§¶®÷fP<~öïÓÉB?¨Ayùq¹ûŸw»å‡Ÿpà<ƒ‘Ÿþç¿ùÃ2íµq©×ðûµõ}*á0Ý;¥º7÷¯f/—›E·]ÒDº6¯O ÃRÒåÝi×½¿ºv¸™”fËîpú”† g˧Õî|»:õÝú—×ÝiµìË›ñ¼9uÇåé¼ïv7ÝÝݪ[¬ûÍøpu­úƒ™»»åñ8Þ^) „ÁÁÄë-±çÚ„^û!u×JÓ¶nvܘR}ˆ™WC žåíl¹¾ÝvóÕx¸ºÖ3XòØÍaï÷W×¾O!¥8ÛNÈ f¸]ŸÆMw„sŒ'æ ‹ùHgj…ïaK<$žDƒœ“΋>ࢮW¾p½Û¢Æ­ÝÍy;C®u }LEi™G›õéA$jAîõË«kØBÒ>ά°%õ„ò`Ö(×Å‚?‰°%ü}Ej5èdfh@X/öl0É™Ùx€¥»›ÓýÈT!€¤ã”«¦9`ß}³E›yM?ÁI‚×YL [:©(ž¾o}dFLÙ!ëYoç›ó‚–Ñ©O&Å:W¤¹pD´/P@?'ìñ|+=ÁJÝØí™sNi<"™ùŽÎ—R?ØŒÀÕƒL®C¬m·¼×ÒÞ¶+=àyðÜqr™Ÿp²wÝ=Mböe3Ìψ:W´Q1@J\ݘ«¡-}ýæÕŸÁñ…?½²ƒ˜öX8lêîZJ€ýt¤»"P´L¡˜Î[ðë¾`‹@1½1™,Rp(¬&"%æi€qŒz˜Û Š‚„)´œÇ(Çø^ó<^eJðH àí¦‡ÇŠ£ýh@ÞéÎ'€$=;?$ »æíƒqQDÅ€S‰(º7<Â-”Àc€/¤†à¼çèyÏè/x­4ðžŠá=…UCÁ ý%Éêù+…kLÖRÊ—ÕY7”J²:„³ü•öŠ‚³L•21‚BªBq‘ù¬Ó”;•ÕI½¥ÀªB‰.ŸB‹¡ <3HòíÌ6ÞL) £SóŠ©·”(_åÕ+VÓ¯ …óZÌÔöÞMWÏŒ½oõ°îÙ ÆöÁº+ÂAÖÑ%Ê’)à=Åàð#TL4ŠäZ±›ä à ¡RDå‡ Š“y 1S ¨†š~"qYéüö!#HYZŠ@Û,;LHæŠB£pqà¿K¸\3ýÆ‹‘f&›håäYH±ªVC"% ] UÊ 3›¢™¢3°Ào¦ ˜0GO Œ%› dY&Á¢n#Z †JN e˜â0b=qóQŒ„Þ¶è¿<·b5(Î4ƒJC)Â4œYÜìlJä18ZO¼@P„EÍ ¯šy¼å³×µ¼*{ÎøËžeŒ³²ç²<ï9f(^¡2uê\Èá „ùXà鮥¤¬aÛºÒŽM½ºÒœR |Bi€Ï ¨e ÁyÒø`-7¾éq×Ï•MJÈ—Ë&–’<ä ‚f ²ÉuóÅ<]†€9Ä|Ç*H%>çx½Æ[ÌDƒñÚKÕP$ÈBŠC1ë AR@r^G ²,~%ÈŠèÊP0‹¢ø)XŒŠY•7! —#z;C’ÄX1aÙ…‡P0ÁL „¤Iº%€b| ¢89V“J1…$¬JŽb0z‰ªj„ «ŠÄUõ# « ƒ½DUU^b¨*§B)²ô6ËÛd*%›¬™ 1~CäÅqãB²ÝBñ,[/AU²‘ Ê‹ûG+µ“˜ª¡HL…”‚´:ÇI#œ„T(6]g³Þ«ŒàR¡N3”1ƉÖ8 aðcN"¡¤£ “h)AtÀ*’q?A¢ÄøSƨ(UæÔ‰^VÂì,ïX=Öó,lðÄy)¢eÇP7P8záMÈÀ6«ì³) j(P!…]tFðàEo ‚c”K¸UÁ.S*Ú…Œd]`ÒÙ.ÁTh+”vÿT8…)Ì@¼µ%œrq~3¤ñ™p øâ¥œúŽ ˆÕ®®-Fƒ1Ì^žº{º¼pÑΖ›M÷žKÕXŽò9*{¾&|Z-¯@õAÿÍì¡ù¦69[v›õíêÔÌÿIµÒãún½X£=ž60 —¯j9B¾äÅWXòæ:6¹|Ê7A é|ºOë#•Ua&¬ÑêAûÙnsÌõ_0mçr)}¶X¬¹v¾y"ŸóM¹t»ƒ­Ï—Û#N¸Xÿëü¼9­ñòbO…K¥9@y|À§×Úz)Ä*òèåFa<»p1*fVnWÀ.¾8À…åª:æêµ‡xdZøÂ7`³ýù=ì´[ìîÆõ¶¿¬»õè™Ê- dÊ=Fê8ë d´YÒ^—¸‰ü~.ø>®p¿•÷ôš ï¾9uóÝÝþ°>"3EͰÀó\»óizª=:Ëíïÿ÷_'ô±¥Ö¾Yo—Xøç ü^o Ë4¹Hª*¯PÉç;¹åŠˆÀC"·"K¾žØž–‡›q“R‰ ßÁ³nû°îŽ×`ÑFüö²„l˜”MÞnÏûÛK9 €úùâ-–Љ÷ßþ±;Ê­©¶zv<-÷#Þ òUÔ`Œ?ñe«\´­ÝR65SËþëíGºº  …;¾ˆVåÛŒ“ù{ eØ¢»·g4™nä[Ò¿®ÆÓw;Ôf¼íšÝwûzÍ b>½îÞŸOÀD¾Ïºà‰Æ›ˆ˜mî¸Ì·…'ýiQ¨§6Œw‡®+Ðó™z×ð„Òƒf€ËLcL¢÷ãù†tZÏé”5å8 Sw+}˜rV ø6J9‰,v\¤)`$P,;¢€ãJàX‰(€<@Iœ±EaÐáœÑe«Ų+ ¹u 8v@¡0ÆPŠ”„Á9ÍãyæD~(ŠÝU¥ÀêCÊ_Úçl¢ÎƒYŽÉãø¤*dŠÂ=ƒ9æSPǾš(gÆL­Pl`JÞ³œûô¤èùÜ„cÍWÂyˆ’Ê”F^ècá¬JhŽ3ÏJQž3O¢° ‡Â!%24y5L‡„Cšù)“§1‘ÃE 8 Ä€Ó‡ß@‰(»†÷¸?‘ðÆ)†sO DäC#yÔ7–ªãЭ “¢°–¡Që4¥ Ñê$÷†bP'‰™cŽ4€æB>©V“™-^³N(p3±0œ1L)`k~ºz¦à}˜|2‰…óƒP¼›¬ÞP Û\Ñòg8> U‘H{E:EYã²¶Š›Ã¯H3Á.’›Èïd„b9TÇ}è Šçy0i0SJà$´ùÊsÎIg”ˆ3ÅÈIkKC±‚I޳P 8Ô? ˜¬Q–~Šæü«¡(Κ¯†l§™ÏC,gYŪ‰¼ŠÈs“mP]P”̲&ŠÏ2…¯‘Çd-{A ,e (Y=±} 6[^2+FMA’BQ™@Ñ”¤½í¡è‡ N¸öýíþÃòáq*j’5k/zMíRݽÜ`«$«*¶®èXš®À a‹vÖ_® ìÄ´öY];I‡fãæ~¤Ý¡(K€óà¥KTªØ â/¶mEY?Õz>æÖUªŠéºB¨ Žßÿáûß~ûÍ·_wÇäÃãAz®„ºØó¿¿hÂVØ©”-ûÿñ'êE®ï8A¥&Bjñ‚4÷å3saNQΆ­ÔJ§UeÛÓ,gãÏù3É‚c5ÔÖNí9Ë~Ýí6‹\Ûî¶/˜™‡X\ Øc 2·Òª=ºyÓaªZÝ-Å©“Ô¤<ÖSUÞ¡wlÜlÀ$¯ðF;zkWcfÍeͧéOÜciOš $LíBÝOÄ=L]mAMƒ%iï°T$=Á8+¸ Ù–nš…¤ÑœÛzñZ¥Xkâ œ7j#\Ê6Yb/Það௷óG` –€µèÇhI­†°cíê±\i´ï»ï¹@÷¶±¹¹–JåäApÍ5§¤VЩeA´=4õ)´÷T?;D'ƒ4ÈÏ×û5@ÆQê²ÚBMòGËò®ì‡k‘Ñz=› „iL¯ŠYPw70PÜ $z®)ž ¹=™*\|dº}1í‘ëaÛzá!—Q< ²{ÑfxЂûX-(mÄ—M¦8¡*2ÜÄŸë1xÝݯÖóU©ºX­ÁöP:Gñ®¬PÝÔ&×O¬c¹3t6_Rg:÷·SLà1k­Vöyü€M¶l…x 0H™ep=¬Ëcßýe»ƒèöö$ì¦ ¿ÌÊ£•ù-ÂÍî¼e¹;^šz­†¶~í¥Â˜Õå‘Û¿6˜›ê_F»`šgF@¼?÷Ê{nü†î ¸ä×=Z5ß8q×RkGJûñÓ°³>õÝWçƒè[©¢6o>¶§ óJCž3!Úæ·ä—ð H·Z/ ümvu9`=üò«¯þvÕe¹AÒ.¯Ejy5¹y†Cô9.6w |ogÛzhðÝíCÌ®}Ù&×€° Ž+ Žwbõ yq_$>`@Ãë nä­,ßîàeßgN‘ûýK´aã…Â`­ûçó:¿Ü@‡Yëûà¸ñ]Þh˜4;ÏÁQ°u'Ot"ÖJtyÓ“qsIw›¥xIS„ÿIJÙàR[(÷mÙ™=¢NóÕ£XèâFäq#:h¹+@[ç=­ù.7&À7-ÂQl»ãŸ pJ0 þLÈþŒá ™qTßÿXƒ¥œÇIå½Qù%M~¶Bí&åZŸA Ó·ØL_=-µQ×ù#'†šÓ¤k,My¼³"‘‚à\ÑE,â÷§’-÷Í;ïkÐBá„¡ëÞòQ~ЕÃôÓòn_ÕlwkP9/uÎÇøèÀv¦±Å¡ñ_Ä3yŒ†rÄèÓ=ÿÀ ¾à$‘ÃLÖרŠ[Á© ¨«ð0‰>±a¾ Í/í‹'¦ª’—;*Þêñįß@P*Fó¹}B »ce ôØè2H²÷¾ø[Eð  b0wû™1ŒRh€hšçsÅ{ÑYĹ,‚ú¡Þ¼<ñÊc KÂ<é–ó*dby}eË#?*ë°"½Ä*a:ø‚Û‹¡ «  Ö0Ûxý"ò<Eœ‡Pr*NÈæ0f{§ûÁÛ¿B\†•ø˜-–€nµ»¿DaeÉ ?œÁËÍòL‘ôayÉÔˆ¡ia*pêc}£yXß<<û /ƒÕ>í³èQ/ÆÁÕ‚I¿()£pS >0%ê)·Ô¸à1?:ÅVÂá©Ëó'ßࡠیۭÜvZe0Û†¬ }çCUËSvÏCèãS/üÆÍú?—¬CÁhp˜Òp€õpÕ¾— «7_î È/Hr^·EªÇ•$„¯{¾®õC„Pît‚@c¯->Dû#x÷Ëv‰m>3VÁŸJÚ~áa¢¶ôàtñÓùé×|¾;,¤ ‚Ûðщ‰õ\[ É(…ZãsPt&²lùž›Ðƒ.U” /ºóå«ìƒÎFŠ[<"?îÄ£þžòLÜçË+…•(ØçëRQ”°ùlèÚ:Þ=â#{?Î?œ÷x¡\”öå'¹ K¡)mv[Žá$qå»è lê|8åttÆ­`D‚ñˆ²> KÅ¡¾fÇ_ þýšž]Ö'>Úòþ@«ÝM=m É¥dXv@±'XÈ"ǰ¾Éݾq„­fˆcc Ÿ¼øµF¼)–Ö2FM^®6ž9$ÊŸzȨ¨Uð2önkoÖˆ³ç~ò˜’ d˜ïn»”VˆüŽÅNQãuRb‰ ¬R©í)#6úçÆ™ÞäãƒÅ#¥$k 2k—‡Û0œO¯£Óu—ºâ Éj䎋Óú3“î®È [3ÂgìþåñÊ ƒ›ëÍç5*6q9’êQmZ7µé#6)uù¯I¦pìÓ¾zÏÃúEæ>¤4µhlƒAOyõ7N{Ô%£ªÃÚ\€,ç»ó&kQ2‰-$úWôŽësIÑI-“ vü¶2 Ñff}ä0;«!Êf·¿Ã8Eôçfœ“Ý]a%%YÌÿÝ&ïý ½@Ptÿã"ÇfVþ.BCŒH{×ø÷ Xq±>r÷8à FŸùê~µ¦ž5¬(!a?àÓðú¿I7°%2óàWo·»wOÿø(¤¾>}" À‡ Á´³€8/'Á+R_jµ&É‹~Hiç+låº N T…pÌøêÁŸ¨åSE(,ªAPªñžYÁÐL½ÝX?Ö¼V=rL Œ“¬ŠƒÜˆý@E¿›ó¸/½t5Ùq6Ëñ™U 8M›;!U@œ®„@_ħ`u¤Ô)µmüúðEá¸:b68“mE)´Ã¾%†Ù¯H¬—‹Áyðìžo‚LÕn¬JgÕî¼!ôÙÒÐÇ\5Çãå •Pù-MšL©½Û álÅòr”äË#ÚåÈ”nÐÓñ̨Cú0Ý•ôBÍW¯»ñqÑ[ÓõVVš‰ZƒOƒó,Ðàì2+§F)‰cÍuЦR9&Šü6ã9(Å™.òƒìó_jÀÞ(ða UŒÂi<š”1ËÜÐÔx¿ZçàÆæ*R¥T/ìäþj¼“Þ:ì j®OçZ)F•ÿ°ÀysžT*-E3[p¼†Š©@ Ù‘à÷Zþ$B)Ô“Ò,›K‰œîKÿ-V€nsTL·ÚϺ¥ÿ z¥¹ÔùøO4h¾Ü³³î‘n+´Ö<ÖQŠ ÀÕ…Ï7M$?n9†¡&»?¿úOÑ{•endstream endobj 217 0 obj 6807 endobj 221 0 obj <> stream xœ•[[oäFvÆÀH`è',òÀG*‘Ö…¬*¿e×›ØA&ÉÚ v娩QÛ}‘»[#ÏÏÞl$oùÎ¥ŠdkÆv°»ðú4yêÔ¹|ç;ÅÒUÛ˜ª¥ÿè?ï¶ûM¨Þ/Úêð¿w?\~ ÒÜm«_ßà¡H‚›û yÏTÆ›&8[…èkSu³½¨ÿüŸ—7ßáYˆõá¾m¢qxáfuQ¿–_³¦Ø¸ÔÚüã›Ý»ög¯ÛÔ¸>%}âÛå뾉þò«ïÞ<¼ÎÞv¡±&¿}[qyíœkZkë›Ë77ÿ8ß“iú¾µªmu®Èø¦­ùä.bŠ^üþÃî»s;ÚÆ¹_öú›ñá…—·ùÕòÕÐß}÷LJa§o¶ú3vã]uíû&“Ä ¿j~Õü¹Â6)ÙúËû"¯p¹êæù¢îOÕ°[‘N<LöN‹`óÕ ý›­;пÃS6õé\Ùñ¡úûýf5ÄFØ¢6ƶñØumCÓ³š/´ôüéÉ=óO¦iÛŽßüõmýõ®:=ŒÕÛËkßÀ‘ÆÕã»õn·Þ½»ª^Å›Km“œb½Üˆ¿{·ßݧj_ ÕŠ×ߎÇãðŽÖ7ðž397FÙ¤ ­39±šêæa}¬ž‡c5À±]Ût¡¯?ÛŒÕnØŽbƒŽ’È+ÙWçJtóô#Îv~í¼kº±„%âYh£M¬eû¯¿ªVköWïB1n¼¼îÉ/±¯ïNûÃåµiël“íšœvWÕóÃúî·pb-¨[×…™OÙÒÇz8ÉŽ—a*ÍUu|dg!Š&†¥³:_ªü¶¾[›¦ú—œ¾}dÛRhC½?"`ð¾úW°éÛŸ9k–L¤Ä!\Á@qœGÞw.Û†@隊 McB¼~[Ó¶ŸŽØd×´&´©^5ÕïÆ]u< ‡ {Zl%¸œEÖYy»:íu3¯{Óc3#jg¸ò† «65%*+u¹rÆû=;>µ]ñ9ÇõžC†Zoë-ôíw#‡é8îNW¬êÚv”óÜpb)À¾’èûj5O†õ Fn÷»w_œ¡m¡©ÓjüÓY"ú¦ÏV7lrWàé¶þ7"­ŠêÕB:ívëÏvk€…,_UëSvD@f¹ŸvDCõ¼>AGµ/ÉÕ}_?“?4:±1anÚ´£kÔ™9më¼Oýä¶¾\ï†ÃêåÞh7˜’’CÔÇÇÍpGao“¡”àèB3K-õ¥ô KmÇ?N–þù“–xÎtõ¿.c="Ь}¹-p}[¿i÷ÛKd£õÞÔ` †ˆÔül£Ö#Ud#°ÄˆžŸ[|m}ÛôqfçïIœš¶Ëõaœ…ûÃ÷¤w¿«¶O›Óú¸Èfbîw›•ÖNj=jç¸~‹G€kÃæ4Jö÷!„z7œÖû]ƒÖpÀ~†U½xԵকª»§œM)†4oS®é'PªQJxpg4±Ëåt[#nl^çâ WN´¼ÞäúN¶Í÷vz|¬´ÓöÀ-Ÿ­œvâ«y8Í2œPù˦œi¢/òŠð b`fW¨ ŠªæF¯©olKOÉ–m!Û=;î,b¯$â)6©-n±`_¼ÓzÐáÄ™vDÛ«Në­ Õz+­¡‡ ¹ªs˜Ùä @Ó Í”PëiØTÃã#ïáÛ.;‡I"rÆô®ý½* y2Q;ýy÷À•Çê~RÓ»²xæ/„pÀ…aÉ_n9CÐbAÐþBý#òe½ª“êaÜ<":N¤½@&¥2 :¿öÚ™T Fö€±YŸ>TÐ~\áG€¦4‰ÈL§ÍzrÇ6›=! …È‚–}mñ¤I]ý4R5Á=TàõpÀ£ã¦'‘dq Ú—0ö0¬ß=œt¬œ“qÙΠœÙô¹Vˆõ‡Ë.»rˆâ×' þîtÈ ¨Í4˜ l­s]½zº+…d»œ”ºo/ñL躘z=Ìöx|À®À?{GFz¬ö Zî¥i‰|:Ða£ÀboÏÙˆ-Ô­V`Ⴑ“ÓñOÿû?ÿuÎBcÓ—dýv½]o†ELˆDÅ=R —®`‹·DŠ_w£Àf4…Öà=Ëù‚ÀÞ 6$Ì1mFŒáTP­Ÿ†’ñÈp¸L/€Õ#Ñö“úœFëÝpwZ¿§£LNˆ§XKa5Þ(ÿ¦úí{j/;Ê“ÝöAÖy@®¸:÷OÍOM³›øU¥úÎm¢ºáÙÁ!ƒÃDË£ºkx?À§ÔöO§WûûWXðÕ[Þ o­›Rd¢„·õMõw§j3Nù5Ñ)¾»¥ýÍ~3näûj¥tÏ÷]-S云ˆ–ããÔ§Ù‚¨-1f(o*ÃŒµŸhüöáÕǘ<šç3³®ÿP/“3YlÛœ|ÿýÉÞ?!Ó.ÏûÌ ]³Zí¹gµ}ôõÝÓ–ð‹é¤’%ãS(9gTa1\Fm@ «70 „¾Ÿ…€ÿgàS!}‡¶š)¨)à1„tX½v§Ìˆ1‹EÃû…é”NûÏÐø(ížöÁ8špWy¶hS¨ï”8ð”†ÿÑ‘„aèÿ»Žã±zût*ŒÂbˆK©¤fÌ\¦ŒŠ+ÑÏ´|䌮@7BØ••‹Š\êÛBm§ ¨iÕø‘gˆ 7Û;ô1K¢ÐíÒôVR{n–ãë†3èÍÁ° -cÝ,1ÔŽ©éO(±qÙ9?{…ÍJÁ=3A…n_ðÐxâð/0–iiŸ,O:ÓújDâ!ý”wQ’ïàZ%E¸H‡³>ùÌåÒ_çÁ±kÎÏóøbï&²7n™Ï†ÞÙúý¤e6·h7ÂC½y7Jâs*àÐ{òû²C“³±Ô–M:™ ‡‚•°˜ÝÄgwÄ…†ÓG»™ÎóJ‰ä\é¦'öùµØt=õjíº{ ó Rɯ-þÀgÊ¿J~N2^U(H8Ê2åv°gÎ̼çýzÿtÔ™¼ÔNðGÒo8îw(³¯éXn'ÅÐÇ‚ÿðDÙÀp"h畞Ÿn·4¤nÖ’ìœ&ö‚hžmÞ¥ÆLõö9oþþc¿¨¸4Ñ"EÔ™"T áÌB‘$ûx®)Î4![™»ýÓf¥æLðe\÷ôuc:¾¤DÕQysèÑKµËôÓY8zÌk ü…Á>M Z-ƒÕú/ïKWÌ;†Íq¯žƒOlø™6á|R- 0‡<÷f~ðQbüžÄŸ•Œ=)¥ !Õ«!„ôËIˆ£1Á2Šb8uå$‹˜ÃséIå8+L3ª×³—_¨Ðý0"”Ñ[÷åst„ÔuæUÇÓ¤éf[Æ6̓Å~&·þŒè OŽ 0Bcœ¯÷ZÖbrˆÍô9 ôÚ‡çïy-`©òôOuCÄÕFÈÒ“Òîö ü1õÓÌx™Ò¦,Z–yH³ø PÒJYIð”#S‘äóŒ1pa!ReŠw!coÀ$=ÇÞ9]½Õcüù©þSaµœ䃦˜Ð‡Ô…ÉuAýîyK#Rø§][Ÿ‹È7r¬08¶ üʸ§â Ê<ÈÝùŒ%0kd8`öô1çã.ØÒ|± ¾ŸÖÇg‘ãêvöä–%!z¥ƒ—³ ¥Ci¯ù;“<=˜múrtVZlSÝ’M¿½¹ø„Ýž/LE_l"ÙV6Ñqnª¶sI"b¸Iï!¹"”[ø¬éU‚ºŒ$ÁÀï²Ä‘ 2Y|åÚ¶Íjx @‘ƒ `"¢ê’<ÃÔN%½¨MhJdoJh_KI =©ÄÀ#wfjxy¥@náMš%ž·Ýç@bIqd¦$’оm6QÿµE’í¥ @éЩl‘m7÷ÓôJvwhi†Ù¼Òæâ[Ò“Tæš8pY)™e­¤‹Å5Igtµ@Ñ×X—‰éAÇD‚âbgÁ‹I$tÐ4÷yha‹¸”¤e àT%„Fóx‰¦£ÑŽ$„I%’YxãYâéû Ky™%Až¡oø,éò.PN%½¬fÑ/%ުͦEèz]}’$]½¼Õ[]½¬…q ¯.ih6W ;y+sd[Ӏ膅/² Õü£WŒ'Û´” CtéNb>“XšYÅ]4Ci´¢¹CW± ÍèL‚ /ÊŠØžI‚¾UV/âAË·ú&·;•ôÝrõ"é¬TÚ”„ÅæŽò%(ï^R·/’Àϸœ*EÒj¹‘ÄF©‰ÔÍ‚I(s h¾#›ú¥ S-Hi·”àŸfñ’§¯º¼MdùR€·E ˜<êa!€ƒM”j[Ç“3 ’À µM—@xr‹·À[´<³‡1mÄe ñf©I’£ IޏUš$­jîJd‰ÏÑÄ[ŒC‚^ºV8“ô_š¡Ôž @l.4H8·Q< Y‚Toø×Åœ}È¥æ½t/TrNÿV‘¼ÏEãè›Ôâç%q eëÜV Ù)zÂ<–Dy†Nžâ¼ÛÍŸá&¾Ð†â–kSlΊÍú ðÇ/׳ÍpXn|ÚŠSÏZ ·›€_­/ð´KLN2HÒ̑ȟ9˜S–ø%ìeÉ„{½bZÁèé–¸ÇsõR²0ŒþÔ­µ‰\Wzmë„ý7¾¶æšJ|û©±û “QT••É%òÎ'˜hlÓ¹?öZ>ê锞#Z:›ªô ~ú\^'è?TåBG>e¦sœÙ÷N§Ç±J¤Ë(2ñAïÐ!Т1D$!“Ä:!,A˜mtNRf,ô]– ª$Á/–À?6z#Ê»žŸõ@Òó3½ä$ÄñI$I=¸}†y $|·ƒõô&Kz²™®EIŒð&–8Òã¢4øIv‘× Ôx§&dIཷeÖ€‚ K,ií‰EÒ‘d›u˜aìr§4u MoeÏÓb²d/ÊuhJ* Â'‰ÂY"1´ÙC€‰a—W ­¬ï¢Ðº8Fõ /¶‚Þ8ê¸Xé‡Ð³ð=.ãƒÖ±¤B s‚yäS«Q ‚! U¢YF$›%Qº¼÷m+ž†„ !$N2 Uvቲª„Ù$Im.¢¬*‘ìðD>Ï$IW/où\®åú²ºd‡wIWB=Qìx_UDqšyc’xÍD˜H1`?Û´”XAB¬ÕIÜgKý›%±Ë»0Z+­h¶åí\3c^J:²ueò¡;“D}«¬^$FøÀì­V8!4[­ÔVàlõ"±Vj®äa±Ù%iTÊ Î^Ž¥Ó ’„œ-Eâµæè-ÎLºÿÚ-âN7jTâ9ŒæwÂÜŠWϺ wB²Î”ÚÎ%]Î2àƒIs\÷4_š9®{ßKwšá_–Lø×+¶¼ž¸Ä?üæ—´´ðÿÅ Ùv/}ÓnhW>¾õÝ'¸áD¹ÞèWe½æƒä˜Ý-6t9ŠŽé‘*óSc¯Tñ˜¯@Ú4]¤«j«éêßâž ^S}#—6… F:š2“î|ÍG/çÑõõéaÿD—×è®]ñ¢ûRü¡‹Ê¥33QÓÏ6zKÓ©qÓõ?ãôT•0wù”—·›~Y8ê‘¥c:›Ýg\¾¡÷¨G»¡ òþ¸^Ød £/Î⚆¦#ô½|Ž‚=ѵ³ëúÿ~ÙÓæÀÇOW|¥’]ôê©yï¦sô Ýx–?û¶¿ÒïzcÝnú`~[¦côí@ÅøÓ¸3)Çœ%Ÿw|û+Ÿ4ïå¶äü`ÜìÏGÊ!ïñ´†k†ßÔЄ&3?¿ÝíßèÕÐùE"¨Äȧѵé‚$A=Jnæ²ñô<]–0¦Ù2t?²š=B#¬ƒiÎnµŽÇ/^\w¦«¿è¾ùtÝùµ(§/‘3Wëûü7»Š¯hÊÙ»DöŠ3ÿÅ÷jÂÅS/½dÛùM€™ÕT¿ä.ùdòo(¬ì‘vqƒ2Eýr›ÿþA¯¶Ó×·çlûâÏ$0|C÷¸ßŽ•$Ê䙫Þì†ùʼn–.]чÀqû¸)ÏA}?(ºÒ+‹«5ûp™mÖ–ßõç»ýKºö,oõš¢Þ-äu+)å?é׌(|3#0»ÊèÓÕ#]CÚîï?Ô_ZM5ýÕÈx’1žÎsüt}o½#×Ý5etþÝÅÿÈIý"endstream endobj 222 0 obj 5259 endobj 226 0 obj <> stream xœ•Z]säÆu­­}Yï¯ÀCª´HÝ 4ºóæÄ–åT6‰eºòÀuEà È4ŒÌrù³ÿœ{û œ¡Ö‰T*I;@w߯sνŸ³²YIûoïó}“=ÎïËìøçñýÏï?ùmÙ?Ýâ!%éOnÞ»Efê¢TVdQ…”6»=¼ÏÿùêöGtò}?tW¨k›_gý’õÎQ7š¢–::âH[Ô…LIJ[Tn‹qžûû}—-cF©§<ÇX¹£§XÚ~ï mÊ¢¬MZ¬v‹eó2NþMSWxóþ A)%ÉþþpÜG7XP‡¸D7¬Ó&Xß/s6œ. ¦V5üMÁsÖÊFFšh­‹(-‡<¯àV·\YNé¼Èþ8À‰Ã2µóBf“e8Ö\\)Pކt÷óõY‰U–ý…úR©¾—ö'^UaM”ÐEæ·3›é“>KFˆÚʧ\^¸D—v q2ùÖu,Ò§Ðx<ú ò® QH .|±éŽ ù¡åœ6ðg>N8ÅtyRÿø5{_Z[4F¤]¥+J>PS¨J Qà¸o7«**?¥ • ñ»Ëg8FÒt¡®b⊲µÑîQ·3¼ùÔ£^§+C™fDÞ=žöíä~+²Û]?»Ôëßb÷:ß²MóxJolÈ üRáG.Ü‹¥²Š“â³()( Óq|eO´šl€Ý~ž†u÷ÖɈ[®”Ù•3¥$9L›ÂhŸXôd¨ªÃaw¢×>x(ª¼;´nÝQKm*Ê­a\²{HVg%йÙþä|G‡ùø]18ÎB+ ûP¸í~ŠôP×gÞ†#Bõ¶Û猱XRí•‘Gº 6¥Ó:ŸhEeÌ@U8*aø{ξç€ÊüpS¯è›Î-\výãné] µ§þ±Ú½‹mCœÊÂ!j¼¢„2¥ɹ:/TLy¿¸K>xéIÜC/ •=éx›Jm…GÀ“3L"h Qóñè}Z7… X;:"É®ÌÛÍŽy|ÙB•3i8u¦VéÛxT N8Ó€¨¸Âê\-©ÊNda»ôãpí7n/ e_é⬴A;y™Ô|Ú{¦j+µÿüv¿ìÆÓã.;P>ÜP-˪ÊÛiy!Š|RúuÏKp‡í™)nä³âÓ»‹Z@ËJWrì(yçC»ß³| ÿÃbŽ-¨8x}B­-…«VÀ¹W›Â€˜p.YñS· Ó]ömä­µ”æzúW %þÏý¡'ˆöì;÷ˉÝLÅ}õÛƒ¹u£J:ìpn™©Þ/ÞrŒZÔ!7PXö‚Ðä„Ú®`$$rjkEŠ öœ 滞ÄL¿{ž¯jKÎ4›Ö‡yÙ¤òÉýTÜp]¬[ê‚Ü$ÿþðöÛw‹ã¡¼<¤´@*øŒ/EQEYÄáÇBû§%½? <(ZRT”2±c©öÊh0åÛïAbø`¿U&(’ûvóÓéˆto¿œ¯ÖÈešŽëì4ŸÈ#IŠz0ipèäŽÍ®ÚÍâRØ št˜vIpíÃÏ( ePÖôˆu^{ e:´W=ÊæǼ‚Ú _3XV&Ö­öÄI’§=—4+ |…U‡1EB¥’¹tÊ¡|Ÿ‰AïùE4"F7òìŤðóM{~2Ë ºªP¨7ï=$¿“Q8¯7䃙øyFVRл[€¹#Q°Q ú/ï<Þ k{U¥ WgY]ƒ[ôÚu! Ñàyå€1¡É–ê ¥MYs‘(óü§Ñ"Ñáu5º] žï$ÐHhIî·+ÝöŽ –<)±œ¹ŒwùCæý‡ïþýãïó‘úÏ›ÊØüÝò|첇 ½‚åï/nê²Ìuýë_¹|'¤ðá·¡ƒeß4\–€¦ðç>L/á@¯ˆ)üáʘUyŽ&r>mv ^h|lUO­t¤þ¹[NGvõZ.Kƒ [§+ O ’^ <AßI“°˜‰qLE>«ˆ#‚®ß2jx1‘¢‘Qj9¢d êŸþì¡Ö+ 5¿wÀeLäàaíúøeꓘ‹©VÙT’=ð)µVÐ}_Å4P³uBv÷'€ÞOS$ôÜÆ´û§öÙÁúg-U:†ë&Ð99U¾G3ïŒ Pª¿G̨ÝÐ^qË׆ö–ávˆŽQ&Ÿò”¶^Ù(]h2H¼ÓÊ'íÆI‘ºâÚ›ü 3ST¡V‚ýŠ\É·×Y2 ˜xFQ«ãÁ÷J«ÀÝç‡ ë]g÷a|P½ ÓÐ#m\˜*]Ô–á÷Ü à»4·É¯/¼;ŠVÌ´F7 Ɇ ̈Gòµå?½àI£ÃŽÓ8ÀqÓür‡{º}˜†*¤åpž™ñ"†Zt¥cn‰Ðw³V°8[ “†Á¢¡Zu¹8õÑqRÅCdÔ莥¼mL"–V¼Pê‚`ÞÆŠ«ŒyJËïÐÑ¡þ³ŽrÅ֦οxIp1µã“Ä&*u¦~8¹'b IhdrΤ \åeÓþ%F±+LYô|¡[Û^̧I¦T©4!!Ò®ÝþJ+œæ€5Ñ0ìgª$–_1ìÁ6t±´ž^Œ¢«*GXº 3Ï,»ÕøÀ¦~áÿX©^6=¥ÁuZ”áü¤†(iV6ûyvSgHתNdk¥WF~gª@»éEì¬älP³æB”®êjž†û^Ž[¨þ4èŽ6Ò^ÞoO¾ï-šÕ°ÇJOÛS¿@Æ êÜœ†U²gÀö¾ß÷Ë3i ï_Z¥Š ÊôFY2ÎI8Üã‘”ëXÄ¢djùh®ï €™ºúê=<z˜¡´·LG¬§·›Oò¬†&æ~.?­YA¾ŸO^܆0g’& jŒè®ÝÏ£_ʧœ¡ñSãe Ì­›¯Ô»ÃÕö~Nÿ½³w†EŤkKš :qËYþÔ#wí´%UÌû¡øë`==ìt%ª«Q¾m‚‹LÒkˆîˆ.$ÃÒw¿÷÷5°¸r +UšU£W˜y—ÁÁ®h$µwTKN¹½}p¡4Ì»|‡°ÎÜ,£Mfs£,&v°xi×ì(Fi¶CwëQˆ‚›Ud\Ö2Gš=õ›4su´3…QyY•ç<¸žêpk–®T<298$ fK³KŠ’ï ás³®©E7é>á.ÿÖá-Y|pœ6$k-Š˜«Mè!¯×zà¦Â‚µÕ~0Äk]«—èÅlƒk|ŽÌ›v C9äm½v7ô¢‡ä6ßÿ†+^fL”>£:¥Ó…‡»|‹¨&ÊՀʡߴ®áÆÒ$Ékü·îº+Ü€3)Q÷t ³Þ&U·q‹÷ÙQïºýÑ3áºs+uaÂ9iÄp~‡z–kfg>¥Ø6âuU®ÿM쪟ÉyY°_•‡Ø–:…#ÐS™4õ2qX¼^_!ñžðÆWYœ {‘º½¸>a ã,‡<€šx¸q®t ˧mhX2wWKSeHú8¼õy-k¹–Þ¯ýÉi<{t›7èhFjóqvç Í*:¬õ|K}{Pùt8§qseQë*†àS~<›ƒÐR¤ïXÀ>œŸûñ4ó­ c@ôŸUÃóFÅÒ÷e€ýß±»ßýÇ4>ž÷+!õ}Sß“”Í%ÙDð9TPÌ"ßž6q\#×^ÿìI•É8ÖÚ¥ÓÚÏ~zXc%:¨Kô„{Fh§=+ìx?$‹2}»òÕë¡ÐkÆ®¼Íewaå3ç´:!tÐØŸ>(ñ߬\Gz(«Ô­›In—3F¤J}Ô4ky÷&9Á®&<›“Ïd4¹qd]¥¿(Ûº6ƒ¿Ÿ‚󒉾q¨• —œr5‚.`¬AÚ¡õM‘yAG] ¯\(­fåü!®݆‰Jÿȯ¢I¨÷-‘+~÷Ü8\ûrT7Uš+@³o¦þ>'âˆ]«„²Ò}µCMªD†ÆËâµ ‰ >Ì™“Ÿxöé?¬ù¾{»=ú2¾qzzTˤÖÞ¤Kæ‹ÖÍm‘†*N(ã«h0óQV‘~™wqj×ΞO`o—H¡º‘)…ÀÚ‡BXÔ¬Rˆ”™ûF']¡KoÔ¿vf""G;š.Î’2YŒq~LJšÔ¾Ð.8Ò1Š÷O¹û9|(Y‘bÿï³w«˜m„>Ç@&«ðxôS½€¨ãì\GEK°¡i²+’½"ÎÎðuaꕯã2úáøÉÓxñMœ„Í"HÕî ·|êz0Ä7çô˳Ƌ³} ã„¢^ÍN]õ€[òpÏB¼UýÝ1°ˆjÛù†3w•XçÌ Û‚+.N’5:Ênºìpie‹&å«B U§[nÚfW!¥¤¶=Äïÿ¢¢y1jW’`óí—Ô7ÿþöýŸð÷ÿ5¬ò4endstream endobj 227 0 obj 4380 endobj 231 0 obj <> stream xœ[ÛŽGr…À—Å|ÂêM=Ø™Úʬ¼ê۰ K†)c%Æ‚"¬bw §Éî®QW‡³m¯ øÑ'ò™Õ3$v ]•—Ȉ'2¢~mºV4ý—þ¿Þ_üþGÛ¼›/ºæŸñçÝů"<Фÿ­÷Í·¯ð#Á«›‹øžh„­íec]ßJé›Wû‹Õ_ÿûòÕ{< qzØt­=^xµ¹X½Œ¿æ‘\ÛûNæßÞý:½.}ÛïÓ?-_W­Óé—ÿؼsûn8{»·­ùí׫o.¯û¾o;)W¯.ß¼ú—zO¢5¦“i´Íù@BµëÄgwá¼SéÇ¿ ‡÷çëèÚ¾ÿÛ^3Þ>Ñ`Ûçm~·|Õ¶¬»÷¿Ü‡³7±[Û Õ7×Ê´Ö Oö­¢yõp±Ú‡æŽ^’;•W7¼#‘ÇSÞg}ŒÍ°ÙlOÛé0ìvÍÝ‘±=ÔŸŸ˜Â@¢ãMó87§Û±é̯•̺»?„Y¤†ÖùtÇf=í±¨MóK܈îÓF´Ç6øõã>Ìe[íºô®Äßã¦~>ìoï†Ómó» =¥åÙS2<Õ`?Ÿ«KÚð{—µýº9£¼î5̪»¦60ë><0îïNa«§ã0ß67Ón3 yØZï]ZvF±Iv-°÷ ÿq܇ $¼Hd|½ú¸=¼köã<ã@ðl×Ù~•nÍ|¿¾m†æaxln‡Góq8œðY´°PU¶–qþfi/ײ“ð§jòÿ<Ój®×‹³ñI,ÏÐŽ_¯^a³ûa»kæÓt¤õ©ÖÑq‚Û™¬ƒVâ-†êÙ÷ÆK»úxi[oMgWãá4†§¤i)›Þ47GzÈ»N¯¦}óöòš†–Æ­FÒÇzw:qçZ!]6Ûhf­.VKëµá„6ÍÃΤDŽõ² {Ûv˜´:˜ôŠ—f³.6ù$h‚$Ë®1GãÀÓ¾ÏÆñz…•ÇCËÃùåÚ„Ö³î瑬'¬ƒéË32êû±‚ZŒé9ãnWÙíâÀ°Þd=¬Oa$à™_èv3Ææn7¬ÇKŽ«_µÍ?mçi–Ü.êUô¢ÕåÕÿ§†Š»>¯¡ÕŽÃ‘Í캥KA!÷s3U”l•c7ŽCÜ"ÆÓì]´Åý•䬯óé¸]ŸvYG¾6ëÊ% B¨Ê%þëow‰×«¦æí°þpG¡E¶Þõ«;¸)vçhÛL9EÕJl¥g¿tЫj‹¦ù;©ÔêÅ8Ê™Õq c?´g¡êZ¨0JYñ_ÿ'öªFõršOÍv•Óñ +WÓñ$¹jnãjâ«1yµeµKWŽV#U+K„¼ŠÎ+”NºÚ” ^³ZÕ›?·¥×ŘðIµŠ%`І<àC€‰ñ›8Dív=ø„,Uë š_~×l&@Ö!¢°Ô0ËX¾zYl·«"=1qˆ¼Ï‚¼ ™2«IêmÖ¯¿¬ë€ÝÍ®6F@#çÛ@ð¡ìƒ#fÒ,Ãö‚©Žy– Ÿ óvKz(­ï*ÐùC¡Že7ˆí™õ­Ö>.ð9%§5“)àØl¶3 ã1Y/<8ûê3€û:o)@¶% Ê; ï[È{+x!&O…ºî8·g$<Èuoà[ç<Ë´]aqëHˆ®{,HÖØ|,¶G,j©g2)ò!Òþ£iqϺåùŒ¥§ Ý6ÿ„ž¢gI¡€-°§œ‡ Õ– /!hä]Z g³B3–äH°¶ èa¼I»(ŒÏa‹R*“܋ؒìx*2¹§jkë1™|H³®°g·™œ\è:Eƒi‡¾:ó"ïï,ѶkXX³Etî³%H¹[v1¢ÑMãc|p™n‘‡­y‚{iV#Ao *zòÚÚî·»áˆÅ‡á7Çáæ”×»æ‰c\5ßã×t4‚Ž3«vºK§ÙÓ 'Ä*JʆƘÁVÖŒb[‘€Àˆ 1VErD°ìŧf¸KœÉ?lŸ#]`…Øj•" `~PÒÍð1Æžèhªo­b¥ÁR½Š³ßLÇ&˜’Ó¦OT€"ÿökˆ V‘È&ØêÉCˆornKXõüxy-ñž—'3îÛæ»ñ°Nʱ¶å`pæÈðc¯DNxŽûýyƒäÃ÷ìÄ»Ý|6¢¨f•<ª"ów€ZFb´'f“œÄ2|`gH™àÏôUpÕ·ÂÚ1~U¡Éâ™Ä’­dÔ ñƒafì´e %ÏÃŽ†ŸJVÂSc6[ÆïÂËOU¤mŽ[«¸µÖYoØæU7Ãýî7¿4!´ùÕÔÌq¡ðN—8ô%“ï`ZQóŠ}ËÑv½ËU±J0šŠl}8\…ƒC@"‚|žz:£åÒ†à‘HQ\&“ ÿ]‘å7÷‡Ýö𡉚hÎÓ{×a%yÝ_‡¡@¾ÙíÊÚ®š‡Û¨â+-¿›b*çÖJŠ™~¦•œ†C~Ì~FºG©ÁœG¼–NjŸäŸ)HÀ„(pci‚pF2Ö’_?‰Ø«MÛ¼&é_]ü #‚í=\ˆ†¢!bÔ«Ðéó¾’䯾ÙE‰UXâ]Yâ IÈÇ£DÃ]H‚œ ÏzÉ Ð’,pA¢xÓj€¹Ø(p­%ü5"eü¹nøgT‹C˜8(´®Â3 gA;JX‡j1 –Ÿçé q‹Âf‰›îòú)dÅP`ÌAº§HÙ:%yÅA¹’âkµA:]k©¼•­¡b‘%Õí.~¢au’Êl8¶,1‘ N­Ó±IVNǦyy&Lo µ¢›£G‚«D `:èœ|%HY·Ð9²å¹Pn$XD” Š·8m¥ÓiZP®(ñH$¢$ÙU¸Ø!‰£Ü&HtÔ1$6=ã£í9ŸwadZ³oMœËè´æ"ñiÍ>›v(Ï$:ÍÎoaV·œËKž=™X¥êø–G4ŽÛJgŠlb©‹,PÙþðŠTQÉÒ/%PdšZÄ3/L)“ÄEuaDŸ¤K[­‘‹‘-QÚ¥D´véVP 8“¨ôÏΰ»| 0–$.¹gGIÀbö"qÑÓŠæ5^lÚ<ÆDÓ5,qá›M…%*»$Á,á^/;NÃ2 ’½ÃšìR Ò(t5±À¨¤¨_ÂvµÎöÖ/Xƒ‰‚„˜P„_ \Ä Žâµ™ ÑÙ’ qa „_J€rýò-™Ý3k˜.•–§‰‹“ª$é4!I'®]B"1qd8e²–¸|šø[À¡ˆ^i.·”@;"IDZsÝ ãu, ¶ ¬LÂ’žµÑgÄ•¬J’”ù“Ï!º’èD2£*’̨è-[í0—YJ`„^ÖŒÊ#ö·âàïs’ÆŒªHzV†dÈ•6«]»šRÑÑfºäéÒ_Õ”ŠÌ»_>j ãsËTÈSiMÕtÉ M…C€Ï7 Õ32‚U§óiïü\ÞþÌàa úìÇT§3`7ùÎó˜ú!àù Å{áMÛ|à;j!%«w¿¿=¿T–â©ÏW¾à§Õd=M©\­©àøDO¡É}q§]¾fV&’èØ†ÝŒÇ6o-ö´,8‡ŠT(½Q¯Pé ™îØøŸ/  –Å™^±mË.ÜÕð„>–bǬ²4bT¦RJ‡‚ ”x|¬Ÿlç&k¼8§¦AÉŽÛ¹T¤?L©"YÀ‚/ vëµmþæLô ö Ÿ¯¸ælz*¶óú¸¶ øÓF~¾E(öÅö·_Ï wÃû (eåv8ÙõÏÿëÍSp½ËÌ(C«5÷ÐÊÇJ.’è,ª´œôJ}Óuã•©Ór¿„xØÎ·´§ù7§„/põ˜ ž¶ow1œ„² 1ºâòÜ‚bÒ— #íJÛtb|àn3Ð×ÈÁÍÛæ[P…‚”¡nŽÆMêyêÂeêÙ@Õàaœl~¢¾CæMˆ=Ò¯Šìë.†ÓÛí»ÛÝ#œxÙjw3¬·»íé1}¢†sè.š`p/ùØDWqçÝ+üÈÍ¢YPGxè|õºxVÚÙÒ?´"[ŒG&<¥ ºÄ³íá›-ñËjÚܧn¶„’£Ç£MѼ'NÊhžbi•ß“%?d¿²Ü„9N_½ˆ9+~¨¿ƒyL²¤¬ÚåO!†äRx€¡ÞÄv²©y39ÇNúã4ËtƒxRqÇÿýŸ3ô-߆¼‰þDŸæÜƒ=6s$™Æ"ç÷ñ¸`Õ뼪pjeÕ“;ïr‹fOœÅÔèJmTÁM¾©ØUºF¡ q ÄF»š“sÊ®±ˆ‘RW3†ìúç½ßKŸzTŠ®?YˆÜ+2%é|»ºC„fç³] û3Ló~ ﹿC¸+«™ð¥Wˆï˜rE ®$'ÉË ®DÁF ;%ðÖk°ˆ„&¾oò¥W¥L9ðEá©«Ôc”Å’)¤à´»’Y=RBÛò¿§Ü"KßÏqþüé4æˆÁÔûÃÚé{°`Ry9SÊ…-™+£‡¤û}Åà*ù,ëµ-o‡ã&€È@¨˜ˆÀO—¾nÑÀT‰ž¿„š«ÎÜ¥ QW1¢l4ç»bÜž& vL–ŽÄnÚoÿn7(Æ“0,¿›¹‚œ’“™6§„4›(Ÿ¸m\|ù ‚¿/ëê(*¤Ì#c\ÛEó,›`uKøçKª‘y!w:Âw­êtÖ·Íw.ÉÒ=µ¿|)Fîš»rC8áHöÍÓ5;X+Q×ñ€sJD87bS™ÒW‰B _dé›V]/Ó·eã ÒBGB7GÈ>RNÁ ®ó5Ú „žšã¥Fø¿Âa søÈéÃ!r- òÎmñKUIÎ#cúöŠzÿdYN¤|€Ì¥ ò ß@0*“Q »„pšºoËEí] ªÀꎛ]µI Õ–’ O‰öˆ˜›C¾}Æøå;‰glƒ¨WôB}¸ð[Ò!,½ÜbSµ™y&­(u'o–õWeÓû1 ¹/;€þf;ÇäƒÊiåÖõ¹„òœbø/$¯fªQXDn”‡{-¨W¸m&0 _=Pù³|V¡YõáŽt"ÛSn_Fššw‰1wV†±s7³îœ?]‚’Ñe4#_åKáèÚ”C{)ÏL,|Ã4™óÚ`˜)5¥ϯº^Ž„:÷3ybäB ,AjT‡¿'Qh;ùÓÅÿ‰0a”endstream endobj 232 0 obj 5822 endobj 236 0 obj <> stream xœ•|I“$Çy¥Á`sé».3—Ð Y3Ý!ßÎaŒ¢$’(‘bKf²&l˜]™U•D.…ʬn”þµ$ÓA7}«»G²›ŒF|áË·¼ï¹‡§7™ÙNÿ#ÿ¼=¼ú³ÈÓýù•™~ÿ½õÝ+KLòÛÃôçoá!ïy{÷Š_´S‰³ñÕN¹øÙ¹:½=¼ZýìæíïáÙ"¦9Äš3<þvóêÝjóÍþq}¼y㽇Wíêßn¾yû×cÓ!ÎÉËϯþbÙXž56É·§ÿÿÝé´ýö÷ø70ãåOÿþübköuvð÷7!Í9ÛÊÃyó¦`rõ«-¤ÎÑÖê¸3—’¦·áÁÛõa;­?®Ÿn ŒÁW·ÚN§»éò°¶7i®%ûÕ÷»óe{¼mX_.ëÛ‡Ãöx™Î/7o¼lZÁC‡yúûãvº==ï7´ùÆB 5ÇÕýó^]_àvgf¥ôEÐjº[ß^pŽ013(Óëð0köôÈfwþîy½ß}¹=O‡—é ŸÎ~Î` 5 Baœñj½Ùïu›½cæÜÀ惘ä§¶¾ìNÇyúúnúzúˆÆqƸMìaýá&ϵz˜ôvÚÏ—õ~¿½y3ί6Óñð0Ý=Ñ®` 7ð喝´ZßßX CBðybŠÍôÆçÜGS*³²á ~˜ÖG4û†g*¼Õx8é¼úþ‘fž“whH(ç!øo/[¦‰jX ™˜yšŽÊÝ| .->°‹ÿ|¾°Û­qquzúvžþŽ›².ÏÁj\}àP+èø6 pÔ~{>£¯ÐŒï%BS1×êëà»#xöøa™FÙkkÄXzO½¦0çlŸ@¡Ðx¡x†×n·—³˜'ÍÞe5}ág!øù‹i½'üõGædÌ ™ýëi}ןOw¤ ±$‘˜b¶æ¢oQf@DåÕvŸäг” uÖ>_OçËn¿‡öi@2Â÷‰@þîyÇìm8r4-ŽÖÓþtܦI˜ÙeßíKfZ¹ì€ç.§ Èã–²hÓ8kû¸±‡‹Ž”r48ßíhrä a“C­NûéN"b@G´¾H6'tyëb{ž§_œnë£/«ÓíúÈa'LÂ-å87ƒb`ã+I3ÚB$èo/˜£OÌÁðħ¨Ü™ m&hÓšë˜-Ëà;œÈÌ& ˆi½ù°n‘RäT9r1)s ¡ª‘M–b2¶7UHð5çÐå$Ötç­Öt³-’‚Ûãúý«Ãö€£‡ù`˜î ç)(àbÏwXq0$ܨ³šÑ´Û0yæ²ÖKìFƦ^¿ü¿é˜™ØV·’‡âêqƒq}¾`½{~Ä€_?~ÁNÈPŽc.9Ò<íŽÂ•.àèÓÀ¸áiAø¥à4”¶w' u[,é$ ¨£y/,j,qõ¼ᲂ!êB °Ú’Ž€Gr´$#^M]NÏ÷ͬÐÓ)ÒAài¢7 †qàV# "æ²û°¾H¿`]èB 'Ë¸âæØ ³zÏÍAá3J*Ëhî~w<‚u©"r‹Ìœ‡V&}žÎÏÿc«Ù—jo'´û´™¶Gžæi‚bÉ Ês+½`’„6:‘™.'&›rÏíÃRlý(eªæ¬Ä7›¡.f{ |¸ƒ [}m÷ÆC…1Þ÷ØØÐ䜇ØRO…H]¦å•ƒzce³~ òy~$Âû]ò®µ¶w=²’´¿{Æ’ù¡Œ‡Çª%Kèc˜ú·ÀŸ4R›20$ 5›4fù_®!ˆá¿ú·§ "ƒPÝúÁp1y÷~·ß]^&ˆ`¨ÿ8¢ MÒ2»"cAµ‰ò8×ß’§ÑÅî âlóZËt†üvö³Q‰‚NKHÀÚi Ì£Äœòýö´—„uÀ6e`›ý–Gd{`‚¬ˆN„ëE94 RøqCÍDTˆ~xÞ*]Ÿ¨žç‰¹e‹u× tËl ‹’àʶä&Ðm$¨.sÙÝ~‹æ—€ímºj—mb&ú` Îý ¥-CQ.*üÖG4(Çv#°\ ª ­©nÝÄÿûÝa'ùîl…|ÿ¿ÓÇ Ýšgç[áø¤ø9CÄ6ÎÊŸäh>O’Þ@D±Õ~à`®CjSÖ0@±ùùÊ,KS?b ãf¯„ÈÿB,ª-9zÆ5VEdhùÍÔ„ˆ‹#³€cþ†XÚÍ©–Ïs&˜ï‘ÊÆ±Ñ¯g€Åtà¡´…#ŒœÒŠ{îôjÕçåÖ2mRÕCÊ£¦@uùpzºL÷OkXë T> ³+}.œ¹˜qk©Å CRî+D¡Ö$$xë´ƒÆÖC ªÏU3 ª’kÕ+à ÄÌ·}Á…êþ£d7¸ùéýó=d{[Þ¼LGÐ(·V[¦\ /ðæˆƒoµ™§ŸîϧkHF­^÷š£ƒjÞúƒì]‰åÐ-Ps­Ÿcì%9©àÚh"Ñ ÁÄçÝ¿PÞ“ùï%@ /ý±`çNÇçÃûÞ $`B›®ƒÏRÈÂlÝ0 Y²Ó¸1 ìì\ülG8¦èdŸÈ¦7‚ªôG³èîÄé|9Ó"|}|!YxxÜoÛòüjÑöž —<ˆkîWÍ_@Fâ\>î6Û³Ê r嚤›òÈ^D]l %òOúvrTÊ¡€‰ÛRÁ‰i>î.Óž+ø04Ѽº >ˆ&TT@2AŒÔÐ :×.ò‘Ç™?ÁAIÆ©ÐØ¢ÙH8˜B2 ‚tØ Ø‘†PeSa-•ì Ö·’‰¹~Ç›:d`½å¥e¤õÂ{´˜,Ä ÕHZ9W`¦_`i§üM²jSyØ - `‚äÒÙØjt6Ä-^4æZËêöḻ]ï…£q\P€>ëq(«Üõ¢"N= ‹ýbÛ„V;¸ç’j1ÈZ†ƒeO;‰WgÜÒÌé0=JF–¹-æ?½éq:Òà1«*HëüGk yz"Šº‰+A§‡‡¯Î=¨Ð~çÃä…Ê‹››v˜DâÈ>í7³ð+î; &HDý K!•ÆÜþ¸æ>O$nΪãp1}Vù†uéÿ‹‹®XQÆX9ó£Î>7Â7!jͤ­ ô ú¹-R±GÔ¢•äí6Z[t½~ÒÚôF¯íž€ˆ€U¸lÖŠû¹eˆ|”'PŸ‹|°LôËûç'¢#Ö§ÖÚž2: •û_OXÞ’> u,JÈ$ ¬×%ºKy 5Ÿ/¼ƒå¤+MÈÈ 5ùÙÇaß"êÎW⠧З-É”0ϱ/·ÆE Ó]lû ÝQQ ½°~‚ˆ¸`Ø«› ì·"/ÛfÎéi¿Qßþùó¥—Fí@ÓîîY¶T@h`ì·m°ê´g cÒ<~Ô›müjèÊæ5í±u'ÙJIÿ»ç­$X•¶oŒt8<@Ëv˜ÎÇ­læÙN´© ÉÃ+ $¢^tó4¨’겓,4S/>v´UM»"û,Ø8uúÃý›¶[n’ ò1 ¸CÒÈ‹4ÛËó#mÜ Ó¿žÚú®\svìê´”§Í›Óóå‹ÓÝà¿/x“åkëö¼¨ô|?K®ܼX± Wà 0÷k îœL_¹±¯WrOÎü]ÛøÔÌîn+;ëÆ·ú>lÐåÚvÓ¶ภ‚ÂõÓ-ÊÛ¶œ"_’–}™6Û»õó^ ,"εÀ¿Þ‡¥Ù„_mÞ==ŸyÉŽC*·¹ª °5®íeë,˜Q}j!Ýý?ÉG¨/¦o¦ú¶ã°A«»=]ºC6‚ð;‚c×·À®ç:—¶â`’ÏP‘>®_npçÔ‚t ýȵ”s†ÐW“Ȇ¨snvŸ2xÏ,®ûçÍö'¬!ë‡uýêO8ãupoÿðÓî@ £=£é·+ùæä'Ÿó`É굤þ”^ýÉÕ÷³–¿½™Þáßþòí«_ƒ=A}|e'˜G†8„lñŒ Ñx‘Q9í!Aé«‹÷‚¬Q’" ÞâÒN’¡O=„àþ"©µƒîB+á` ?p;¤¥ûâq^‚$jÇà_Æv`Úd®ç™Ú¬ˆ¡¹;„u&û`¤(±eÈûÒÑ1Ë, ~ºåL1qa±þ–ZÊf.üµõl)1†ŸŽ2ùP¨(UæšÅ‡¡Y(‹sc´! ˜ñïðYD"}äÄ8·¶V ÿQBòœ Øëèù”Å«( É´ð&D¢,“­| Dü„d¶tÀï„ѬΤ`$q_%ó˜;R ŽŽ镯,½ë[Åé]û*k½st …*#Œòj9žW•g FÅ`Ž$‰DD²e;»ºDœ¤wÇ~ïˆ!ÛR"#”}ÔŽÉ:SSÇ–3,!ÃâÑߣ— ¬¯(oiïÁm‰å[c*™êÐr‹Þ;R9çZö1[ŒyB¨WŠ^ñŽ¡ÑC„W‰–Ž$É9|‹"ò¢Æ…ßI?1b˜9œ×˜/sw@œ´ã0cˆÅÌ[¼E±&Q—¯€^!Dx´fŽ–†àxˆ“,ÊzF@Š’5¢ ñ0 dï â—oÍSµ³u2÷æ @‚]øk@ħ¸ÇcÎUXª#YZ¶ 1Ê-Å0#1‰}üâÙË€X«£ü2Eù¸FŽp“”IňØ%C;àáþj9—AïI”"¼î$w0ÂÍÕ3–ã,s/ÌlX°…Ç"³ Ež±-½¤ÂŒÔŸI‘Y«·“¬Ì½õMǬlÛ˜õ'cn}Ïó˜S«„RºU—U†*2Y±¥#’5Ê nCy½@ŽpÆ+¯ÃŒ«S翆4þƒ\« ¾AÄ.ùúJKþ[ŽGý¹sR]Xñ_'ùšÐ¼ñ ¨ÏI•»;€ï>§³¾á½ÜÛM1}Ní5A‹¢oó´¾Ã•ÿ>žâý {ÔÅ öÀYºø?ôÒù¿¥öHz uc ˆÄkHU‰‡òÌ”q›¡!˜h9;-¾Ñcð 5&+*Â] a;ʾ‰,L4¤C•xLhX–MIž)‰ú©¡¦È„Ô¯¬/RQñ(J]´³0-ø1°q¦’æ€8š{ÒYDK¡–“×àTf|U% ˜žˆè˜e¡4‰'3DM,ÖßRË£°²Š þb‰ƒ`^%ž")¨Ä„}Xš…‚øÐ¶1FñXPqH¦gR“x$´=Ò–m4âÂöxbgéŸDsôDV)ÍÇ…çs¯ú&ñ2"©Ñ§#$¨Äƒ‹‚¨Äˉ%ê,ªå1—Ø]à1H–1GtÖHï Ò{l/KïÚ’Œö.Ïé=¨Ä%Æ¥ Ã’",ò #¦Q\ħÉÎ"ñRŠ#¿w?Š "‚Dh”\1M¨ººhÙÅåìèe(¶ù qò–öÞ‘¬…½½•TâÕ,™šDÐõÞ;Âå¥ÇasT‰â¡xŽ^õŽ#y’³W‰×£Ïr¹Ã‰§~O¹I<^ú "1å¯#í$•x ‰*ñÚ[¡ :^âve—D/ G$ 'ù&ñ -ž©ä[E"1™iOàu•xòÊ»°sLmîâ @DЩ¿D|S“öY©#AZŽMì+šÄËÌHÌcÒW\ ‡E+cvœ_(\B¬)¢BÜ֝и£å)6€—UâÎe7® Ã(ˆH<ˆp·|¦Ž<•Ü:ÄlÈømAà)MS´ôj#3ÒðŒcÖêí¤Êsï}¥ØÆ¬lìÚ˜UâUsë ½ÙbZ ¥:4«^U–x.ÓbCXê0"¶I¼,õ[y½À"Œ"¨ñz…U§Î iüˆ]ð ¶ã¯ø/7¶ëˆÛùQ8˜Í vb‰ç}ö¾¼ÿA‰*(Vâá§Þ6G÷Œ›òøõŽöó¶G=ÞF{–¼5ŠïwÏ_ýöF>“ÔYwn±%Þ=E]€ÂP&aÁÆšN€ÉÌ’.à×buµ€ˆ ˆ$q "!!R…xIجZY ÜÂv Èi;PHé™$® xò•,Á`Åïä–÷·ÃT„HFÀ‹· {[lO+ÖE+6µž  ž'‡QÀ½š¹Ñ9àz“%Òðd?/z›Ñó"æÿbšˆpV©¹†·Äì—¥bÀÑU”TwúÊ¢æH¦ˆ˜ >‹÷\3NïÅ6À̾½"±Ð=>ãtMp_Œ¬î¤Œ” iav$›¥g"íEÌ „š>Yü™%é"A$¾ |BŠ”ç€åTsÏÛRuø{A¸Ì”øK‚Hd€ â’¤w}+âÏM}EÌA84"È,#ŒòVÅl¦yUy¦àbl°FG‚D!"ѱ¹ltDwE"”¨2‚$2ÀÅç p5 {ul5Ãð Z‘_h* [3í#.!gX­µN;P)ÃzàÉ8­îÜä£U|ˆ{0d t_ß¡8Ä}͸ð²µÍBF8Âj„CüÔ+ÄI;F¤[CÀ·Î.Þ2E„ÆX¼B ž¾Dt…Tf“Eºá+!Q)—+h ~u‰x)ªý-§Y)66F§.^ ØÑOÀžÄLnäDYyNÌNâ|Šz‰GØJ c¯OÎEÄÊ`¥Q„ÎÅ£ð…^€zqɸ¸eŠ€UnѨY£áŽËTA$EpùõŒ¥¨A$Ë´ ±¶,U Ò‚yÆRŒ t@—Ïà‚zÙn,û¦cVÆmÌúŒ•1·¾|‘1‡Vé²8¢™tQG¨´ Y%׈è0"ºñqeUFêŽ`ydîˆ9è ׯpPqËÈ,ØJ]Ú^0Þbx?N¬A JdZÜOe±vë0­ÒgÄZÓNïVß´ƒƒ"ŲKIµ×q{3ã=ñ‹wûµÈ—ߣ8ûSgolòô+ýdÝe™u…VÓ‘tYGŠ3Bp ©Ì7÷`ìSCP­c= Z±®òçÂhD˜’09LÐv*¯,±„‘Óáώш0³x:0Ë3$#áÍ_l'IË•t8Çx…ˆ4£·p]ªH³ÖÎBûâõ(ÎÔfE<ÍÝ´YZ) ‘Ax-Ž„\‚«+DtÌ< ¤q·˜)"&ŽÞRËgÑf×þÂp´ø›TÆDu¤ˆ<#„}(òŒö¡È3@,÷_Ež‚ÅeH„÷›PXi™÷›ºí½åý¦îoy¿)‘g€ðÇÓîyϧ–ÉóŽÇãøã)"exþÏ"òÌzÏOÉüŒç§˜¸2 ŸeÌ"«,žáˆWˆ—1‹³>fé½!|zg|+yé½õ•Rë£Ãg#½‹<ÄÑêçUåKû)ƒ5"´CoËvvu‰YQï®.þÀJÂ-ùk4¢Ðá¬CË?«V¼ìù³Úˆy«õÞQjÃ["ÕÈòV—½7Dv·8”1#ßä¬þªž£W¼´陬ÑÒl„ØÈyQãèw8¥õÎÌa5æ!¢Â’¤l)"Øú[EäÌ”w×G„wàñ2SޥϜTD°Y/;é(P$¢d¯õH¬KDÛð–Ó<;£^* _ ì诟"¢~÷Â?±Ür®-)êSrVŸÊ7Iìå,ºÍâÏqmÒŒ tȇXS˜¤!^­gÁÇhyŠl5ã¨%=)oYáu£¹ãùëðŒç¬ˆä6wª3Y$ð`E¤ð3Ž?°öjà`ž±üuhÇF™{ëËÚ6fåùÒÆ,Ϙ(cn}'céÖ«C·ê²ÊpåÉüASXê0"Q£,{©ßסMÎøÆëÐf´KþS¤ó_nk|“i·wä›ìÛuÄŽíüùfž‚G³¤&ß6ïs¸u?´×–pÛ%ÖúœúnõëçÓEâÊ)õýtØžÏkþYN‰ô£6þýÎð³ëÇýËôŽÄÉ8¨Á¼}‰'ëIÆ HfGÒÒoÊ,‡©!ª˜xD6„ ùá/mIÂÛ ˜BÚ.ðHUä>@è” – L Ÿ!¹H¥p¦ä´Š û(¯ù´HH¦ñ8.ËC;¦õE"”fj³"–æÚ,Hz¢¡† Ñ¢4) Á4EDÇ,³À_Ø.gjå„N·Øð–X¸ZEaXBžZÁ,˸ŽxÇ2ŽöaR B>ôU{+V<æX”Béà‘Ђ LRÚVZf"l/§IÿÈÉ* ‚0ùvÏãÏ›ÈÑrº{+'–á(Ã\XBf`-þ`‹Hæg,°Å’ijÀ_€A÷åøƒíˆð[D8:€¤÷†+½··BÞ[_!·Þ9:,F²Œ0ò[‘<ΫÊ3üg°†"`CÛbÙή.ù0E½“ß„?g!RØbxa‹äŠÉ:S[-{úÐ6"ŽI´{ÙÊ ”±UÞj½7D>” o–qÞÊiDR\öÞÏ9×â°Y>àR¨ð`ôŠw<ñðX|%Zñò±ˆÞ¢Èô‰e\÷»j1È}b@lÕˆrWH’v˸ñ,ㆷ‹6Šºr…¿ ñ2SËÑ2 A8ɲŒ„>ËÂ#U# ¿' 5\aá2 r^ixKN¯v;»Ðæ.¾pE[÷×€ˆO]h~ÂH±Ò²×HhˆSŸÚÀŒä¬úÔsG2{ÙY–q€ðÇF¾™BŠp[”I’Õ¸/¾àc´<ņšq|=‰ÇE¨f^š;–?ZÏXþh‰H–yñGKlÙ ñGKD ?cø£e¯øÛ‹´xÆÔʬÕÚ15ñÜ[_–#:fåùÚÆ,Ï”$cn•GNp¢Å¤juhV½ª2Tyɪm,u‘ªQƒÔïÆë‘?̼y³dä?Aþ+Âmo"ø&†ÆvŠ,Fø£dZÃ’yqQÃ2.å`í{ûCŸLñct>™¾÷ƦPW%¿ñô~ø E×u×Oô³!•rú+fü â¿üú—9 ¸ö%oS3oŠd«gÞd½f‹nÝêqKÿÁ°°6ôí¼Š3 ¤§Åè@¢·Õµvè°! AO>E:ØHԯÓ3r6Kv?°=SÅ„aA:Ä%RªžyÃOl4ž¤gÞ´Z_žg*çÑ/X£è,dgÃf=Õ„¼…‘–Å9DtÌ2 üÝ×r¦É 'L^¼¥–Ç>'Ä_|æ-EÁ¢žyS$'=ó–¢øÐ4 Eñ¡ocLⱤ§Å“D¿qè) [žö‘“ƒíå´Æà9ÑañtŒ…æSƒçådz^μÉéD$Ê䄉âòíÀrDμÉIK×; ¢§béÞÃRdÌYO¸9+½w$Jïí-W¤÷Ö—·­w9ã£ôžôÌ›g1ó’Jø3¡Etĵ3ôÓ²³œCkˆ~£Òs!"§@‘SLŽvf¨9óæ¨Å±eKy½@(÷/ãY¬|…xy«õ®HÑfí-ðmi–7‚È 7í}@2ç\‹Ã6æ¢_Öè°´çèUïЗ@¢žykˆ~ãm.ÃAfv -àÐ~.—Ä¡ÆôW·[ÄÒ.uÃ+ī٧O]LÄW!ò_Lfê“Üî‘%÷Šy¼=Nn”Èx˜ ?€XêšïW ©_2Û==mD«t·R¶xð¸]² þ¿Û‡Óy{Ä!é-xøó­¨¶üÐ.xÈíʼMr/ImÊ|É!á*Þ²r™ûBüׯþ Z”Zªendstream endobj 237 0 obj 8592 endobj 241 0 obj <> stream xœ¥ZÛŽÉqÅÂzæl¿ÔkN±2+¯KX€-ßÖ»$íèiHì6»‹3MöeØÕ=Cú«- 0 7ŸÈˆÌªj¹§ò—™ý±jUµô¯ü¹Ü^¼ü½¯n‡‹¶úüw{ññB¥•ü±ÜVÿrA€ëwî«õö>­ltÓv:/¼¿Ä[ Ž‘Vh‚+ûbâ>iîª3¡qJWWø> ÇÏ›ž¾¨8ñ#øsÇ lª_/vŸ«ý;p[½Ûo6ûK×Dï­©“Ô‹ÕÃz‰s­“þ:­»ºß‘rèãÇÓþxvZ’N“úQödçêý‡F¼¶k³…µÕ BïJýÍ?6On®›uý+¶eç]hÕWßçs½ü=|"ûJs¥}ãÒ¸ov«~w\$—˜LÝÒÒÀï.T¼&}\?¿™MJÚªÅ!yŽ·,t׳/´±1Z @+ˆF«»ýæ3y iÑ*(ʽO+´¶óõþö°Øn×»Û¦ú–"‚ˆöÌ«t dîÖ·pÎj±[U¿]¸„F—„y¼¼RM Úèú°>öÕˆÖ%V“Ùß^ÂøÑ·‹•\u¶m¼ëŠ›ðóÈÔ¡ÉBýå/gš‹9j³'Õ/ªûäf-ܯ]3_Ñ6¶k[ñúúÿóÔ¢õ›¯Ë§È>Ò%Ë*è…ÏôÛâ!F/e…JH„¼kc ,íÙ*Cu·Hþ ®ŽPÜbó¸ø|y…S:ÔÉĉ1|‚Ï,w{âÐéšÎ¸BÁ«jñ6y¼ ÆÖûÓ1ÂË‘“òr`lô©kÚ‰H!),‰=¼¨Þò)zµ†…ƒ*a¥{a<ñ– Sà˜´Úrýw˪;q¦2a”}l¹=-ï*xõ@D“V×´x8.v$ ül}îwÃz8"ªÅýýf½LÑÀÿ–؇ üߘ˜……CQö~׋,ð»è49Ç¡h§×o#ûÓ!Y 5Î×ÐÄiè±õdçÍçKñ=¬@οÚïž‹øZ×Û>›M;Ýø8š¢ë<‘èÀc®ˆ E/ŠMñMµ¸Ma§áΙ•ë¤Ið}7f¶ž“Ù›¤$¥hÕÈâ]±°¦,•Ô=Ñ\Rý~8­w( Dëìßw*C]É(›uÆý8Ø'Ì…ö[v¢N¥d˜cþbƒÓY‰„ØÕ‰Þ!Ââ6±JaaÄ^hDªòÙXaLôíPí¡ 6£AÕCSýûþ€ì@ÊYö9à6«§³ÉMê¤Æõ„m×GdÛÅ[ÊćÅòÈTˆ´†ËL4ði\;Ò×~W¡±~Ri0AÈYî{íN[\Nð‡”õoÉ×¥{ÅB›‡±\@¦ï¨ÅÆJn¿[ ”¯é»~8Âé*¿èåªÆQ•wÄ¿±0ÄÌæ{ 9/D’¾nÝäQØ•ÆHpwm}83ˤí78¯ä|“‰§æõÁüQ£êfºîísNËñ1T\‘@n“Y%W$¡uõCªx:,¨tý3¶z‡äZ|ôÓúí¦¯ÖÃi±I{Ôçõ»á4‘Y¸çØß¢lú\DRÎ6%¾ƱÜL|x½¡Ñ\,‹7ŸmuS´U™B$qÕ¯Ïzµ«%ZKc¥VýãY¾Á•åTy²õwâ*ۚŊ˜çñõ• ´±v4†\?”|ZôŸÈ’é üIã¬T»Bý ¿™ø§'乨‰ÿy³áÌ0“ IÒ&¹†»ýiC½Âw[H:UæXbÀçdõa*$¸ˆgì’÷c«#V»½«¸irô¡x;¼Xˆ+ËF¥yÜ.މ´SzEp:˜˜iÕ{‘wu&.Õå”6%£Ž™jök¦ä‰I¯¼zÔ¾Z¯PÛ4ò·Ý~ZÅ0…t d](~Ã}@7v—%Ró k%2J-µ”.7|pø>Qè8În$¶©˜¦ˆ*.ot‰eäÎÿíúâwÀ¹êñBUÄŽ £+Ð8”«íÁ ±Ú0â H-NF‚«ŒG¸8A@ƒ8P—‘ލQeÀcüœ—éš`¤g€ÂJ Mä I09^Äñ²J5pglAˆsÄÓ™QPŠ-CbwZÒ!•ψIÇvù@4©&B¾ŒàAŽäô„ˆ¼|çAwÓ#ÐÚ‰ž¦SDÝN©221Òæâ{ÚY †.Ñ'Ãe$y°tZ Šj´N…vl&$˜.1 qÄ+ ’²daøa˜é©1Îí’º B’&#föF*dk¦Î0!tÛÈx|Þ$ÄPørñ‚xÂHÞb‘S ¯éq¼—Õ,ó±"³Ín¢]ͯe÷2Ë[Ù½ìÓåÝÅ-ÀsHhyV€ëñ±Ä¦d·™.2ÐfÿÃeXÉ:ΑÐ8Ù:$›OäA«‹*: –Wvð=[Ù)ª™§ˆÅŠó°²ÔÌ‘Vf•Ý BÌ|8½¨½ÄÙùî#bS¤Mœ°ÈlÉßÓ¹Ú¦u캮 >鲫¤Íá„Ü’b"Ú©Ñ]ôYctåÈ€ø;¼ÉÍ «8”©sÄRÆN‚ð²1 I„3ч9`…ƒÀ”E6›•= ˆO¡Ô3»Ù¬rxІ]påÔlBŒšZjа5 ‹+<4"¬l³ÄdkbVp…½d/†Äd_B”Èܦ°rAç@£K}Í\)’eÖF›W—…}âs¨!ñ¶‰·]qÿN˜Üå k›ùô?J_ޝ,)δ‰ó <†ÞÂ,t]â¡é˜6qÕdíùèã^Ú™3·Ef£¼È\ö#%™¡°œø´˜¢(užZ8ÝÀ˜ÚzÚN•Œ >#sx[Šô‘Ìá‘nžò 2ò^N+<ƒuìœ÷àmjΪÓn׋@ÊvY%h“nÚãÕÁMMìMg÷rQºDˆ$W_½¸.ækÙ~Ü\À·Í™´òžÃW(ÁêŸv.p9ñft½¨»T5ŠÂ’¾øù)¿å=æV,5ar—8npS‚Cãì‡r97^šÜ'm‹&Ò E‰5õ*#¶N½Š&ª¡©u3gBÐ+J® ÄÉ”øSšM¨”R¥¯©p#6i½)Ë"·Üšˆ €§"¡õž‰T{‚á©´ÀU -âTF(9!\˜Ú&ˆâÒ>!IÜÀ%è¸ w¢;E>¤ba´¢Ö¤ ©2â“j<ÓzB,i¯ãn%”‰Éó¨{Ÿ’^1íTS㔬pc¸9711îóÜ­ŒêÌ(ç4b:]”cÄt¶˜ÊhRŽUXzF6TÖA|ÊÁT¹+^M¹ 3­ƒÄÌÜ2ÈÊ>!–»íJùubqcÄžžŸò4!â[T'$p İ–xãÙÿP¢È)\+2G.e‘yD¼È³c„Vv‘Nv/³‚—ÝË^±-»‹cÄNvÜ­qÔұĦTÕÎt‘“=€3¬dçˆæ a"Û|‚¸Ôel>B'!Òú|ÌVÏVÆßÌÒ¦z`bbĆ=C´Ì*»Dq¥:™Õr·ÄI€¶Ü›LvDZ6:a–ãåˆ>‰ëlštÄgW)ˆÉá†YÉ-!i´3££Z‘ó1 þîÒmǰQVi¹[¹[)“ŽÖfó3ÀËwáL¢Æ9à˜ƒèKf &Äf?¢"œ„EPØ8G:.#'³tά_W˜Û€Šr5³Ó[{£‹gˆá•MÌPm‰ó$bîÕè9Ë[A”Ȭ8¨èjBÍž ú(HW´¡3ß c™ä`# 4j„ÓÂmv~jå‘¡Vn>†ÚyA¼Ë2›aeIq–ïð <JHn2ò?µ{gc43Õ¸Näèe¯Î™3ë"³ŒÑAd.{ÛYfSŸ$„Q©óÄÂÉ†Ê SÈi;Elv2´òfFå1Jœg*tGf¦¤7"™õBÛ £e–!¤³¶rsÞ™ ø7õ*:]-‘VèF€{£5{²W‘ßa`-ºo nEÑ»öŠÞ©„kÓ?†ß)—ûݱÿtüáÐßoËþu½<PÔ­úËŠÿ|}ùŠ;‰ñ÷<†JºTm¾|ÎÏ–¹ ­]îW‹c_aÉý,×ãzß4_¬õü%ß«#sx;Vœ³%‡þãCÄŠ¯ëíý‹j{ÿó_nöC¿ÉbÒcÓÿOÌ-Õæ·}–Gߌ/…eÍ$Éâ¡'9°·lÆÎÕîù.ÃçÝòî°ß­ÿ»/[`‘Sê~È›ñüó½Xq?¼;ôgÛÅ'ö¢‘¢î—e¯ãá´<žå`ñ˲7ðÁ&û´E©_ Cóï+hnõn½·hù÷]Ü'ß4Mó†{ê‹ÑC«å«Ëg“.ýµ&˶*áyGËΞʫçËûWòPïÿÆ]¶ëaÙo6‹]¦x²×ýž^"Ëž``ÿ§¬_>¯~ó‡ï~Ž‘ÛõŽ<,uLë~³¢™Ï.HJ¨Vÿ4ÓBý‹×‡ö¯ÎchÀ*yÇÏɨ¨ò*ém”_p-½#¥ß°ì*~Ú ÞÇz±¼Ëo¡¹Ë£W­ô[ŸºH¡Ò×Éï1)­wùýfR ½°q iŸÈEó7õb“Öœ¼n®ø “ÊÄäÇhò'YŸøé»ô§ËþþXž¹“ÑÐTO.(þ€ó›ú»¯Ž}þ•jˆÒa&#@)/艚H· ”%âíÝä'3ËÅ6]™ä_L¦DXy(ßoGÿ—_|)J·rˆcSÚÚß]üŒáRsendstream endobj 242 0 obj 4396 endobj 246 0 obj <> stream xœ­\écÇq‡á80æƒÿçË3x9ÆÎS߇ ð²-+–6@€]AzCrghqÈñÜÕæ¿Î…ØßRW³£D@,Zýد»ºªºº®Þ?jÔƒÂäßË»‹>ÃÍáB ¿ÿß\üùBÓ€Aþµ¼~ñYƒÈ‹×ü¡’•ÍzˆÉŽÆäáÅÝÅâ——/þc“ £ó9Fþbuñr±ú|{?í.¯¬µð©^üûåç/~ÛOíü¬Ò<~ñ«ùdqTZé ?®÷_üy¿_õ'dìGYùé?þ›?ÔY¾¼²>~¿raŒpö‡én}à‘mo@Àðâ÷‹O×7—Ïð?Mʉç5£sqxñöb1=¬6»›áx»9 Çýýfù|øN1Fòׄ¦£z·¹¹vô[ ÿ´ù À#ëÚ Wx¹X‡ÓÍÍ% LÈ‹õáøÓáË/ÿù°¦åqóæ2Ž9`ázØá6†×û‡áõi¿íw‡gψ±W:úQ{?\iÃxy •Jzñ»K£àOæ~`ªD…ÝÀ*oËÞýë§ò(ìÖ£Gá[ž÷8HëÑê\¸0žk„Ž–ÿólR7/?}>Ÿì`·÷÷ÛÍrÂm û×Ìò^ÅÖøFƒ0î´]o'Ëí›’On±F.Á²Go‹¼QqŒ,¹¼]/¿úby;=ÖÇW‹W—gÔ]™lG—láçâ¸çm:`®ñ…g›Ã; üÍúæÌiL& ^â¯ÿøââj ax gí·:ç8&=„ Måá®Gâèò°E$Á‘~±þD[  ÄŽÖ~˜©É£¶ˆ¤:O#ŽÑj´£”3!×$4_ÆhÏHMäy‚.HÔˆÄÑŸ!÷%ˆ#z̘ò|U×Cày§Zè c¢½;Þ!ù“ŠÀ~X#äœ ð=!…fÚ ×l;%DùŽcí«Æù˜Æ,<œÉk{ñΔÓ`@† É× Õ²È0Te”a ©ø‚áa~ \HÎ, #׈´CžYýqÆ{Qš½|Œ!¥BˆsœIÞd–HÞ0=ÖŒ^ÀkY?&B ÒEHFNyŒ3¬‰Ú–]€é‚^Ëe¦¹!Þ0Í€ˆv/«7$Éêõ«hdõº˜Å²ºhÈ. …ž¿9iÑñÌc’BiöÜ(ðPWÄ[æ³És4RVw(÷¢Q*„$_vaä¬(ž98¤£ŸÙ'Ôöâq?½”œø3$ÊWuõŠ´g_9ä%ͬ夒…ž­^‘ Q“z=¬4[ä.!è°öŠtœ#£‹¶0è\ùòUˆ|.²ï䈯3h9Êgˆ“yÊd†Xä÷ì+Ð_´ÎŸ!µËó€¡çpƒm’Æ …‘”‹F‹§„+̈cg_…rN™Ï€¸²w–!Nwòê–)!EîZ,REàœ±[¢ 1E¦prÉ"±þè3Äãž ÑBú]ˆ¨râ|DŽ“ÕKR‘X¸_å¹=„tA,že@\=Jìº+g\™4ã,ë Qö¥p šÙŠ ÈB’ðDz¶”Û²ýC'¶ŸÇXÞ{[ <¯Bs±Æ±Ò,cТÍ×»Ã4§zÊíи:¿eøæ?[­Ô]ä¢e _“gv´‚N|³ë ÊÎíŸ ýóbÛª½yòÜþÁZ~næ"ÕO!ÍÓ’ œkà²mg¤ $­b¼véÌÓ²ÕW´&°¯>æ pè‚‹¶¨ÍÝêiµÚ ×9m·ïÈkÔ¹­K,óݯÁ9_¬ù'8‰pÒÛü&¬†ix³ÙoÉ{Ej®,ÎÊ-$x‹B ¸¶_~ù tî—§‡é¸¾4 ¼:èųgÃKZdj(ò²ºïÃŒ+˜H{›ïwäÁ—J5¨zÚ‘ïü÷äŸòÞchÁÌ7yïÏöÁ):×+(Sb0–¼éa¹¿¼B†ÃY¬ÖÃj³vûãp7—·äÀ {ÁÕwÊ•­}y…G3z×ø‹äXA–¾²­·+WcækQ‚%޳`(W\wˆ·è{M§±Õ8|t¬D.÷wÄ-<ŸY—ï¦Ç1ÆrèÿCèÁØ…Dµ]ŸŽÃýíô×ø¬A»puôŠ^Á<ÖwÃ~Z f?Çì@Ë<æÑ#’Æ­r\6,§ƒpîúd;n€Ñ"Q ³)V¹L¨JÚõDg£3qÕ—}öÉwÎ4LƒùJBæâ/ù¯sÓàcʯߙ+" ޽üøoO+Ô3ü .Ô•ª®@õ®F`yô¤i°+`¹®@&´EEÿVœ…x?€Í|?%Ÿ¿¯õž‡ãÃv½;ƒ_]>jó3 ·ÓŠSƒbVÕN¬'æ"œÞ¼Ø±Â¼Ì›`WÃQÔÃ¥°8Øo÷§>§{Pøˆ ça¸¶ ¦¦ å$ñÝó™@…*2™HÃA;àÆÒ:€AÞÆ¸°Àã÷½5ë"xÞNÕн;’¸2àD;§$ üòñžCq .tj:lîøˆ’âìŽÓî„N»átÀ¼IÍ`€1‰5ƒ=ÿ¼Z–›û¹2Ò˜±…ï"mtŽPD`m¶YxÉԤƄÀŽÀÝáš@Ÿ7Û Á]±}010å´{'7å-t´Ð¢dEE¬–d"àû.¨ÄcÚ'É DàÊ$J²¸áÉ’¬ˆp³(œÃ\€c¼c' ñì6éè( ¤1ÂGG¢y‚.ˆGš½fG¦!–æ‚X¢'pðÙæ—µ,º?´S ‘f›Ê.qÄÏn!g6š“„(ÏH¡Yva;Çm§èøÇÚW…óp-f]N^è|ÁÜ^0ÏÉŠ†ØÀÉ BX†ªr(ˆ m¥1ˆÄ‡Þ€Dü ‰ @2Zyà´â0MGBö3Þ{¼gòá ±œ¬Ð¥äg’‡°‘¥êÙ©$c`BˆhY4h2 ~˜Ó²È˜ÌšècÙ¸°AÀkeÉgHš£hG‚ ×!^V/_%LÍÖJœF!„µ#¡ý =¬Ï2†‚—Ž 1¢‰ ì¶ÓÌg“çˆb×Íro' ¡ð“v¡ä¬(Ù…FÞu3GÂgˆF.ôRN”~›!N¾*«W´&ÇÙW.q²$'5qj¢­Þ!‰Ï\ÕÃJ3hh”]Pš”´7T$Ó/ÚÒ#gÒL8ÙÏäD’Õ3[›‹ÎƒF¥3Dó›T÷.²0‰SM^"2Dä“X¤†™9M¨H(¶%f¶HlÇ„?jŽpʆ-4[>_ƒ1âXÃ)–¤"Z¸_¥¹=æÄ®O¯Øþ¬ø,Ãy•S"Ÿw>Á„X¶ ÝÅúH”}E¶l˜ÄeÙú’dŒbmi·Aˆl‘Ú˜`Ùjµy‚â½·µÀîš‹5v•æ2F1Ím-8ED3p¬Ü„r;4®Îoºy¯R¬Ô]XѲÄüììzb)tv=ñýÖÛ¿ŠTû‡ I|ßÎì_®Ö® 3 ¿U²BƒõòÌ^ œ“AëUH«'’‹ÏÙõFŸÎ›Ð|oÌ–r—ܦö¶Ëm6Ž‚@ñ?À /Þ ›Ý‘%Š@ë” ýÀ¨ÔíguZRNá-¥K’7‹ýðˆ™®!üf¾ OÀç;‹Ù!dŸŽœ0EF_¦%'6Á²-ÅCûn7«Õz使¼NÄyíª¹£œÈOåÛÀ{shÞŸpƒ½Â„´‰‡Wrð‡Ô«ËŸ±¡§vv¸»ÞÝûч<îÙÉ7ô;SµElа\3Wr[ê›ÂÑi…¼sÎù/|Æcw{‹6ž-›Þ†\ 8üŒ¸TØÞJbÀáwÉ|£…ÃÊh¬7À¦[ÎËQZ—4ÃàuoÊ—4ÕžM V CÍÓ”ºó{Œ>ì±_ “¹YÒ7ïªÑ¡¼¡-甎„ÁDø7]hCkSݧ´3Ösº§C2§{›çŒ7“`œ3ÞHu ¸‡ñRAE{@¢tuXO‚3AÕy¨G#5)‹®!VªdèxÃ=6PpDópM‘Œ4cZá ‘´!‘èqÒkPçñ¦®E!íTÇ‚hÚ{(»T=¤t pf“¥7ç)4Ë.ààšùNM©“W޵¯ ç­’šó™¼¨BÎ`VzS*âœô¦ Â2L•CId¨+I$æ¤Ó†Œn3 ’)P$IUÞF ¦{ÞG Ó{ù@è› ÑÒ›b9ÿ½ä1Œô,y®aÚL•,BDË0ø$ÄI·ÅUîMq˜ ÄË.&8ᮇI9‚‰AX;€U²zC’¬^¿²ZV¯kYWWgíp6ÉêNzSœ£ú1í+ËJ(tÜhˆMD$iæ3WÁ"A5­Nrï…|!„» œ¡-š‡ëë¸Sg3kªáϪ½wRv*¢TfH¯êê‘ ¿û*HoŠw7 Â(mõŠ€«r¯‡f >ñÎ’öŠt õŒbE[".}Eš ç"û™Ü±Ö&ˆfˈÎE£Ìbež ½) ñÒ›Ò¾rÒ‰‚Z—ÎêŒ „í¨Ó‰µ¥!F‹M²Ò›â0±AHévBÄ‘%SÒQ[ºêW¶ôU>ÛÒÉTew¢Ty5¤ÈÔ†*w-© xN“Ø-Ö„†”~#üŠ,’-ýFÈw†8–2¹ÄŒ>_è\V„4œCŸË*ÜСZ_ çI7LéKtÚðY6¡œ•Å®‡rvT`›Ð1¬?€DÙ{fËfb¹÷¨ZÌH’1†µ¥Ý)³EjcR`«ÕæI–÷ÞÖo²Ð\¬q¨4—1Vh®k…Ì4[UoB¹*WÏnºyÐ’e]­Ô]è¢e “>övÝ9ËTíºsžo§fÿ*RíŸóbÛª½aæöÏéjí 2£ðÛõ¦`aˆÙ |âtÏuºVÑŸÇ•Ò=#¹.Ýîƒtä®!])Í1r©S¤r|‡XZ¡­-çÂpw!ª{Ã!%H­Ë ­1p¯U峆˜Õú¸?uQúÆ8ŽCÅìƒîCE.scV³§–:ìÃn^¬nÙ™.øFi‰iMk3·Ò⽪#Á:®xã%òbz8I=Áܲ%hÑ"ÎÈ:Klšî)y‚}`5‹4½/†õpê&o‰eS­Æ+¡"„æ£p I¹*oUƒ„Ãas½Ù~‡¹ýE-þ­qŠ"Ø"QÒë–Eb‰&šD»ˆé¦ÕPâï–x7ù½ÙEÛ5‚Õ¤¬jOŠD…šLO™¿ |¦6%K(P®pnc Þ›„œ@‚fDÀ’åÂBŒ>Ø/-N´“èptäè«€ÕÄl‘&$ŠQ Šê¡4†]Ö€jžçá+ ‘Œ4ƒqñgˆ–P‘ˆóø$®]LJºÕ­i§:DÓÞ•ì"(ª¤¶GHÀ™ÁH¦Š8ÏH¡Yva\=u§VªPcõ«Êy®oÉ‹ rPY°(¡@EÐÁ‘½f‘¡©Ê"C_i̼>pˆÛ )ƒ\Tr]M— Fœ  é‚êy¯éëåcè¢ÄK(€õãg’7Y¤åÊÀªU„µ «_š$ÎÖÞœ  `U4®7Ù… Bs'‘ºæˆ7Bs.Ú¼¬Þ,«×¯¢‘ÕëZÑ×ÕE;b–Õ“„Ì£sGûb©†Dí™=7*âŠ&’4󙎆¹øpu’{‡ÐåH;w!PuæawwªólfOÕ½BÕ½^ÊŽª{3$ÊWuõŠhqÛWJB¬ädAØño«W$h>sM Í`o¢ì‚\Ò^‘N — X´¥"NÎ~EšÉý ½Ü½®3b9tÑyøìvˆ“y”„]3zö•Kâø£Ö¥3„¸Âv4øÌÚÒ<{š- ©_4 ‡Üà˜"5¹î+SÎiá³SeïE¾ê™¼RdêT•»ûS›yf›‹&T$™ÂWd‘l,2õ†iîÏR¶QBê± [ʉó‘5¬¦X’ŠØÂ «õ{L©lDt9qÞòYÆB¾Rb×U9;.²MhcœeýÁ \ö¥Ø²Y]î=ÙúY-n>Õì}P=~>ÆD¶Zmãdïu-£*ÍÅÇJ³ŒÑNh®ki%4»zÊíи:¿eøæIz+u×#¾hY2rW»žœœøj×SàÛ©³iö/ˆm«ö&yÖßfo’©Ö® 3 ¿](!Œ ö¢•çP`š‚ºVÓÿ ðkR˜U~µo8Îcÿét8Jß$yn9öÍIJààA¿WN«GÅKÝ¿²&hkÙë»Y€é °þḾ§°2nñ|xWKë# ‡ÍñÔ<å×§¥ÆŒ Ã\Ýr|²JqBñy ¾£sù}QL]£ë$—z6ê…öXóº4BÖâNu±ß 7›7X¢¨E^ªËQ¡÷Í´=Q«íyÑu§ÔFÞŸíWòë㚉æLöûK&¿Z¿ÞìÖÃg¿üÃÿâ“^-¾¯¹¦)Õ’~į?ùý¯õd‰¤ÕP[Žo/S_A5 ·¾«L?¡'.-“³$J4I||TJb©áÔ7háôú¸~Àw¤Œæ·÷Æëíö=là Ü}«JÓ>l|üñ‡9м“:}Žeß×ûí ¨ê¦øp>ø)N¿\üZTúÊ,îöëŒo´úŸŸ×Œ¨°D¨\ÿz\2ªBlÅãxP91¶ç÷Ûi¹Þ‡®ÌñÚj,ý2øîL¡±Š¨U_IgVœw"w½\\·šèZâÏYµm9XY›äU‡T»²·D}¡[«îsë#êŸDy:·½©Og÷¢¥É>>Ï]bì"Tí yzÆÕ‡Ô )©q˜»©©;b|}HÜq€”‡Ôžz€”‡Ôžh€¤:%/¨¡$= òZ{K#i ÷ÐzK¯ hî©ó\ºDYuˆuè«DôÈCênU×¢Ä)í”;¢1´wWva)Õˆ<¤&îlãÊCjBÀbRhæ]¸òp¯îÔÕ‡Ô…cÝW…óõ!õ™¼¨CÌÛ ˜<¤nHyHMË0TQ"\iŒ"1yHMH$9KB®%’ òJ™÷¼Ç¿Rb.."©¡B/y.M乇̓ož-ã„' ò*8eLfM,›µçä,!ܵê9;C2Ó\žMkÏéãdõú§¡»µ§ª aíœÎ& ¹79(ŠUi_YÆDŒB:nT¤<$$kæ3wA6DJ´ºÎ=â¹$@w›úìÑK§yT,;5¹ŸÙ'êœ!ôž —2Æâgˆ“¯êê‘E÷•<¤&Î+A¸¹­ÞÊ´ôzXi–Ô9 io‘vÚ!¢‹¶âÊCjBP3]yH]åîÊCjX=“åpåÙ4i”=CŒÌ#©;DRw_ɳiÚ{ž#‰Þ9"v4QOû Éb“ä!5ÐLù3°¹Ø‰L‘2 òºCä!u÷U(çTøìÊCê* WžMWyõËÔ•gÓtõdf[4¡"¦È”KãÅŽÉZ~Ž`· Zh¦x Uìq¢¨œ¬¦X’ŠÄÂäªõ{œ,ëFyH Åm€¸r b»îÊÙ‰ÏÆ(ÖŸòpöɲ¹ò*¶’dŒfmi··ôcÀÑpóy¸Ñ _‹K¬„kì*ÍeŒšëZ`ç™æToB¹Wç· Ý<µêj¥îzDJ¢„„ØÛõ  Ÿøj×1Sgÿ Òì zfop{fÿrµv Qý<ߦ7‹iÄÞö:¾~}mÃÓ½ÉòƒªOã4>«‡XÕ8vÿ~8þÝøÃö÷=}v씞–ø2’ 5ø´Yé3'nÚŸ®ÅÇõ]ßìÛËâqî¾:ÿ ¤®’›u«b_xäøççý›JìVÞŽßue.eðMd £¹¡wçíd­ùŸxoÙ'ÿÉXéàNµiÕªsô¬v~cqŽúÓJæßŸîȦ·ÍëFRÊ;ìå1"¿îãQKñ«1ëé»éR[3*bG$±®ÕZÄ3Fµ§í¶¾G¦½“˜Î{Ïõ¬vÖñ;)üþòK)$î`ÆgÏ.1n×6.Æ¡èK‚؉Ôt‚¿gª°ù³=+7­Ï¥mïø0ð¥ã÷h§øfË•€}y”Ö\Ýçà*®Þ–·Ã–ËdŠn$‹à[#kiõÔÉÒÃÈIÑbVñQùqÖŠx :"‰ÝÙ¼xWóUÆÕCŸ†Õæo—§íC¢i‰ÏAoé¹´"b±5xQ ÜIÑ7üD¶BÍ¡Fo7ôW<”þ[l^î´´¼À=¯3šÚ(^,•BùëR¥/ô©‚#hÚ†žÈ_äù3j푊‘sZï–¬÷Š£·?,¦ë¢ÞÇ=½¦£³ß8£ÀϬɋ¨…±†‚¼øÙèHyendstream endobj 247 0 obj 7213 endobj 251 0 obj <> stream xœ•[[oÉuÆB1 èiB¿iˆˆºvUé%ˆ$Þu؃  ‰¨9Ó$gw.Ü™¡(þkg“‡ø-çVUÝMJkÛ0(S—Sç^uNÿÔ¨V7 ÿ+—Û7÷‡ÐÜߨæŸá·o~z£i@#–Ûæ×0("pqó†çéF;ÝkšmkLj.¶oÿóg?ÀX€ep§Ú¨-L¸X½Yü+ÿšWŠ­MÊä¯v·?ígÓMjm—’Œø0îÚèå—ÿZýpuwÛÏfÛÐg_.ÞŸ[k[eÌââìêâûñ™tÛuÊÈj«ùBÚµ**ýÅSÄüøãÇ~÷ÜÕZû—M¿îžq°µù˜¿™N máÝïúÝlæ¹Õ¡ÕÎ6ç®kCÐ ‡`‰o.ÿpjNwC3ìVÍþÿ¹>4Ë»þþ4šý®9žž6ÃYjS2]\¼k~K<ÓÁ´: d8à––TºËlÞ­o–¦‡e·þñLûV©`CÓ|Ok$Ýjå…HP‡-šýpjïžšG\×§Ö¸˜—ÝÎÎ ,ÕE·€"] ;‹'ZñÜzÕGÕ†(ë¯q…Ôz_v1´Év “ýýÛ·Í%mãG²¿\üöÌ(¡¶Ñm Á;9ÔLkœicHA˜ñç?ÏøŸŠxÞ5÷ø›úuѲv*Ì®M «ùÇŸç†TC~%àUÛüÓ~³ÙŸÁÜä:»x\ïn›þpiHkñ·©†t¹è·÷›áˆ q<8þ°<=úMsà%Xn°yÎ{(¥“_<ÒÖÁG×"ä’-’w`™úÓ]jVÃv¿ƒúÓ@‚'Ñ4ëc³Þޟù¢‹@úáÔïNÍz‡ZÊj˜R²¾:°°­«Þäxjî7ýrÀ_¬nMqÊw`¢˜‰qªõ¡¿ôû†G 8Àã@©DÚ¶íªôúÝnî¬ÎóˆsÐùŽFýûî´ÞLål|ëL± Ÿÿô§ŸçÛ,w3€ÍÑ(ûe ˆ2š¬(6²Îßõ«æ¸þÜÜ<ì–§õ~r\î·[´ÐÍz74ÇÇõiy7ßÏ¶Ó SNüæÜïwÃî4ÛÔ6¢VÏVi“µe•Óðy¾€ñãóžÛ\žª¶<°Žúj¨Q޵¨_Þ5@þ]ƒ.‡ –Láöa ”¾#7„^Ž !XøiÖÈ®LeY-ú5iDUXÌš‹,<Š>Óå³ôþ¦¿=ÎedºÖ)›ýëËÝþjÚ=熿È4ðA6V¦á*ë]QèÑB«õœw*3jqq7ìšïÁ­8 ëÝ]@s:±á@˜L¦8ÀýÙ¹»óÖ/VK67Ð+ãSñÅ«æL´?€ûÈææøD®Æå Û¶ùŽ¥SðNô©ñìêwt ™Cr%š<“3ît³?4[pþèµb@ŸÖ¯>õ; ɤ°jоac@“.°`Úö<õ¨û ¸ñhýí»c&8wü|‚€‹sØ2‹•8ý" öÙuñ+Fص*„j¥@ÞjŇC©w¡<œ mЋWŸ˜Í†ù ïXLJÌæbl®3Ê¢nmˆEõV‡þfnjV}Áµ@αìõf}üº•ަ>3Ø×«a3"##imÞ|Àµ½`pÁ $ÁŒ@ò›ä¨^$Øy’`H…ÄNä)›pyaGù¿ RD:L©±^Ì„íN3…D‡È€ «3¡;Ï‚¡&Æ%Ì€ ó¦õ„¼`â™Ë€“X “ÍGè Ó HÇ{uži!‰iD#Ù½"^v/³à„qºБwÍH^v7˜±:"ê-MpÙ™š@F`]féÈ|6iŠtm'»k–yEp¾ ‘9²Œb&JN¡[ßMVMO3o›)Õ ±2«ì^m˜Î*‰b¤ ç~º{E"Û[ÕÃB³E}'Ķš5·+@ !:+KF`9URL0‰ä'b>3 ­Ã1"* ÕÍ-ë@.`§¨†žÎ2xÅ¥3Sÿ%ˆxP¤c†DqG ìB¡GÖ…„€Øú4 "Ûéœ.ifrçÊÉE€8=Ö"BGåfH'+Û¬1Y èÞŠÿ’­âÀ[<Z¶lYʶé6,&>¤ ¡pŸkʤàKÄÖ Ë&+†¼LôØ«ÃøÙŪH('Ÿ+K°ó–ýú-£XQj p}Q·´0]Ò27݈BsööМÇ(¡¹ìe‚ÐKøã˜P™: -n08÷´#)k ɺSšµ§8t¸ürH*ޝ Åñ!â&Ž×ñ3Ç—Š›ëÊîf¼Î‡/>Ö[Ÿ¼:‡Vˆ\AKôJ\T«ëåWr<¾t]µÍ¿ÀÕ‰r8à¶Kö/Î@ñÂtŽÃáÓ³˜¿|%IVžÃû#'êx¯Þ'¼W¾7Bž¾6›qÒa©CvtÚI¦7B$Ó#´¬Ó^2=BÀItø2ÚtIõ ¨S€HªGˆÃuºXÖ‰˜htx‹%qÃMJ¡sDR=@,z}CI …Jët¼²Ãë "¢#DR=š‰IõF먲—G7F'Õ!#šÎîò)²Éõ ¸²•\oÉ4Ë)¬x™zR+¶W9VgeÎ[ÉõæòB5†•‚`’ëUÄK®G˰+ ,CŸ Q$&É!ä,qÖ$8µ&žI¾ý6æ=p/LåÓ‘4‘|‡z2–<Ì'iq&ÑÛ#¢e€ !’ï˜ÓAò=“¢bM 6Ÿ²-HÇ{ëpSN„´Ã*ee÷ŠÙ]fY¥•ì.{bËÙ]ò=@èM—ΕdLÄÐ]¹Q‘NÜ!11ŸMš"âähw’{ET¼Š â€tH­£B>© £•žp‚X¤l,åˆòSÄË,Ù}„H¾7š%ùq^ ÒùéîIlsYG4K¾ˆCë#íé(°f# _E¼$|„fzIøªÜ½/Sì9¼Ï:egˆ•u$á!’ðfIzGgO3_©? Y½#Dû$IøÑ('ð)k†D䆓Œo„HÊ7šÕe;Í|v’òUY8Iðª¼*’eê\‘»Tde›5¡ &û|8ÐÅÉ^~†X–²“¬ÏöåTöÇ€†Û˜=IA$ë#ÄNý1pžtÃúìû!-![¶.[$^²†›ÙÍúc%Ë‚“FölÖç¸I¼$ÊÃÚR£X~˜Ž+rÓu@×õt/ÐìLsöƾМÇ¡¹ìZÂ4Ç %:T®N£ Fòd)/µ#)k™Q¿Å¯bYƒ²_Äqtªþ/#ÕÿáSÍØßÐ:fêÿ`¯8õS ÿª´Ï‚G Ä^SÒ¾UºÖ+¾ö21Èû𹚟è>ÈÓr×-vûûãúØ¥¤¨lS&ó;78¤žÙl¹&zŠ~@çôðrqÏoÜNÛE{†oo]´‹ATKiÈ`¶üµ’AïXÊ\ÌJ=°…Rùeó¿gsÉA—wq"þg”²R)ÈÉ;7Ö`ûÕèÉâ W¯€Èàl‘×RôG5B¢¹¹üÛ›ýf5®šËíñöæµ w6Y=~~$½Y›úÈ*ðI/À¥Fu _ž¶¿=;÷J-^ïöòó•¼ÎCDM.‚¸|MÅü- —V–‡éø3îBÙø~Æá5ýD¯ÍW$iž¯—òÌ…ÞÉ1Á"ó.0f~FM‘„þöùÜJa¿Ù|mîÒ7¾‡€qMÖMíè¬y Nú4Ž É|*Œ°“cÝ ›{U‹i#òØYðª×ûÕÓ3³¾^Í ˜“Q:X‡à«ÜXsùK²›Ÿ¾¹rC¥g¬â¨ŽÊL"z®{íÄž4fjµ·‚ óØo*0#K@ßJIí’+ÍgQ&c-¥«-mó;*„€]ùÅþÈ96×4Ðc-Þå]r)É–Î < Ù÷þ´>®azóˆe±óZ¸Kzföçóñ%3Iðn:ºQâƒø}Ü+ëŸ3ÏëÎÒLÇÎë-7>P\ø‰•tl¢°:dŽÆ*à¶j K—ÄMȘt&eÁ7gpç… àOv§f;è÷°Æ•€ÕÍzw÷‹åúo&­'˜PH+ÜtT,Äec 9‰1Ìqwö=”Øã ¾fÚéÖØê–M—y±Ü³” Å/»fÒ³Qž±<5Çá…þ ÐÅRg}±< «éLæÈcdóÄ+VW™¼^qÉÔø‘wÆÚuæqn™OY9ŒØT£gv w¥‹ 4Ä`k‡¿ßBȽšG.¸‘„ì°Ë6—`¸¥ýƒz”´fñùôÐošÕp\Ö÷ÉÂííõz×K#>:`[Û¬qiASÈgü…ܾƹ+è±µ&…*Æò²øRŽÓ?nâèÒ9ú}Züân¨A]z†‚.kºw’žˆ™©´YæìžpÏZÖµµOg/ÖU,}Ørlú—G r– ´c.™Å+È%kÌ‚JßçóÅ«5,uÃê ¦ÚMˆc5jîr“ˆµ§ô+ìËÃ-á>K[Å/:ªåœÃÕ–´À;îû î ýcCÞ)?ñÒ zªø{lT¡¥]ÏÖ¦—úÑ’5ýBnCƒ-ý¨[ójrTÊi³  û64ÜÍ–|J =k0 ¹º³ì S×rM\ñù<— ½tmQ.`ÄEíñ¦'` \:K£MïÞAšÕhåþ”ƒt’$ÿ:º$Nquôºô¡5ë›Ì³ªtÈR{æOh\›]êòQ6ìÚ÷è¤(F‚éÚ.kʪç¤X§I ï7©5¹> ùvÏÞ¤Bù`ƒÏøà¦×xåiE!`úê@I¸±ãÃOë%x”§3¬™ÁOâx{é}Ä\b\é>_x½¡¿Út‚EÏ<„»w ûÝæ‰ý«Í…3•[(;oãb‰ñ˜ã·Å%ÍAžN±xÂÐ$ŽëKžI«Ð:]<Ó/tçPþÉ٬Ƅh´)kÕK›XU“Ö¯÷±¾/É)k ¥ÎÂ]R`S¶†³wÍß2b ®rzÉÀFÓÚ|ú‰,ÌÃ'È-K*¦8…»ãð‰l6ÉOëyXÅæóÃk'D7Lƒ!µ¢ ˜ðw4J1² YmŠ ­±-ú©YöÇÚXÝ6ßÝ•ôÊè”Ç“.KÖ1j·ß}#;¿›ëáy¶¥jô ¯v$ÍKì‘>÷Ø[+Çõ”ñÕƒtrÜÜ^ÉzíÆXZo_ºaŒ’ÈÒûM;ýjµæþÓÍSsׯ$SªŒ{»fÿ«o®Ï@é=îÅÓ7èGs*‹‰fu¼‡"úý!_:ã¨ÕºùîŽb½cµ·XI)_¬ä bÁŸµ)SNÁ#?)‰ù")×$l[º= hàpж’Zì–…£Ov¢ñi”u®rG¾ÑU:¹ÁÓ(‡Å«Òb Nð _ pHš³óå _Þ¥Sü‰‚Þ?€@oê¯>#YGrŸØXMÌ÷i¹Ã7½´b*äT]V²w¸Á¬‡ ßîúO¥×¦ï7œÆG¬—^îñ„ý¶äÎ$Åu_ç†ÎäÆ×nì “ôî}ÞÐÜáªL~¿ã\­!µã½1-,Iö=³:Ԩόï™K‘'ý¸Óu8‘§׋ò}}„Yü”ÅÌzV~ÉÀ5!3¬>Q$Ž[´0®œªâZlŸ'Ï"ùéc¨®ÍÖÞúEy¡a6ã§%ªÄ=%î­òm†I0øv{èA@µËþšš2ÊlQ¥ü%Àjý«aô¥ÁSÃ%Ú,Dµæšûgáº1V,ºhígª`J·4’v}FìüÅÇ“¨~Ìâ­f ’ÎØÒ=ÿÿ+ûgYÜó"XW±á/Yæ>Ë[+ržƒâkõTr)Ö 7ÁüõMíÃÆöüÒxÀ}×/fX0-éÖ "°©o?/ö”›òáÇËYÞÿ²q ­rÃqÖz½{ìŸðš'Yá¹î˜ê«„ëäŠ#¥gÆïnïò4¼&h[ºí8–' †µá;Œ‘§  3¤'­Ó“ u$‰:Ý—7ùôUÍ,Úiˆ¾K9Å~Ÿ}¡=Fد¤8àÈÇõ‚¹αeÉù_씆PîêuŸúôÑòur ~hÁO”t½x§Ì8¼¡5{¹ÐsÒõ{Ë]ýà,dYǶù P>–NœÃªUùHæyv纒ì¿üå‰sùýŸ¾8Éé-¾²(?¢U’wŠ¡B«üxL+9o¬}•¬u5¼—·,¸Úªg£Ñ“ p¬WØáQ?Ó +#ÇS­º¼"]Ûæ?$•Åòoa:.›óúFerøy>Ì¿›~Z% úü„۔߷!N²ûëê7KùÓ9=þtn˜û÷åZˆÊÄá0â½-V(®ô&8€)zư±š .ªãóiôhú l¹¯Æ«¿Ü2¾cy3•mà*a wUbç>„.ðΫu¢ÂøéYyóÖ•²¥\ÇÖò@e°¶¬+Oòg;7»UO^~#"Ó±ôogÉøí­mþmX“Ûz!Rì$Ås}_¥ò†f¤.«=Ýöƒ×‹åCŠYnä<èËWý!_=öW.+¨a±ÜÈÐ`!ºÆt§XùÑRyLIº°ò3ˆ¦?×ò‰ >’(=’æÈINEQ_póGÈ ÀiôŸè‰bGÂ'äWã|"XÇ1ð]óÜ, ü¹ZˆQr‹¤Ä€_‡mNX¿ìÉ_wFz-}ö áúÔÐH}jîNd9…¡Rvñi/rð®ûy  ¿Töµ£z/©J±>Iìa"ñQ» p' °5ta»àñÜ.HHr€iSÄ`7¦¦Fˆ‚ØöbÛŒàh¹ÏÊl5v—äeðC MÜ$5¶¦¸k|_¡ÔÒÊ­±%žétF:㥠"ÒRGí¬¤ó«,bÞ ä:>$÷' èØ&ŸÀPw-°&I/" lɈP‘¡XŽ€]Ä“Cb£±sj4EŽ=L:##1Q¯F4†1ðÔ%X쳓s+̱"ºPXjYPJZÞ"~XGˆ4ò‚ÕD·G‘)N¸IŽ™J.ÑžÀM‚€¤6ƉÄ!(²<“4“DðaNÑ-ˆ‚‘¤¤í âs›üxŒïXÿ°™iư!·ÅÎ0Í#¤cš±1ˆ×Á‹)ì^fÁ Õt¯˜Êî¢ÉÈîJš#¶5ñ±D¦$˜Ê‰$¶¡óÿŦˆÁÜXéÁ‚m#Ë{„з(„p¯’¯Å<¸;0ú¦e¼r O"ÆH‡¾m"^`ž!Zf•Ý "=a£Y†»ñbœ†{G»WijU,4K¯œKa«9©m ÖìP³SV“‚tÙÔ`4©$~øà'Ç®PA:rˆ®ƒ&¥)eý#Dso`¤¸tÍOübƒñ˜¸Áðì`¤+´EBBÖ"°c…|ÀåÓñÒ±Ug¹lš™ÃØ;=•~°¡'’!"MìÈ”s{ñK±²²Î:P•¥ ÆJ>ˆ=—0GÍÄòÅnf¡Y±Ia¯§ šuÛwÙyÄn¨ìmÅý@Jám65`&Y/¶Ñ‰ú;ñâ&M§Ø Ô1>°âäXŽ}™·9ÀyÅþÎ[nù_XQª÷‡{º™Qì§ê:p]é¦{YWhÎþWše ¤ aº^ˆ"3,‡= •©Ó°Â¡Û-«{ÚŽ‘Ü|SÇ¡º8òÅÒ‹#ÇnÔ™ÓËHõ{I|Zñ3°Nœú=ØÊM=Ï”À¿®+\µ!îbó›tz·Œ«ë/•#®è!…2¨ß¿ùŒÉ+Mendstream endobj 252 0 obj 6576 endobj 256 0 obj <> stream xœÅX[o7V¥VŠö‰Ÿà7fõÚž› B*%¡´ j Ûö!ŠÐdÆIfg†Ù„´ê.ô¥o=Çö\vCRB%J„v3s|.ß9þ>;o£œ0üqŸér2““fÂÈ·ðÿdòfÂqé’|³#_à“ÅñÄ.äD†”ùŠ“XúTEˉ÷xºx¶Ò™F4Uƒù"›xÙaQ'åtæû>,åÞ»éáâû±ë ¤‘ϸµ÷v7Å”qÆ#÷RW/ßT•~ý |õ0ß½zÿ·]Ø»…€Š x? "Ç\¡§$P•m^®õƒém˜­Äö¿{±pi…ñÍ’ªWU¶†áK N8N.§÷1\¸Ég#“ñ~SŒÌLýxf½óÓ<=%çICV&;Žä »í\Iª-Ò4Šû½œÁ¾Ã”aŒ"åòö.îÛ >šÙÑàŠmá”èr½$¿“g?ìî½|´»{Ï~ƒ>ºoùƒ,« ïÌlv nÿOS0N "^†þsÁ8! u£aˆä@º†peÌ"×ÃÈaÀ´’G ™ Š3`%`QÖ¹±ùê†x¤*‹ 7V>zì$DifŠ4`¦­¡ïÚ„|{üòvCšve‰¸%ˆ»!\§íÚ8‡2âγLA%—ý̦ͮKê+&º€÷HÞ¢œh«”^Òä@B­-næ3 <Ùó¼·.3ëH„ÄÂ↠‘ØEçS‰,IO%ˆg“,¡su]䀋óÍIã^ˆŒø!Bœ©˜Å›b„ΖIIjëÂp7Ü^r‚‰)pž Ü×iµüÂÌŠÏea?”>åÒèŸWãÀw­òAу€w i+ŒŒ¼ÊJ“0'ÓÐKÊü7«h ä±PqÏm…m´B„²G¼ª-Ô±/0aS…¢Û$°ëÚ/ì98ˆap†ŽÙ–´VÍ#ÊúAxòÆq•ì+À*݃V'…íŸúëO4fŽK²‹ñ)ψ 0åFƒí@¼¸0c»•«~ç:b-«ºˆv ª!`Ší¼Ì–`^Á–HFäà.œ-`ÉÁ²9iàcz[W%LˆuÆã¨óÆAˆ»Ù8Îu‘m‡~/ÔºjõÛË^1UÙŶ“ޝ¼C‹ƒHïÀÈë2Cß´ ¬ŒÛ·ì¼v¿î”Z¡u½Ò^™*ìz F‡1´ëÞÚ]Êñ<5:ìü¢W Œ®NuQ»ÔÀ¶­i.€i¦`„ÀŽcý›a‡ƒ‡Oy#5®àz Á hæ‘%¢ ?¡èOu˜\éâÖ¥•C’¢¸6ô¸7££Þµí«æ'vÇpn8ÿÑ€ÆGõÆ¢jóáRn8?˜5ÄSœƒ\lÀ \HWå™]ºuûá!jïþdqçÀ{R­Wäu^f ©ŽÝÍ•F€„ ‡ØHhö“Ó¸¨Å×^Yȳ§÷7ojPLLCE…Vö½?·r h/'Ô[HýîÁ££¦*Ö°C~.ó·p/³ìÀoPpЊØ]aÒ¶²š-``ð‹­òš{p¢ym,áÊMR6íêî™LÌu›Îë¤iγ­üÃìG• PßUþîÊÊ`ñŒûp%{® ÐÝ3››ñxàHÞçý¹@ ó㪚%«íB®„T*æ#Þ|ó†î?{Jì&Ä­ä9À,þ=÷»pš}¥Ó¶™/—§[YDWçiåÿ×i!´i«üÓGl¤€Q?¦_7ë#ëk{"Ù¸œ½Åä'øùj«|7endstream endobj 257 0 obj 1650 endobj 261 0 obj <> stream xœ¥ZÛrÜÆ-•’~ż›“¹3p^WâÈ©è!6ó$©,pÜ…ŒV ¬(þu.þ€tÏ}wIZ–¬RÉ$.3ÝÓ}Îén¼'ŒrÂðÿw¹½øÃ÷𬧠Fþ×ï/¸½ø–[òÍ5Üdð×·î9N¸âTKA´‘Tˆš\o/ŠŸÿ½¸~÷¯ýÍ£†KxàzuQ¼tWÛ •5áâ›aý~wª8gjIátåÓ®º}8ÈÌ&8!Á•)–àÆÅgŽ÷º´äÑëö\‹è^Sþe¾Ô$h ûæ8GÍá»3ø±BP¸wTöÙk|¶„ÈËüW2ãü7B°ö£DÉuq©aßSrÊdpÞ_‡¸WŒáÅØOð39 ‹+î—u1ÍÍ€9€1sØ“aœ!!ÇrËǼõè=¼'§µØdóIoë:ÆÖ ¹Y\Áùòº„ &ÍMßâ/—ãðÌ™- ø‹›p Å÷s4ÜQ´û^‡ç ,¡Ò:í|·0`„ÓÜÞà˘ØpÀ&l)ùn Ãvc šZÄ = Ä24ÛwöÁ½B3ªcüµ6Î  ÎÌÿnçÛð´^²‡Uã˜:íÛVAîldqxÚˆ“rÎx~GzK4­LêBËÆü¶Lh½"5 ¯ *à ø¼o§Ó°d´æ"¼sºÙÿa6Óåi|®@@ǽ.Þ¾µWK^Ÿ}nB¾%Zâ§.‰Ò›D€&!ú]ëW$¾úêõ‚@ÌlUB\եζºý¡ ’ýl¿ºÎök·»¶¾’vR€Xhqç-7ö¼§Ñƒ>5Uð¢ÇJ—Ö( ¢g€¥+ÄÄ—`z¤”{4Ñ!÷ä2DSý<Ø1TcHù#&³Ÿº„D‰Àb¥†Ä*£PÁSw¡&“ÊÓHËB·EjD?!è”a;O0ã]7oü›u<€NR.‡‘lGç#¤e#sX¸’™q6žNgÄ¥/çÀå [Ü Îݦ[nȪ–ûîÆy àú4äŒ7 Lj°µøÐtâ혡ÜÖ‚š?“n=4Ô÷, Ð,o­Ï]dpÌ È[¿y¶Í0wËéë xÅyF ÿ9I•舞ä<ƒñ?å€t úˆüàµÿÿKpÓüzñÇc!w%X¶ô?ké°X˜òa­ÿ}ÉZ.~Åj?ùj€g‹%Å›¯5ÇË{pº¼µÅ€×ÓÜ­ƒ©#X82&;—e<Á ø¹Ò6æWžžEµ–‹mTÑ€ñw× kŸ_;ûòóÐc@yúW„_æ »²tiàñ/¡åBã1תhöÀ3¨ÔñÖï ù›ÈptGúzqZÇÈ#P¥Õ˜Åª}>@B[½·ô à¥#\e„E¬0@Ñ9Ü „a©b … ² a%"t7xÒ`€ÉB'h@:¹R ê;"Ï=#TT…EAi ~½þPÆ$LP€ô+TM¨üEeP‡Z€¹r·4€@"è¤=W”üÅëc8¦ZžÈcYËcÚR,¾ûÞ×WXÛú ”X¢FE’F ê³ÖA&­ ln¦ñ™åaÀç:úLRåUR˜ÛH´ m>cDZ"¤äÛX)Æ8K–@aVæ–pYSUþ¢!!-Ajºßâþ¨Z­±DEÞ=®ªL MÔQ"Ä583Q"œq´m¸í-–KÈݰì+ˆTÒ»€Ø¯‹f…Éüö,}4}Øëc•T#¡«YB.J¨Kju ùGk÷€gî^ žÝé(YeUÀälÃxcÑ6n/ž“Ö Øz@ƒÐ­DqÂÊ+C(ÞA'ቕ\yy)Å‹½rlnÏU Õò¡Ÿ±äE=jyºªŠü Á8 ƒßõ÷®„r‰#Ê<&¸·m8ÚŠŽzÖeF)_Êå,ª’•_Ρ‰=ÏÀ¯ÄU&D£¬ªPÐ6.ºQ$AÑ«DBŽ¡k‡eûìΪ"ô;ÙíìÞ±-–²À|^F€Ž¼þ ü)R|4¹ÿŸ®µ¼ÿ^!dzÞ‰Äbí¤¥©äÉk…–pDZ՚•öÜÕ=î”mcPÑ;¸BD?‹•®k‘Ú¾P¹0,Î[H7Ðè÷u×ëͧJ| Ü7®"vÍ[,µënä]ä8G§ ‡¨º¬RãÄ Ûƒ ŠEƒb¹`‰§“ôŠÎpœôøªé¡¡íÜ`ÑŸ‚(ó™®­„:Ñ[(HrõVIu;ŒÖÊeg$.4±!öL4¦b,(SZP•B Ê[)>GGUBÉ D^k ñ`Ëù ôñŽûö•õƲ"†q¨²ÅQ•]\˃:޹&‚:~åáîávºí”5Ã=, /©áŠÖµÝ-Òl`Ì:ÐŽR?cÞá8÷p#Œ¡þúÌ+!ÛT¦ .=AH¨ŽdŠ…}@,émÁoXUøv%âI$޼Bo‚LxZ!@¬FËBÔ,§!Ó'÷ƒ…|H €ÉŠy)š¡ç •m I7°¨˜ÎÚy [¬˜j¸Ùúf˜²¶@—N|A¹i<¡q. ª<•µ?ëUÞ’×®š•ÙjÒËç󈩠àÑæ“úú쨯ÿ §bgíB̂п‰x„Ø7Ù—5¸¿®0êKYBž«jÀ˜J‰ãsùD„†ÄÕ2„8=}–³ð°ždƒH}ï5TGÉ,ŸÐd„Íï½Ô8©Øvî¤ Â¶L¤êÔ±m´ChõýÀÁPX+ê&@…™oc$ÛÂÈF± 2‡™¸fŸ.±qö“í@ÅUb1ùhw56x_…»rDåš{D=BÍX<‹¤vFâæ 5Š@¯ ]áQ¤ç ÕjóD¤ALW2FÚŠì0-D¶=¯Ó¸wÃä¥Oo4'ñÃ…à>Àím +Ë,Û*á³Íñ„Rã˜ÿ"%þC Pgšøóòéƒu QÛìg”ÈxŸ 2M^kå·lósÇ…*}œŸÁ_ËS *ç}ÀÑèÒ 6^/㘤Ԩ:븩ó¡bâ…_(!'œ-=â‡þA™#þQIxÅA󬑙íç ®=l{Ü7“O( Zñß#«ÔÙ€”R]±ïpCÃú’ø8…õMÖ L¨?îŸí’T;ÖÙãæâ˜g‚Ã8<÷óf\Çaí84=’Ï-E•ˆÃ‚U‡¦<ó“©ÒfCý/ãà ž&Hªr`r KÅn@@¼”ç²o³0‡£ðæJ$Ø8ØvÃØk?²1eJôo(ú4xÃ6§¬~ÅÈYuP\e¾™@­ìL਴°O@bÿ0n[?ÇäLÒ:•R;xìàN'œìCn@c$þRßìlˆ/0¾Aâ´FÞ‹ƒ£ú[ɶ›¼\ßhe#b{XnPåDUèúùÞ ’dÓK ¦³×gk;z 9[UÔÄÉÕÓe`à5/ÞàIɲîWé>~(\ïO)Œ 5~û§³Âšr+ˆÂãôÃÝŒåìûŽì%ö3”È[OÛ[é訥mÖ& ±:µ¬~p$æóœœÆSvßC$mêЄyW¹qjÖ›ÜYLÔs@>V¨µïk|iÒìñ‹KkF×þwÀPa!'Uµ.Š:»åói8Ãc—)MÃSÀ¾rãð› ¦å¸Ýõ }­ ñ{•Ñhkï (ÕRµz€’o;¯Ýy]b b­Ö÷.ƒ Ûmj‡o”,Q±ËxìŠDbÄ¥ë-Øï\ ÇLSkè¢{ýДOM 6£"p¨éÀÀ“âÉE®K4(´J;ñŸ$î÷Þ ÝG 4ˆ»Á:8µ â¥ïý¦%„Êqð:~Oä¢T>^õÌ ´Ý"3ƒ8hæÓ¸*[ÑÇŒö4 äê÷{{ùâé¦ò‘ápžÇ«¡Ô<ß ö³^›SLó"qetYŒçq„ÃÎû^a‰%EV mšÎÆCU&Á¸)_þ¥Æï@²–  —»(©—øµÑ»tóãB £¶T_ìˆ '\—ä;‡Ýç6»?îú±s$vS+–/³±9·lws Ró}±áî$KâeX.%®êê TÃÀ°Š#Fü¦Îá-Ø7–Vb:]ö¡ê]U:Ö¹¡ÀK„Q¼?tXsxkÁ!"Ô>¤z3(%P¤i0yÿ`7ÉI¬ýìüßD×GOh èç‚^]Vµ¤[R î]ùm¤k`$ª²&ìcIæYxïáÍKŠ ÍžþøÈ{ä' JUü©mCne@Ô(-hÙ{‡qöm4¥¸| F] ”,,m¥†¦*W ~:ÚŠB µöc0—]%~™Q%ãµ/–‘ø¶¿^_üþüÎ<ßrendstream endobj 262 0 obj 3971 endobj 266 0 obj <> stream xœ¥\[scÇq.•òÄÿ€øå¼L-æ~Q^b[V"—²•õÓJå‚„àP¸Ôþì8ùéÛ\H®ì¸\®-}œ3ÓÓ·éîéÁƒõ ðòïjõÙ×q¸;]©áßáÿwW?\i0È?«ýð«·0ÈDÞÞ^ñ‡zH~T6ë!&;“‡·û«Å¯¯ßþÆ&FçsŒ0üíúêÝbýíîay¸¾±Ö§zñ×ëoßþ¶ŸÚù1X¥yüâ‹ùdqTZé ÜLþaš6ßÿYûQVþô¿ÿÍÖio¬Ï£¿ß¸0ƨ3 {ÀQ~46'Ç_ê1¤8¼}ºZ,Ï÷Ãa¹ßœ†évX> ç8:Å1šTè+„JÕ»Åf¸=^' ÔÄÅ´Î÷›áñ´9^Ji¿‡·÷ðŸ¸ïlFs6·|¹ØÐߌƒÎYz3lϸ–6£ñ±ÑšˆÖáiyâƒM F>[mN§åqãÆ Ûv3 ŒûцFûõ ðøa? Û’ƒ!‡ ær˜à¶ÿ\S6Â\’ÝaÌâmN2¬ÊelVÂåé°û@_€ëÎ5#Y¼á}°ye[®TTõ|*†úˆéúu*(Íf½U1éÅæô¸;#íK\EÂbÚ ÃíœÎ®@S÷E$5z[˜òò?¥bQÙ8Øù¯ÿˆ"CŽü‚"C0Tø÷²[\ƒŽJ¼ŃNÍ\Éǯ˶½õÏŸ>HÀÏê|pUÍÉ¥,©ñÌUù ¹~rÉ`m»ù²©ÎÁðvY´ý¥’M R, Š—¬¼Ùƒ^žyÔ{p„>µä5Ÿ )u)dPÐ""®s ž¾ì¦löf\øÉíW«FÚCWèÀ4ß9-|xÅì0ýS/fçÙà˜]”Qƒ*|´æÒ+@WsiUd",*–é32.¬tå¶¶D¹ÞO[›µ”Û7kûŸÿŸµ'Pë—Í»QüÈÍÔZeШ[ÁîåÊàtKR¦â"ZÖ¡*k)·Iìö·Ú,£ô\ƒP…pQ í©XZ¢*†â?7MË€ÂÕý´]mȉ?´b’LìàS"2UÏüruÅÙL6¿ìwc"Ä®þ2Dù¨y”z؇ʸbáòÒŦV½``“*µ +ŒÙO§óÀE4íà›Ãæ¸Ü ¼|¤\á77ìÅ0Õ.Dž6ÔVæÍ²XiH¡–ˆ¯5ÄÆT#⢠öÂp«P<³¦8c‘Žj¸l785Ö0/MâÆ¨fp¦*qHvhq&»Yw¿|O|sl®mŸï—@áa½]'D^näU:»f±@>ãl)¯?‘,!µ‚š;( ©AW§‰´I•º‘Šô ê òH«Š{Ïá#Æ#Õ½W6)>Cn½yÑ)Ûî¼›Em­f<+íת)ËL[Ó1Í'' NðÍI5¿Æ‹PõϬ gŒí›u‘UÝÿ!ò„xÃDûу.Ìn&„¬Êˆ—]ð ¼ØyõXl`:°ò¢†qú¹?Ϭþöàõy ^`·ãc8Œ ”ñÂq-D Ä%Ñ 0@:K†Ùq$+Ÿ´hdºÌçZÛn—‹C£c*Lbë“ßyšBÍéÙùÄ~ +%>g%õíb‹¥M³5ªU|ºÛ\žAlëÂÏÅé»ãgÈ£Õ gPU&<†ÎËíÏ]Œç7{tJÌ,Š’¾Œ‹Åeõîýô¯äd0ÏŽ–ýŸ÷ËíDÿŒ ˆ%¥ÊÙ§ˆ:“ÛO×àçbônñ¾¥Œ¬&í–e±‡wø9Ý'€I*T1ða^.’åðç+Ù¶"°¯²)Õ@` @|© 籈Î5x ;v0)Ê<K4KRSÈx‰†ˆ-EøÞË©zçŒ58šG*bS\+—ºCE¢\$ ‰WÊÃ2EW ´S©hàÝí=Ô]ÐM ¶]2Õ0½ÂÂsEœg¤ÐÌ»P!•R–ì)ðŽu_ ç£*ù¼¨Àc”ÌÊmBE’“ÛDX†I8„ËPËjˆdáÇ¢ AªFy¤Öãe‰–™©´ßñÞ@–fò1èûÑr`à 1¾—¼1Z¤j¥yÖ7 a-3&!­/5¸F ‡ q¾N€sš4 h² K&„kÍÆi¢¹GœÐìE; ÄYiŽp*Øœ¬^× ±®ÎÚa¢–Õ\'ÀQ3:Ññ,cˆ =7*¢DIšùÌĔ$©¤áê$÷±ÈB¸VŒ>ˉ­pywªólf¬ŒÏÈ´ÍÌ VçˆÍòU]½"QêÉí« 7 +Ý‚ðýA[½!–m®éa¥ÙKÍÙàÝ€eíéxòW€Ø¢-Qbsøj&ÚEö½ÜUŠ…cp"çH±è¼Ml»dž w ñr§Ð¾rr‡€Z—.„ò&ÄÊN5iK8ñIVnŒ§5ÑE£qäÉ”ÔÒ+~=ÛÙWpÀˆ>cõw. @œžÉ«CD¦€¹;ñH Ñ2³/šPWdжú1á»@"K-«göH` ª"¤áà5Å“$ä ¼é™ùcä<éØXœó|¦…P­Àˆ_Åv,ùê~Œõ¬?€DÙ—ás&D9÷ŒÉäýákƒÕߟÊGêÆ`Å|iÔ|-m*ÍÅÏçJ³ŒQAh®k)Ã4Ç”«óS†OžH¬x©}è¢eÑÉù]ý:hjPç×1ÄÑsÿWæÿ’ø¶êobdýmþ&ºêí 2£ðï»[°Ø×DŒ>ñÝÂÚæY¹WîßÖ°ØÝ’DК(…×_bS 7ÀPŸâõ˜¿Èò5žG?•å×BYèZH®#$‰<ßµˆ=¿Ç‹Žåî4I=o0U!ó¼A Ú›–†ÓµCWd–ÂPeh|T®Äãw›3 ¿Y|ùÅo¾|VãAÿS£QdÄE\|cÁ6cjéL¸Þܾ|ÍðR³L¶<¬/æ‚üÈG›^ ì×úúÙdè+k­ò%Ò ÷×mtõx|åú×2­2œÎ¾žî·«{*ç ”Åƒ3ж¬v\>œ.WÃß•|†kÔ’¤á i«Ç/ˆ†ŸýÛÏž‘áÐÂKÞìÁ q9ëK¥¾†G´«E˜Ã¶tQá k—ZJEk5±Âª¸Xo¨÷ ÒnÆBc©Ã/3ðA펫¦G©í%ßòÃýséÕë8Ê‘ªŸåHŒû’ÚAž9=S*éC—㿞þÙ.ÛjuYØéSÛÓn7ömY: œ÷Ò‹Õ ½X„€ãr>J/!@ Ò‹E€H/ 8Ÿ¤‹€ó$Wç¡Ã ¹šÕ1RЈ´cBA ¡pÊ ižÀ3G g‘ëÛ‘~,ú*ã‹35Ü»âI*b 7q3Œœ'ÝðºXœ1lË^+À;=AÄv@ÃíÅËúã¥#ŠvJžÍKg ½Ÿ—î+@,kK; °£x6&æÀ^«Î³•½—µ"6í R¼q¨4—1Vh®k%%4»zÊéP¹zqÊÐÉ“Wºz©}ø¢e€Ä8óëXÈ3¿ =NÍÿU¤ù?/¾­ú˜ÇÍýõA]"ºŸçïH£4Rˆ½®¶hýMi”ƒˆ)ôwmÚòm_öaîZ’Ûâ› 8°´¡ö´[ ‹¨¤WßWœW¾Í;L'M½¯Àë ! >pÕâÔÅÓ°=¬vëMk`Zt™-á‘_Ãþ×ÃPUBé7D³tߥ£YL}ÜéÞi„Á9,—cÜÙ!‘ãN@"ö1:§¥l@(¥3Їo±ì ”Ï Ô6HªÓ@€‚c O&uƒtAc· š 8`d …G€ìò¤y‚.HD’Md•ì©râ‰ÃaD7ªkÁ!ÄûÔBu^âÊ&0WƉÁGªŠ8˜ØæÈQ'!Æ0RHæMXðf¶QD”ïÖ}%|·øAX8“ZÌÓu6DŽ:I"ÁP”H‚:W“ÈËpä\Hy ÕØÒ HàÓmâ=ã±Íw.G À€dŽ9ÁËܙرtfXì†ÉótÇ ˆá(êå%$ò˜ Y !½•MÀ¹› ¼F÷s3AD5’“Õeõú>i™¯•]]]tuB(¤˜Óa–kDÁE¦xA47‚‚˜TôKV‰ùlò‘©Ã"5I½CÞÄ’|Ù…CQ<3xñf3c”vÀi47/Œx. _ÕÕ+"Ûî+Ç1§Ãra$øùêIŠ-®éa¥Y ‰KäžuW„ƒI* ÑEY ¢S18L‚ Eö3±k_¦Ùk"*<{¨±2ã³C,‡œÝW†LRºp8ì÷'D|(õs$)qHšCN¢0#Á(¦†$ޱ9è¾ ÅH “•+;/‚PŽÃË&¬†R„®ÄUßgˆË5¨ˆ)ÅwbÕƒ sÌp$`¥9Útx @–¥T±µH·Ñ[Š©H,œÀšÁÜcÖMc|±5ÌÌÉ{»¢ÿ!‹?wÅj0¾¿cHu‰²qzŒ@3Ëq‡1œ IÆR”îpô„¦C³yœ¡½wka Nâ‡C¥¹Œ1Bs] <2ÓœêȧBcêüp¡‡neSuOû‘›!G \ïбVOÚS:Ýp¦ÞñU¤:>z|6s4tç9s|¸–sdFáßl¢­Eâ.O8Øüέ Dh¯›#×TA¢ëžÌþGn¤/ÝÑøÞã²:HO„‡ûåzøŽ*§ä¢$¦”~•ÖJ´Ø†Ý$«¹5¾®J芵³ÚíAäE %4µ;åv{÷ÿó¼qdÖyƒ= œ5œ~·øÏ麴=]ãMhÖqñæ2`E_ÞŠ«+œB*]Û¸Té ®4ËÝ®ô'™L¶À³Ãz·=Üa]™ß3€õÖzýZ^I¸ysׯ6§ízs*mðø>cƒsì6§S™NÓ¨?2‰¬5ÒÄZÕ§>+ p€'ËOÊë ¬löý›šëèëåwÛÝöü ï·w÷;jOŠè}íÁƒ¼žïV¶û‡’³D_—#€ jO‹AÅòj¢ÎîYõšÛÚZ'ßí´Ûñ×!a»á6¿ßO‡átþ°ÃÊëÒmÝbÃåkÚ×±ž¤¹û¿‹6=ÊõfÖö ‘‡sTZƒ­ª*2¼ýÝÕÛy·øçñçãÏÛ üAZÝ…ÅLŸ…_óE8ÆvMµ\ƒ(/A dÒe‚6¦ÖuùûÿÀ1ØÜ§0E¹û¾­úTF몞6fyš=>½{´Îížå<—wrMijÓ^9yûCšzÚî·»åùˆ×öØ¢gý´ÖÓýÛ«ŒŽÞãO|ùx<—u0X6lm¢ØAX;>K¿döÕHÏ,€º\B!]¬¡CíGN ÈåŠJº AFØïÖ¹¯Ý…»£ŸØÜ.±ùô´=¯î7õÇJJO–‹ºA×KL¡m-“8-SC7N¨ê8=‘àñ:<Â~,?QPnÙP¶âã,6*{!ùöú ”üs¹š–þàLõšgÍM 1øj¯«ˆ9Z•.iþ£™µJnôü¸p¿EÕØ®˜>ð°`œú#ôÀå½NÓžw¿b ZŸ³eêìŽ;¾wø$Íá,ö‡iC{ÚUV2UÆï²G ¬ X&Ùj)s¿tÎÿx‡_îñG"¤£¥N'"ȱ=_ùb"BëÙd÷ìBy(xÑ­ŠºÈt>L§ó…W4R!Z|v `BÛºÓKŸV¸ø4@BPÈ[ìïɬ/Â&UÍç…ëv|[âœÓnZ-_ý¼4ì³nêì^—ý;>˜ÿ”ËiSŒ2@oïSq®xßùºp5ýþÝÅúo,Fè¡õÁ?HDjLÄr¨k–D‰Ñ·­1|£U÷ƒ;ÒºÕN\<Œ^,»ÔáÜ×Çá‹Ç#:é%¨êiõxÂÖÞ¦7Ý Gyâ87èÐþþî$¹™z¤LÇï[³yý!™ÜÞL±¿¦ ŒPžøa/zS^þùŸˆ—êeCÝ]ø{°¨ßqh|ØÈkLºS—+Ñlè`®ñÝMg@»åΓ7ÃT¿îÃ×Óg~‡t~.?!ƒU¢Ú\¿ãw! ×Ä$ß~Þ~Ô(óAÌ›,‘!¯”ò­<Šø ¼î÷ò¨AW¯)Jákní =QèîEàx÷ârÿ%QÕÞ8Ÿð ia~€ýíËjGëKOˆ¨.ž(UO±Qd½¼ãsÈÓ)?§1ù\5ðD„±òbCNm™¤W=áÓp|ž¦YšÑ±wzOÁ4Éå-½˜Í®ã¼ ®šõ{àùtÆ’-œÎøÊøójè‰ù>â/Ÿ`È ßcyô{0ä¥è¨Ã1¤Ïô^Š&n®æBíêI7sgI¢h[_ÿ½ü|Ï™#¼ËU-¶†àvìë¨ò³7|q¥“]|àß"½†ÕËÔÌH¼=§ö¤¢Ô[qãÙÈ»*ï2¾«’œ+_õ½¶KbDc­µÔ÷}Î ÇÃ/ÊQ…¨í¥D½‚nV¶¬^¬q W3¾hʸ¿ÿóÃqºÝ–×…iø !% Y|³ †¦|£“=%5,Ý–Ì¥6~þdÃGX™«0·T..¾¹Û-ɯþp Z©endstream endobj 267 0 obj 7021 endobj 271 0 obj <> stream xœ\ÛŽ$ÇqA0ö+êm{€RefåÍ~²K¢>ÈZC0v oïtÍt“}M÷ìpý×6ü>qɬªžž¡i"µÑUy‰Ë‰‘Yû·¦kMÓÑ?úߛݛßüklîŽoºæøßÝ›¿½1ü@£ÿ¹Ù5¿}‡ Þß¾‘÷LczÓFg›˜|kmnÞïÞ,þ翯Þÿˆg!Ö‡C×&ãðÂûÕ›Å÷òk)µ.w¶üøÃþîo‡³×mn]ÈYŸøËüõ¾M^ùÕ?¬ï–go»ØZSÞþ°øÇ«kç\ÛY»xõÃû?M÷dÚ:«£­Î2}ۥμ¸‹”S¯?þôi¹ÿñ|]ëÜÿíõ†õ3 ¶®lóóWc[u÷ã§õr_ßLôëµÅþMïšë>´1šLOvm ±yÿôfñûÃC3ÐO™®jé竾Í)»Xîî·+ʺ6˜PžxלÖÃÃUj;r\ ÍÍrß|¾ºöPmgzö§á*´þ?ŸŽÍ½ACe߆¾,{{'+ÆN{›£þx8žæ;2‰V_¬´9bâí–ǰs-­Hrm»¾í½o®H?“Ôµ¹sY-að»a]|mØâðkãø#ýöaѬ‡íýÕ56úÐÜ?\Å6çÂâp÷°Ü5¼«ÿ-¼ÝüDÃ¥Öú`˪†æÓ|·¹…úrÙÍn½[n¶óýÚ¾¨üíÇ+¨ps³nv˯¤ëžVF}¸º6øƒO~ñHf€`ÍÌ{¢¥]¨Í¤XaÛh£ìlØóý›Ç#lã¬nÜ¢mþzÕç¶ë¼Áà«Ãþí©yZîO°9~:Xï‡Ý=É&3™BN·L3%Ö/Þc›”Ÿu)7ìF]L˜LÜ£ÍÞd CPö<Àò44p2,Óc¤Þj¼¾/@˜šïpÓátÓò¼ØP¥^ø±×ÕÁ÷_›ããÝÝ•!½õa1O›Ã¾y7ù¸]©ww&9(JX/¿È~» —Ì—Ý9¶]Ýù8ìWgŒŠ»ó¾Z“YŽý-ÇfI¾F®«/­7«Õ°ÿx%ÚMØžËÕãÏüÍ zS€æn7Ûáþáp#™ä) ôuMõ÷ºæPÖFOÑÚÞ6‡{VÙé0ŸÒCö¯D3ÍÝ8žàÒæ¶Ù‹5C‹ð©¸4Œ&X‰¯P¸VTþ°XµÍ¿_!;‹à|‘á–ÛãAàmˆ©h§úÖ‡¼—œkØÙˆoû`‡ýn€×Y>l–Ÿ·)ÿÚØÅwûŸ4}”­Kþ˜^¶´jmñ›s“øäryïi½<íOóW/´ ËêÀqøñª­OeÁzø>A4œ µ¿,+T—Œ/Oo¯ônð“qéa'‘ú|ƒß1Z"7Uü:ˆö}(¹Xèa¿µ€îÎ×8à”غ²óãa¿Üjô:©Zv1ÜÊó½¶ìtØß ÛöÜí–¢Xl2Ò|حѤÖk8o7ûAò]³?œf†M]Èç†Oò¶í Ú.FÝJš½6Q~~‰rÁðlîjæ¶­•šãaû…§ë‘DHÍäúÅsîØ£w¸.Ê…ú6V7`…uœAŠÂ޼ßõaÄ®FžŒS[ö7ü:~ñ»n }IaÉU¶ØI¾$À…ZObMp4kŠÝ¾Š›øÐU§W–síúÔúL@le@×%ÑY÷q¿9}m$#ØìÄwë-ÒØæ–΀ð… `­Ãƒ%ut“IW¬cøÍñisºYŸkö³—¡pTHnRS™ð¸.©€’¯7dÛ%àWˆ–±"<3j‚Ú“}Õ¨©+>áõŸ•›!Íט%°QçŠMKÂJd ¢-P™c”ÌÁ‹B‚ÅYé,ñ¾Úü½„ ÌçTw ë‚.'`4èò·¤&|üN6Ù;<_è Ø6ß5ÇÓ@ï`¼ÕæXì1VŒÓ­ÀMÆ‚6a©µðŒå½ø_À¢mÉAØÙ„//A‰>kZ¬$öÒè7K‚‘Í©‘Ø%vaœú¨šEDM5› O:IP \ ê¢Ñû-¹0û««üêÜð0Ü3,„9€±Ú‘1Ge àG5!PþÌÊA¨shŽ_¯®áº&wýäë°k›÷XÉòæô(蚨¼˜!ü¼€44ªÊ>_ðËœ* _À b ìB <¯Áù{[ü} šD/!ºšæ°Ü£T ªˆÊãžCšt„   ),nNZƒ„I‰†lO¨B_v.¨A¼üØÔheSô”iqU%âl°ã&% eÁxÑ8[09Ñ÷ŽLŸxÅ„Ñû V"ôùž’}ÕùReUtêP4-¹VHÆÀÆeÄã𣲺îQP-%Òœ ´tu8ätïDZÄ>št‰ „ðb€ïWfr·œA6Gr®Ç£–{˜-¤è1Û% Ü–ðLÝæq¸¯Û,Æú[¶¹ä7{ÀÖ§O·âÀ=eéÓ7 QÍ¿Áßw†©—\²I­üö-ké°G³tTßN¦q>œ >}Ò•‹»²‰:©_©Œ$ÌDéA8ÎU”[F5Ö6¾Cp–ˆ=V,]µ*ÜR™§þ©o¿¾}Ëà DºZß$a]ÅÃà\c Sìd&H /=ŠÞŽTŠ8 P!‘¢B*mŠÀ}çE÷lÌÅrUMXŸq#­æâÊt õc‹Ÿ3A‡—R Y Wúíã© C@ÙY¯0´^Rùrûø@Ž„8»W}ÂUb¶ª~lÝœÞIÑË?u(Ýkœx/®}xØÜmö¨Í-/Þgvê’0vgyì8çî…š[›5£}>,ð;ý qÜ>QMøÑö/Œæ@ª\-èl§5ÇT§‡‹ VPŒ „"V¤UØñ5ud"ŠÁ¡d¾ß.o¦³ÙgÔÃSî.ʤµý|ò ‹+ Xz_ò ÃØñ4G9'ñ6ûã >Æáz,¾€Ðtc°ÃBš0¿Û+¯¨Å=±ùçì(Äi{ïâKùñîÌ’p¿4²Õ—tß];ı"Qóî [{{<HmSõ¡KÉq60lF»þn8‚ï0s̽ÛM>óñ¨ó äd±6J,…Å5ä/5•_ƒ6Ãeªç=;8ÛÒeW•÷’zB}Ì$‰©#yÍÀ77}HýWñ3$Kùg³ÿ»G2±¸rôŠ}Zî¥? mCW§æñžsÌz³;ÛÛF}•9TÔû‘ee©X ««Ô1¦±/@®Ÿ´˜*ÀSó×¼ª”³•ò.h}”¤Á„  gÖóCs 1M}}¸6£"’±Òù>÷4ÀîuõmÅ"ràê«gÛu¿ä´Ý ‘Ú׋β@rAõ f3}?É{€&¸jì7Ïb ÜZ¨Ûsäí¤;Iypš×òÝj’UM¸üÜæ%Ô¸ŒÑp€›™ö^‰‰‡T|¦…*IÛ-§5—1¬ó¶ùTy¨å%âëVUJ(:ŠIíJ?¢oÇÀêÿƒ6mGÊy¡XöºoÛ`ä_³ïåÍÍáaµá†0|­+©ÚÜÁN_K›µQ9Ü“.ù5XckF§§¶ª ‘ÏOËTJrzÈ$æ¯u‰Q›b¹µã…îA²/‚ ²SQ{;"Õa§%.ÔFëeAeòYߎPê3•­m1“'׿OWÜœŠŸí2Å =Þ(òyÈmmÔßÒÆ]S¯ÿP)e öÜ„gLg©…Sés îµ Jškv^–O‰ ÍW2ñ"«ìBU³œ”‘ô K'8aà ø ôn¿Y ßÊ1£§RMÝ—´ìr¨Ýu~<5(G8ŽHƒ@HÊ{>ÊŸ¢‚6±„ÞˆfJûvLë‹§ åo{ÿ*F´MÚ‰zÌÄÍçi«›äª4ó¾6CõW°ççûÚ]ÇÅ@=·gÊ1lãåS(Ø%Ö€nFédmâZAË´¿>ï•4úr£œÄšã½ê¯§¦ÂË€º¡fãò(q8¾óÕ&¡VO¼ŸèÓ¢úPåÊ÷€ÃöY`NÛþÜý“ÊÐU)'T''+Ô†[=Þ(I@m>¹¨Ãí?ÚÕcéþt±Ÿ/î6ÇÒÙ§:ÖŒóIj€ÉÍFyÌl+}òu+6 t©‡ŠÍˆ#WÐ]µÍo¿BOܶ§ ñ°‡ÐÈ¢S¿*‹زðÚ±‹%÷NÚ³óy\°Ða¹‰RÁÕ›¶«¹ºÛæ0Á™/(<èDu;¡çpÐÓ°“Î\$83õñÃÃ’.™t‹¯Êæà=vÚôÔŠÄd ˜Róõ“0¶ÚÀz7MîÍ yôdE«m÷²×X¹qöÄîs§Ý|PÙñô˜ºå›ÿôP"NOÄäú W>À't2-™Öö´> æ%­K›»õÅ[/³›ÅÍz8žZ±Ñ´7êz90ýnßìvkÙüÓæ¸.wH˜À’¦üt«SصnäV—ÑÜ·i,^¸Õ*<<"ýÞ"ÌÔ­Eà¥þB²Î7®&ekOgãiÈ´ÖSG¡Ú|¢¥Ãg0‚á$Fá&®ÓÛ -’ïwëgý8FŸ×{¶„¡¢ÂóÓªrJÕl{=R‰âêæPª©šZ_ÄÛÒ<9)ýùÂDiáÚˆFÌCpÙ| ‡þåý›?ó “æéiþ„Ôw†وЂ5wS 77[‘ÄIÊHŸE‚eÙ˜*¡l Ý=(‚ž%t–V$ 䮫Ãd,”$–j’Xp–8‘ åP<–D$ý#ŠEšˆn-Í%tÑ©H,/êËuZ~™¡˜d‹&‰çM‡²~ºKBÃ&¬­J ËEoYmAY¬,?èg¶E’t~¦ªñ­¢ñ`5E2±ÓöÍ_h¤¤2G‡¦»‰$‘'ÉlIm—ªv’ÚÎÔ5f5UOpHJxüL ã–À§H¾%StÏ´î°ú™azT$$À~UøžYþŦ¶²D Nå ¯ æ(‚ÔfDy"Ðõ|Y9²ºA9 æ4 d3"PW@¥àæ‚$ÓÖW ª<›n®Óª'@/^æù:ðËêÈjAh*ͽJ:u:zËѪÍs Ö¤s÷bã‰\%Iô„¢#kLt2<"ôÓ‘M„ÿIzjKNm å™3IÔ·êìUB¬dþVh“êÜhDR©?Ÿ½J’‘ð}®®Ù“³„èµxj¨’Äϸâ#UÒ•ø‚¤—È~bñ-}YÁHÔ½áGñLÒË(À7P?þNO)D}ÍIàT*Q Œ‰=e"&zÝõÕõ–˜âM$,ä <“Ðu7{ 3hHÇPv^ìIof¶%Åž›Ež*ÃuŠOêUÒ{â-FÁ++I¼X£ë Œ{?Åm \Œa u£d„:¯0V …Æ 3¨£¹l?—ÌVH«~é«‘©Ê¯M>±f¡¥È_…¬\|ž‘¶sõCÛüN 9K®Ð_êLïOrÿîùy<%BóËçñõþªá®%ß9¦Ãx¹E|ĦÚé4FK_nfOt}äy6Â6x%w‰’;–`T‚’;H"y QÉK  H”ݱ¤$QvÇ’Lã¤®Ž“(B¢^Íwäk(»ƒ¤§Xãg˜ŒHôy'˜"!¢¢zÊD¢OB”×£o'Ú:—§˜ãšX$÷Ê. q4rPŽÇC#÷ÊñxÍÙ‹¤¬YwÑ+ÚŒ;í5$GoÍ{%yçö"ïf`™’¼Q”ä šð>RÕPRšºÆ¤S’'t“ŸÑ„ ,0”¦ Q–ÇàüL÷ôÛÜ>‰?ID‰§²èg–OI­ª¨ÁôÓ©D½Œ’:K”î ¥P ó=Æ!öĤTL(—J˜@eÍ£Ä]³R<›¸9—D½¾Íó¹è†JÄ;eé ½¾E·Ie_YŸIDƒ&Ú%Šbü–3¢g›çÅ>HœØ}"éèi–p:Ç.ùÓÉÈ–õ;ÙpÔÌ$Žô;±2éМI‚¾Ug¯%~“·”øaäN#UiÞdö*±Ä\õÃqÍJü a°÷†*IüŒ¿‰D‰KØ3ƒ2¿Ñî!VAŽ DOª‹3‰Óq”ûM$Jþ&o)Õc¯sg^=KGIy.±b’’?^ad‰)e9C¢äo”x%ã[^ÉߨgÊÞ‹-¼R½Ñ^£¤ØÔ‡j÷N©H(?;Å-ñ„QÒ›"r‘¼+65®y”ôbe¯ä/ñåm‰8HØÃ½²¿QÒç¢ ã+úÚ:2ûFKÄ+±Ü‡]R\%v¨<{ÆŠÿôʽ¤Äò2²æ=*WT’ô+Þ2fƒ”‘Æg‰æã/ü|.ŠX•4öuÍå«k®sQf÷¢±’ 5;T­žeÎ<‰n™ŠR»©Ä/ëæï‚ë ô•=¨âzê{ÉN#þUIÅ?Hüo0Nœã]}š#Ð|…¿Š ZÔqQÔ[é ³«þ6Ÿ_F(t°r.°ÁïNú½ã{ùäïùÅØùæÝ 7$Ê]år‹øÂwdˆÚTÄ›÷/^äï ^;Gìâ…ηžá´õk'ßYr»ýØÈç¹Î÷Gè ½¢½Üž†zÀ8~Hµ_ž6_´óëE°ïÞ<Ü.oý(tü—oâ ÍîPÏ8¹Û>9ÚÛo¾zÐI]|Ä#§ýÒ³EO¯ž”Ärð@Ý{]Ž7ÓxÛdx8=»ij;¼~a¸dbmÔó¥pìŒÏ¦é"×c¸É©;ŠC9u¿}׬‹àÞã8ÓëhtÒ\Ïê‘Ro§E“Æ£ * V“K8Kú|„Ï¢moË—ÐÀ7z²Ow‹& ï/º)w<ãù¥o> ØŸŸ[Æé5¾—J7¹Ÿý´ÙnË]|:pô@ÜQÊO=f Œú˜œS©ý£¿Nî±Øz©—¯¸îÖ¢{h½áswõT´oÓxÈ4ÎR¾‡™]ÅúZ.²Ñ' r„¥·-˜{¾tJ¾X®ŽÓ«—vr—áÒÝËE«ßÍNƒ.>Þ>n7Ë‹÷¶Íä¶)…âùå½@%Õù5“WAîålÖN³| å{ˆ]ò›é›èÒŒj›¶cˆ~F³¸¹m›¿”ËŽHÂõÄìFï‚Mþ~ïˉÿâü/iè'Úš¿gëÙþý?ÞyežWíÇ+:íáöçײ"_/}í^"²~éqùcEýx<úޝylN4ÝÙ\×6þR½~³rq¾ê úMö$/ÐU†z ‹ž(_míåN, cñÄÈ 3ª›› ^þÒÅWÛuV®#|à×¹õਯèûÆ$¢GÔz¨’Ü9i=°þe2ÐU 0’ äú²‚,ü˜=I€\\³³$Ñ0Äíå%jŠò3A‡£VhdIä¨)Üé3\!C’d`ôÔÖ‚Ä %™HŒ”ç,±¼¼$e¤‚å—Y"+ñM,Ï›îÊúé†+& c Lå9é9ðj³Êbeù ÔÒζH’ÎOU5yK5žPjgS$;…ÂHYeQZU’åzÔV$b;[µ“Õv¾Ì–;1 Š:àÐk¹“²êvB`¥Ö‚€ú¡­Ó ˆ™Æ’‘ÀK»êºN¬ô"¦fJŠ?R×–âTt#’&Iéu~Yå ºµN‚¬+·Ô~A9ðÿÒLd6"W°ô)ç\eÚú øwžÍBGú"O°ôÙ,ÌË+Tª#‹-ŸøÏ¶_%½:½eƒhÕæ¹Ä ™ÆT^l<‘pû•%Iô,ÏŒÜÓýáÙÈà8Ý™ÄÓ¹ÒԦؠ9“$}«Î^%FŠÊÉ[´]XìUü|ö*é­„Wõ¹ºf“¥Ø$Ò©{j¨’ÄÏÄâ#UÒk|‘¤—È~jqcª¾œâƒQ÷&?Šg/£tÒ[¨‚.Kka|Ñç}ñ5w& t®ÄJÒDžKècÓ @Ó×õ–øâM=Ñl’ôRLO$NоÉ[¶„dÑ1b5ÍíÐuÒHm5JŠ=éÈX·ngFIÇ#>/(’TìIÉNªx¥s¥3 Ÿ²Äèz"…VÞtU{GŽ*qEÄìÒÀ‰Ÿ1%بZ AWý¿ðîJÐÍž Ô%‚¨[22¤SÀŠ„p$Hò»¡³Ç Ö[ò§ÙÔAÍA½T(‚S»uú5‡YF¡ÑDC%¿eU}¨¹k–<8¡PõáB¤ÝTâ‹SQÇÝÎ`;x îŠÛtâæPW$#Ô…± -ü7ŠÌ sÙ9ØÌWø«: Îr߈ÙAi$ ‰Ëøb#¡±Úæ÷|u”xsß•òîf½ÜßÉ×8þíODäé ºöì¤ ? F«_ü®"ŽŸžéW&l~󿆘´yendstream endobj 272 0 obj 7002 endobj 276 0 obj <> stream xœ•[Ý$·qÇAqîOHòÐošv;M²ù¥7I¢³-é 8 qßÌìNëf¦WÛ3»ZÿÕ±Ð[ªXU${tºØ6 ßÕ4Éb}þªŠ÷]Óµªéð¿üÿëÃËý£oîæ—]óïð¿»—ß½T郆ÿo}h>{ ”×·/i¡j‚m;UãƒiµŽÍëÃËÕçW¯¿…oêÚÞFïáó×›—oV›oö÷ÃñêÆKÕꇫo^ÿªÞº·­3¢ïW¿\næÛNuÊñÛé?¿›¦í»oñ#ÓÁ}:Ã?ýÏÓBkxå±±ÕðûMïZïULŸÍ÷Ó|¢/3:´þ’öQm|ýŒ¯‡cóöê.ÜçVÛf=çq³}HpÂnÙ·VŨóÅ›Ûé¡9À÷7nÑ+·ºwmóÙ·™Y™áÛÞ‘ü=n.ùìø·ë‹«+FgIüW\s3÷Ïø Ð}ÔÕÝÞ}ÕŒÇGüY¹6Ú.ȦwWªoc°=\¹‡¿Ù¢ºM³Ò®]Ûw²,˦ﴰ¸>íŸA¶øißv½lXº1δîv£4R»68Ÿ¸:í¶Íiz‘Ö òJ8Û¾Xï†ãÝ•²pÜ ðµ «Í¥ˆÁÔtt¢´Ãî0Œû I•‚¶…÷ñp¿ß¶ÇÓp§c37ÄvYé^×|WÇ0„¼ÅÃúq3þD!ÆŠ.›§Ý¸Þ‘A·>ÈðÚ”‘d ŽÐ…l[pIPMèƒ[}wÉ"µBô"õ™Ö)ÛšlU¸7RÑ®žHƒ  “‹LïàŽÏ/H c|²Þ¬ž†ç+W-ÖÁà¹ôÓ¯¶¿x¸ lÀˆµbR1r§çæ‹é8Þ5ß§éȇ΀Ñ|9‡hÕ‡Õ¼öûæõØ@×i8¬ùã4o67 ùP¶Ž´õ÷÷ûa<‚o5h"Nô_­ÇõvÚ §K[P ü-JdyŸÏôð{qçñî8ÁOÝC4 ÷!…ÖèÚX ñ„œÜ§ï;ÿjúh¿mÞ ½}’zÕ:kÅw(™o>É D `üÍ ­¦+§hû§ÝöØ<ãöÊCPÎ ±‹ýê|l;W‡ì ÎLÒÓ®×éÇq®šyý0ÞŸ®aCjÑÖâ†OÃñÔ 6H¨·ÃyšÁÁH¾uÚÕN~£È,à ‰º5}:¸Ni`¨¹ÇO]ßmÄG†;¤…ÿL6ÕfƒÃK%{Û†/ <‚ªKw½óxéAî ,Z08 ›k<W‘ÑÚ6áy:Ó>¶*d®Á {ÏBF $!wÆ÷ðýC3¥} £èÁ“ðB°LeG:fµm{aW7bWTx`½:Ǧüz‡ÆŽækz• ûH¡ç¸á"O†ÓzÎ]ì+Ùãôâf¨5ç'­áª±~’~"ÄL9\'¢2 Æ –ø=ëý—cïB6x@3ÒÙãñ´M&DˆZ]0À“Gî!ÛmOà ö’Â|¬¼$ZG!¯¶Þ'F Æ/›M‚£žÄ³¶yuË–ˆÖš¢°]¹|Ÿ÷ç`ø|$–:¯Á¦†Í&IMYYlžY”’k(øh½;Žëaßì%Éé6{ê#Ë'–d¶Ý³'TÀ?Œkp“'ÐV’.€¸½Äô1ÅtX@ABZgB%Íþ§ãø}s¿÷Ó<ÝïRä½F#K8êÕ‡ì8o%Å ÇÌÆÃB,)SÕx„œøí¸OÏÍtÛìÎè¸èX)RæV]Û‰/!ßZ ÃýùVÂ9`b aš"‚3!çrˆ†GJR½omQ½°†Í ×±O3X +ÜawÆ”.€Ñbº== I×!hHFY ýTˆAÎAvØ>@à!gi%£”=Üu³›’‚TÙ÷©Е_ìG»õ­Î±º¾´ZÛÃf‚ß^u0^›´VrÊŠL©v5¸“b™«Ö4+«½>|<7# ¢‹%JØ ¡@52dÆe±¤„Gqˆ÷‹m’1hn òTç[vyÚŸÑ·çf ¾¢Àæaª–6Ã=›³ àz™¯éþadÒCJpEÉ"–n3HŠÊcmƒ¡ó”Tˆ2X³P ã·*‡Lð™è\ÌDxw…@ß ‘gÃ8ƃc(±dF8øÜ 3ž#÷˜X$Ù$@$_~ÑÌÛÓùrÖ[É|˾€päœBÁ5øÁý=€º2$éØåxèÌÇ @붡瀾™O×Nét:Ý6>°GpIÙštv„-K ñ ³[뺂2æ!øï0|…قļXÇp>MT–Mªw¤†Á%a°TAqFРZÛÿ7­ÖÛûÞj†ºÞ!¤K>ºV›¢Š¿…ó,ú äÂÒ3}Bc3 þáÝŒa{سQÛþ|I·6ÏhÙ)ø©J{uÕÑJ…ÛIÆ×RF—¦ÿ©ýçö_JEüÕ Ä:àú`¥ÂæùÍø–J*ßšS†‡q;_ (Í­- œV3ÂsL5ac,"ÄÇõ°Åì¡ E|L úýï¾zõ)ÐúÛ¯^ql„2ÛdUjc]ÞÌÄø&›9¦„>°i<ò¸ÞŸ7’C¡¬ê$Ænr×€ò2Õ&¡sR›hì$ä“MG©ŒrQ•Íh/·çã:ý… j3ÎÁ…^’.ÀÐ'Á>×o dZUZ TrÉ5Ç¿pÝ Tƒ`è yŒ쇷’o =÷>x|Y|˜’Ñ€§·Ãú] º¿89˜ì …­^AjžÅÎuev×ñ$ò<3Ð…B×¾Ç4ÙÈ@°¡”í£oÁÉ/tߤ®ŽR®u½$aÝs{àI°éâ‡ex~»,A¡Ó}¿DÎFá ·Ùe©˜±föÓ=¡1l»pûþ˜K®˜Ô˜î)v€o9y©°<¤Ý¬ ¥o!¸r}"³˜Sfê­3raˆ¡içù´=ÌX\`øGh‡*ƒ°V9À«cêQ‚бu @O¾AÝ–Pƒ/¿x1§jÃNîäê^÷€EÇÖ‚¡}}íU’7à’‚èARn¡pX'™XF‹Ÿ¤¼˜Ýn:ï7ÒéŠ3óF€ žª´îI‰”úöç䦛¶ùuº?h2ª ÃÐÅ0QB‹Pöî˜ßï ²Á^]V¨;cJRì-e‹aó@÷“æÏþIд1:‡ŒÞ2(Í÷ßC±ÕqÝ<ƬÓNºµÃÜàÊfõ6.šð&´>·Íbœ`NÖx Ýè}€r8tàv €f},Iš*ž”r¼MN‚\kÀÍÏO;.€ ŠºP·ã®ò–°žÛ<ïÑ×£ÔGˆ^;ð=„·çý TÉy¾–ön‡X´—€1}+%Bé5C”ì^ƒÝk%ûDý…¾Tò*©õ}˜¹œ.è*pño´‚;,À˜ŽÔoÜE(sbNê)ÎJ{·ÄÙbñtµ/©Cb`m/?P¹XÂv\ŽÄ?ü×_¸ìqˬ½YÁ¶·Ãc©1’}žgi­„äaSk8߈;ÕµhÄrÉ‚ÀŸú®Š"pº6¬Ìffƽ‘g Ìÿöúå€ê\óôR5xf ˆšL@Ø›CMA=6{¢ô(,M¦@f5ÁÂ^™‘Ô!‚a Ŷ`ªL±¸ ÀqÚâO«ñ×µbG¢(HND©ð7PÜ% 6°Ò6NÂ"r Ì^P,ÞŠÅÄd˜¸Ø¦Ë'y쳦k*/.ÞóÒáÆ=ðǨöqcH!S„a¾”¡zyM tv!®¼*KÇLJ(•®ö/¿Â"Ó°ªEýeJQ:-²þ\–O$ýõQx„€£X>ÚÅ'ƒ½3Å´éH¬´1fË…ÜI‡…j0< \Û/4~êIáš8ûI%ÃÒ0>4bøDˆI¼@ðô^ F8ÇN2×´ ZØœ[þ5Ò¡y×­[œá­Êvà#ª[KK –96eÒÔ­]š»P°BÍ”èH¦:.)`Vùì¤áŠg0%” ;ö‰ŽvhúÅÎpª¿ X| Z Ï«òé™2ñËU¥³ÄSœ]žž) »®_X\æÙ u“¢!’²jp–¾Qb!B.ºLQäÑ}CAòÉ):…M>í/(–öÀ¼º €M¨åMƒtG0 ˜3S(Pjð ·¤7vl¨èåQlÉaÂGJÀ>ú‚‘Î,W9qG‘°é忢 ôj¡©BmE4®9êJÇ;›lBÑ¢MX•¢Å*>Ë^P,é(ŠùñɱL'ž†3²ž#‡ŒLñ"  ôËk…¶âj taì,ó¢Žw/.ƒ oñErø«Ï—ö´%'4Ì™DôHÕq^Ã5Ââ äy±ž¶8p ó)QÖ Ÿü@³8E)’d6÷E†Ë´A©$€q¸Œ5%ŠIÅëE¸–Ì¥Dìà(ÝTaŽ)U˜sÂrX}Ì2ÌÁY±¿¤tõ>_ýì›2‘¦_e:rq–ïÓ›®³úVu?󈱷Á¡8üê¼ÞI£OÅ®ç!ø µïa¤1ì}éØO§jÐs8ìšñ›!i®êRïc3¥m>ßsB=”¿Ö¥:ùéø]ÇõrÑ1I½4l8`»p“ûÊ ««6``‰}¶™ð>Ø­ê/k¿zæ7T],FêÜP‡¾Óv5FàÈì€rkYèCiºt]¨ÄOüxFéØã‰÷ n?ïX0¾-}¹÷LY;qØÍ¢k8þ%UÁmóé~ÖU¿;¸4ˆ1ও-GšJXŒ€­I¹}àצêàs³d3$-ÐKjSSó0õ®©-ÄŸtö»–ÐY¢ÌM«Þ\m –vuéóËp(`qãë'X¹­¾áæ<”R¥K«âUC¯/°€éüÅò4öÍMéò’î4ñóÕÚ®/í—=³æ‚ÊÝ|‹ÝƒÜ^À79évÇf¨šºÓù” 6õ¹sˆ+¤Æí»L^E ¥xšÐ§5UW¦Ö§êmÓŒ}áúMZš.nß«˜×WîCoEÒ“Ä&¿­ å%ä{q`û)M i¦%D~q7Q*ZL"¦wsÊ®[J\ ÇUëëÕ]zè±|EQÝ;aR”Üåá ¢_ŠÐ›¯¯p˜–Ì“ÓNj0,s:–¯YÒøFâZ¦C³ÿq}ÞŸš$ÅiSJþ”å3=¼C'K­>±Å¦D·¹“Ö”þ ÒåOê½IG|U´bÈ«®˜¦,'l;âgfuÆ×6†ãzä)¯$t—“NSs0¤TyÇpßo>=§Ápêd¢uP/éâÌTÂ&X¥Å<¼ Ci'¬˜ú’>ç$.O ŽN8ðžÁ¢%2<7õälÅ™B{N£¾-ù¦šl݉žé*:om~Ä9½“Xå›Ï9›>2‹ØòR©zË~·|T˜æÂŠJf=Sçxœå „·¦Ú\ìd˜ßå§_G€ÜätX±Å>{ú{ø<åûÈoÍb•\øMŽ«w2[hÍ9 ·†½>½˜ÉYR}D1²rzKSÛT„¼ÈzœïK¼éäÕbAË`Ȉ4ŽWË÷È<Éè ùÑía.³7®¥YÞ$ã„å©÷ÉÃÒP¸vÅCQÔ&™>?‘õI4è°6å9% ÜËíUKoõDneP)9jÀZˆh®~>3ãèXó$ 2ßSå àÛ‘¦Ä¿¤p˜Þi=Ž›æ7éA;š2Ü{›f‰ïëW'L´Ù¾°WRæhø¯èîô¦Ëásê‡w×øÌ‹Þ¡@ˆ½Éág¿çêÛ4¶z‡àä=úïnOÛȦ¹?ï÷ü ª‹‘ë‘2›„ÐŽ³IŽâØèɯvßW¢@\¼­KÙäãñDë}À7í Êã{,ìÓ4sÎGS(¡±hy¨sƒ}!ÔOf†ãsz^=&‹ñã¨_öñ}>+šnªˆŸ¥äØ£Mò±ÔïJƒ;[ESšDQ–(Â3ßÊò¦8#² ‰•U"y«©5{©/ìRÁÞŽi–Æ4…âi€âY‡]–gšÌ£g9D ÔAm%P›U+àÖ'ÙwÔºJüײ·„úqíbhT”ô>¢Ö¼ó¬UKÝ?­W¦°•¯!Qµã5Î’S<}œ%K ^n óì©­¯ÓóÕ%%v̳gë€*›O/ǧ˪4ØZœ…c,9¬çXž9´¼*¢u¥{Eþ&`W¸’F¡h¶D¤XErÖqI騇 Mz/Ï1%5åÓ-ûJG;wilYí¬¢Ã?-(iàWkupA±¼JNÏ©q_VE¦DöÔ@£šrzE‰äsÙ3ÏÞS(i°“¬—µÓ¥-P,[K¡hö9\•,Ów4½)zð+ë(r…m>òÝŠ¢ih‚SQ=¯òOÏgÁåt¶ü—ªÆX> sjŒ…¿…¥dŠÄ˜t†¯qO¡HDñß Eâ{ÆX^â{ÆX^â{ÙY¢yEáh^´,±»¢ÚΧ %c¬¼*c,/Y!#ª|zEá|SìPxÎ+Ùq¬1–Dž1V¡ÆBJ¯jŒ•õž1þ)EŽŒ¨Ð¢üEÑ>cŠ`¬²JZYR>®J#^PÇ$ÁXÈGªŽ2ÆJÜÇcŠ`¬²J0V–sÆXYQe}UÖiFT>çìBq¼³`¬BŒ…«bÅÓYaIû¨Xc,¼sò¯Œ¼ÔocŠÊÒ09úê¼s°5ÆB¹$_Îø yªÆXÞŠ Õ7ÙOÆ4^êÛŒ|o(úeüä±gªÙ@:åc(j•}LGw/giŸy–hl2ÏòMG<—³°é§jŒ•³C‘ê2ËPæÌiJ%x¨)‚±<`òÎ,âº`××£¾èµJŽQslËñ&*²ß*þÅ턲àðïÃX)šªÆúðÓ™Õ7m†VxùóÍxendstream endobj 277 0 obj 6813 endobj 281 0 obj <> stream xœ•\Y[Gv†aä!zÏû}3{ qj_òæØžXI¼Œ¥$´…˜M²Õ´¹´I¶dåW‚ 0yËÙêܺÔ2v‚Äö×µ¥NíòçÁÌí`ðåŸËݣߗ‡—§Gføgø¿—~~diÀ ÿXî†zƒ Ïoñ<;Ø`çÙ»!?w®ÏwfùËÕóa,À28™y±&<_=š}Åm+•¹¯Æµ?¾Ø¿üùp1ÝÕ¹OµÊˆgÓéa^¢üå¿V?¾¸{¹¸˜íóÜÙ6ûzöWO¼÷sãÜìùÕ‹çÿÒÓdç)'«­.²anŠ±ï¥¢Ôä?ý°Øÿxy3÷þ×M±¾{‹ƒsßÈür:5Ï•w?þp·Ø_Ì|âmžÛà‡'!Ís¶•Ùðõú*ϾÌ^`§Ô9˜_?š­ç»õv}:=ž¯qí˜ç5•ÆÎÃñ§+`L­.ÏÖ¼P™»vÔÕpذÀp^œ~'^¡ 6Ý*òNÛíãá¼Y½Ùì_÷8I# “@ŲQ5úr8ûÕ⸶››ãâøæ‚ô’pmý˜ÿ½²%Ka±'ÖÑXbw7Kyd>(LñtÌùðôI\°M Mé¯goä°Ãéðp¼*xOBš-A‚<¼¸¹‰¹šh óÆ ¼@&?ñÁÏpA8ìæ®<èõl³_nVëÓpû°_ž7‡ý ¶\œ‡Ýîn8è¶š0;lOÃÃéa±Ý¾ö¢]5ÏS½Ü¸áš:¹Zy—Õ|øtwervÃâ _KqŽøÕ—îy=P×XÒûéYn>^Ò9?b¢²44¢ì¼fKÜg2nÇážXê¼$×tàðñ–5N¯*9,{VW`“ù¸&-ùËùñpâ¿û¹5ÿç‡õ~Ùæ•\sÞcä=œa»Z0«-Ü¥ÇÃÍÙï2À¼iÈÍ~µ&TÚSxðþ,ïˆ>:™Ê ø°¼ƒÕq|Få*jBLŽ,ˆañðËf» <©h;\5;xÑ»•îYð)Q9/n`Ƶñ¼>Þ.– ,HÛZ”ÖÃ#¯g$Ú\¢ƒ™-á¦=I@© n¶ü 6¡)`#˜)%æzöúê †(ÍŽ‹ûûñnÈ&>àÝUƒ[Â÷Ÿe¼oø“Nºá=÷Ý …/àݸ~O¤×ynVo¶8.vkP"2× ¥–ñ¾ ÄnpÉ**Lµ†õæåÝy.Þ¾2 ûðuäغ*vœÆsFEùìÂóˆvî‚o7ð¯ÿwùúûyJÏeù@lGߦý9ÁvíŠX+û4êüi¦TÈÖ ¶ ̓P%_ §ÅíYñpZ׸ÖÏý¤4¼çf¥¶Ö Éólê°ë‘<÷aËËäÁj{E` ¬¥<ƒ€xps‡˜ZÛ€)ºL˜ÃNÁ‚S•Hs>œ‘E@ x8dpï /’x٠ήb2€\7DP-ñNÔØ Ýר8»WlmÚ&(5¯BóSÔÂN&ð²6OþÜvÏ€ýsчOeêÅÃBM°BPã´ë‘Ú” s½)ÏàDÑ=My4ôuF¯!£ÕÄM­ ¬ã§V¶ªî1ý:ÏÞ›ýYI9ÐOÜE‹™)ýµ Õ,£}O&aöbN®™†Ï÷¸ýè qæ)ó«ÝWTç1šß®$`âŽÃgXÓk Dá.XMQ\Ï?bâÿ$ §©^ŸÑ1‡û›Åò§a³»ß®w.Z”séÒƒjR  wëÝîðjý¯8öy†™ä& |cã˜{}<ŽïZ ÜŽ[H2º§ÎË ±ø\‘Oª(û¤ˆ€é´p·½x©-8ÂIˆtÉbM© ‘*zA8H^†Bq#+(ùE„D¹1ø´EÃ.©ª¬Ãæ5ˆm°øüLØÜÔ†d:N_C×"Ú^™=$Ôæ†XdE‚¸>tÐ(‚WÚ‚ñ)Šà-C¤Yˆ@çjJ(² Nø¥³Ûahµ èdE¶"ÈCha vL#_…ÒÊò3Êž*òózÂ*ÒJâf¡ÕH4¦È;B1ÞÈ»0É&Œ‡»“¦Âq޼( ®]„ßÙNì &ik`~„5,`ÔNHo#`*QvLCp¬…åñ™ÅR!Â^KûÖ!ÑÉ™sSe÷©²»ÎÊNv×½ài»‹nä*»'qLCáÈéb¡x üô(⚊|Íü*`Ä"ãÞæ±ôÐ!Â>GH…:\†ŸY¤ÓNŽ…žµ‰ô¬u2…ÞÉ2Kwoz{y2‹2p¼²•KZÄÕÝG$Y¾o£¶3ƒ¥ÉBE"_ uWd“29SqŠ8¹o8‹ônE©£/$ˆc£/Bmúä.Ž(-ê§Hßtœ•ÄE+è· lAC¬¬+#ç±l|‚ÐcPoáfŠ6q⑈×A'™vE“á9/SAÂΨ kDš@1õíú™)"±Z,QER(Ì"cÄL˜.È"ÄÊy2_-tw!õFÓ§ˆmÌÄM 1°Ã`ˆ.ˆ§klÀÚ¶+Àn"rqB&sд’….CF W–÷Ž’OŒágUÑg àšŽ‘p¢[_¬é^ ÄíÌÍg=³Œ/ÛN÷²†8Ö^@yF®Nß~s exÄ>í:À7ƒà#¦‰A/AÞh5èù©Ý`4{IŒššIuG;å©å™î·¹¦ çÊŒ…S³kzcR¾½ïqM1±•Èç|ñxXlÏw‡‡—w÷˜<¾Z¼YaÝàn!¾(’^´f Î$'%sé|I,¿Ž™¸æµá^\÷ÃÿA²•T¡é F‰Ë ûÝŒš–=éáÔBÔÿüùϽ¬Ÿ ÑBó{χáôвü6,2 Ïöß<»ÈÅb(ä´üsYÊcýf>|Í5pl¢oÞè+.!•±œ‹tH%¤«¦Â¿œÖ]ù@êSXž¡„±¤Š¥D€¶ï8oqæÓ¯Ÿ=>›KnÛ€; UU¤úòìÍÕ¸üpª×;)¶­Ãþp¤¬f(ò>fë½DÈÕ´¬Å#kÒúÛõìÕf…t®ðáF¶Kig8bmW¸{G¸€B]ËB_Ïî±p…•Ö'TaNe¶ Šònw'µ—4€º† Ö uöün}™¼óu ?–‡û7ïˆ+<mSc¡çÂêõXô€y›õIê.c$ËJHHL$ù€„8"Û1„bMeOŒ©C³(¡ Ž„HL95™B $qˆv)&ôPa+ÏX©œÅiHÄCT¡Ó‹è‚2Nj貲4°  ç$È8ÄJ5 Ð`âzà6àèP&\·T^ì%c©¼ñŸ™GåÅQâØ$ò¬ìôBåEBï婼i6ñT^$$˘Äúçl£">3Öx¯àùÌ’øÌ€ˆbÄÊ»Hò²»ÎJIv×½RÕÝE1²—Ý gqAŠÈª2«‰=/šfJ “]"RÌ¡­IæBåEB ³+Qy‘Ö1¹‘éÝdåHÅ¥ T^ìE¨¸4A¬ÌÒÝ‘âR7Ëq‡ØnIqºûˆPù«WB=³T=€.r§Iu›h¨˜Ú]›ª("BH-AÍkœîFÑÝ+¢ïÁe_eÇ)œ±œÂ'Î×'ÿ±¼H€=éHPÚ“,N9Ù’›E*&´+±N‘ȱu7+´ËÉü d¸{l'§ B²$Däí“X¦ ²²m ˆi²ô”o¶KöŠ• ±rf*/RÚ5‹TL$K)æC‘¨Ü°ÍÞºÜØiˆo-Py§ÊÄŽ»ve•û1ž „d%=^ÙË*/RxŒ£„ühÿ¡òâd •ûulÒu/ôÌÍ[=³Œ1Eά{™ gNúðy…2uú°ðc“)'ތӮGrS²œø±VSž«Üs5åÅð{4=EÔê#M­L¦ô{oerR7"¦_ç7äp¨ØIÜžQÎáÄènWÙýò¢+þCåE04‘ÝE Z|{éëç¾ïþho°cô—wÕã`¯[P€)¢ÉDÍH¼³W"µá¥´4‡Ñ«^ï×ÇÅvóßœNÙõ¥Iöãai£;²ÓeM‹Þ‘@ÎeÞé—cÙÎÙ¶!¶î!¾~mï¶€ ¢9PÁÒµ!¦*ÉeÇaµù;i´ƒt†ýº§ùð)„•Û-wMbH~‘£°è>kŽâCüFgG‘ßäío§»áûÙ—¡>X´¯~¹–àØ5Îm¼x”5HÇå°ç~Ëó5L_ÿÍëÅ©Rg Ô°ÏIüIáÂdç4ÄP[t/¤ƒMq6ÿ:Íó½pZŸ(¦jµýÚR,ÈÙ0  …› –AºÀ1•“»ÐÔ.›B]àÎbƒœª–¼×g`ÉG¨=ô'ôP»®Û±sÜav=+¿ÞqßÀ¶jøU¢¬AÖ͘~jq᤾dι,a1L’lŽ‹nFç«¦Ü LÌ£ùðï{yÏûÅy½}s1¨ð$¸)K£óå·3Þ™Ñÿ}ë 0†¸6f6ý¿È¸ŠÕì‘E¾N;®gØÈ>¶o數ÁSªÄ5ȒܦâEò‚ˆÌ|è{†åf±UsF©ß-^m$ÿ¯Bê2¯ï6Ë;1Ïé{™4^Ö¶ƒƒ÷w@pÒþûPª°®}j Áy->+òíTËo²aÛT(ڨϢHåÜ!=W›§å¨*èª).rÀZŒWÿ LHÀª½¤•›@ÊFסb Nc]ªZ|€Ä÷rÔ@c$‡s¤È눣Šoð̾6wH‘Üò0«ÐyB‹ZÛ:Þé^øS*Žü›#Ú“RQ0q°ÇÃ(’qexˆ‹"12ÒÎ,T˜Ò<ìF©)êã ǺYÂyP—ªÙN^ìwb3a¾%9âBKrÂ2,Ê!+2´m7ïDb¡Åìž¼ä€}-(¡ Eƒ<ü’bÂ{ o§ò i ô‰¦ XªšHƒ’È’oa Ÿ„ˆ–Eê$ô¡« ’åH51DÍ<>36/KÒÀò™;$È™cÓì;"ÕÊî: ûf§{{Üvgí¾#:!g9,6~‹ŽW7urFĈ&J»ñ™c«)ÍÁǾÿ:E¨œ a!ÀŒrW$j+Ô-Ý­ŒáEš"™>›è¥œ)¯Ô#©Ê¬Ò%^’ÜB suVj‰lNDÒºûˆx¾s£ê™c …!6+žµW¤SÈ‚,Ÿ‹¶(bÚ„4ouœÈÝ寱Ør¸Üt>¾»’eÔRŠÄ–êÐY¡%70Uu} Dì(V/ 6É·„G¡ïS6؉ÀО,™i!~Clm±h›eK»§Ï6)í" ›Zz£É«CD¦6©ÜƒX¤±²rlš Hh2M-’õM¦9È™G$³”±øÒý²NóŠ•5³µq‚˜Ú¸áòÔçI7LÖÔb仌Ýá2ˉ]Oíî¤Ê6aƒ©EA$Ã[6“Û»+[?“[6#&Ö–ñ5ÀTÓtL¨lµÆuBbÚǽ‚Ó37;_õÌYKnºúO‘9&/a{F®N_zy¤¥Y©]HW!)÷v]Ú,;».ÍOû×Ñþ±mÍÞ&ö÷*õ1ý:¿)å:FŒÂ/)å½µ°ú{Rêo½˜ÀïoÉ7E[¿i=œN z rÇg]#wìeåÂ×ÃiýŽþf`i£ç9²X†t઒ ¨tÑ%¼M൞;’>…È…«‰Ò6¡I™‹,Á“ ¦dì–Àðqy÷®6i|íµØy=»·?´`áâëVîÞà‡¥ÊÑbKJ;Í«xR÷s ™¥§½F¼=¿º#ÃYýtþtZÿü°xÏ甾êwò}ª _WílǪ«Á÷Ç?çÅŸýtuñv–å°}C_ôÒçõÒÔAŠ‚oxHm2î“O¤¥ÁÛ1ªÔ=1b9JÕ¶Äñ#SP(F¯9ÏVËaN<ê·?• }µ9Ý×·›wêÝøÅ@m™–É‘™l/Óo}Rc_wžï6'üAƒ×XÝœ‡ÅòL_ÜóÔͨëK&hÉ9‡Þ¾ª×µ؅¡ã÷ê«>öÁîÑXk•ا! K‚d™AÀ¶$3v(ËIb¼q‘*4"!‚ý¶! ËLå’Äâa3d&$‹ àÿÃ:6UšÀëð‹HÀb†ó‘2(!×w¾ÔÉ:6é^‹D¨Í ¡I¦Ñ€ÉbŽ´aú ôøà‘k`¤™‰ˆXŠ??_Ý,f{ÿºÚt²¢×›NË÷4$™"q"$?§ì)"¿¨',,-ü¹aåä…­ƒ¼‘ïÄá f„ ã1̘ à B¢„=ÃŒ0;~ÃXìüˆQk†WÉ+ç­Z¹†ô‡ûm±~BŒÅlž|=êÌM¸}ÿïP5'ìÅðô|ÒR¤q}Y@~º‰\÷¥´-VêÒ¾t÷±Ù뇭}_­±Ò…>«·9ÌÁÈÏÛܶ[úì”J-¯Ñ[^vøèéñ°? ?~Ò_è)ú=ë+ŒæL-³îWU ¢ä²>?xüÂÊßiSª¶&ú ó~7<ÿòé³á³o>ÿbøü›/ž _ó|øÏo¾û×áÓgçŸÿÇß=úì‹ÏçÜí:<ÿ7œÂ?ÚÕ|[ô`駆Ííp²ô§áÛï¾øÃÓ?!¡'7¿úg}ÚUkÙQÖVðýzM‹7k^Œÿë´^óÌÍ-·4â°“Ž[ì_®Wóá[òå»Cœðß÷ëããátà¤I¦ý„ÕXosþûÓpz¸½Ý,©[•ÆýþÿaÖûø«}†[õÄŽÁŽÐ sM·Ã›5°ŽØÝ½ìãa½…@AþÓŒ÷?3úC\Ͼx5þÊÌ^ ”|ðú›lç·Öäs×…@‘(ÕývåGi;Øg¨­Üïþ•#\±µf¿Oôv%?vŒ¥ë~ß/w÷ï­¸‹¢û‘¸1ޱ%R{‘Å_Ñ 8fD‚Ä1„€µµ9J C<º€H C¼€H ~¦ks’8†€ˆË¤ Ë€×Œ€˜2[!$Œ  ‡€ˆn -’xÙDMT€ˆµë‰bhVÅÃI3.“îÑ“'"mnˆ#²M£ a³/²F¢@ÐöZü‰”¢@¤˜Iðòt*‘^ÞåÔ8¥1ÜKs)&4ϰNLB˜ ¢sÊœ,¢‹zÀBÛG aÈ8$‰óhK¦Æ0@$„„~ ¬çzƦ&’)Ôˆ„0€ào&N$ÁËS^<[àå­‚ˆn¡gBˆ„0€dær’ÆVôÁ‘°yOÎ,¡ YάØó,+F…7³^ Yv×YÞÈîºÊ_VŒê³ì.! 0ŸÉª2þÔóBy‚ ¨™ìê‘w›¶&™>’‚[ H­cr#Ó»ÉÊ–>Ø ô‘j'âŠÚ_ QféîŠHÓÍ’†ØnIqº»"˜–q½ꙣD0€ŒøHuE4`H#‘¦C$‚!„Ô2J3 =Zå˜aƒ!á iS˜^V‘øeD‚Ä/:)H°dÚéâo–À6³b¸<0 lq‚œŒ"|‹¿¦$z„¥qš%±K‡HìÒÍ’àeäo0æ&ƒ ¡Ê(§i² FåmÄæ4¤ÔÂ+{ ^:¤4YÃVÈç&KŒ/ÏÒõ¼ùRùÔ®æh[J§ˆoÜÀˆµ7ÀÈvR oÛE³–ï¯7MùM;nÚ•1‘í@7ƲÚx‰ˆP²fÞ¶'®F¶x^â@«Éhÿ!¶ËÓ1ñ„é:Å éºW.zæf£ž¹qrfÝ+9sЇOeêÅÃBMñš Æi×#±)~Ø›òŠn’ëMy¥÷h4zŠ¨Õ A,šZì(œZ½`ÔÆˆé×ù Œ…°-w07æÆ®VþÃý©äCýñÑÿ ù¨Yendstream endobj 282 0 obj 8115 endobj 286 0 obj <> stream xœ•[Y$Çq!øe‚ õ`@=ÆN)ïC/†MÑ Ñ”¬l`IHµ=½;-öÅ©žÝÿlÃ~w\yTÏ EBŒÎÊ#Ž/"¾Ìù~P£þOþ]ï_ýâ?âð~~¥†…ÿ¿õý+Mùg½þùYƒ’›w¯øC=$?*›õ“ÉÃÍþÕêó«›?ÃØ$CÃè|ކßܾz³ºývwšW×ÖZøT¯þçêÛ›ë§v~ Vi¿úÕr²8*­t7Ç?~wÇý†NŸ€ËŒ)†Ÿrr<Ûp¾<£ÂÏÓö0Ó óaM‡7!ŒÖêrx3:Ç_Á?{ÿpOC3L»ù¸˜†6æ`#^Š‹æ†Ý7ædœ·ëL]ì©•³ñݱð—‹„nž«ÍQ{ øv`oÙÎüAÊ£·¡DØã…a®á§Ñ6c¯~;ï.ŒbTqqô ÖàMÛ8 ö¬‘òKæ(ûvÊ´™ +æqi‰ý´…€¦÷W}Ê„¼b×ß²ŽIM!5ë¯~vÏñfaúrÌù<œvÓz3œ`²EŸ¼lq5=ÇÕúnxw¼çpfŒÍ Þ¬ð‡k3*•TXí%öPºÈEPþüz˜×Ó¦»Ö`• Òj?AŽ'™·ûínºzhÍb™>gõCvmÇîøœá™@&˜ "¯ûŒæƒðWÍâg>´†ãAŒ–u’ÓÕ@p”·W×` eœs¬ïŽóæ@³E5ÚdMûŠ!ðO©GsÑ/™Á¾™ ¶·{„©§³ –*á~å³8ÙÃü ‰0ƒ0µP‰|àGG ÌMP…¨y¦r…ɯÀ/ÃÀ‘‹UlbO  €X•YrÐêÜJ€o©$¬§ÛfÜò en5²½‚|Óg#EѳB}œÉü˜ä@Cói·=3D¦1¦šœï ´MŽy1µmœ?^%°nP—ЪyÑAð%û [6ê+cʼôº4Ys·yO&Å·ô0­ ¥ ˸–ª rá›ãa÷Èš{åŠæQIâ±à›óö-ì q‚h;?p¬|¼ÇÂsfeÁ‹5A MäC1ÆÐËè¤ÄŒ%HAÎ]5¡ßäÞ=›CÔDZ›ŠšóÈ0ßv·|áà¶Á—|ñ*W­ X¢‡SD”’g01›Rd©¬`fO«£RÎ\˜Ôü›Õ~û‰C¼8Aêœõö1 ¯ ²?§‹8t»ý+Ö/ U—9ßm·¿d'6P+Å:fô/¿>lh`Q>92Àö[ªßràéO¼# !Š 6pxR4¸–k®u ö«Z:žï¤ö‚/©‰ÙGŽ ÅÒ½Ja \àÆ]CËõÝt Ÿ÷óU¹Úóa6íUCqÌ„”5Ž»¹j%ÁñÌ1L®3¿ÇP>oïŸnî-ûyøá öU-›Z'pÀÅⱇ*µqQg²2˜¼§æB y´²Ä.™ÞšèX“úeIÎá¾=L'^#£ìxºß¤n_oV/ç¡;Ön00l÷'^)xÈÒ­:^è„ãêEµ×Õ“º{O梯ÃÛ+Œ®‡€l$Ub¡GM]€¢Åù¦ïÐ0ë㞪}—:x ÇöíŒ÷HyLÒ.Ôv6ö(Rí)öØSœD5NÕ:¥ö ]ÿÄm† ·2æC’Ôýþ¾´HÔN„Í1ú¢p;mrkõ8!G1s )3¶ÓÈè:™ c¦êϘ·ayH3«Íü°;ÏT¨’-µ2~u¼˜Á¹×P©Qm¡³·P—ç_Ö:ïÚ(ÈÕ¦FÈñOÊDÓ‘÷xL.áJ¾¬âo.QžP1­Ì€d¬ûë/æ58Ôn×ŠÚ þCzƒkÕ’N Kö›yžL TS™DY±±’|ûp~ºÛˆŸeS ªOì•Ñ—vs*5áéáín»–Ò7ˆ¶š¸¾ØÖêym€Š3×ö¹(—+Ø@'º8e3­À@€ê~úý®²±+nF }RƒjºÖDÓÃ' .¿á0µûÄQºëúÂ8¹QeϹmâ î)ŽP$Ølœ-¥hÖPîëÚ}¯]t€V¨’ä,#€R›e°ÛÐ5¬è)uhçë,ñS ¤`*—ñš³Ù¶tÚV=[”¿\I/nFÌ M™ÜľY-ï5~ ζ¡´ Í‹˜ã*TøkC ò(Å.ÕqÜËãEÑ zŒª´+ðÅ~NZ§„: «2gV—M¾‡n¹±` £kŸ¬fÄ$kmÞM€UµUèZƒ¤°†®{¶=ÐVë¿L]dè[œý‘¤RKÞ¦DÆg’š3¨¼ç*täH%q šÊ=M ¦.ØE~!sm `o1êmöI k„ bȺ0àâ/ƒJ|¬Å_i¤âªaöÁb.å行®$£‡F¶zòsÝ»møû<ÁhëB„r—EÛ&2)’©m†Žá–¥¶Ša¨DSͤbŠ%˦F‡â\ÿ믿úâ/ó ;„š²A—Ðac³Êlû»_¼00x¨Ò Þ7ÄL;é!|á-W€ÙÒ’Ôò‚š¼»éÃVŽœ[áYºáÅ‘=TçùÇ9ù\«d³ èÓ²ù)@ uçS¦ë/bøHz¢·Ë êwÖÕrþĈ™!o¬8Á_Õ5Àµóéü%;iqo[?›”‹Ô„É §zuUÞ@÷<~sÅh-ÔqÎUâ§4Sª⊺V@îÜÈÐi}'”†:öè½rã+½FFò$ay.”¤ƒë1mÀ¸ðnÚSñ†ÇùÃaû‰©:"ú0z‹£Ì£Pc€Îªƒ†¬RÝ<”Ф¯ï¶´jŒ¾˜å`©;Âf|‚µ‡ÂºÓJ°`V‘.¼4ô¥J { f_ ;4oN½)|*V/lnšq¸QàJÐØV²K£ûš¨†zס±@æ­Ö‡?ÈÀk·¼ñœ¡©+F®3’àÖØé7øØç¸…¶4­qÇôÑ}»e™©8Ÿ†“lÊ$ûäíÓ“; ¾a‚\ÒúܰÜT“ò¤Ò޵(½Åâ ÖgRû—Z¸ÁÍáßU©àóêx &âÃt¿Þвz¿ƒì„þV(Ñ 'ÃÛ莕"×û•XøÜ;u|óI¨}(B.o’úGëí»GzÙPîOsÌt*4„|p¶pHÏ&`Ü«€¹+áÍÊñÔ/º]„~³õš ²Ee ÁTíÂyÆWÅm‰0ÅûóMÏ‘ÐlÌ\‘/CZ …ÇÙØvŸÎ¯‹ÓöÍ·à©··_ýúó¯ÿýæ‹ÿº¹P´Ã«ÉJu± QHýÔ踰eaËÁSÁbíÖÄF`»h[HDÃMí-ßT‰‘œs¹`–¤BäFåêÖŸB"S#EcíF‹4öPxaÊ(øÂí;·ÇzwÜÝ2åºi¤vñÈÕà3$¼{Ûo1„&&äÉrçí¾\üb¹X|õõsƒ—Úr‘€œÀö0Ÿ§ÃZ.z4ßóì9ŽÊΡ¨°w$¶M%Þʵ߅æ¡{ ³`çç…C9"„@쎗‘‰ùÚU¥}õ44!Â\¨èžn ø8úQPÈ|Ÿ»w81šú~{»™ûK²1@Tl•köþâN/ö—/±„ fi nÕ³ã?ü,÷›ÕEЀïªöVà9º\¸½Õ7Wãå·HëWR÷Ûg¨vïë•öá’Q…Ý)U‡ >n›ê—7ð¬zA Ð{%gQÛ-­YìÍRÚSX¦9¨1sDN绹ciq ¾´M¶ ô˧ •f¨Év‹M4;V3*ö4{UÙ¯yY˜¬×íÅ|j÷Q Òqûì˜p³cêrJ{BSnÆë+ˆÐ=_x‰¸+„¯+B=_¬l(³ ¡tÕí Ãýgr£zÆ"¦þŽàâ]N¢2_¾V/Ï5r}5 ¨XîÛÚ/ÀλÇ,§‚-¤Ï¾`;âÀ à‚­Ûˆ:ƒÝ íŠ£îy€ö¹Ütåî¡Gg}Ð*i&WÀß%=bñÐ×-^HɾYB5A1aŸІw]¼{8¬Q«øzc;O·¦ÃYDè²–"1Àiê,g‰Êl÷_PÊþ’Þjn÷å~0A.u±«’’TIï·‡My׉ Æd¬)²ÀÚÎ_*g¨d¨×X¸Ï#–E:êîÞààÉÄ ‚…ÂsFöQN MaT®¸|á~û65F(Œ¦y ¹‘6U{PW«Z–ÒÂhôÖåãp”úùò\<ëùzrÕèZ$#AƒA¬ ޶JtPÄÑ¢ßf±EY›,d‡q› ’Œ=~„׊Z$àœ(q2MÆ?+@AàÎ ÉLu ‰Ü+")e‰Ø}A/K“ž6Ck­Qb¹wë$šyLü(Ó¼ÌtÓർÞ6Ò!u‰¥ýjUNF`@³_†kÔžev%`$‘ ó ,T-fqH”(ßëª}TTnñyšIo(l6±ïYdr¶JÔ3D΢DŒgX=(aãy^ Ûi6h‡˜F”`5TÌŸ ÁhHí†I©¬ èÕžéÂÖt¦Éû•á°ÇaI¤?h&Ï|G§>ãe0OÙ¹²AŠƒ&N̵e«XËŽù"”Xq@fuPeÇ™);è>ËŽ«Ä–gv‹ìcY¼Hðj³Œá¯‚-‹—¥ ¼êâä™Ù!Úñ²9øÚð©2ÑøS§‰*p쀙èÃ*&þ§“æ pi6x“‚’Ï–¡†%BˆYÊøF¾HxfìKxž*ÁN;õ¶¨“…Ém*_•Õ›D3×}¥˜•Eµë"!¶[½H¼åP«X·¬3SDh«lÙkÙ0žèhDq“*ph(`‡d®¿78³©¬,X¡ÅÕñó…$”y3²M¢23²í+•˜ÍŽhÁ^Eø@‰åS*q“&±‚BLÙ¡Ä!7 /žl) ¾’öy)±Ì”µŒÄfQ0³|½ @BÜk³S•T[âí‹•¸3å+‘èN‰ASZK$¨Å Ñv;I Û¢@ó^”4UE@Nm™‚\H¬¨$iM{h‰1ç8tmVÅïuAp%ÑbC@c={ Jb9uô<±eÐJŒt(!Š5jžXp?ÍøÓÆèÄÕæ”惗•´n;@OmÇ<ãòÄe)eÊŽ'¼’šF/² edÂKÎ&¶“xq-æl;Çâ./±!/e;ÿAWyÏqÜï¡—‡9ÞÒú!ºµVýʯ&z¡²x|Öë¹=S½ßïkýþ»WÿÛãf7endstream endobj 287 0 obj 5750 endobj 291 0 obj <> stream xœ¥[[+Çq†<í¯˜7ÏgÇÓ÷nû)”XAÀÑyØ#ÄsÈÙ%uÈ!ÅjÏþk˲-û-U]}›!wu€À1œÓœî®®ËW_U÷~_µ «ZüOøßÕþæ×ÿmª§ñ¦­þþûtóý óTáVûêw÷ð‘ÅûÇšÇ*&Yc¯Œ 箺ßßÔùÛíýwð- ‡uÛX&`Âýú¦þš~+ÙF¸–Ç¿ž¾?,¦s×í\øâ›ùtÙX~ùßõwßnžºÅlaÎâì‡ú7·wBˆ¦å¼¾¿ýöþ?Ê3±Fë–‡ÕÖË…˜lZÛ²WOa•áÇì†ï–r´Ÿ7ýÛ~s¡ÁFÄcþ~>Õ4IwßýqÓ ‹™pZÓ0)ª;©c˜ÃOÛÆ SÝ?ßÔÛ±úpÞî&œÅmcœšÂO¬ÿ¤z<ᯠœÅØ(ÿaOû(QH˜>o¿>í÷Íj!Œ‡hªoû¾g¿¸tà=ʆW½ß7ÌZ ÷O»~¬ºÓ­mZf”­ûê<ö·w²qè>õºz<œªýy7m»¾:ú[îD}x:uû±©þ ~ï½É™•0Wþt«ên³‚?¤3îlƒ"Ü1žŽ5®ºaüpº8švN~¢sTÞ*ØË©@l©UóƒßJé&ésÚ,j›èЏå2&d±[Ý ëålÆ´Ñ3¶ÃRZ– ñ•_›)“èü >: ØoÞÍ™ ·þË?–+‹Æ1kÂÏ“f8 p<Îa7VÏÞáD£¬‹*èOô)cm´ Ù{gpAáæìÂSôšF©(ÕÏKº \¬M¦|¨½ë¡3)&ÑãÐ p4+e€­•^ èzMu¿ÙŽÞW!4Œ°ù#EšKwÕ©›¶‡êð8— öVRFá~\E£“5æóxråyÀ/•jmtá×ãfñs¼½3 h üDfððQ²Ø^ðF EøéÏ—–V­Šæ;óYѶ¶\t¬Öý19ãñ¤ý°¦(wÌྮÞï„026š‹5Ò’-R„GèPª±.Úì'&ëüÛÈ Õh›¼÷ÇŸ/ÏÄÆ‘lãZá~ñLðYbȆÜñ¨ÖvFÈÂV0c÷r Ž[[ŠRo1ØO8yçÛ_†)k„ÔÑ:?] Sn;BœÞi€RH•Ÿ~/o­2üuA“ÓjèÖÌåÑ £Ì©yŒj&ÙÛajr£ü[iG/ŠLׇ/‚kx¶3 ¿c”½²³{É·èäèÐó8ôYBËiY"DÚúz šÂ þ|ÅÒν-e zÏ•ZDÙR°y±8ƒ„$çÑ&šó9Ø0Ã@šÖÑsÉÞwBµÉ™VãEïëûM?öÕpÞHÄ 0¸ –|25d>QäÇ黚6( øÂvðÿÿãa·;ܢõóvxª¦þÎk¥Õõ§©Ú> â:À¾ qÒ׿¯vÛ'×;`mÈ;ꗪä –·BÖýnÿ&ã[ …ˆáx4RÆ ~5®NÛãäåÎ&º=Hˆ<wá_™ˆ·¼‘3O}ëuÈ,þp$C“‡µZЉ¿9î¶Óäϵ VC÷´­[U«ƒgx¶•¦^ƒf!ˆw]0¬”äÑíŸ<§bࡎœL‘0 ÓéNAk´À7„ˆ¬§Õ9áW@º`ÆŠ’ŒnZe£·ö´—b™Ót£W=9Œ@5»L52HÑ®°§NN!àĵºu÷a Úx ùRD_įlð‘-Ø#BwÆEáÊ  ¥/JF‹xbõõ;€é©ÚÆ µ‰:‡ÔQ!üƒ“1×JOÏf<{Üwè/àãtê¶O›)àƒÊLô<"ä²¶ ’Jhü¹;­#1×Ê%bþÕx¹u51¹-÷Z6*…îÐ{ˆÊÁŽé 71E}ýÕ×_VP ­wÞ±Bn3€¾x¸÷õ¶ æ6rï‰CCá( ‹0±ß`~[/«º8ùÝ/L§Ã©ÿÜÉKÌ`<³K´6¤}*ýmL:ÏцΤP¡ oS—`æñëfÙ±·šG×Ävͱ[}¼Ú®IG~Ô;NÝaÓ»HÀ±±£=PVr¹ŸñPÿ°]÷cðq k‘(GtÂ,JdwxÚ®8ðz© Úè êÐÉFe·ÓC†À>V…qÎÊ^.äŸý+MO•ì:žÝjéJ ;ŽJw¢ÞoÀ³ M¨9xÑ8†þrtÞþ4Ú¼ƒœ³…|E=¨\Ë ÀˆK^ÞžBZˆÈaÈè¨9²> •fEr2t{¾â¹èØm›˜pú¹Q,](¹Ä©êkpl}¤žöù:YÆ,º\²L„ràAV US"Á]Ѭ}¼ì»ÛY¾a*žšRp~“XeêQcÃ|}™^ì±!…}¹U«PÜ(+réRÃı0¼òDÁ`t†Í\ÅB´Ê¤-BNÀŠ•ð3dØ9w4®TcÎÇ@¡0£s²÷Þ@³a,Ý+\ŸM,Òû/ÜyS+Ø‘œZ Sè¥Ý9$dé˜ÓüQ€"¤»$*2¼·…ê…ZkÒ.«n£c¦Ë!ž©¼œ™ƒÉF˜Ksöì$]š¥šûMÁæ÷°ÒÔ‘íÎK%ð†ÕÁƒ²})\ý)rÌéUÄ"´ òP$>Ûҽђ;Ó¹[úöí6<°ÍÌй\”o÷Ôi€øT"ƒnn‘ü@p ‘WÜ"Œ "ZËC>ƒ:3_ÊãþØHŒ0µaÉH—E—aîóê¿«¤•†ƒA¶©_hW½ý),…‹,¡ípö5þ³€Ì}ïB·¤¸y… j¼•vq'‘©=3*µæH  ñ€gÞ1¨c! ê¿þéO!ÉdìS`Ai3ø-Ê/m5¹T-û}túÖ6ÆÆó¿„ØU.™‚Œ„l Þ8(ÓSÀ¼· i™SŠ@D(êW^Þ⽛߳^`­Aû‰Üœh‰¯ {oÇi¼¼ =UTe-º¡Û*®Gªú-ç˜æçkHƒ]þ1áç«FE/ŒÐ•6tà°34G¢Ä"SâËz Ll6i! ŒÛ¢FT¡ø½lÙÌ òÞ„~œ½û±¨‘Q6¨P=h*€åÃiÚw€r¿9Ú„žO·Œ>gïOÛÕüB’«îÿ-uû«zv0{q%®u¿ð+TöU+Ð9½ôÏ EéÞD`Pgá»É&¬².ÂÀ»e%ÞijS ò×§JP²KæAÁmº¡Üõ±2wÎ@\$ ˜7™²ØØYÇŠ”龃ãŠü¢ã7† ·ãhŒ"OéÂ[Ë·w·~©€@bÚŽ›¾ð=@ÈÈujq®Î#ùžoòÁŒ¥**s8 d£yk$œèö‡ó0…ø–IÆF®èuó5ˆÎU ~B™ƒA¥üŠ1¨!˜â£ÐyZ“Ñ­1ˆó&0ßþ&Êó î>ìW–ÁX 0(—×ç7Áîº ÉëpõUh±C.„ ìÜǘw8 <êÕ„ö®Ã:żuh¬?©€S€å±‹i…ù+Kz=°@Rlû‰>¬XÑDÚÁÆþñ˜ŸÄÎãa_ÛOE_3$Ÿõå À‚Ô—ûÍE­ƒ:e i.Ð\´¯öx=J†_Ÿ ‡çãé°zµÛðËÞ°ÊUÿºLeŽý°¾6]¾Þª.§wÃpxk:¸°’¡ß|YÈs\,jsÉî– ¨ã½/±±»åíc°²¶F¡•ý•½PyI­2‡œlêÃ…i±^a¹»jZ €dÒ%ε¾OÁûYÆ7d6ðE €_‹EúçË¿«ÐælQ4'¨TÊÍ €¦Å‰ÆëË…¸Ÿ{逭¼T}y/zE,šyá¹W´g‹<äk¹bùV<ß'„`ŽÕ*Yh“lïv a3Wôxz6ØÔ¿¬ê=«±#j YóÍû>ê.},’›]ÿ–§Át.(¤åž.г¢x“ÆT¸-tÈ犌7y23ÆRÈé„T.†[Hïf™j)¥fЂ$^RŸè¦oúÇí± SéáN5¾„Ó( ¥ñ4JQµ?Ný¾Z….¼l‰Ïi(w>¾¯évxm&ÂWã>ÙåS¿º¶H¶éÿâÉQ‰iÝ«÷· |#r ZmÁ“´Þ|àhE¹„É:£Â4&½^ÄbR6Æ„‡¿E-^*ÆÇ5Îß‚û@ž32öKªi‹wê^LX!•0x+€—¬˜·ãªÞûrѳ3ìo¥ÐG—SßÍñ\i=ç+³BPºÓjxqž.äãKÊ|wgðAoêÀ\½hnª=ä§&¶:¨³ñ.á9¤kÕ°ô*=l­E½ˆp14"wÅÒ-O?¬ºãxÞuS5V”ï’³á:æê&4WðBÜÿEŒÇçD¼ó­ôõWоÇ呢ދL÷OàP>¢8“¶N4½!ÉyðÃmt’—Ø*Åj=þ3†w)™)ê~KµTM]©àöZç×aZåúJç;t³Îïkt< èØÇ"…šK€‚B…:Ð7·ƒ‚—™Çb”³0Øly%²U›½ëË«tÙß<K0³ŸÀò —, EJBMö®öý8v¾uŒÍúøu ïØù+§¾Ë¸Î1J+ò fGŒ0ÙêJ‡#^3÷º}ÉJzÀí1•r Ÿ g6WôéšNºzEýX9¢ÄÛ~zñP]¬ºØ§L†^ÞÏáS;õ9––P5ñäºHýÓ3jÈ:5–Æ¡+™šÊ(háqô4Ë„ë°[&¼‚á¥P¯„ÕM·Ž=5…úŒ2`?Ä Cñæ˜J~+™¨;ðÖ~ <è†-bFˆðë]¸ ‡\eRŸîŸc?Nf¼_¥TÀqöñ9C5B®_mèÚ¡s±*D¸gŽÏ€Â³khÈgΡŠ÷HÇü «Ûž"ñ¼ã^U\©±ðB㪾–íÖëPò⇧FKшϟe ÿ¢"ðDaÄ€Ýl™Ö¦}0áÑ™‰#ÊšGùaDxÅàCÛ8Â`f„ØÂÒH”¸ÅÝ-èZ•µTN eÄ‹#…‰v7ßà²‚Æ OIاÆ´µf“I5"˜Í$ñ$©¤|‹Š# Å0béuU«_XÁÆ–:W-þ•Ri[?,•F`mKk+|nkÉÜ\ÑB!¿R¼…Ì#3?Ô±1áC¾‡w±^f…ψ¦½„ ™‹C2ã…)­ô›/FDØ=ÍÂçaó½ðW!·Px5$T4K«ÆÑ±\øD6s]Äü§pIJæn><”¶Æ¿ðàó¼D§KêRª!@ZZJÍg+KüÓ´Ùw3 +T [Œð0+ížFÀ°f> 8YÑ!<ýÛ ÙîyDc¤N˜eöwÈþ\{š\W§ë#ÀEWI#:„Žx·‡ujfôVDIãá‚¿ã­Úl_½XÂ%æ#àl6©Å"6ø›˜ à "*ÂÍ4bG™dÓ~ÄDOÂ=Gà[7§óY2†'iKÑtjo?"Ya©Ùˆ·¦ ç:`S‘ae} ´Ñšøº@'ô {Ùù¾§ #,ÈŒy‚#6šÄGì„•@ÒˆJÚ`qyZØúOD 5¨ž˜_˜'÷—Çy lFÌ¿æÌÈIGw–VᆘçG,}ƒoË  00ß0ĪrHTr¾&ª01˜%™M@ndNÙ\‚dÖ)ñ‰` ›’Ú,µøt£°é&<íËL›”kâeÐK# õ`DÍQÂÍQ˜ŸãÎ\<ùµ¿$Î|~­ð/ô„×-Ä 5þ)ñÚ}`ke^ka~ë+aO¥þpó±&¹endstream endobj 292 0 obj 5435 endobj 296 0 obj <> stream xœ¥}[o$G–²ýп¢ü¤jC]“q°Ÿ¼¶±³<ÀÚ½†FðÉêfHÅ"Õ꽬áWŸ{œ¬¾Ì6ŒÅB£™q9×,ý²Yva³àÿÉ?¯ï_ýþ¿·Íûó«eó·ðÿï_ýò*ÐùÇõýæoÞÂC)"òöÝ+~1lzÙ-i„MëiãØ¼½µýO¯ßþžíòhÝå2ZƒÇßÞ¼úq{óÓÝãþáõ›”¼¶yýÓÛÿê‡ÎeWÓøùí^ÖvKXB•?Nÿë—ÓéðóŸñ¡´À~–$úçÿË/Ú°0áØEøû›\w­…¥]äí‡WÛ¿{ØÜßßþ°y¾=lžðÕ ëŽ}èLwCØ•°DÝ˯û‡çÍõéõ›¼£•º½9lNïdC%©Ò.Ô¡#]Ÿî/–ën)ò¸¤LKÂ'ŸŽçÙõüßjuW[º˜ºÂ¶s(ÛïîçË™Aĵ´.3¿cî®/æ/8VÉínøï6Ì›T(D¢ôávÿüpúðøtºþdÀ^x¬°©Ð^@°§÷$Á±k±¨TacOkGÐ~Ó¿ÿåÿÓÅÈ¡ƒVôÏwÇÎéªCѿܶÆ.ƒQèöØ|Ùb ËŠÓ£yWÀ6ÔèöçÍñaóöp!‰²ì†Mÿ9Mæ]n©ÏÝ_jò|ü _y“À’ò2T¢aà-|Õ¸ùp|¾]‹%Ç]]ÊP½ÿåõ›Z—¸ýçÿóO—Ón˜=±”v›?žž7û»;¶ Yè`8õÀ©Ü¢(ÑÔТÁ¯sï -Dèù@‹“Àœ{o¼Ðãy³¿~~q?n^ÎzmgßÞl®hU¬3-º”âì»ÖÇR¿"ÏÅ”wõòÌ’ËàÆ5«ä@! -kž—‰Ê´ƈªÝ›ÃÓæþ`÷}˜;Ø“cíhA¸þwj7`Â2AÚµpi>s‚a†Í‘¤¯üüpz]w£ƒ+l?€ ¯o7,)ðvÿô B|âÙØOGıMȾ(øôOÒ2ºH»Í?<À_¿‰+C‹Ûó3¸ôñá=ô÷ŸÄˆ7±”]ÉÍœû+jìÅŸŸØÃR[ËtL#my9>½î°‚ò–e ®­ž i`ób«Œ!÷¹JÔãñátôˆm{zúþrþLlE/h1»·x8¯ž>‰IµïJRIm¿Óå”ms™ýà 2|ûºFðß¶'0e4‹.ª8¿<½n ÎÛõÒ‚ÞÄa-%çεñXï^È7l¯dïu³ß<’ˆbÛÓû§ýý`5àü·§;˜æÄ󌾔íµù$;×Í—D ©#õúe[¿9ãÙ)zlæòµŠË_ÍaÂlù·×e»¿?ê„aIö†ÃÊÍ õv>±.âCQQDzç¹0Xlî$H„·ûGŒ8ïöí~ØìÏç˜æ=;¬!ʶp6:0ý3ÙÇwˆc½ÔjÆòjuÜÀÃÀéZ+ &v®´¬r÷ys»ÿ• l‰öÿ‚OA m–NGž(40”%LÛ=]¯_ؾ[éðö#Ï®”šÆR*퉃{Ê3‰>ÓÐm'JÉ»´FÙâöáøË Æì?p¾ªË®éÂUÉ©N%£ÝÐ2ó®ÖæxA”|¾=½Ü݈÷%7 )¸`:Œäü#Uîu{ ÑKTž0Fö¹yÒÂñáÝI¼·¦¶½ß?O×ðQv¡¸dzf!Öû8ǼâäqQöi„@ jeg_…Ý-N|·#¬NU7ÉžO/ïoÉTÙ*ä2ÒÇ÷gö-2³¥îJMóåÈ/ƒ¿]íaÕaÁ =@À7/èì4à7Îoçµx|x@°z@d‹Ùíþúg|ÿ¼ÿÕœFzØìonŽ¿“RAl3†€¿&^ »¿ÃœQ¨ö9cx†É,åÓ @,–u1"~)¯îH¶òø›€ Š8èòŠscZÜ,Šj̾HëìµÕÿçò ¸IÈ&Ÿ(Ö „ì/ïºÑg\3J¤Å’:Ö¥ƒ¬3þæôp÷qM©RGê [ù ÕúX‹Ù«'›ÁZЉid³`,}¹ä°˜þVq*=CUüã–)¦€”òd¶a¦ì¹ ØßŸ^ æ€Pú|Zv¼‡5ÝŸœ7`_°‰9E)k›ˆKßÁßÌ& )Éióqs>…Iµ¢9>kæ–ŒuáˆÁÜ2f2§;áƒú%†ð y3[9ƒú;ˆ;m+Ñ8¸¤ 2½ãíjò4ÇÍþéx …y¹GŒÇ×’g Í »@ þõx>^ݱOÇœ·˜qÄñ c…QfòŽ‹dG¦"àhïö×6…˜$0 0YÐÇ·‹d«Ó…_ (ôÓß×Úþéõ… fkK13Ñ‚`Ì…`ñtu|~‚U¼BG>nÞ½<\Sè¥õì6ÿ‘CS®PÃ1„]¢S™õ(Jô(!6·]·œ¨ŠõýºAÛ'µ£èÓ`­ÃÄdziø¬Ùm2E扊)Íóüüt¼~–ê €³—K¿O¶„t½‡ª¹4Üÿ\ä5èèáô¬y˜ßþO ÁWÀ=òðLr$O†<ÿ8³=qå’°¿ðµ•ß ûÆbùAêžF"!¥ýûÍïo!+ŸîÀӘܼ((eÜݽùÇ| äoY à±Æ|j àL±?Ÿ®^c¿'äºýþ{q¸8 FUÈËØ0¶9»óá¾Ha*m¯x8þ¶y¼=ÞΧÇÛ¯!øAD®[m¨h‡¦XÊú2ÿ-VC~žþ¦¥9úku묿VôwVÜ ) ©íjÓÆúW×Òôõ¯5H rçv¸zŧà±î3 v><Ü|¡Û2âlú_Mʼª1_$Õùžuñs|Nz †îF-sdj‰Ûz&SB/¡uYkRÁ‡µÕ Äù¼ƒcOÚ8¬<È«$Õ$ Ž˜P|Tk]3—"«òU½øAÖоdö™ßŽçg%ÈÜ«†¨Iúî|)èº FŸ?[ÀeßÍúŒ¦Æ®ÌœƒÒøÛÒõ¢ö8¶&­—n]ø_yK}rˆ-1Rl ƒÿ­7ëæ‡˜8ÂWÏ<þ°nÁöéðx÷ÿ5ÄŸØ{îÍÞqÆ0n@…Ÿ.¢W‹m92¹$üƈá_8ƯÇýýþx) C×Áâ…ü‰ô„íçÑ佘Eþ´ý·Pu¼ÜÅÐñ™ÛU[Bé_Xñ”OÊ6çý=ö.ÈÝ0«Ê’!Ã@ü(yÖQXÆ07pŠõ­)°øè™GŽlϼœµ‡¹ê±ç¸+mšÚW;_¼áÝæí-ÖÏ/ZhQañƒß] ö.m#ïÁg>µÖ˜«Y£$ñéÖ85j>ÊY%ÖJz/çj®¹r ®5ìý¶¿ÃÅú€à›ƒ2Å!•‚mÿür~æT‘׊w‚–‹œl€S-0 )F¨;BÅÕñZž”]2›zÖ#0òE§‡Z‚Ü ïh”«n XÑp´ù,?*QIÛRq–YQwHê/é‹@ºÁn.²û$±žç±P÷Îm´yééns qùy³|TjI Ïh¡Ûíõ­” Z$ãˆ`dÂÉH¾uW'µ½‘Z” • SÞ©‰& 9Bå½±3«fôç³ÙåN  I¨¹î¤ÑF?ˆ`v£Î–2:Œ­_<Ûa¬ÐŸ™]T:jùx~uhØê³aOÚÚ¦Òü~¯q ¥1ƒÉnCw‚§#Ÿ/[o”7¤ ‘Ê)Cû8Ú¬ÂììDñ9Íö¼¿~:~w1”ÂZÆäV¿\úB!¹¿:ÞŸ¹šºÆÐú(}d-d•å“#ð9NݘW½À (Åó£XDëq…¥²9–ÑÀ³WwÛcs|ûÌg-ÛƒÔ*PMö%\6~œÌ€üs'òš>yaW»1³ÿGaUÀƇY*Ýÿ0°·¬]E0›`äêä,ÙÊýÍûÃæ¿“¡œ=ÝK4¡u@ù¿<¼œ÷WPvïNrD tO£Õ õ¾Ý;ø‘Ï®ÉMíšÈþ#uݬw)Í $u6“è@«þý1ÎÖw­e3Vé®T‡§ÍE0Ï:£% »‡gÉcÖwã-°;91b<å)Ýé\›ô¦ó:/å@©{ÏÍ] -Mk‡·–¾TÑRw•›-g>[" -°²ðÕnÐ=úràR€îÚYÌÚLò õ(7Q«œ##pÕ†Ä82O1hÓ`!—1Û’¼ÒŠˆv;M¸•\þ˜®NôO„ Ûú¥/ÌË(8ž +^M3¨Fqá0¯ܸ}pîrêÔ*WšZ™hº¡´‹Ú¦™Eð÷gªÂJ¤ø*œNV/«p<+ƒ*üýËñæ€ç%zºL–å•ÙŠ#†#en[vÉÙ†à>-ºF+À©ï/+¦Œ‘3~­à(îõAÃhÐoŸñ #!(EÏýÐÏ›;Å’­ÜS™\òk[]2“â=hJÇ´[~sü×w°  K,=zà¶âÍñ×£pgêŠÝà±6¯«{% ëËg=¼ýU„Œ±X¯øgÚûBGâFîr²œj¶åúVÄ—É8gºJÌ\©ÁƒU¼³‹Ãůܲ¡:Üä¬ÄÈ/Ü8òîŸt «ëÍ|žÈ·4Q Ö¦æXÐñºÀ§×èP£6ðª¸îÆÞr)­·Ûðbšé|>Ù&‰ïøT—±eéq‰Ö­¸\"¸LAŸ)/>©vÄþËÛW&,ãë°A¶%_›X¡¢\ÆæÞ!hߨÜR`XK‚êA0€ )02¾T0í 2 Å5| )N¤.ø °f€  ôFLYéln‚w7ù‘PèØ¨ A*;v¨' tÔ²Bî‰_4.ø~ì&ð m24A­ò€ì ïÈx+•<ßÀ—RS¤‚U" –¤ˆ›õ›d)+YÙK&r°ññŠº{õ?^eQ¬á÷å| Q^dñ ÂÊ+<ÙX‚LÒ‰IžHy1Ï'±ãÑ)P'/v(»w½D§šnN€ÙÁÇáT>â"úl8™ú„q <ãA#ôLZDÊ€4z$ÇX‡ì!5YñØUš ;£<°!IW<Ø,PÔE'×·`Ã2¹N›±ÉÉ0€cÈä`UôÞÊîÐX¡£ü““„™ ßYHu0ck†Ó©YáÁƒˆÎH'iOVõ…F«OŠðÈ@cHÝeGŒM§•§Ôõ-}"xvý؇Š=(RËzvEÀ —á Ж »iMt5[-+†/hb&dv4Ø ÁFY) ‰®3K¬bê`Iù©:ØTZ!x[5¬ÞÂ8Ì»Ì(~4\ó—>e™mIþ+üÞ BÙB‘?eI7ïÊþ*]r½¢¼=òÍŸ6“M… {G¡&¢ ˆë›Š4‡"¤Ç¡éÉq(@’P¦lã$v- ÿäH øe„cQ`‡Ad+¹š^œø"4Šššã("$ Ç£Áæ¨ãQ„·(‘"¤$G¤IÁq¢¹ õæ¹S5ó)1÷–H^™Ô¥¾Ðf`¶(˜0©‰(“$‰£I(‰‹É5ñüJ¥É»ì3YÀs˜— ` +Ùú_^?À#{p\*üþ)xÍÝ­Š+RwÍ»b(Tï92HbI+™¤²%*ÃdÈš…AÝ•dÍ©»w $ÜÖHN2»½…ßz.ÈD:;[GÁt¤ L:HÆ÷½4 ‘Ø@HmŽä8D" ÌÞYï)HJ&¡$¢ì&¡¢.e5r¨²Bâ@+qZ.PÅ• $È[6»!B¨Ü[B¨)â©BŸÜì)B´ÕmÍʨ`_‹¦nÚ œ~”S9DH½E–©¤jê]I U"‡P(Xó¾;H~<Žª‰(©šo)‡"«kkwr ÄÖâÂ1IY MØYQ‹Â ÂÓ*‡­ro ¯šrVb5u¡4jêË!¢S¥Q°÷"ñg"I8ÆPK0¤«NC判9œä/!$HÈIŒ™SUCþQ»rH2i‹¾±é8±8zs5öe¥N€d‰ë‹úXø²~ÊÄæéæqdS^Hàè§Ü b]ck±lP–¼+ÏŽZ6NMö®så‘m̓­Yžé]Öl™â|ókf“êE–¡Ìƒ‘¬Í²ïÞ#E­ ²kN«¸Ž¸¬â:~ÙáëI‡Ìø7$¶Y¼dYÇ?ä#ë´^á·q,̃$Þɱ®[º^–«¿Â±~ÜþÄçáv³;ײ:KÅžàÎRçÍýþøð¼ÇϘèâÝéA.WŸÍk˜1èwFze ÜâêÚc“›Žr”„_,vÒ™:àN0ñ|áN0ÿðr¿Ào)ýçbtˆÇMUm¿Ñé6½^‰¥k»«Ž·; ¶ tõªÆéáüÃFoK¿ÉxÛv~ú#ñÇ^òå6Qìœ,Ðå'¾)ć+xòÙÊü«\š?€¬éJ/*ÌûÑúÍy}\õó§W 8õb÷®¿öáÊ›‡LôLýÒwòÉ68XI¾ÏU¬Å!qf¦«G¾49"ÄAcMD9Ö|K9–Êyr,ÕÅdTª/‡h7FÕ5g‚~:ŠçXQŽ…oŸÅi®|$aKʱ:Tk!x6Ð¥~›k"ʱI«xŒ’ÏÅs¬ç4ãO}8xŽ…/ž l?ÆišÖ·ÆÄÜ<j#²µÌl  ÷ h7¯ÇéQönsµnkÖh\lÍúL”5Û\ø%bð˲ƒIõ"ËPæéÜUwk"ʱ:÷â]\ïÂ]g\ïPÁ­{-±øHXÇ›œ¤‹cñ†ÏVqµÂoãXÏÊcí7©çð- Šþ,ÒŽ5åX€bBƱIÅq,B¸²ŽEHŽcR)~Ç"„+V‘- C˜¨p,( ¢ðWáX€Lù× H÷yÞ!±)Ãq,Ç8!\à NJø#—•cÒ‚ãX„äá8!«Ž”íÂ|Úvj–nso©ä•c]ê mÆ.‚ Çšˆr,@ªè0š„¤þSŽEˆf©(òhÒ¹‘Üñ785¯9ó)º“=Þ4[ë'éÜÇŠøƒ”K[i^ø¤ù" ÚËijeô“nŽcRÅÏ„c2¤:tx‡ 9nH•5OdÈš‡Z~ƒ~™ÝÞ’Îßœ+/ÑfgëȰçÞǤ[7ä™&}•ÆD$6±JxC$¢„*’$¾Ç¢]¤à8ítñ²˜$š{$ZM´,±Û#ʶmvC„c¹·„cÒÅS…Q¹Ù'¢p³CÍIʱðkΣʱaFnË!Y}nðe'ãX¦wãX0ûÈÔæ_¶óHq„cMD9Ö|KY]]#x¢8£¤Jßh"]˜™p,X3ŸÇ"„»h±"˽ÕO5¯+Ç2]£2}yD²¸2*ü1,‰?©Â†Z‚!]u ž›|'ùÄ5Ò£°%áX€$9!¨¥~3Žå¤ÒèÙ¢¯Äãž„yýx‡©9þëi×õ¼­uñÌÂö£œö%õ­r£H¿ÆÒ„{Û.HGÂ=S2së9NYdï6^ˆlŽc’mÍúÌ"k¶¹è—(ÇšÙaJue(ó`$k³¼÷ˆp,@†äoëY¸ëŒë˜óª×â‹!JlÓxƒÈrÿ†E;EV+ü&Ž…}ÌBâ+]ïßCüÇÚþ$?LJv–W_þI2ú˜˜“êóì>Ê»¦“ËÚík´€ßΓeü‚¿z=ÑÇ{?æº;o®^ŽwÏúÁ#~ýºßÜ¿Ü=õ'Hi(¼oxñËZtÕ¤ÚÑyYÚüùbþŸ—³û©NŒ·Ù/Ö>À¶Åºs µ^ ¿I îÇ¨Ž¿ÿwçÏüöHAÛÑÉ€[%ù…*ZÛõéá;þXÑóàŽgÁy—% žHŒH®€„&þ‡Hí€àn† ’ë^ð×)B )8Lì:LÁß%L‚Í¿ãïuÄ!{ÁßÉåg˜®õ¦ÍÃTxì®86ñ‰aÁøÒ åDa56Ìb3A@î¼ÍЉ´ñl{Àïî :„« £ F¤2  ¦-R%æÊ6 YŠ—‹¥H—Üv¡+ŠDo&„¢p`DXU僷éh«CgO "ftˆ4Òq–<Õ!zÓ#U’Ç‚t%wˆµ}¥š†È0„ÿvˆ¢y¥q¼BË ç(Ù{æÃÂl¢púüŠ&¾øšÖ¼N<Ëg€ };´­ƒ4Æmõ¯`iõ~Îíç ™”í?剼,f»#áo9ñV†<ðÎŽÛ¼!ôÁ±"£²L9¯N¤JlǹIÃ] Âüe€f«øgì7êòjdÈ툿ö$à™ýéò–Î>‘"g¾•…í¢Äƒ Ìmçì†@h^²·¸¹æ$<?¼êíTTƒŸÐ3A,Äþµ A;À(Sß¡˜´Gì[ µ¡|T# Ñ5 ÏïDaµøµÙr4üqRB’ìqa;qH’°„çúŒ½|¨-á2PKf7‘& d¾UÅM°®¾ÖÂ’…Õš¦ 1mb]›Ôåâdäd6 HÔøoQÔáX%s• ¤²~— <¿ Añ,‹z}&Â1–5ÒTK·› ¾Ð3E] ?Èfýw—¡/'ý¬‡þµÙ¦) ꙃ©k‡2"¬â<~‹°zÊ€²ªŠ¸š¯ù3 Ñ»ë:å <"[ÍR#ËG2›†{“áEÚ T‚Ÿ3-ՂѽG†š6¢×üÁ˜ØüÁØ:Ì âÂ\“¦aeÐ/Œ¬‚} y‰,~œo!µ(” ÞbN;õ<â œÖø×ªqU•Г09D!±9ÂDHŽ0Ò‚cL„`ykŒ B”1&@øÒŠÉjZMÆ”r t8aŒ þÃò2!çn‡e"¤%G™Ü8‹ÍE’É™YšãL€P fr&Bjrœ‰ýÑ]LÖN3W‰ù·Xò“4]ê mÆ.‚ išˆ’&BX‡Õ$TX‡JšÉ‘&@øÞR Ô›¬)å©(w²—Co§i$qJYœæ¥ý`¾·(ÌS–ö•Ñ'@¸±aü)ei~¹IYšLÆáæ™G¸Áf¤))o=Rdv} ?„È«¹ðÒ¼ÎÎÖQäøÏ¨TÂË÷99*•ðc€´òC46Òš£7‘ˆB³“Þ'‚Wö‹£R©È!”Q)Úi(«‘ñ‚þŸ—8-":+$É[:ûD„J¹·„J¥,‡tFœÜìiìsf‡sÍB¥‰Ô„3*•Š(•šˆR)zkx.5õ®t fçæƒ‘'²¨x,2Žð)‡¡ro }"«ë+¤`C>9úHakqH—˜$„ A-%#T„`»Æ•C„P¹·„PM9+¡šºPú4õåÑ©Ò'òÁå)2rRK0$jlAº1\'ù¤‚vX‡#T©È!¸±BrqŒÊ!ͤ‘,úƦ’OÅ1*˜¢Õ$L)óuèÉ©ÈÂÃú™>Ð~&ŸIøaa Ž¥ÌMÊÉ›R¦ê\eƒFZY=CúqíÙÏÅíØI¯I¶f}f‘5Û\|µjr¬™LªY†2F²ÞÇrÈP+‹]ò·Æuú¬©ø¸^øS%ÿ™ñO.6ÏxSøs¦UüëíY­ð›8VÂÿŠ ‰w’¬wË»^úòM$+/x‹¦:’å!Y€@bíŽd’Ç"€ËkáX„h©Jì$/tÛÇ"¤û R6)ÇD SåX€t.ì4‡Òª“¿C„cÂÅ«p,7ÎbsIñ* ©•bR«£X„äì(!Ñw˜tÓ¥u£ÓÐU`þ-–û¤X—ÚB“‘†`B±&¢+/ø»dÝQ,B’cX´ì aç{$lÀM‚H“^– ;`kåT)d”`Ò¸VŸjÇ_öòÅ Éz:bbtFt+/}‘¦¦,@’ô}’n\÷-ª¼ i—:D[¡B§2þGê2dv} ÿ; q5W@éFG°2þ„b÷½ªP¼Ù¬Œÿ«°rC40BÕ»’‡H8¹ kÝ!QÚÀB°h±:‚HYwÁ@CÊÉT)MË]úÔéë¢Ò!B°Ü[B°`ä(n*tÊÍ®HÀ“–êíp®Y Òªà¡:~5åWô¦ò«©våWÿûMÜà*jòx)ã)2Žð+‡¿ro ›"£«Hå*\ÙTÆŸ›ˆH”€$üŠV8ºãW€póXéÕ„]¹w„]M!+»šŠP.5•5U¨r)@¢£‰,2r23P$j`ÁÏ^]ú&áÄ5PwÅQ+{–’ü5 mOjå¡V„,ë8ŒÑ¶:jþ¶¢£M€‰çB­HcýLÇßÏqT€1mR"ˆ`#J›Év^!Y i§Ù3µËy…ƒ¿ºž«[³Æ÷nk–gJ–5Û\àWí+Ë S¨ëäB CXíŽY9d¨…!È> ¼zT}@Ç_µ¤¤äŸ .ðU jhpœ±|øãÛëÀ·^á71«L¿ñ·n_XÒ¾^þõ<’5:õ÷¯þÚG’endstream endobj 297 0 obj 10212 endobj 301 0 obj <> stream xœ}K]Ir íø+î’m ¯óýÐÒ€!cà1 -F‹*VuqTER$gÚó¿µðÒñÅ#§»o‘G°oÔɾýphI_[¯>ÅË©\kõý#žúo^ýã+Gß|ù™øù;úÀ\ˆ‰—k¿º~y^(ÄÞÔ/OBI‰(=ãŒB}…þ”Ö@!ÎE¡Ð .59Þ9’F7í@ O­L ©á'êÕI'%^«<á³òµ4é¤H·…þƽÄk>P<¾I[u ®][_»ÁØ›ò5ùH_ø³}QO O)$Œ˜½HÒn„¬1B¬áÖÁåe¦–&6á5]»7ʦ§W@?Ui•¸Ì¬3Jk×®ßY•uaLNUÖå1ÀƯ§É ѵ`þh B©þêyÖÃÕKÇ4´Ô¶YÇ0vÎ4š¦äkU ±¾m§©~ÒÐe84Ý])*[=]S–S*Ï2(•ŸÉ4ÖÆ”®_‘i^)¥ ¥ê˜Å;sWÁÈ!êÛ'¥êÛG+Z×y©{»FÆÔfmEí峺>BZçb’J =É$‡¾SµŒW‡°QHyv¥´,Z¦ºD\µÏŒaë™ôM=PHl +ÓPÛ’µÕxû øk¯{+bјv¯”’÷·Jp¼Ö¦Ú˜¡bª~­¾"¢«¬ ùšù™ª¢2)I—(®Éšèyezì~̘…áUÞ!Mi'Dí…„!n”Fbá×F´³~¦ßÒr‚èÌì+dd!Ð8XÑ2I:2Ò§LÉ&GDÉÜŠTOß)ô]qotqÚüÆæì›• $¿òi¡(/A1~;Õ9FIÄ §ºJ$`RšñÒ9ÑB¢»ô]ù@‰Â]¢xOæEk±eF”DS†¼S¢ÍQÒª€1í,ÐjJñb½ª3áǺUŠ.ìpxƋإŽOg³B=«‰#5•Òô™ b2õ?±»îÏsÓÞ1Îïï¢É´1›ÎcÌöLÐ1w‘n—1§aøÔ ŒI=669Ñ<¤¡œžWJ6!#J]UyNQ×¹©òœÛ£Eé ÊÐzD »–¡~â®õèU=)níç¿ hi¹-Y×ʳKv—´5m¨-”‡~DtŠÈˆD{ó3!°ËVÁ «JéOÃQø)ój8Š)bžG1E̳â(¦ˆmQ E”®Ê;~ºZ-ÖàRPû£PŠ(Y­Ÿb)¢T†<Ãb3¥/3? Ф˜ ÀI¡Ôèe@)¦„´@)¦°0(E”ÂÀÉ 8µA‰eÁEãÆRŸ9|L×ÒʦÝÐÔÆ& uÓ¥? Dá§ò-ŒiéÊ·<†Öÿ*Š .;…»jÀˆB§,(Š(ëÊ6á¹³\xR«Á¢ˆB,·KWNêÒ Ž&¤–eé…øSE”Î(žf+CO…¤¼´-Í·OJTÿÞÂ6½ÛU¿¢±sl"¨BèEB¡&Å0Z•´b(ãúÄP…pH*+b‚<õÅð›a¨Aj´ˆ 2—”ªÈËSi^lïB‰¶SKc€}EP¥eEG† &ÅÔhdÊ&y"(cÄDLƬ•ââ¹Áô¨zgR¼î$ HMŠ!),ÚÍÅÁ“ã”*,HªPûº™ýBïðm…R“bX ­ú®„‰âÚ ¦JÍ (ÜXA•¹©R«ƒå™’Exx)´YdÛ2@PÉâ1ž@©dCˆÃdC‘ã8nï‡öÞuW c̦âû³>³Žy¼‹T|N+˜†aÎên]Øâ@‰Mýô¼ MUúSØ6ÁÛœõ((m×zmWyv„aJ=ôUÇà%©í”u`ߥ*”bÚ Ô] ô?íe(u½¼y|ÿåBÿ÷öéËÇË_ßyÿoO÷—÷._ïÑ ¯¦0F4üãëËÝÇçOO÷?H”òúÿ¾ÿú·ËÇn…ÃÑCƒt¦Ë´¨¥ƒHpÃûËû§w—w÷Ÿ~ø‘f¥ß_ßxwÿáîo—Ÿ>¿ýôøåï¹Fw4ÉWsÀ…öü*c;FÅ(O“Òsêi¶”ÇWÿ|ùð pÊWqlùûWîò»W2·ÿô8jf¿­ªÝðèJ¸0RƒÏ÷Äyöóoq“‰"ËEó‡9'©$uä±ùI‡$R…µJf^½}zÿöË¿}¾Þ Pë3‰,-ûRëõç…âqâ _c‚2+Àf4ZŸSÿöûG:Ø9Ψa Kö[^JÉ0ÈkŸ›ûñýçuã ¢µß¿áî7Ešæ-åLÜœ¸LöƒHÔì¢ÎÛœ±+ s–#Í)D &¶¶âR1R¤Œhø¬HIópøŽýÓP…LÑ ¦ &‰Äˆ^1)ÂÊOð"zõpªÕ#ÞÔUËÊåAQ&A¡‡ÉCÀÏXW&Uç´p¹3ä™\¶ß“ËJQ.YÆD{Åd³Ža< C´öû7Üä2™úø—–Á‘•Ëw?<<½¿ûº°Z‡¸°Ú(¡Ë<ÁÒ®¿áÃõÂjwß„&! Ûì²))âØ3ÌìSí˜Ý4Þ•×òSùT:'ñ!=­Œ®dðʲœ+)¸¶0züŒ6Š2Ê:0>Ú+&£u ãŒÏ/C¿Åb¸«n3¸B­nËøÓÇ/+sáIÙx‹ã¨"˸ñ‡sh/ãŠß´|¹Cú7ë2&ÒÙ€0ÙØÜeY’¤ÔŸdBù«hÑ2š{8ÙŽyÛV,ìeP+|¨7Ø€„úÊ⪰›ã½ÝìÀ~E™¤íö‚É`ÂxB‡hí÷o¸¹”[óþ…Mê6ðÔ Nyúx÷öiáuaM¼0›C´©dlz€Ü9€±K¦‰út¢î"â3³[ˆb  O=¼¼zHtÀ³FS蘯ˆ™aVŸhŌֳمу¢|B¼JXø˜rŒN8¯[ „åüÒýŒ6Š2JÛí“Ñ6„ñ„ÑÚïßpsA‡èÒ :›”]Ë›ÎþrXÓˆÃÛøœ{f‰Eí`›ItYí“zˆ˜`°.|nÊçD»çÔ„§T‹BeXjNŒñ´«º>Ñ |Ž!±¯ÅÐ í´=„ þ¶ tÑÝž±÷,µ€À¯÷ŸŸwi´žQ›‘”HÜX!’žô‹¨EO›ý羪Lk㷉 ˆ¬ŒT”Æ+†°AŒ'tÚÁá+n [ñÞÝÖ*Ñwùâ‰?-3VÙK:-ÄãuF iDY•Ùó]-yÅß1ÛIÅrg|6z`Gõbˆ"}ÂJ° òád;´èyϾpyP”G‘”b( —[ý0¸Èr×…Ë!±c&'ö{pÙ(Æ$í`ðP_1¹lƒ°'lÚÁá+nr¹†F†óö¡^Êf;Þ­lnØ8nl†gmà?þ™üãŸ~‡DëºêYܵo¬1Úl+™a^}¦3š6 p}-Œ[Œd±Ã²œ}èFã´{e4Î*WF߃ÑF±å¬í“Ñ6ˆñ„Ò:Ø¿â&H ëÀî›Ë™ð¾ +£ßXU`õ RN“µI =ñ–¬´¨8ùæ°_u+æÄpÐÕ¸ÀCÄ,#ƒ:L=;À‰R¸[ Håô™f`tè…ž“Ñ“"l  ƒ‹¡Óâ‰aáshX“Ï$bAžÐÆoã ›FÊÅñŠÁgÃx@‡¨íßp“ÍpáÜFýðE6ºƒÍÏìZXMûª´nà™µŒ*$˜PÕ_°ÖCÏI-[ƒÜñÌgÓŒ¼gx–¯dl‚+øÙzŠ‚x¦Î5ÝM›ß²-éA1ÝÝØ¯<l,eÝ@±’Àæ¾<óê§™¿Ç’6Š©^í`hf}Å¢»uã ¤u°Åm8X<ÍÐÍ%M££…²óúiásOPÊ Ÿ#Á¼ÚèlÛ§‘Ž™ƒå7#áMv=Ž«©$L% sÌëùD+^Î-©ßh,çA±ÕHR’çú%ÒÅ'2Ös]~†Š8ÁEŒßc1E#·¶…jÏ•l¯·'lx¦ öñßÞÖùBpûæR†W/Ä{ß/pŸT´ccÜØ‘þ,Z²"8/ÑÒ^ö^Åã´Fè„JHõÍzbš·YæñzÐ ¯*€9øp²óû€²±IQF!q#.ŒLøžMo'ú¯R—'¼ÚëÁ~VE™e/í“Û6ˆñ„Ò:Ø¿âæbέĸM³Ù]ݹýáWXÍg[¼CQ÷ sœ~Fù{ÖŸØIÛž Fȉd . ð@‡u‡®ïôú·:ë Ë©£ùVbœ[ÙI<.7úÍî™;álÇ¢õøÔÍUr’—ÄÖà=²q<ш¥î¨Õ¥;¶Ø‰ß‹Ÿ>ÐzÛ1G´õ‰Àˆ£‡ñ{ÈQT¬“{Å”!ÄÐ)2FS7Û'Ü” ÆrûÀ# µ©Lÿ—Ç?¯BäE„r7JÁ<‹ e¢ð+B5,˜„&á)À‘Ã@LáÏ]ð"ôŠ;a‡©03[c>‘z(^Ô„}×èÔqÃ',§Ú±``:{]%cP”±qŠBÈ„pR^Eƒ3Uúò„s8µœ=Øï!FQÖZÆx{ŠĤÉÖþ7…ƒ6Å/8Bh<´KÈáøúñóý®bj Í$ òQ»È‡O¿¦d¨wÈcŸaQê<ÄM]=ëXO>*$c×2}tÏkàœÑ€“B×Õ1Åq\tÁyJ¼™€NŽ"*…Ï£Mñ‹‚jÆÐñŽqƒžƒb{ÁÜW[D,Hû at¼Ê²Ëè­Ê›l›b¿‡8E‘£u`ÀÒ^1¡§ b<¡ƒ´ö¯¸)N>øz[×DŽY:ˆÓ×û ›ñÞ/J¯NèÄÛˆðqœ•Ú¢+‰Q"a–*ÛŒˆÈyÖÀc£0÷¤jd©&ÌÏžñüiJŠì3εcnׯ«îåuÍmU ±&Eƒ×Õ<¬ö„«rŒb=Øï±Í0вÊ:0NÚ+&¯mã £µß>ᶃ¨![ú&§ÉÓ6NyœlŽÈ­ÜÕŽyx½´î)'EY…XÏÕÓÇÁU³áŠè ³aÇü¢ÆïÁl£(³¬㥽brÛ1žÐAZûWÜFŠ­×\û%ÒšÞÏ‘îÞ.› Âìh]xäæ5d9e˜¡ÂŽ!þÚ¨ Q=ì ‡A‘}LÆÌOx¦¨e×ýý˜ÅH7O~eñ (ƒê¾žÍ ;ß­@$&2=,Oø-|Ü òzCX„mRDTªY¸)J Ž·ê“”‚R؈ KöÛDaPDVF*JãCØÆ Æ:Hë`ÿŠÛÂÖ«¿i<ê G…4qsÎ%ßÛ"m ‰ö|æ›VIBu ‘¶ 5˜Pa£1ûY³Ü1÷‹…e›ùlÞÀÂn"$U°ç1IøÁ©f,mpì¯þ…AP.!Æ£OÔŸZÒ ŽÁçÆßó·Í߃ÍFQ.i{㡽`rÙ†0žh‹wáð·mâÚoó¸áDfóF",uar.û‰p‚Y`&ãX!^RÍ^¶Ep›S‡ž=Vœ9#G…DÊ‚š"§bÎCT·'ô=á¯Æ˜s‹™Ç§Ú1“T·EMŠr‰Ãéçf.!L?®¾‚T²[ÃN„v9lœ¿Ÿ¢Œ²ŒöŠÉhÄx¢¯ñDǯ¸ i­Ý†\G§l¬~·º*£„m9(UŒG@dÈÙSC–#R¬Y-‡F%8ΊF„ò9P*vú Á" ñëa9Ñ…ù|¦³™}^+âŸeRE(ýäaÍÛ&ŽXßÖºÜô¥=~.E™dí“Ë:†ñ€ÑÚïßp;8°Ä~!$Äÿ´mÿðñóÏ “'Z®\n]×3§Ò$äðÑiu²¾±²ªØìR„Ñž¹ ÌOž'>Fñœp§g¢ºKšAÁsí˜Õ½êj¬å!µÜQ€`õ|§8gl>á8æa´×ŸƒÑJP>Ykc£õ?ù¬èø¬ýþ·„k(/,f$KŒÛØÙÝzZø\øˆ}ÕÛ´„`…pˆXóWŽ–,œO_kÞ­$߃IwY=gMNðS§­8Oª“P z$0À,R€¹|¦3YSe…ü“¢Lâ,Ëe¹Æ£‹7áøtÁe O¡/=ØïÁg£(£¬ãc<ºxÇ Æ:Hë`ÿŠÛÇÁ5·Û{x ôÜ7N¹ÿðná´cí¼p€Ú÷`¡÷v!Á >¢oGp`B–V’EîYÇÒu¿¬*8J˜„ûëz>ÑŠ ú mA™„ñ¼èm'‚…ÍÎí{¿Þ²l^ug7~Q”KÖ1Ñ^1ÙlƒOÈ­ýö 7—sÎý…MŠ£7åm_÷×÷oŸß¾_4˜šÖ ý„¨̵ž '_4¢p1–„ü}ö./šxjˆfAԜNj™/Uµ"»*žðŒ( Ž:>Ÿi&@ÌqN feu^øJh³¯þ7bʾ-jœ¤]Ï¢¬¹ýËÙ(Ê'ëÀ¸h¯˜|Î ÛÇð ‚íã¿í_/×$ÆmåóÏo¿~ø¸hçÝ@Kîµç± gÿ:o›Ž Âœ—.ã”–¥2NÃõÉ*8£0N–ÍçC>œlÇŒÎH¥=î›o¢£R£ç#†¹‡‡<ìá9Årߪt‰jLœ±I@¬‰ñ¨œgIÐ ÒAUR] -$¥eÉ–#JWg•­%ĵË΀‹ É^åL;Y"¨ãêwK]$‘NŽ”öš(Ç‘këâÎqêJÊ9Þ+ÁWâÊ9øêÙôɱ`ï3ítÜgswኇ–0–pJ®‰&ĽT%OlÍKH‘×sØa êEÑÜ/†ˆ! s%@òL;va_Ä2l{‹Ã›?/µìdŽ­ ¬Òôø›ý‚ŒP&/ˆåK] N•Ä I­ Å}ʇ‚ŒN4S=z,U‰ãääÜ”$ ˆ‹È¥(‰ß,išÓ“94\+ò”q¦¯Ã2KÈ g4ƒd}>œl7ušÀ{ F&š@¿³2ƒCR £_Ξ Pp¢o©>2¶r]B½:‡,$T÷Yóùªû;zf34Â)øí•™pSÜñ¨Â{.jÓ…Ä´uñ[Þ<‰IüþVÂIb}¬G‡JÒä;Øm5E¼Ü=Œ’¿£ÊºŽ9×$gî‘£wx³^§R5„!ÈÒ®ºnNµl^%òaÍî%±ø/méþ¥mkD´lÚ4<œG/mGÚ² àbVc_a/ÛœæèÒbêͼQNB¼CÕgÑËm›öØÉ¶"Œ]Í©vâàN\aEèÄb93¯˜TZ)Ž"KÃl&$ðËÙUGœ¾(ø$†és^ÌD> gKHá×ÜÚsítØMãBÆl“BÏA†Íã̺gD’ô}§-½š§€Ä;„ ÚÖÞn*ºDóp|3tè}õ×1A@·å椬æÿû[=šC¡mÚ#Š0³öÀ2òI ø‚B™MÏ lÀ®¦Ü#6V€©ÁWUG˜yûÎ2¹‘븬Ú9síb}šDö°°|b‡ m»&¶pU1ÈI×Mxbš²z–užrdÐÃx4™=>ÑŒGí'[.znPTKùR—Œxšít8¯DíÍõ„«4Ö¥û=ÔœQTKY¦ÄìSÍéÆ:Dk¿Ãí£¬L+û¶–£•îöÌøŸ?>O‡*MûQVLâê–PR“긓P—䫆«ÏP¢Õ‘j$‹Ø—2¢cŃí!Ë–|«pñT;9°ÌŒe xyH Â4¿akíîÎÿåë¼Ô%ñéóÇ»|±w®P–¡M%Ôª*KUB-7Qf‹jÅÎz8( þ ¿|“úo›:ÓLf¯klóuK]S§Ù1„s3ñV^‚ Åݺú±4`‘OâT展A!²¸C¨BÅ0¡×÷·z4ã7˜ÛÛÛôè2®Õ¤=xtkMÒóâÑ­¨—¥{Í  P_·–ì²ÃÉT´ .jŒÏ4“QÓWY·ÊG`ócô(ðÑü=j&ùâÇèq“(½Àâ“Ãd‹Œb0j[O4“#D'y~¶ºèCõMÁ'­ÖW4Q‰Oa~±º;›Z‹†d¯Dw"¸¶¸ìÜ­„rˆ¥@^Î xxBËë"ÄŠ²Ž²Î݉V2u¹–Š}0ÃÍä4ÛV=@¨jWí0À–VÓó’- ž.~Á œ%‹ëL;w‘(¾eÜE– *qã”ÓJš¥µ]NñH±‚DüúJ ¿o jÞTsœj§‡ÝyHªj/©;\ì"ÒÄRÀ¿Ùq¢éõ'GóZuy*5dY¢ê<NJVó~=u[h'ƒNò¹Ë\{­   hY-\Ѫ8?¶ ¶jýj=óÛDk¡>ÂéÜô€HŠØ¶:ÑL‰µx†ù² 6ô¾M'&~!5ÎÔ¸[\„ijWð4Œ³§"g¢0ä稽—d÷ÒÖ*ÈDÂP_XDjwIúנߺ¬C2üE´¨ûlú,iÜl äl'¥ ‚Ö1}8×Ly“»®ûÎgsÍC‡Dd™ðèÈIJ~Ó!±Ê¦A5;"Æ‘ÂÒNÇ48FMP;ÓJ†‚:1ǘ5¿Eu51Ï[ j3øÐ6UM4ud ‰£œšj]&” i%CŽ­¿ 9êG+> T¯D}Hɇ’Ú8°’ˆo.Öwf¹RÁžˆ2pªß²è¼sí¸X6È~úƒùT©}“uþ†*2Ýå=4ôÝçŸö•HeI‡*Rç( i§GqZ“YŽ6–xLµ\×*¾G¦ˆ’£$çrýÂOw9lùÎ~í¦ÒÞô;€(À”÷¶ÑíšUƒë}4ì‚”QïàUÉEP#ÊÒ{‹»îœiÆ y˜˜¨ideÌLÓL2"™õ[ÈLgâ'¢á¹E—4( ž½×}ËŠ»Õ1ÊE‰"×BÖi¡Ç*—ñ´T?ÓP̳Àg×±ú,«H2S9¡$iB‰¦8?œlǃK6ê–=(šæz˜%O 2ROw~ipiO-s4AnIb¿Gj™Q4ÑÐ:°œl'Ë€/¯\¹=(Z¬·­´¨ï¹ ')hÖ£[“<ËR¬tüÍŒ¢ɬ+Xf¯˜%ÍlCt&.ûW¼èÝmÕZó1ñ _ø­C\øm­B9æI«PŽßKÊNæ®kM(©&¹Í.W“ì9rBV…òT;±I©3JwhkÈ‚"{-ËÁ3*¥%T.ô²8™[¢e§I¼ª¾å²Óð𞨷‹!=ш%4ª¬Ø5àé ¾ÏVómV¤røýèN Zì(œØfË F@À‰‰]¡­Æ†¿Ez´®Šl2¤¬Eéšã×µ¡,Ê4y¨Veš¤ÒĪK"|¬Þ¿]ÎiW˜¢:QÅô\;¶\jµÎ5ŽŸÔE‹R'€Öìé’‰0Ã9TRÉ“¥™DIæZëAaÁ…k¦GµízÏÈéV2æzð0JI’`[\®¸ÁL”-nÈ¡jÇ&Ö¨tú«,aÄÜŒdKÏœÙ8ÕNJ/e4¥€Ã©oR ój!ž½ÚJáã_:K m‡D1È5¼¶hE\ÖÆ‹Ibž¸¹}£Ö¢èr¯/j=k »¥i)^?R¶êL;™¼êÄó½Ô`’M•kø"ÎB4†[oo% j×<;½M‰Õ›ã¼HWÔcçU‘Q›ò®é^ûT;I©Ì¶s)ºÃqiæØö&FÄAßpU“0Ø)ï@à1tª“;’ôZÐùá Eú­º5•ä;¹æ]Þ`t¹ÖŠ´ÔãàÜõ$ôád;) '¥.NdOFè…‚,ï’ýüþËzVnzZÝ^$^(P¿®˜Ö´–zFŸðMË2ŽV‹-ê¦1&9ð§çåÈ#ô (P´ZãL3)ˆ¸™ Ô°ûܰ %‹©e;H¸;Î šnjœ£J]h ¢áµNZMˆÕ|@ö[Růœ>×npÚk@”¯mQ÷˜ Œ~;u}ð¡J赎8j݃/%N}äϪZ›É⫆’ø.%”4ÎÚW© äuì^M߸mÁab$jÐÒ]¿«!é–Ï`Ë©vÂNRH[Í`’ .X¨ç^¡¶..;9÷ 58µÑãÜ+ f…í¢TcB(‚®w)ℨŸ¨§–fKOµS†Ê6e^ÑéŠ g‹‡Ü»îùÙSªÅdøZ:9ic×g9iü ŒÂû‚­3Íd²µn˲ޢþµQz¯ñv¤#*yv´Ÿïï×½ÎR·œž€ô³2ÏRC÷*›8Ψ7y¢6NM2½Ð‰/û™(QÂtóê*8ÓLÖ.ª¢Å}í:]»¼3æâ‚]CÂIm“šgµ½îŒJÔ‹W‡ƒ£Øø±Âe"ɸkø÷0"gÚ †Ç¦&‚q`s|SÁÙ\¡ÙårùÐUs!Ã$T=;#`g/\T‹‚Å!/6Áä1i¼¨)Æì cÝ®18R gØ„ïn' r|‹ÐÊ -” _QÈ®h–¢\AªÖäÀn3 8éë—uSêâUËúrºÆ¹óUèbN4Söp"è:j/U,8öìÁn7Š)C}Ì,÷ó½ôQvX]qQÐû ¤RÛŒícÝ®Éä1XÊê¹v2ÛjoçÆI¯b@Â_$ó8ÒG)fç› •4´T« ^O|šu!Iç¼ÏâÚˆÉjqœh%¾¸˲)tœeú-À9´Ò^(bÌÛç~P}ŸÞ~þ²é>üq›øŽ5ìk ÈÅk¡šÎ¸4ŒšÀ&¤ˆ˜IZvŒ7I§ãMÍŠmPÕ—’ehœkÇs—½ÛKm‡\u¹AL/,îN¥4g–¬g¦|ÿ·ú‰ªäÅÆ •”kͺ%âß7™îðÝph',¯ݳ¸/ª—ão55Ø5ÖA¿ý8Î3SƒI;K Õ7u3)U-Ó†R8ÕNÆmض¼àùpjlPxÑKðʗز3§ª{§ë~c’ ÁWÜ?Ë5†–="ųjþ¨WW>œk¦rëåÓ1;5=’û²&eKêGÈ´d¢ús5õ#d ›M"H‚åôÏ)C„ªÆ5¨ûîF"ÓÌ!ðW3]£ç"ƒÔÜ4äèA§ÉÅ—¼6ô¬›ôœ,•šŸ½ë-ÁI¾ãþÊÃÉv2î<ÃÙIUìú7ÅLz­évÌ$õN“²C¸‡¯Çcc)?¹j±&µÌ“ÉX„÷1âÉ„?:ëÎÂ<™@&Ý|’ªÚ(¥YEU-zZìΖSʹƪàeÔ©J„½\(ĵYƒæPÑÕªˆn^(„rÛÓ¯rGdó–-„ô„†Gg»˜3­„×5kÀXTÙÂzØP‚‹×T‚Oë?u$¨+Žh•øº€+ü†MR RVÆÙ؉f2æÞöê ¬­’ÅÒâL!©C¹ð _:jzÒÛ&MÝìrþ^j<udæ0›c‡æÃÉv2l Ø^Mœ¦|ª­àl²Fà_¬{r2=µ 21Ãê¼ÊKtQÖ±ÉáÌÃÉv"Ö¡)¤Ð¬7ƵQE$¡r+./)¼D= [YM‹%5{Nî6‹ÎE=A zsiïVËxúBNµ{´sŒ%§º øîÛ¼˜¡ôpÛC{}Ê!§úù]^5˜ÂóÉìªõȪ$†…µPåjØrg†æñ´n¬+Šî “~«­‘6öF].ó~8ÙNf­‡ý|6À±ëÜ…ò‰¯­¢xRk-»ÐÚädÕöÀµµ!²—¬U#PˆûþVDRÚõA– ÕÄž€8%›ï]Òj°H³*íÕîÑa·î³”º·pÙ©ÛMÛÒ@—sídؤ¡P]ÓkMàw™!ßü»ÜØTžäcm~j[ÖhnïÎÔØ‰f2j\à¼Û¸2®Ä³ÛÝÔ7Ÿ«-Îy‹ ”ªÓ¥(œR';Bõ|à öý­mÇíÕë–¢–ÓИ†%Ç.}sák©NJŠæ¬WsxJj­œT¼&­'žê¨—ŠcKZÕm³)°íäÆ&çÖ=\Ö¡| k%ûi±ß:j0¹çpʈ”¿j„ˆÐ§ 5« ¦OïTiL@±I GΕٓ[tXÙõ§ÍšU|Ò“yÅøM&ïD3½aË·þŽÄ„à¯÷Â%$„…ÜÑ y÷öîñþc‘i²Uy¨kQæjÁ†ÙǹZO™÷Å‚<¡±èy \%$ò¢ëN1M7ä÷·’‰ëuO[&J[}ñü»/¾SÜ“özôÝQ‹UX žÊHªÝR0ÚØˆŸj'ã.Q ÔÔK(_"þƒ ï×£Iu^¾§Äk6©¡XS®\Û€wòêɵ:»U„¼‚‘d{ðÍÍFæm¢‹†PÑÀ@JS4Jo¿P¤ï®jXb¯ãÞ?¹ò¾g½Ë’ÓÉÄОh&c®‡,6e—²1ê…v.‹ î¾lµ-Lý·2*¹h,©ö¾!Ô²Œå‘js®Ý£yÅ÷q·¯yQaYsø«—Û ëmo"¾D§…%pëAoeµì>6@SgêJ}‰ßßJ‚ Hf¬<,ŽQ®Ó¿-ꬒ½P Yï Ø‚ÎŽ9NÎD–"öU¢Úµ¢eL¨ÈÃÊ M£ fEˈ€¤®î@Þ+Å¢ÆPß|9X×i­ªsª™¤ž x3U­a”=0‡m9‰€öIë«ñB"ž}! Â5<Qš' <È¢¹Î´’!ûC¥AD‡Š§Íz¿êžF@—M÷²êÔ"ZUùج*Z·ba‚beI4výL3 Ñ.‡´?¥|S5D §¬«—* ›p¢P÷Á¶†dõØš&kª5¹gˆš¨µ8Cg\£g@u‡®S *ShÖdGí(jÞfð£hýÍxêpÕéVö9Ä,¾¤*÷Ñ&\ó×J’ —Ø‚½E0ÔàrÜ*¬ ¼éžƒßÍmIŒ’¦üh$·ŠO©SUàÜÙaøá vZøê,o º÷ÏÞÊMq2ô¶|Ìt¨atKš4¯ë‰fSòˆÅù>àŒà¼úÂ9 öõ,w›|âÖ ƒ€bY„mæ|³“·ÂQä¨HÏ ´ð5úh)TÝö¥¸p^ÁƒWQÓû]å‘' îŠA’y×δ“Õ¾×$ú‡dUvÇ–Ï»¤àÌMå-÷Ëé¦ {ð¨ÅºX•„ì¬È,»û•é'Ú±&E=:K,ƒÅìß^b©xÞ¶˜¸×ÍíqÚŸÞßýûÁf¶W·èGîyFŽy]jÖ«sêHÕ ã"Bªœæ£Ë]‘Èi]OH"’j-Y/s:ÕLf®öÃÕÀƒ¢õ@ªÚÍ|šØRÙ+AGÜz¶”ŽðÏÇ´ô`¿GEQ£èUÖÝa¯˜wEØ Æ:Hë`ÿŠ.yñ¦oxµÒvø½°º¤=\ƒ(NÛ5h ÂfFD鄸'`ð3^£EŠL}jóf6Á-e]Ém@¤Sí$™Û¾55ä¾­ nœyX"p6å—Ç»çw_ÖeÂÅïW‡]Ô²ÊcîjŠëÚH?Ì®R2QîrÑQÒ cêÚ¥εã™ëvBÁ$½p7I'Åqp)ü•ÌÊ®^p pÞ库ð=vtf,³$Þ¦Â9‘±j½F>·›¥Jå€åÞ ®E )oÀáºÕö¬–ð{¢™Ì[ÉëÝ^Ï ÅÊ g·]SgçÝÛþÎÈ¿VÚ ×3Qï’¿?×J¶ï $;œø¯{‚̱äj ª¦Ô&UU¹tfÂ5޲̣’‚–ŒªR¯!õáh–Ò}DqpÐŒÔy8Ó3÷¿114”55ån‰Z<Ø•çá??þý˜ê z$;œgTž¢qåiRzWßþh5(¯þùòá'yÿ~¦!üþ•»üðŸþš4>aËÈ3'u‰ €zELå¸<üù§ßd}¤f\6„³|ƒ—oÎp¨å âÒ¢¤p—ÎÓû·;ï=6ÿ´2ß»¯Á¤´rE7ž³I2n´$»ì èëø}G”ùª”ùDàí…u0~ÊÐÀ($wÄúÑA|÷Êx…þ¦6{bŒQ{8|ÅM5Ój‰·gG3ŒÇaO·™[æ¬pVæ ízu”fÜ«Cbà!2¤o2ÂùɰøÔELø¨BÜ<e‚šxܯ@ˆƒç‘ã'i"ø$;K¡@NÇ<ÑŠ3HkäJô ŸEØïfH“‹8laå3ê’Û›ð; Ãû9ø<(Ê%ëÀ¸h¯˜|¶AØcŒÚÃá+nñ9¡€¼¿Íh.ðÕ6Fùôq©QéQ¾¥õÕMâ`5fO«‘óÎj£À3ÌlÏ<ŠQĺr÷]9«Ì>ÕN†+»yLÉ ’e¥ [•ÌoN}R{A·%ø°é–_¯àÆIâu“»A±Á Iòªfß<䮡â|@ƒ ‡ÜÚÏ!vƒ¢B£íM¦ìSêlöÄ¡vpø†›RWûVþî×&Rõ²ÝPOb9„.¸Äå>26'Ô„1oV3jSdLZãúÀY¯9—loú*ÂÆ§ú‰E·UÎɦ™ô²ígš1ùaÄœk'¤¦ëÙx=)Ì«€œA^ÂÊàD±²GÈn>àèr¼?¯ÅX¥(+í ƒ×cã¡tpü†[¼Ž8..7y¢ÂúÆë­nàdÜxÝ9fόՄ0òý¦`ˆÆ5zX È)?òsjZE@~No¢L,qïT;õÈVHÚÂëA^q^«öu<Êæ¶å ƒ {þ4NLŠòÊ:0^Ú+&·möÄ£öpøŠ›+Û5’¦ÛÜFÎJˆ··›°p6N7nûÈUe·Q½Ü5n£^©k;·Q颸Áu‘¶k¨ý‰7)g™Û§ÚiŒ>_é¹p{P„YIêò ^²Kcã6®8ZÐCˆýfŒŸƒÛƒ¢¼²Œ—öŠÉm„=1ƨ=¾âæÚ¦pº_Þ6no÷aoQ%ae66XUÔ8Mw“—2©ù“"g¼eΩQfÇÄ~gVµ€D³c7v(°Âvõs¢•0ºðžklNpžJßö-¸!vWJ»=eìoñnøeº‘YWiàS”ràÜ–EØ€·Í‚H² 9æÏ!kƒb’"íMìSÔt㟶?|ÁMI˾…ô VôÊûë„å8¸&’–¥”ÚP+|ÏâD©!˼›ZÁ½Tæ“N"—ÒZ´Ê:¸Õ3ÜSÍ4ø„WÁÂæA>!).l„¶·•ϸ¥&¯O FWŒŸƒÑƒ¢Œ²Œ‘öŠÉi„=1ƨ=¾â¦ é¤oÓmV#à6îJe»P›£õÂfBrçÿÊM.¤àÐB(NÄÒâ^›àEXBGAÙN5+µK cÀÑTÍñæøoÁ”ZNþT3ÉK+"¦WPÆÅoÔ+¹ÅÛ;ö€èÉM«|½ÿü|p;É3X&nà1qžËÑ”Öe+ÒØËÉ‘3žu&çòjJ_Ô=*Á”¿šåÝJã!¤Wã+ûþFÊX˲:ô'Kvô¡k,ød+ýî•ሙ0)ÄÂ[]ãçXƒ"‚=:PÁ¯Kc žjóuð7õ_íý¶¡E™öZׄ].Ü•úM“»DÁ½ä¦#.Ã稤߫cÕ€ÑI^Ó‚mV'Út¿Hàp’ÍÐÃÉv².—ž\tà (Ÿ¤ÆË`c+›;î…,ÂuÙS5Ç9–Ö~ü|U`ÚÞô›½`j@‚=1F¨¾á¶S¦:wÛ·@ã!šÜ~Z8ü¾;æh±¤° YMH‚uÌjÎ… ­GÁ„¾“…Ö¢ì\ÅÖ–³•ø"¹Éå43ök†4âÏ4“DÇÁ ËrYÑP -΃ßýo7›/”˜"P°ÆOcä蒴l½Ú+抶AØcŒÚÃá+nãšîÒmOcÒè¬^÷ÇÑ;¾ná¶o|åq›ÍYŒUw5ó9Ô+gÑ¥Ec’Ü“ÅÀZr“‘¬È”%¥“c¶¸=kû¢å€Nµc~süo^ù=(Â.ÔÿÄÆ*q& ¿q)ò\Øf}*†ùs°{PŒYÒÞxi/˜Ü¶!Œ'l„ÚÁán.lâa¹í ‰°zq÷… @máuà2: ¯±aL……¦±GŒ´ƒ(°CJ—A‰ ¡XŠZä+±L¤"VòVÔÞv©ü+U5™‹zå¹vr³lj¢ ד¼JŽ-Ød%N ú;ŽH+jSÍÇW ;fŠòÊ:0^Ú+·Ç ”2Ç(=¿â6·[··zl­å¸¶9àka¸\ƒ±0<òõÄo>( ¿'‡q"Z%óØ3²óS¶`Y ¾y Â) ¸†‚Dtd¾—(ç^G™–ïo$5ØúÁ\OŠ0Š4(73>¢ æ¦Ä‘È»ŠBðIø&íÇÏÁèAQF[Æh}Ã\Õ6„ñ@ßÌõñnòÙ“m¿Íf 'Hllþz¿ªp'QÇ« —â8l°-k„Ê©½&ÝCõºËðvGjÄåeìñl p —WÖÁÞ‰÷¾˜½>ÕLª.Á±î2ǢѠùêÎÐ|sÜ%}—VíÇi 'Wæc1“ C•HŒi>n(ÍI]÷––|¢™ìP$,î@»oÛd¥R_b5¼ë¶ÍúE!’®º¹êðÀ…Jx{Š °Xô!€ÛH ïE¢Ú•ªp︂Læ8)%Ò9«kn3¹:9ŸW†l7øk' Ûù}scâ[+‡Œ¢À¨ìªEH¹®‚ß…YßΤc Q1"äEÚøÈ)±(ø3ÍdÔATúuB!ÁFØä Uû0`#pUóþÙÆu½}9ê DP݉Í^Ër¦Â»jX=ÄTG±²šî¦• 91N^‡\8î8£Nâ«T{ Ÿø&TÑ ¬C; :¿ŠÃ‹Ï¨X·&PF ËCS·| 1Ó(¶3ÍxÔ´iÚýöDÉ|NbÛKÚ>ëžC¶—¨~Ø^â"Yóžp‰¢DÙ„ŽmbèI´vŠBOµ“|Ç:èúÌX¿M#¤ìÛKˆŽ¯?np,®C ö¼r–µÕ¢èQÂRdàÔÙÁqà›+˜IMƒï|ôºËâËIù¾€®ÇIâÏŽˆïj4 Òi&ù%Nùç³ ûÁïìe/eüΞs7~Ãí™4ꃣ²#‚óûz|¹Õ}ZtاÚɸQÕoãÆy§(_\à†è€<Zà(†*Ê×™>Pß¹ø)°qqê¹0eÄ+ÓË.8ª;ÑJ“ï°æˆÑEXä£r$áNø?ˆG뢽ÁD®¡q§e]ùÜ××fQ¨:ÏgšÉ²" ±„\ŸFŽVÃ5r8Ø©y7rЄj«¤ b œVµØ*‚/¢¾Ã(ivª™¸Û%Ò„„8D¬µoD¥½nP kmÓ¿¨¾pÝ·óîÖåD¾I¥‡€òºA$”ývQ+ç_(äÇxÕóÏ×è`ó"+}ØùèĨúj‰²çÚI*$ éoÀAVÅÑg/Çò¯öä­«W7„×¥öÄàÄŒ ¶˜îT,ËâM kÎ4¥¢’`ü6–ã:àvx°”åˆU‰R]6åŸSÑõ-öyá¼ÄÔÞóž~·÷¸¶Uáà:4ÆgnÅ™¯a+¢ÿO4ï ¶¡›þçÐ×¹¾ÞœüXß!æu_ß9ó 啪.‡ŒSÖp慠c2Ýÿý­dÄ‘$瀹hÒâÿ®Óú†Áª‚ÍZU\ª6.™B‹Õ©^÷ãâè–÷3ídÌ™‹¯ƒnœç7¦¹•¶ªÑNF¯¦¹{uÛ`:¤àjP‡à˜1\nÉ»ß68ÕNsAÂaØ(¤”ƒ˜,”.LØ3@1™ƒê3W‡Ó‹“"jÎ ª•ÝFT°ì8f“Ú¤ÑeIßÝFò”äF¶©÷ã7‡Òi§ð‚Ÿ‡Oû6ðË‹8hn¹¦Ó2gЛ=‹þlÐ&¥Èá[d’Q@ÍˤiEk¾ãLüf’ó‹È(¿jÁ\ÙÃÏšrÜ_öÝ$ÿû¿uÀpý‹ß™cðbsUN§%¤¹ˆž1x±– » d\jÚLbŸâ8/ˆ\}«ÈúÑ:3çÚ´‘² 'nð3Â(r0ýŒMÆÎÿzÔ¨Z×C}žŽº!ЛDÎX€síäni@ôx¸ˆè7¬ºRÜícu¤ˆ–C0ü¯¥G'/>ó1{ɵ¢û<¯e@ÈÒ„D $&ºá©iv3`Kâ[tI·k`g÷âLä+#bTå¢X­±síxò‚ãK%–a#ú?[¤®:'+ÂLj½k½ë .7€?j`75…^3ŽšÆæ*†Gamãï¬xýýÍä¶vÉœ è·ÕRòi{¤Ñ/ïÙKIÖÄâ¹ñÜCpÂtà¦gÄ<¥»£¯e›'Üä—ô‰ùÓ¼­“¢~wëÀüòöŠé¹·AØcŒÚÃá+nǵÑûoïêÞ=÷ûµi)IÚú"oØÿ¤$†·ðÒºa[Š{ èãˆ×Yö™\™†È&¨‡$Hâmеß8ë ¢4QÍñ' jÇ{Ü7nŠ0‹‹rÍs¹ÍuªH¸ûf9§I¸†!.âb?·Eye/í“Û6{bŒQ{8|ÅMÿ}ðýväLâk2÷Óöã­i‰JVŸ]B.¹ØBawæâ;ƒÛ¨^và6m,ƒ#z3nYcOS.Y”©pV.Ô=ÓNnaO\ôVžÕô*œKßœ8tÙS Þý÷¤î1n“"÷¬O…’æl•¸Zã0 x@Ÿ“¤ýø9$nPT^¬“'}Ã8‚=0F¨¾ávH|Éþö1×~ý(q[T|bIÛ nä(s;“6îÒ@1r¡øža•4žå‚EC™¥uc’Ph`äJÙÝä'šI*§¦ fO 3+#$ÉOfg’îíŒÛ¸".â€ëý´&ãçàö ³´eæxÅ`÷ÄxÂÆ(=¿âv8O¯îk‚Ðf·~¹ÿðnáuäûv^sNñÂk¾ŸeúZ3"ù¼š/¢˜ƒVåÉ\l~µ Ô.(Ò Rmæád»“é§|¨駿×ôÓN¢uyó¿^½ù¯|ýæñþ‡nGè¯ÿî§¿|þáOo~÷ŠýµSGoÞ½"ІëŸ_ýñõý— ­™OOoÿvyûôtùôù\"Úrxýñ§ÏoŸ/_?^¾|Ô>à§s¯ïøe$|÷³Û.ÝþÝÓýåó(ð˜úëû§·_ßüðåñý§/—Ÿïù­…öú^_È?ø…_.ÿòZ^Æu°‹¾íþé‰ßù—ðÖÄO{ùÛJúóÛÏ ãÆY¾üA>ñ‚ ¿¯—N _|¾<ÿåéëûO4Ìùyž“¯Ÿi}¡ÑGaxü.Ôëï.Øð@B­µNB`¯Ï:w_ß~øé c¿^ˆ7ôÉïŸiÀ?â0v{¯ÿ¶¡±3ì—c’LìLJ 8LÍ]ˆ¯ßÞ=bÑ—u:kýñ¿ÈTqÞϘ*eãa1{ß¹||~ÿUºkÉÇ×ï0O¸ã9ú‚yúJ#¦G?=^ù¼ØþñÕÿ+&š[endstream endobj 302 0 obj 16909 endobj 308 0 obj <> stream xœíM&¹u¥¡mý…Ù¼;¿ t½Ž Arvò@Èa`¹¼´µÈÎÊêJw~”+³ººæ×ÍO’lÚ yïaðR‚,ÆŒ€† ¨tòIÆÇ‰à=d0ÿé´\ÖÓRÿƒÿ½yxõ—¿Œ§oŸ_-§ÿZþûí«zµ pÂÿÜ<œþêM|QöÓ›w¯ôדóþ²léýr [<½yxõõù¿¼¿þðrûñêµ÷î’óù?]ýêÍß¼z.{Z–tzí ÷öÕùïþþ¿øé/ÿÇÕ›¬-»º­Òòë5ø‹÷ùôz÷—½‚Ë%…òÏ¥å7ïïžOoŸ®^ï—ãÎ7Ÿn_NooŸo>Þ}sõz»,.„õ|û|º~|{º½*`Êq;ÿðáþúîñùôðåôù**úp~úøÝééñôððþ"»è|¾¤=•#Ãf£nöôóÓûëï믭‹Ûη§ç—ò eW·®ú _Ÿo¯ÊAæìöt¾~¸¿{¼¨œ—@ç·§—÷·§ëa—“·eŸÚ¯?ýci ^–eÍÛùæEÏšéwz½:ùýoê/†K’S‰ÍÛZwôüå$Í®eƒ¡mïöáI´XO걩ïï¿­;QÉgw~úöãõÃóW§w×7w÷w/w·Ï_ÉæËñ^ö²åcC²9·O^îžÊ}y] ¸û¾n%¥²åŵM|¹•mo嬿ܶýöô®løüô gâ¡Ørz¹~.N¼«Nèv_—¸¬i:ìÜ»^ZIý¹­GsýxúÅß_m¹8RNßO/0-–+%¤jZ9rH«¿äò·õ:u—Å¯ÅØÇ»ÿ ËÊ­±·ã¨ʺ!5ïæI|N1æòû§o®ŸoOz=¤rÄ-ͧ¾Ÿ9óOß?žÞ©åZ·¶ ×/Ÿ”ÝëÙ¯ÞçÓ½þöŠyå®zwýéþårúëOËqë!æ|ÉËvüÒÓ\DÞ9Ösçä2Á¿ê·Ž+GV\¸{ø  í… á¸*ž®Ú–õFÛÖ€×pñÃýS÷ÞùK<~¿ž¦ ×æóË—ûbŠÜ_Ûe;NÐ9½¾ô*~ëוއ—½ÜAÁõ’t7åøo^ž>ÖS~sÿéáÃóñ¾v2{Ú«÷õFøæª«sk¹ÿîÞ–îèîݽ Ë•®§Ç-‹;ßh;·½—ºþXÚ{¼¹ýðò|9ýôþ¾ôNzù•~È¥½ïOÔCû,®­—=ïÍáÒ…éqm¥{uÇq•ÎËë1|¾.Þ“\:uËgìï½+ûûÓÇ—§ÒO«OWnÄ—ÓÏ~øôAÏz\/¾måÉi*7w^Ê6p>ÿâYwȹÒõÑýýO¾{3×}?ÖãÙ/«?|,•‘ŽûkÙêOd«õØ–²ãG'U¶úz]ä\õÄüå/ÊD¹ÎC¿©þå·CÉ—¶›¿úÏDzÔïÖº×åžpz~×ô\ýüåô|+Å%í!—û½›ž‘-^‚?.§Û¸µBéò¢oû,wó©T©ë——ëZ¤§ðk*'þñéåôùýí#zÖr¨­tÔ}ØPkäNKÕ¡´Öûå¹þÞ{½ík¿y{zy:]¿}‹ŽråôçjüªÆÇVµ¾ù¤›ÓK?˜×R1ç˦¶U›Õ;sõõ Ž>¨›!dzt§åö(çæJœYöóΘ å÷_¯YÏðù§ßâÂÍÇ%½íÚ©•šüÒîh/«Û]gpÙß<=<”“*L©†»)™?hµn>õÞ"v3®¥sÕ^èãÛû/õÄ™*]<éásí,õøK}m}Øïî-KgY ŒüÀ•ò–{½•cÍ—°–M´&>¾­ÁãúæýĶ—;Æ]Ÿ©´¹óíOPô·Íýzƒiï&7ÍÝ£œ­PºÝÐJTi¯_?å*¾§(Q¯ÉR^ëЋ—‚àÚVXýÙÖvK•½º~¬·ÃKýÅÛv?ÿp÷,g*—[­ùœ©¯´j¾º»¹­­=ß>>ß}£}í¶tñq퇺®RÕϨ>å·kGZ[_(%6ºvœx©mIöpÙvC¥çÕ|.)ñ¹æ¼–Úöµô®8sçO7ØëÒ-Ķ˲ÉÞ5ÿ\ËIò¥ãp½§»“kg1N5«§`JëW8õÇmý\Ž¬ÜˆÚ¯/ŽKºFÈBÇ^ú²5ëù‹^_å&ÌÇ­R/¿ú;Ï¥[==—{_Ê·ƒžå”/±õQåjDg¾K{ (ykÍ*Ç[mù\ºŠRÚ‰ó©õ çï[=Jg9'OZéûô\þõÕéóÝËû§ÒÝ_ß|WTvNC‘>}h {)ךmIÔÁþ×ç®K*ýrUNUéÅ"úœŸ½yõ·¯üésy©õª¤é}=yÃ¥ô¯Ê®’rÿêï~Õ”׃ú½?­‹k?k¶åFKn?çšûŸå.¿l‡kOïäð¶šdê#P;OwØ—\X¯xÙUWÎW¿)kÏÒýV®ûr:¾ïwéãÝící²ï¿àÑ¡ÖÚv¬ÿpU·*á↓¼+OPà²JãUU’FtåwËUåpUýæ·¿3N 0¸}Ï?ѵ†<.3ýá¯ÿõØO—ryÖÉf?»òÇïgy†¾l%‰Úýüç_ÿæ7ê~þöØO_BLíÍÍÍ|(ü~Ö.t]¶q?ÿùOÝÏÿÓ}O{¹¥£õ½)¾ÜÇØOç×:¢öxq+QPˆ*Úꉂb©r›TSˆJòSKA±ÔSéˆ,ÕKíûàØ¡X*÷"íWS,•Ê}Æ[l Qõ))(D¥’h¿šb¨Ò+¬CñhŠ¡~Ç]¾ïëXbþíwy9‰©þîvÔŽ_Ï=ÊV½Ý”?j[%6‡ÒKû¥¼JòëßûÌôݼ±<_–5»åOÚXãÑŠñÙœÇ3åOÚ_qæÿåÙàü`JSþ”Ý( ú0å_ÿ¨Ýq0¥)Òn”úÙLùßÿÆÝ(O)±übÉä­èI‡ÕÜ4¤ UzÚm¤H«TXjab*Ô‡f¦J$ÛbM¨r¦¶HJºÈ"M(éªãÐVªÝÚ@‘V©M:,¦X æåêõF”·n€ò£C%N±&Ô>;TR‰ÚJÖ Pith_f‡XjÚKÜÚ*`S[¤ µY7@m£Cû>;ÄšPiv¨hIÚZk›•*O3ê†(J±&Ô 7JäZEšPnXÊ_²gjƒ–"M¨nXŠ4¡ܰTyÔâ¶êËí±-Ö„ZᆥHÊà K…úo¢je)Ò„ÚᆥH*Á ‰ H*nT^jè·T^7:EšPþp£S¤ àÆVïqPåIÆšP;ܰiB%¸a)Ò„Êp£S%Ý¢OkTZܰiBy¸a)Ò„ pÃRú´NI,(Ò„JpÃR¤ •ᆥH«T‰x~8«5h.ÜÖê­ üàPZÃäР µO¥5¢Ât*Y7@¥Ñ!·Ì±&Ô:;äú4ñE( U@‘&Ô7,EšP;Üï@µ ëý%T«÷¢€"­R¾eC±&Ô 7,EšPnXªe€Nµzo)Ò„jÀR¤ •à†¥Z8¨Ð꽡XªeK‘&”‡–j S›uÔ6:öÙ!Ö„J³C¡e€ƒÚZ½7kB­Ö PëèÐæg‡X*Ìm-tj·n€ÚG‡¶4;ÄšPyvhoà öÕºjÚýìkB…Ù¡½e€NíÖ PûèОf‡X*ÏÅ–*¶zo)Ò„òÖ PM“]¨7DEšP;ܰTËjõÞR¤ Õ2€¥H«TMuë@¥–:Õê½¥HªeK‘&Ô7,Õ2@§Z½·iBµ `)Ò*•Wë†R¹e€Nµzo)Ò„ Ö Pat¨dšÉ!քгC¹e€Neë¨<8”—urhЄr“Cyi SÁº* åeŸ4¡âäP^Z8¨u±n(ÅšPëäР å&‡òÚ2@§Z½·iBíÖ PûàP.Égt¨kuv‹Rnˆ¢”kà \«÷–"M¨–,EšPnXªe€Nµzo)Ò„j@®“C¬ g‡\ËÊÖ PytÈ/³C¬ åf‡¼ç S”0V˜QjŸbM¨8;äW˜¢ä±ÂŒZ¥Â:;ÄšPnv(x®0E c…5¡vë¨}t(ÄÙ!Ö„J³CaÈnÙZ½—>Q)£å¨TË¢€"M(ŒÕ2@§Z½·iBµ `)Ò„ÊpÃR-ÔÞ꽡XªeK‘&T€–j S­Þ[Š4¡Z°iBeë¨<:—Ù¡Ø2@§œu”Šavˆ5¡¶Ù¡Ø2@§¢uTŠyvˆµJ¥ev(µ Ð)gÝåF‡R˜bM¨mv(µ ЩVï-EšPÙº*åevˆ5¡ÜìPn SÁº*Œåmvˆ5¡âìPn SÙº*é´z¦M(79Tµ<´¬ Âàкl“Cƒ&TœZ—dû4¡´ÞošG@‘V©U3Q¬ ¥3˜"M(`J3€¥´Þ3EšPš6ÍI HJG6Í# 4@«”ÓzOkBi`Š4¡t†Sš,¥õž)Ò„Ò ÀiBé ¦4Êk½'Š5¡40EšP:C€)Ò„ÒѦ4X*Z7@ÅÑ!Ÿf‡X«TXf‡‚fK9ë(7:ÂìkBm‡±]«A34¡âáF§H*ntŠ´Jm Üí=fÑ4@Jë=S¤ àÆÖÞ¸MÞ¼ ¥36MŒ š¶èÜ´¢èèPš,¥õž)Ò*µk Š5¡tt€)Í–ÒzÏiBi`Š4¡t†Sš,¥õ¾ž¯ÃGÖ*5ÅšP:C€)Í–ÒzÏiBmpÃR¤ ᆥH*Á Ki0TZà†¡XÊÁ K‘&”‡–Ò `© nXŠ4¡âìkB¥Ù¡¤ÀPy±n(ÅšPnvˆ5¡üìPÖ `)­÷L‘&T´n€Š£C9ͱV(·,“CUK™)gÝå‡ÊãéäР µMU-mEë¨88TÂéäРUj]&‡ª–¹­ÕY7@¹Á¡Rš&‡M¨mr¨tèÓ:…zOiB%ë¨4:ä–Ù!Ö„Zg‡2€¡¼u”rÛìkBí³C.U§Qɺ*ùevˆ5¡ÖÙ!ïlŸ&T°n€ £C~›bM¨}vÈGÛ§ …zOi• ‹uC)Ö„Zg‡XÊÏ…`«ŽP›uÔ6:öÙ!Ö„J³C!ÆmËTaM(7;ÄšP:C`Û—# ¹ @ߟ…z¯ (Ò„B Š4¡t†SÈÚQï-ÅšPÈD‘&”Î`Š4¡tt€)dC¡ÞEšPÈD‘V©¨£DEdC9ë(7:ýìkBm³CÀPѺ*ŽÅ4;ÄZ¥Ò2;” …zOiByë(?:”¶Ù!Ö„Úg‡2€¡’uTÊËìkB­³CÀPÞºÊåmvˆ5¡öÙ¡Œ `¨dÝ•‡ü²L šPëä_ …zOiBmÖ PÛà_öÉ¡A*MU-q[ëbÝPŠ5¡ÖÉ¡AÊOU-mmÖ PÛà_÷É¡A*Í­Éöi•r‹uC)Ö„Zg‡XÊϹ`û4¡Pï‰"M¨Ýºjr ïÍ䮕†wiÞµÑýxÿå=¾P­R³‰"M¨6CÀR¤ …Ññ…¯T ³‰"M(Ì Š4¡0CÀRã ˜%HiBa– Q¤ …Da|ÀPøR€(Ò„Â,A¢H 3ˆ"­RF,µáëCyë(?:´…Ù!Ö„Úg‡6|=`¨dÝ•F‡öevèÐR»¾vÌPÆ Õ>G´iBa– Q¤ …Da|ÀPøR€(Ò*1KÐR¬ …D‘&FˆÂ׆Â,A¢HªÍ8æl sÉŠ’Æyi¢Ñ¼4çf Ú¶Œ–t‹iƤM¨yÖ@ÕhNMQ¶cZjÇÈšPû1­S¤ •Æyi¢%n+ãKK±&T›%h)ÒŽåŠ4¡ÂáP§ðõ€¡Ú,AK‘&T²n€J£C¹ÏlTXðõÀA…¥ÏìiBùÉ¡A*L…_j·n€Ú‡Â’&‡M¨<9V|=Щ_ EšP޺ʅ5L šPûäPÕÒÐV²n€J£Cë4spÔ*妙ƒ¢µO·)åÑÍ6bЄê3:EšPÓÌAÑò°_4KÔ0s°(ÓÌÁQ«”ŸfÍ sj‚÷ÓœšA*L³žM¨iæà¨ 5Í,Zf=Ÿ§YOƒV©0Í5¡¦™ƒEóÜšh– ¨0:¦™ƒ£&Ô4s°hi˜õ¶ešõ4hBÍ3M¨yæ`ØüPa¶MfЄj³ÍÆšPm†€¥H*=Z«a_Žª#ó£‹Òf ZŠ4¡Ú K‘&T8z´NmG…iÔœ¬†½ß[0ÇÈšPm– ¡â˜B\ç ÚP-XŠ4¡ÂìP3@ˆs4¡æ 0hBåÃN‘V©´nT3@Hs´‡c)œ £CiŸæ¥U-rOžZ½ïOsƒ&TË–"­R¹Í4T^í“§P­Þ[Š4¡Z°iBµY‚–j S­ÞKߊ4¡Z°i…Ú–6K0õeˆXªÍ´TËjõÞR¤ Õ2€¥HªÍ´TËjõÞR¤UjmÀP¬ Õf Zªe€Nµzo)Ò„jÀR¤ Õf Zªe€Nµzo)Ò*åVë†R¬ åf‡X*̹–:µ[7@í£C.α&T›%˜Ûª¢i…ɺª‡Û|«÷†bM¨–,EšPm– ¥ZèT«÷–"M¨–,EšPm– ¡BËZ½·iBµ `)Ò„j³-…YúÝ‚PP”fKi½gŠ4¡0C€(Ò*µatÀR›fKi½gŠ4¡0C€(Ò„Â ¢0>`(­÷L‘&f .K[mdÔ*µc†€¥°t”¥´Þ3EšPáp£S¤ µntŠ4¡âáF§4X*ntŠ´JÅåpã XÊntJ3€¥ÂáF§Hj?ÜèiBÅÙ¡ˆñCåÃÃíØ2Àq¥–z4¡Ú×–j S­Þ[Š4¡Z°iBµ/zR4¡Ú×–jà r«÷†bM(7~…;jBµµ…,ÕVèT[EÀR¤ /n;EšPíë;Õ2À‚y|ûÒê}§M¨–,EšPíëþ¾°j©¿CªÕ{K‘&TË–"M¨<~…;j•ZÛ׆Z[èÔô¡ÑZŽÞ×0½©4¡¶éIg_÷áM;Æé]šÕô9m_óñTÓžÓ­R®}=`öޭÛšÝõ/Ú›šAª)Ð)Ò„ê_tª=Шþ¥@§Hª)Ð)Ò*åë†R¬ Õ¿èTÿz QýKN‘&TÿR S¤ Õ¿èTÞ¥í~þz`Ð*æ¯M¨ùëªå¡­ù=À  µo6;EšPñx³Ù©þ Qý=@§H«Ô¶o6Š5¡Üq¿tŠ4¡¼½_@õwÚŽ·2"M¨8½©4¡úè@§òð¦fß—éMÍ  åf‡XÊÏíý=@£vë¨}th³C¬ •f‡öa·ÇiQÊY7@¹Ñ¡¶¾ Q~t(n³C±¯,Ш8½©éZ{Ç·Çù ÂA«T[_ÐRiXE (Ó*£&T˜ÞvšPÛô¶sOÃ*E™V5¡òô¶sÐ*ÕÖ´TV(Ê´ŠÀ¨ Õ2€¥H 3lÉšPûìP¦•„ÊÓ7žƒöPyî_6jÐt)èe©1Ä%LfЄê_vŠ4¡âäPÕx<-.yO´J­Ëô¶sЄrÓÛΪ¥¡­Vï-EšPÛ4ž6hBÅémç  •Ž­SyO‹®Õ{C±&”›Æ¤­Ö(?¥´èÂÒ¢›W4¡â4žÖµÞVšryñ¬Ênñ4¡ÜìkBùÙ!ß3@£¶iÄsЄŠÓˆç  •f‡í8_m}A{¾Â2Œ§Õu”Çñ´AÊÏ…qÖ@lë 5®"P×QÇÓM¨–,EZ¥Úú‚–ÚÆUê:Êc…4¡ü4ž6hBmÓˆg]IyÚšW4¡Ò4ž6h•jë ZŠ5¡ÖÙ¡Ý #žuåqÄsЄÚf‡Xª˜Þwoàè}÷tdæN‘V©¶¾ ¥Xjžtbtc…‰a®0¬ Õ2@Ï÷ƒ&Ôn¿‰5®"㼊À U*µ `(Ö„¢ ÆY1ͳdmå¡­^ïûIj·O5 öáI'¶õCj뺺’²TÕ*•Qïuý0¥mӵĊ‚ àû÷ƒ&f… `(Ô{¢H €(Ò„Â ¢ª®£¼m šPÈD‘&fEšP ÀP¨÷D‘&T²n€JƒC©­/h©À·/Tñ;Bpý‹ñA €(Ò„Â ïŽo<«&}šjB¡ÞEšPÈD‘V©¶¾ ¥2€¡Pï‰"M(d¢H 3ˆ"M(Ì ÀP¨÷D‘öpü±”|ÿyЄ ]Ï2€jB¡ÞEšPÈD‘&f… `(Ô{¢H«T@°kBa†QȆB½'Š4¡tCPM[1û6µõUEšP˜!@2@§6Ô{K±&2Q¤ …Ñ¢ …zOiB!EšP˜!àúšU“>͵5#ê:Ê↥X €(Ò„Â ¢ …zOiB!EšP˜!@iBatÀR Sõž(Ò„B Š4¡0:@2€¡vë¨}t¨­/HTjë Z*!t*9ë(7:”üìkB…Ù¡„ `(Ô{¢H*Y7@¥Ñ¡¶¾ Qyt¨­/h©Œ `(oÝåG‡r˜bM(ðùøK®®¤\+ 4¡´Þ{MX H+TÆú‚ÞÅ# šP:CÀë“8(ÍЄÒzïõï€"M(ÍL‘&”Î`J3€¥´Þ3EZ¥VÍD±&”Î`Š4¡tt€)Í–ÒzÏiBi`Š4¡ܰ”fC¹nŠ5¡ÖÙ!Ö„Ò~9þRŽhµOƒ&”ÖûUç_€‚¶-¨¢YW: «ï£Íƒ&”ÎX}:©ZíÓ UÊk½_ÝñW+ŒÖ®{YG¹¶åÌÞ³&”Ψkµ§ßAJG˜Ò `)­÷u­¨v§ šPšV?Š4¡tt`]ûWlYW?iZ¥ôëë"M(Í´EÖ„ÒLi°”Ö{¦HJ3S¤ ¥3ˆÚ4jÓzÏiBi`Š4¡ܰiBí³C›fKi½gŠ4¡40EZ¥°¾ Q»fKyë(?:„õWÅ*éšJë B¥ÀRép£S¤ •7:EZ¥°¾ QQ3€¥´Þ3Õ´„'YGYÚ§@‘&Ô7,EšPnXJ3€¥2ܰi•Âú‚D±&”ƒ–Ò `©7,EšP;ܰiBE¸a)Í†Ê Ü0kB­pÃR¤ åf‡²fKi½gŠ4¡vë¨}të 2G‡°¾`UP;¼¬­œ­þ©Ðe…¾Íh4šÓÚá¬/¸ö?`;jB¸a)Í–ÚᆥH*Á K‘&T††Zôi¥u HÊà K‘&T€–B0ê=Q¤ ¥ ®‰Z;jBé %§–F­RX_(§ÀRZï™"M(ÍL‘&”Ž0¥ÀRZï'ªiÒ Àm‘V)¬/HmyÍЄÒzÏiBi`Š4¡v¸a)Í–ÒzÏiBe¸a)Ò*…õ‰bM(7,¥ÀRnXŠ4¡öÙ!Ö„ŠpÃRš,•áFjïïG­RX_(Ö„rpÃRš,à†¥Hj‡–"M¨xÜ/Ò `)­÷u-Xß®UÖ*µ¯p÷§ÌQÊÁ K‘&T€–Ò `©nXŠ4¡"ÜpíyhÔ„ÊpãXI´ì­Rq…ÇJŽ£&”ƒ–"M¨7,ЧuJëý¢ß"M(Íu­áp´EšP:C ®e|T¾¤Z¥’Öû%…Þ“š×§9/ë(gUÖvîÖ(!ÀTÓœ¾ëð Ö„J3€¥´Þ3EšPš˜"­RX_¨¬`Ik»·³Ö{( H*À K‘&”ÎXôK?Pšª†l’µÞCEšPš˜"­P+Ö´[\Í‹~ƒ(”ÖûeOmžû¨ ¥€)Ò„Òõîj××  ¥£L! õž(Ò*…õ—½ÿqø®m¸ W¬/¸èw T õž(Ò„B ªkm‹:C (dC¡ÞEZ¥2€¥Œ†ýÂú‚L!èÙ õÞž¯Cë[D°ÇÈšPnXŠ4¡ÒáF§:åWë†R¬ …  ß ƒ"M(¨Õô¸î=2€~ -ê}ÈýúbM(d€íø¾cÔ„ÒÜ2@o+ Þ[Š5¡ˆ"M(!À2€¡Pï‰"M(d€p¼—5¡t†S¤U ë µ! õž(Ò„B Š4¡tt` Ç×¾®¤,&àk _×QV7,EšPÈD‘V)¬/HÔŽ àñWÖ|]GYÜðÇw'£&2€?þb[×Ì7¸a·ˆ `¶ˆzO[ìZ£üñWüŒ†¿öéW¬/¸øcôÁh»¾©ñ+Ö„ ÀP¨÷D‘&2Q¤ ¥£¼_Èo‡}]GYÝpý®e­RX_(Ö„rpÈRȆB½÷k¿ÓX €(Ò„ŠpÃRȆB½'Š´JedKÚÒªBvpcéU5¡<ܰ2€¡Pï‰"M(d]‡iBéèSÈU×QÎC[ƒ&2Q¤ ¥3˜B0ê½;Ö5¡ˆ"M(!°èz2 T«ÔŠzo)Ö„B Š4¡t†S¤ µÁ K! õž¨®i/ç°¾ P]C[X_°¾×i=S]IY*ŒjB¡Þ¯Ç{òQ €(Ò„ÒUiy¢®¤¼ÆC õ~=Þ¹šPÈk÷8h•Âú‚õýY{N«+)KŸ¶bÉ×u”¥ÂEšPÈD‘&”ÎXt%P¤ ¥£Ui½œ¬­œM(Ôûµ¿9´Ja}A¢XÊÁ K! õž(Ò„B Š4¡"ܰ2€¡Pï‰"­R2ÀÚßvšPn¬½7ÙT õž(Ò„BX×#!šPnXŠ4¡ܰ2@§vÔ{K±&2Q¤ åᆥ …zOTÓ–Öcb}A( H*Á K!t*¢Þ[Š5¡ˆ"M(7,… `(Ô{{Œ¬ ­ âèÖd*a}A¢2€¡œu”Âú‚L‘&Ô7,… `¨hÝG‡°¾ Sitë Ò=”‘ú=”Qïí~±&”ŸbM¨mv(# õÞî=kB!,},`Ð å±¾à²ôwµƒ&FˆB0ê=Q¤ … @iBat€(dC¡Þ/}ä§k…õ©-Ö„ÒL! õž(Ò„B Š4¡öÃN! õÞ#k•rÈ–bM¨nXŠ4¡0:@2€¡Pï‰"M¨}vˆ5¡0:@2€^ •ò¨÷ª(ÅšPÈD‘&”‡–B0ê=Q¤ … @iB%¸a)d€NÔ{K±&2Q]“TÞc}A( H £D!*ntŠ4¡ÒáF§H«Ö$jC0”;Üè”Âú‚L‘&Ôv¸Ñ)d€¥5Õu”Õp¼4¡ˆjÚÑÖ„¢ÔŽ ÐÛÚQïm[¬ … @iBmpÃR¤ …Ñ¢ …z¿ô1°®Ö¤¶X £D!,m<­®£¬nøãinЄB Š4¡v¸ÑÇæ|D0ê=µÕ´6‚W×Qvc[¬ …Kçó `iã|>¡ÞÕ´Þ2m‘4¡0C€(Ò„ÂèQ-T^7Ž3qhjÀ´uhÇYÅú‚ÜV˽­ÍºjÊûìkBa†Q-4ª®£†¶M¨Õºªi j«e€vŒaiõÞ¶EšP»uÔ>8°¾ Sip(`}A{}ÉÚÊÜÖºZ7@5­]«amÀ¶EšP ªe€Nµzo)Ò„Jö~•†{(`}A¢\ËåZ½·iBµ `)Ò„’>ç>rtÎpÓ„’z?P¤ %` HJÞ«i•Òõ™ò’ˆ’z?P¤ %` šÖÆÝƒ®/(J{:©+)¯þЄ’zï³>=êš>w]_°)JM³oÐõ}ŽÇßÜðu%å5šP^Ý Š4¡6uƒ(Ò„ÚÕ }% iBI½(Ò*¥sÙ}Ö¿$ Ô¡-H0A×l (Ò„rêQ²×DmêQ¤ µ«D‘&TR7ô¯%€’ дJí Ü0kB­pÃR¤ åᆥ$µÁ K‘&Ô7,EšPIÝÐ÷: $4­RQ®Ç¢ÄÞß³&Ôªnì{ïWmk½‰®/(J{;hBe¸a¨¼hŸÖ©,õ~ º¦s£då|( ºÖÚ pöյÖÖ7l[»VC%¸a)Ò„ÊpÃR¤jÓõ‰ªZövïë:Ê>òÞ[­µà†m‹4¡öÃNíÚ§*ntŠ4¡²uTÚt}A¦V§}š¡¼V¢H*X7@…Á¡Mר}phÓõ ÀPùp£S¤UÊ­Ö ¥XÊÍ9dCë¨0:äöÙ!քгC S~9Ü8®/Ö„Z7:EšPîp£SȆB½'Š4¡öÃN‘&T´÷ ¨8ÞCº¾ S Sa=ÜèiB¹ÃN‘&T°=(dCí‡"M(dýP H*à CmÈÚPï‰jÖ¾- 2À~¬;jB¸a)dC¡ÞEšP-XŠ4¡2ܰi•Òõ™Ú[èT«÷–"M¨–,EšP»º¡ãq T õž(Ò„B Š´Jéú‚LEdC¡ÞEšPÈD‘&Ô®nlÇj6¢IŸ¶µ9[ue©0[ŸÙ5hB!EZ¥t}AŸ·c…£QÊ©D! õž(Ò„B}NÍ  Õ ¢ …zïú¬A«TFp}¤ЄrêQȆB½'Š4¡\Ÿ50hBEuÃõ±ò-#¸6 ^×Q– ³ôìƒV(YG935hB9uƒ(Ò„ êQȆB½'Š4¡ˆ"M¨¬n… °´ù÷ueqcé³ôM(dýû¤ H*¨v‹+2@߯õ^g'"M(dÚ"iBe¸a(‡ Ð)‡zOiB!EšPnXŠ4¡6¸a)dC¡Þ/ý-Æ  … @i•ÒõEi½Üî‘–öF¤®£\ÝH:c iBi`Š4¡d†À@!˜-j½O:oiBi`Š´Jéú‚LÍ–Òz_•öì>hBiHùXƒjÔ„’‰âŽ-’&”Œ ”fKi½O:gi•Òõ™bM(7,¥ jú\[×QÞä÷Öcfj×°ŠSQv¸a)Ò„ŠpÃRš,¥õ>¥þ…Ä Uj× @kB9u#õù÷u%e'maM_×QÞ·CEšPš˜"M¨¨nEšPIÝ J3€¡¢Ö{¢XJ3S¤ Ô ¢4XJë=S¤ ᆥH*à ×ûœ¨ ¥ö†²®£¬nô7ƒ&”ƒ–"M¨7,¥ÀRZï™"M¨7,EšPnXŠ´Jéú‚>ÅþŽOÖV®méüm¡´ÞCEšPš¸-Ò„ÒѦ4XJë=S¤ ¥€)Ò u}A¢â¢ÀRZï™"M(ÍL‘&Ô¦n¥ÀRZïS<Ö5¡2ܰm‘V)]_ÛbM(7,¥ÀRnXŠ4¡6¸a©®iUˆº¾ ¯ëaµ÷¾UËž© 7ú;äA«”®/Èm±&”ƒ–B0ê=Q¤ …  _E€êšÖ¡¨ë 62€¡PïSï´JydKZ뙢®/ØP¤ åm ÀP¨÷D‘&2Q¤ •УõQ¤è‘V«ô1 Þ›Þ·km¬)dÛkByuƒ(dC¡ÞEšPÈú§WërªÿÁÿÜ<œþêÍ«¿ü¥w§xzóîÕª?<ÕOp|íÕ¶ZýéÍë¯Ï—«×®.1›¶ÿøÆÿùgûÏ_½ù›Wk½æÊ¥ôæ­½pþ£·úZ7[g/†4lûÇ‹öÇþ}ÑúR0v÷ãUûã?ÿÜ®ÚíǾöÇþY]µ?„ÿùgsÑÊãYªg¯ëœïÓëºÖ‘órý–çÚ\2ÃçWçLJ÷§‡‡÷WoþÑ>Ï¥K.úëú—+^Z,?_Nõ0èÿnõ¯0ü"Æÿþ­ü?ÙènãÇóù{‰r9Ê ‡z×ÕÖr ×ïíÓ†´ûß?½Ü?]½Þ/9…´ŸŸ¾ë—½þZýg§7ÿíÕzqK’«ý?ÿÅÏNï¯ßÞß=~{º{¾ú‹Wõïõì¸;+˜+øõùôòþöôðôürºyzøp{U7S2Ëù‡Ó‡«×¡ü—×óõÇ—ÓÓ»zJ£ò;O·§Ïw/ïåÿ¼¿ûöýmiãƒìš«s|÷¨Û:?½Ü>þ¤èëúÔâýéõ*G¶\²ßdw_î®ïOïž>žî>|¬h]Ðfk=ÉÓUùµ%-ûù{i¾lçÛon_ž/§7e?nÊ1{UiÓηϧëûÚ5ÕÀ;š<ßÖm„˶ÖÞaiûôŒ\¿ýrº¾‘³q÷üþöêõvYÜšãùíéùéôîúãé›Ow÷oOŸ>ˆ'±üðüô(§áV·U?Õ)Fè¶~¸{~)&à,å'Ç øúüüò±tgçO7/Ÿ>^¥³þ~] rϹYåË/Ô“ôUÙîËé­ì{àµl¹·ªåK¬«™6íãIÎd½6¼wÇɺŠçϺ—ë%¦Üð§ß•Ëäô¨­§Ë²íøóÍíóóµ´U'Àùö+_Ÿ¿œ^žNw/·ß~¼~¹=ñ5wóôø\޼XsÿåjËÕÀt¾œþúé#’F]á¸xŒSq¾{|~¹~¼ÑíûKòËz\«z•|]Î@ñ¥ìMmÿ¡îU±º˜³nY¬.fÿy±ãÖÇåâÓÖ[ƒÏºÃÄßwR½ÈŸOÏïŸ>s¿yuÕÛrß<áœåËÚñU_ú–x_Nv¹DsòáÜ®¹¶X›«­åÍ—“vÛ7µ›~•?GÊ©¨w¿®ó¿þ¶ž‰Ÿ½yõ·å?ÿ5¥¯üendstream endobj 309 0 obj 12292 endobj 313 0 obj <> stream xœZ[oäFvÆÀÉ‹~E½-H\VñRE¿y;Ö"ãMl-öA;Ø¥šT7Gl²§É–¬ýÕA‚ä9ß©Sª5ãõ†aCÍ*V:络â'‘¥RdôûïfñÛµØÎ™øWü»½øt!íÂýg³¿»ÅC†þpûpÁ㤅Lu®„6yªT-n÷ÉÿüçåíG<‹?»‡«,52Ç€Ûö"yÏ¿ú™Lš×™ò?~·Ÿ¦³áªNóª®Ý?½^¤¦t¿ü¥ýøa·mÎFç:UÒ¾K¾¾¼Îó<Í”Jn/?Üþ~½'™VU¦ÜlíùD²H3“É/îÂÔ¦p?>þµ?ž¯#Kóü× ÿÐíÞD0Íý6¿=T§!vÿºkƳ‘Ø­Ne‘‹ë¢Jµ–5=š§².ÄíóE2÷ãvèDs8i`aÒBåÆMh¢L³Õù4›]*nwý,øù:-¤ñ±í.¯«Û0UòéÔmx•LUØ6™Å²ëÄÌêº6x´7§¥YúiËdJU¤ª®x -¸´ ¼PF©Êb½Ð"­‘%þøžúÛÏÍ &MÛÚaƤ*ža7ÏôÇ뼬°H„H*ú;Ò Pô²»äýÍûoÅáòs­ë¤9.³hÝÖªkÈ×»×È«¼Î“Í2¼ð&êT†÷Ѽ’çMÅÍ(¶—ØE­s™tcwl†«uhŒÎßDfÞM§¡÷<µÁÜZû­pÊ"Õ]²™öØOÇK“f™6x ¶BCi»FùǦK,;«L‘<Ó“R—&鎧!µ#ŠTg«èè²à]|7E?ÎKƒU^Öi]çur%úE =6'R­Ú¥/^{9â°Zf7"Z´I 4%…ªªdšçþ‰Ig·Ùà BlBŒ§±C3/bŸ›-g›ÊÒ¬T>Þºä¤é°L$ö²aRi™>É»Ñå€I+vy—̯²™¾Õ”8ÉS]åö ©øîtÄyƒ5¨äÐhŠŽ¬ž«¬Kÿój> Í JÑï…£Ö•˦qâ×(ì֚¶²?pheIë+ßžã½NW™v¯ÃlyÌú6ߎ^(EB… ~¹¼Vi–KU&‡Å EFi»¶0’Ö/”‰ÍHkŠÃ È—±¤0²Ì9iBÛ¢ª3JË–_†#0!W(í3µªLÒ†åÄÀµ¢9-Óµ±i¤Pƒ„hûm¿4ƒ˜ûíØ,'¼ÉJŠäO¡ëÔøIèýW¶v€S™Êò°QŸã­˜Æw8ØwÿôrYâ\3c¸z€ ˆÒÏ˘:¶âd) Ä_£ªø°Ò"HPÇéøx%Þÿ›YœÆY&ìbŒN«²öj÷A˜W¥Õ¼ÄÈ+W ×@[d„–ªèÞ> . +е« ‡¨ô`êÔÈåk¬:“E…ŒŠ;² \¥rEªí•¸?-¢™Ås ø0Øšm»‡æ4,µ€ˆEáq»Û5OýtäŒAeUÅ fJù†¹¼Cä ™”˜˜™UI2î޵Ө »8äš\$¦)UBÁ­©zó’ÊN–É3‡EŠPãi&9nž>38ÈÛóÁ }Ôɾ9>þÚ7ƒ¬URôÐo¾4R¥•âc¹¢º?›Õ_f¹ÏÉy:.ûóy^W•¥ârè%жkÎԾ˃‚V&Jã$K“{ Cëu3ÄJˆ?¯=iñÃP7?vC³tö…H?i Àyx&%XÃüÂŽàW¤ª< õV€¹:$zÔ‘î–Ó,[Aë–u24‹Û»!ÏöžxÿCB5T¼Ê¼Û7¶H¡uÐ)ô»ƒ.g ÈD"§ûöïþ´ Lúƒå(È ?5ÈP7¤OqR3âOèl[ ®òþÙ‰‘=c ÒeZ(iOCsìÿfe —&j^æÿ˜Ïkg(Oÿœ\JB•l .9P\EMúºƒƒMäË“ÿ:ƒš"Ä29§¼˜Oþûÿ1æ¿8æ.ùóå• ùþÐ@2¡ã$(nZ”¨ü™†N6öé~\ºí±_œÒÌLªt¬úšÕš? zøˆzrâNÕà#]œ‹»;’Ŷ%¼8‰¡~d/Wa;±38=º,΂"ä\SHc²YJVNV’‡gÊC`ØSÚ"²Vå&ªyRo»…;Övo AôfT{~Ø1´U&Ìø5,Û2«—¾Æ¬ ئ7`*q˜«jIT0 W²B$!ÏÖQ™´øûÎq?Í1 bÛÌ6lð°QP|ÆEÒ»jOÝ„–Ì uYuß¼ÿæß­_zßôCÛQ¿îæXÔ€¼HÅïNË•“A9ù15/ŠžSï"¸REÆŸ›'"Hþ*´IV M‘ùê¦æ¾}³kF,Ehs#†þÑ:³jP}~±ö†‚„n®<”™€ãÍclósßÔZ$lÚ5¶Uh²š~œw%ŠÒ±›ø|ÞæGÕÇF0Ô ¯¢Æ_½ó®¡XsÊHô\‰X'¸,¤Lb ¶Oiø]ÉܱÉÏ+pøFðU–¡ËU“ ºHÑ@·“YCHÈѹVÇJä}ƪ¼)ýê’ï-8Ýq¹Ä”Æ]zˆïöHP+Á…·» 7eÖvW²ÎøÓ»|v7KÅ*‰ÞÒRBņ)Ö`=çhsÈg.`™iq—+‡»¸áýª:=o ª•yšB!Ó¹¿Eb-NÐ_.½ó£N‰ÂßÙÇjÒ‘±ß©¡k–,Þèjw™"hÍ^Ì“ÿnAÖ¡eèn™MÄdt2-Ô»°/g8bXïUµÂ<®ïU¹Ÿcª¸ŸÎÙw‡Uà¼ê(NËiuÿÎIÇ’>cín€H êþÆS­¡{€¬Ž›WT»’¢®ð¬ðèv=‡ØuGÅf˜Ö=ËŒ»H…ØŸt'¦5r&€ejW3oNóÜÅ›èÖú—~ôñ·NÝ%^çb³.°í¶· @+;-Ö§xÔ£¶;¯H††1¦1õ«ï>¬uŽN°ïé§Žê’ À‘¬®->/ÛèW(ÈñtM.!ÞÙ(UTþkYع£ou׫o°Š_jTþf5Ù¼s$¯;ïÔ]ç¨3…c¿s3åºëº(Ö7î²›õÀ×°8ØR'›ùŠÿ¿Êê0€»§Õ±|ÍpS¥RljíaüŠïúUÿ¸xšÝ yª™¤:û—’ôŠ<ÃÛu9»Ó€[‘ U£;)âÖ·EçÏB©Õ—DÔ„èœkÏò7¯%(kÉ·xÙ‚hërÅßwÉì¬]à“ïÊÄÆ‘Dì|ï°}a‡šjs×XEzô ­åª^ƒO3ôë,øÀ¶;fµ0M›'ƒáôžÎ+"Ò[–‚ª+²"®ÊQÕÍ4:zR8ÞX{DdÚ·O\lQÊè/V²a #<&Sžr’­ëAD®X\…@­Ì5uOœƒ…q—o?[)‘f˜=lÓ¥»ÕÁVJ`ë2 ›¾õ'[V«o Änºôšô™¢Þt?n¿>`l¦ ¿ŸWŽÏ_XJÒeÀê:þçCè @B¾ó´À¨V Y1­%fNB¼~#1£!sÓ}úÃM>mþ ‰FbåÁ9Úš¤Ë0RÒ&hÒU@ú¶€ýBHíÑ6¿]XC©Mã–PßéÛUç|Õ¿§Oa胈سñß§ÙÄa¨—°? dœõ+Î ¶Ëàr?~ADpÀùéø©Shh­®,ºa:P`ÝE8µ¨!b%~lëÙ›ïâ¸kªbf€8/}1_yn/¹wj¹ýpšwžüg(yürê£ÃEP'*Áç±_wnðÐð¥™ïnÐ×€”Ã*5+ mŠè!¾½½øüóI¶ð0endstream endobj 314 0 obj 4496 endobj 318 0 obj <> stream xœ­YIoãÈEÌ!úWx€=º4+ËjÔÿ°ÍÚ<ÙäM“t0ß*Óƒ;¶ˆ G˜æg,Žu½nÒvÌ Ût€rfÒ¬/bH5';'¤Mžd‹Eí_À ¡ÜˆÁÔÁ¶ó#ÊðÊùåðT¼W)Õ§ð¯šöy£ÅZŸõ¿ìо†õnW7í8Ü|êK€#uŸ¶ë*âuÄ9Û/XäÉ¢¸Ÿ2‰/ @¶MR”mÕ,$º$¬/çÓˆ9lu×åмڌ†lxÈ)á¢/·ÊÇi/«@(–šÃ’ÙK*°„½ÊÂEqÉËõÔxÊÑG‡Ú&”ƒ±¹.îvížÍÁá”§yg#ã ODÙ:&_“TD;~š},éì .Æ"œÞV‹TªÏäß3Šä„*ù‚õºòY Þ EàxÃØ5…"œq6„o-”åúbU.«õ"¯á?ĆK6ÉcÑ®öCf´/”Hr_›ÎÐ8ø>/%äɰw“µ°Sàµé¯×ÈâÞÔ½î¤ùÇW̟ܲFs3„÷»f÷ÄQîñ{Ÿ¾1šxâÝ@eú¸ÏåŒk¹#såE‰à8Ñ:J OèëLªGíérœQ´ÆžŸ³zqØ6…Ö£b êÚJyÆÀwˆ±å¶ÎÞ•Û1µ·Qƒ©ÐJ÷ƒ* øøó¡¨vÍqêk/qÌQê£Ïˆ½†zVdÿøÔ/Êù8[áa™˜QêÐ]Ã$"05°LU{뙹XÐô'Üd€ Ö›³i“Õ?FÊ?\§©ÍaÌ937«»]±^Œ;´­³²Y{‡}ùÓ—ï“ }? ÈeˆÆ ²’E-Ûcÿ}Ä,´Y½Adå2ÄÜ·oMvgR5XíÀUÙz~ÃH0ì§°ñõ:šÂ¨!­ÎïpAý¡ !&ÓªŠÛ¾<»yÞwVÖq½-j›w"Þ74ãÄ{¤(ïÖ÷å—Ã\AÕ87Ag)eϵâwpÓf*i¼-•‹8>ÿú§$@Ó– t»Îæùáúaz2t góé]n³:Û\Цµà¹c0ÅUÐ.1õýëEç3}ŒªÆž”+z„çÊõíÜKÛÕk†.wh¨H?üpmSl)3Äü(ü^ƒj0dA×OCÂYÌV˜ÓÛ¢¥ùx¸ûñ5t7I$el ĺX>Û!í1ËÉa†¾Mç¨çu›–ésלˆ“bpV»7(‚zC›Û}¹Ûvd ‡ÖBxigPª–í×Gï‚—:¼€ë=”Mq_ŽW&U@ì×&átŠçè­{' E1@ê…ÑVu>Ž£ít‘$Lê+ïy·9&Þƒ¨íxÅýr5F…#!-1ò^y+âo Ç@%ZY¶.~†VZÅ‘&/Š ¯Õ ªÒÓò $¡€‡…ƒt„t×]¼Y=Öã·li¶øq‡Nç-kòN£OôÝ f¢­£}àç`°BŒ÷”2CgDaË3–ƒ‰5}Wr”ù¨^>¸ÆÙöíŠ^¬üåo¹K`¹n ¢ì4’ÛcÝé0dŽ6ms­ÅÇsÖÅ‘²Y…;[æÇ½þcX§ž7~¤ÜÃaP§RHñƒb •WÝÐl³ùOËQ“·‘` Ó´÷%Öƒ`:éo-ïBfi¢Ü°ªêèÙˆaÀxêUŠ7ÚÙ~ªôóÿÑÔh€™^ÙÄ·Å|\V7y¼ìB†;÷2yÏÛúQÂÓÏݴ׉Ï=[”„õSÿ¹)àºlº8Äɦ.™â²/÷èÝ ‡Âík?Žp{³ FK;–i”é®›·5ÄQ{áBbÛ1”“Ã?Ê{ U“<êCšI²¬‡;2DD¼8 ‹„š³ëÍí ž?\¾…Κç8Jb>NËù**&îãr(†®^?G!‹† øA\$¡ òÌÅuœ?©d|lþôQ¦Ÿy€í‰á*Ø·îl»ôWf^Þ*lw!_z*‰«ÅpXÈQ9—>õW…Ü÷ÿco¯`ßnëÿÒêq[_$ˆ3Ÿßƒ¼ÿŸ{ÜßßLþ†Ÿÿ'ä'endstream endobj 319 0 obj 2094 endobj 325 0 obj <> stream xœ½XËnã6EÑÐæ+¸”fxIŠÙuÐAÀ}x× :‚,GÊèá‘”éªß\ û^J¢bËÖ4SE8¶ø8÷òÜsý0 „¹Ÿñ5)/.Ñ亽`ä[ü½¾øpý2¾$%yµÆAÆ}°Þ^ 󀀪'Úʹ%ëò"øû¯p}ƒcñãq°bÔ€À ëÍEðfxêW2TXÆýëêúC=›Î-ÊÚqį‡Ó%5Ñøä÷ÍÍUvÏf M9øÙ¿/Õ‚2΃uxµþa?& J1>®¶™/’2Ã`1 c¾W7sŒ ñ´éWiv”A*|˜ßNÕtÊÝÍ»,®Æ™ŒX÷ƒ•TMVRQ­ÁYX‡ŠSk êp¥ð?%mPáJJ­ƒoÂUDi›4ù®ËëªO—WöcTKMÖ÷¸ÜOqÓ‘z®$ŸÞ¹ †aN•~]Ö·Uç®t„»rCVÀHU™…+΄¡‘ J|ã¦kN ~z½% Fxí5ZúÃJ‡¨#á£V@!⸺éŸ7É]ÛÕM:¥µá^žqû€Û»¨¹ª$k†x->íRWõm[<¼JêÆ-àÑíÜ'«AXãW­›¸KI•†ÇdpOÊ8/FÞ >#…Ÿô'RTké^¥K#¼§Lò?ÇÓÓ4é6/>ÞçEJÊ´mãëylµ•x´©»,mȶ.6é20EAª1¨Ö/9BµXošÛP…¡¾xØ]±5è‹b¢hº;LzW“؇€#¿f*ë Ád½å'3 j„ù¯(Ëír>súµ­Ò«ÜœÈ½¿¯ûÿHäû¬^æ±ë5¤ "%?p¨}÷´Þæ'ù.O«®E¯|À´ÆúQ›ŽèÃP޵|}¦[¸zÂIhŒ‡i?–:ªÞû£á¯‹– ˆðJ(õ”aç¼2Ü…ÈšÁ?(̇|lÉî¤kÚŠã™4ï/ç9D ¦‚á5„Ë!öºÚy²Xg®m·Áxôt›L‰I²þ”ã"ÛËÁ|[G9Ï߸mï}¡NW«ºÙÜû ÜúHTüZìSàÒx7¼<.Pš[æ‰O4É«¶Ãúú²ÌÉ’Wy—c¤m8Á+I«»¼§3'ܬ«2­º#ÀXbV>à2[ß‚/½/ÝUª7ŽázÒÀË$N0Šý.íâ@»=¶åyÖ^Á>_ íu’½_ ñõ”àH‰é.ž¼ï‰´gx€ê‰FÇÍG(zÐ ÏE¼ÈþRLÚ,E•~„€…€ÒöêUÝWã ±26cåZç“ÙÔ±zœCR( ±“wp7P©a™K"s6øùŽàoŸçÁm’»®{xÒEjç/$L<ê„ó-Ã8WKþ «Ùõl Ÿæ—÷¬²á0Xå™0cÏa>jumßZýÚhªá>©1%÷ä}5\Ó°Áé{BЯ¡¨–0}Ÿ†f£¹lÇ;9Ù£§oVŽL6šÁÄ'ÖàëõÅÏøó3öSendstream endobj 326 0 obj 1623 endobj 330 0 obj <> stream xœÍZ[oܸF^ý+øRDÌ0$u¡ä·Øq'¯ëñnuŠ2#ϨÑH^i& ïëÿ)Pí›4NüÖË(ê’ØIƒÅn°È€ÉÃs¾ó ó "˜""þè¿g«­{G-ª-‚Áÿ‹­_¶¨üé¿f+´s ¹0 ãÓ-µ"FCìúâ.ÁžÏÑñjëÄ9Ú{8š°êRgïhï`wo:úëñ±[ÂêºØ¥>š.†-ç°î~>OÊÑ„â(ôÂÀ©Š\¯ õ"O Ÿ:¯GÇkmÇšP&'ŠWb–ú8 £P­`˜„.:þNIÊ5zŒ‘> &˜O}qØúøˆûÎ*ÎÑ_0š.ã³´”‚PßÃŒøZ†BâáÈ#ÌmñÔ!ct<‚‹Ê§(cô£ôµ<$ÎçèŽs"/p–çY–VB¢§úÐ$ÕbŸ8q¾ŽË‘9c9;q™ŠvëË2ìƒ@òÈ—/— z0š€L B'©ÒEŽŠS´†ñgѳ8ÍÐô\â ÉõMªu²‹Û0q4aj˜cŸŠ»wÑ Gj4Ä^EzÕÁeƒÚ8”`·™}wqù¡c#XèÙ;ûb.À~d)OßÄ9ÚŸ¾—‰øÈpyQó‘Ö0:ºæsá²”;Ðn¡Œä3ìnôw6šp0C ͰNÁZ 74zKÐ4)Ó¤’›NhÄqëÜIaÌ™ÏSp£;ÏG^$¬̳dTÛë|䇂>ß âuÕÅ6¨-l°}ÕŶšö <”3WP›"1†#—˜ÒHS{:{ $Ë<ÁÀ®N ÉÁcòÈfpS üÐl¢é£'‚zá‚$tð½|yP iš½¸EA1໳ɲd½öªJÂXÐ; •)Ò™ÍÒy’¯+AÃÓâtýk¬aœ׺”D7qMˆkQÒ^¾HsEF$$€ô2Í ×$°¹ºF5U§¹R¤qf0ßü´(WÒÑaYÌ’ª‚=¥›"¬¦¿ûÇþý/9Ê-çç„òœ±Œ)rƒdTu˜Ù¸ˆŽáÆK Ôë×W¢Øgrýó¢Ìæš`9üÊO“Rè¯ sI´jŒÎ¤LÀÜ&JÕÞZ£*À@¤Q=yyqõN~Qv}Õ³°yñ¡‹Éf­ˆð{YÄã¼I“¶á"î×P\Y…Q´ƒké9­YòGÁÀH×£û+à×r¯Lœ0.b³aDç u— ­wnáC4~T÷é[h'Ž€KÄ ãÄÎnQ­ã,©:ÜÆtÍλKõ|-ãŽÔ/Э —©èt©U}Äífñ¦B÷ÿ ¤Gä}aLjeë¼,àœ; åû5²¨FF‚žÄ9øŸÊ®©xG0ç‘[o‘,FTÅqGg  Ê#K8åÎÑÉúD†±…ÔH"£¦o2;jЫ- ÒÌWqu£$dòãæàÈJ)!N¯—hožÊ4}÷(I³ì\ê2/)§kðV€z{Ñ3Ì;¶½¿îô¶±íýåÅÛ®ß:¶½½)¶1Q´cÛ®ÎÖxÙ øIÄÜ9ïÆ6OPI …Þ'žfšÚSHÀb"“9éŠ*ã7)ŒvUé-3äw"dˆtºßO}dúµ:VþV _”ñj%(âšþx¤*'¿)þÙ0÷I؈©èí`³®–I–Õy\ ¿”€»zl¿ø ,ãÀY}Hü.îæI·†ðÕûë.œ>C;A»ê墟ſ¢nLÏ ø“°áGq>‹Uá+“Šß:Ð…²œ7eÜõûÉëùÚXÏÒ×ÒÂü›e†Ó¤…Ç®ÉÖœßÆ4%’ÛÖ1¥Æá2ÍŠª8[žwq‰rÛì÷ ]¤OÒ’´‰=INrÖ4²wÇ? ØlÒƒÿº /ÁF¼[ÁííWÃí¿7ÁÍuC`§ÜCÜ•aг¸œ¯ûhc (®»1D Mδ),Ú¸±¯‡}©¤ýéó('‘ÈæE&ƒ¯8ï1&8䑵\ÏKzÜI Ï“²êHÉE©bª HßÎÊ4ë(’c?0M‰Ë·Ô("\¿‹nö:s©!è» ‚fINœåd—0¨PÖíŸ$ BâûÎY3¼m ßk†ïÕ-Q¬5åÇ¢ù"µZÇ`k¸j†ckøM{XÿÌ­/òá…ËácíMôÏõn† k¸l†Ãj˜ “«õÞðmVÍðrX(ûôÎÞÆƒÖˬáx4h›|x“y[%÷­†.‡©Ånk[V¹Ayži9Ù[̆­ž ËñªNnÔä'À• ƒ¡¶’¥÷¹õÅi¯Í¢ÛÇP®¨n;ª'HÙ´8´’ŠWèPÅïBkŠ¥%ªV¬rLúgâ´ ºSS³ IUÛÊ2÷ò7iYä«$_÷òJëCÌÈå͈ïÀÇ©®­¤€Ý½&W|gY'¸ƒÎ‚F§PwµúÙøÎšPù©ønª÷oWµvÝD»·‰Î×ï>\}ìuú@‡õâŸtN¥5o—5_Ø^ XÆý`e7ˆ ì b‰)…,ÄJ˜AYgÖbû@¿Ø/yžVèFGéz¶Lu[ôÈëBÞ馟¾(êL§IÀz·Üïâ|±‰Iµ.žçÕ¨ê·ê¿ °-œM{%ÿ‰cŠýæiªÐްÛÊ Õ íÖη®ô?ƒì°éP}m¥ÿµÈ¾¼¼xwÕ«¯,dnqWEý2Œðoã×ýwÉ>÷Ýú´E࿌ÀM‹èf·€~XÆ3I°¢½‹bq¸î]§¶7t€Cvë™àñ©·š0lÞj„|ú­f).8k«#pÓÛÚ«©õ<Ø\]¾ïµl[Í„šÇEºî·p›Y³õFr `Ës’íÑb+ *š©‡˜æÁüÄùN¬S+äT€iØ4ý‰¨b~AùõzS¡él™Ç™‚…yÆn;†©Áðjµì‚ˆ…@n¼ö¤Ýe\TÓЦ*>€Š×Äõ+Äîî.ú![ –\¡qÂÄ0H—Aúªk,޹Çÿj¬ÍpzoUx8iž ãá´5N«w‡‹«¸(†åépZm‰ý‰ªÄÎõ˶Pú'³¾ Í0µ†Ùðm¬¯=køçfxÕþÙT9½¤ž|±[-Îò/ò+H]ê&Ù_ J¥ÁíØ¼y«wV¢åZÜ­xz@&æYRtΫ‡üh“ÅÕly¦žW™8šèõ?wõqÍÓêÕ’¸þ[ÇYC¸ƒ/³ÞÊNœ¸Ì*ëßCl–*us]4]¢1z²É“NÎÏE[„~³·ÂÅ:»íÛè¼×v•Õ:¦´†-×;.tmgê8þ€sZ‚<²†›ák˜{äö 3%ÃòÙŒfövŸàOícôO>Ükøy˜jâ›O·8`9¼0oëo@ìvÿ °ø  Î ÅœzªQ+Óݽã­?ßÿ)°Oçendstream endobj 331 0 obj 3010 endobj 335 0 obj <> stream xœí\[oÔHV´ åW”´¸µI᪲Ëv4ÚpšdÒÌÌ Ð`ÒNºIw;´»ì¯æþ¶§Ê—:í>N'À¬ö!„uº\7Ÿ:ßw.ÅKæsÁ|ó§ú÷h²yãaÄNŠMŸÝ…¿'›/7…mÀªŽ&ìfÅFÐ?Þ,ßL‚GJ²(V\Ê„õ'›Þ¯¿ôú/ -ˆ«ÆÚç±PðB°éí—¿Ö=Å\%¾¬|:=y™·^— W:Iª‡Ë¯<«_~¼x:ëm„:†ކOY1MÏŠa>gù1›¼aû÷öïØAa‚Íw4Öã2XÎ`<šž°ÑälfÇ ¹¯¥¨É{÷}Þ9¬…'± ¤7ɦób«'¤0C{ׯWŸ–^©LÈcXt5ùéd¸aºÞVRó$RõêIm§ñ*Ÿf³‚™=ƒÉ˜Æ‘≠«.L˰œðxTÌÛÚpõh[l?+ŠÔv<ôÃf1ÙÆ½Þ6´ö…ÞíjÖ¡b‰UÉuèÙƒ³«|éÇž€G?Ö±†Þ'ÞCbéħH|Û‰¯¹GµxéÄß#qGk߉¿Bâ‰3÷8C-Η[Ôâ -æN\ ñ‘ÝãµHxŒÄ§k‡Á­s'F#¦¨Å؉ÿY}Ew#Ÿ'º¶1[¥âÁÉT~£x½ƒ¼ª±†‰A!BxÙäyo;ô²YËj1O„lìÛ»Ÿ{Û:”Ðaè½ûîm{*àAcmy©«µŽÅ ÈlŽ0ÚÅùòc½Ò3'ÞAâN|ƒÞ—­súËrúsæ´ø„/œõ—£3'>¡W“Ò­[šW·9ñ9gôî é-Fg`L¿8uâ Ýß5$~µvíǵ(èÝ‘K¦Àb @wcû/Y*yz„-x¹¦7°Ð,fâÊ„žÒ€óÔ1zäWü4­c¶ma4äš„ÛÌáâàd4DX^%@ÊcïAº³ïG¯GYOÀؾ ,¶ÚÂZ7²Òk…‚QÜ‚‘B Ø‚9 Ë„oP^X¦4¯b™ŠV± ~H 5eÚÞ;Nü5ÇN|Ó=&¨…r∶"šÖб Õ)ÂhgõS- 4ú9¢õóˆV3dÏ08"m^ÂqMœü¸ä![ì¶ù(HU*¤5¬•hêä}S` :·ïÍ c m0åÝÊ,$âPÒ ¬3¢ƒJ½²ªTg¨Åmònà“GÜ‚¦ w™ÐœŸÐâŇ~I¼š”nM󌜴éÆò‹Ä6`œh¡ œº?d¶_­_{ Uˆžˆ=OBù½jÎâ±ø$¶,81A,–ä‚'ôLðw÷¯4:2œÞÀÎr%,æÓÑI >{÷³/f=³Õö€ÍʹÏ7,mĶgÞ´λŠP ]BÀ {nøYBDÒË‹ùu6È%ÉŠéõ9+ ˆðÁÁ²WŠÆ+ôÒ+ý¸ÒÍiܸ¿ ¸ÞÒBè$Ð2ìÒ~:eÑΠbítyGlt2Ímo ÷@‹úRyƒ‹~¢†‹#´¬\&>‰rˆ¬Té^€AÄuÓ£y£6Ç(Á””Ó'C.µkü%Ò’[NyviqˆÄ?81‚Õ˜>¶ÿ Mê>M=Ìîñ jñˆžö÷4ÃBþ:ÌÏQ ½–ÓáÕ fðŠîýû¨Å!ÝšÔ€¶Ü?!ñËåEVßÑÃüˆÄoèi,ãP-þÏ2”6‰ ä* £Tb‚$ÅÆÞÒ ŒÀÈÒaËÙê„€2„BœÞÉœîo…sdȇYˆ=ƒ÷Óé"ÕæNŠÚ¼Yާ Cq]ˆé}o;CalPŸ÷õÑ"¢©#”êð§ øìO7þ4á{ýþ41©ËøÓ%=Ñ`·îš³r9ßš˜w' êð­×ñškë[·¨ÏyÑb <-êóI½h †–„ ôÜÝò¬  tÃ4 dAz>°o,A1qÕêôÚNŒÛD»ŒÁ¢A&B…£Auüy™ý¸, J|IÑ ­ÌuÑ Ø¯Ä-© –/ó¡ÈÄЯ·ÂP\’AÛõt¶‹ŽÌ\–`ÎAQ ¤ð-FJ™ÐJ‰„¢[èÄ8œ€(z‡:¸ÉW´=m9¯ÄIAl[Èç´Õy½§Œ Qe´æ£Iu6dq:2ÆÂÑeÂð®¦A“ƒ:tsSƒó OÂÑE8R1J€©gø%Œ›ãôœV_'<¦“ …u(« Ÿ«z|9_¹_.M°A ñÕÓë´ãCù‚4Áz_¹Tš`½¯Lø ÒŸÚ?&YÿEÆí-–ôr/H\ÞSFÞÀ^.IРA¹Ü tžnLéJª ?œ¹"“ÒMÀ_­ýRŸ'J–ùp\_æC6f¬X<Šób§ô“ËÀ‡£†å¨õIQzÍ0+ï¨òAUSo ïlvÛX%àN:«y¯ç• ’>×®"Ÿí÷­CØÉ–â][0f‹ÿdÄ, ÿb˜/ÆfÜúç¦YâóÐÑŠË8AÆÊz:˜=ŒØ$v½r4“^mfFµ .ì²|V½g`YçL‹2ÉöÙÙ†ÆÌ6ºû¯¸$°g¼tÉ}%(/=ⱨ㓗çÜè Ùaä$™êµÎXhÈ£&Z–µú›èI;ö)Ñ4?Uì³ Q £>Nÿ ÓþÁÎÑÕLûzç蓘öõÎÑÿ¥i'#Òi]%ôI@ŇAá@ÐÇAךvcéÏm¼/„òÒqËÜ T®«¨×dKÖ:L¦°ÂÛ²r™Š9XTcuŒ-}âUPØfm6RÛyÂuàʼSÎ~¦óë…ÅÔÆ×r!”ÜòNñ¤WYD?¢,bF>"â–Ö"–޼A?Ðn¢*›Ûa0eÌ“ºÐÉ4&¹@òÒ‰\Xœ©Š§ŽêÝ$>$y®¯t¸E·îÐc¢Ä‡á£ªw×ûK„­»zõ.1 l›>¾z—Ø« Â\apæ£,Ù¸³dWmpªóó[8°à¤WåU«%»&àßU^õÙuúì:ý]§¤í¨ú®î/qbœÓøô®Óþѽ±õŠü(Õ5“Ø×À['Ù°ô:•åýþGûò¨~o`'QéKísv»gP&N”ÇY9 é&#k¦Žo¸”C'8Ñègœ=M‹|ºe››œírV:(¦–¡¾à¥'‹¬ŠöȰ齶a*ª!û LJ4Ô½Y4É6‡é¬º£a2ua§YY\U¾)é™u1Ï&;ìë¼\[¨Àª†¬ºvø&ÈŠ³èµ7šÏl¾’ºÃ£`ÀÆ& ®`Ç @÷MÜÌÆc˜ƒ™õ3 7£#pïç‹•;]–»Õ»q^9žI¤ê…çcÞrŠ8EA½U¿þÞê2iîcm±i‰ÚTŵ2Guo6©ÚhÐoí *lMÓÛYùM¹p“»°³w¾}ßí¯m•õMj`øAãÃÆ§ó|6ÊŠ­vÒÌOð)bEçÛ.á¶2‚ælyû{ûÙÄn ®wª;_æ ~;Œ¬W¿·ñ  º—… ÕìΪ¯ÔTÖä…i ½Îà,@á繋ê²»©©‡¯®š™’U×èUõA ¶æðä%µµµŽÊ~6*U7-M4ºyf6" ðÕ[ª gÞ¡5,§ ˜`ÊžWWë²×óŠTf•ÒnµJòÐ¥1î”[Rk¿ôËpîmv«,FÜt=»[@‘ÃÄUa›<2Ø|:¯ ¢P{¢³Ås Ä0sKÁÁ>ô»E^µ³«°ÑteáQÇ;t½]Ý«“0THic«0`à ý¿7=Îg;!vç</ÌS[«Lø¨)ª(U–ÇQ¢›Èûa4†Y³=p-¬uRæ37*’Zs.e áÛéXêæÛ5GÛ|Ô&òþíÛnå6˨+ËJ}4Eð’>—Ddy÷þÏv·p8»øðq‘³ô¼—ôù8«˜Is÷ÅçqmʧcPm–Îw–y¡ÑòðjÑ—ËSBL*·Bl—C^£YšT‡S€H.pì pˆô_‰)v¸ • szw:ª0Ðè§ô‹¨EGʪc·1¯¤‹ø;Rêx~Ç—ø6%¤ :®ü‰ûNŒó€ûN¼ç¬RµDð8I0œäE±|ؤ0Ä¥¶—¬r²Š×¸«V",!à0¥†Q™>-´ñènëU^5wó½wäÇ-ïáí~U¹—øÍ’¶ºF$÷¢)-¿¤ÌJÊûöç•p·$«ÏÀ“Þ»•¢PØ4;eæãq>­.„E`§«~4›r¾D$‰ ˜Kë‘VÒ+Fó’àƒÝMR¡±ò[ì0;››xBÉÕꧪ&aéÿ0ÑŽþ¹²öîˆ=QÃDؼ Š˜.Æ \¹þŠ#?n@ˆ¬Øýâ„nÝá„_m˜të½vdZôDÆtÈô¿^<¨oI·H—[>6Ž%¢ªìc£*H´Û˜6 ½<¶ª|§¿ùüù/ fú-endstream endobj 336 0 obj 4061 endobj 340 0 obj <> stream xœÍZ_oÜ6GÞ  >5ZÀˈ¤DJ7Ô ’4µäÉ¡•wå]Õ»’#ÉqürŸí>’í&MüvCý¡(ŠZ;¾àp‚l(rHg~ó›!ß!äÊ?Í¿³õÖ£}Å–‹~„¿‹­w[¤ê€šfkôÃ!tbT¶oÕ |ì² 0Liˆ×[Îþäðwè4]}ð0¤Ðýp¾åDGQýþk”ÉNÌg˜1Ö|úô©¨&™2?ÄÔehêq, e·7ÎËx2N|2ùçáSmb…A#ìÆæbŸ»ÄçhJh-çiœO¦»nàr'¯¤S¿–@°ëtx¾å\ ˜„‘ûiäÇ'Ûõ°ªf~öâ†Í÷ç{è{ôa½ÜAOÖQ²BÇYŽ^q^@óË<[äÑz ÿÛ6VIÑlâóóÃý8Y­.& —pâl›f>éÕÍ`Û°hÞ|Åh7Eg§•â)è•¶³Ì£T 'I<î;ójŠ)£8¥®÷“zøÄsâFY 7Ú` ˜ ÒU‘d)ÊŽQ¹ŒÑ‘œ‰Ì<¥µêÔ}LÜPˆ¶é½uÒh]©Ø#ØWG87L``@u§ë¥±_Ÿb"O¹îôv‚’ç² °Gy;¼žû`1^Û´º@Ñ{8¬èh#ØlBö Bª-È­Šj«è§´ŒkÉ`ân»Ÿ4.wê5ù …µ3†ÝPSår®Ç\êN ?Ý€®ïW¿›æS­y§k~¤5?êšóîg¤õH»æ¹Öü]×¼ÖšµEáîg¡õȺæ3­Y›}¦5Ç]ó±]ˆ6paˆí»‰íJÓµsÔ5gýŸm}`íU×p†yƒK.˜<ð7à@‡`Ö+ð–¢”Ž4õp(|?¬-£ÓÓÚ/\‚=¿5ª´Æ{ngÙ(IÑó袔`ü4l½Ò¹¾¼üsƒ/ËO>²ìʇ•eíƒÐ)eqFu–ÎM¼an뎗MÄ%Í÷ÆTÁ™B¿²ö'y2Cí׫ö”Õ4&23âµû•jÛÍËy¸ç5€%ÅóÚ™3^½øéï “t1ÀFЙ{-jíN °Pg>OŠ,}ðzâ…ÍÁ>ŠU<á\;à€g zð}ïômjÃÔwõ©riŽƒ+Øýéà‡–¡”´zÞé´À`A+úÒêaÞjöAÜ”ypÐD‰sõ‡1ÌÁ>v€jÚ8ññúæòÊKG‹·oF×ÛzŠŒ4«"ëé*Ic™ÐHˆ‹CÒžèÒîÖ÷†Ås­ùÜÞŒû eÑwv,ÄvP1 Ͳ¾¹}àÌ>Í#û¢r«vÎz H›bŸöÀ""ÕðŸÙò$¢8Nk‹_ìŒT_[[|U±ðÖg æA_i3ô´òÉ®í¾ÖÆ‚ö³f Ohkdõr¨âcá²Ö«vçï£tÏo^´¢²ãò¼^,#`± ctçI\lƒ¬Š§€=»~¨€¼Lfñƒ½hµÚ6ÝŸrÍ-oʇ8Hç™cP¢è…%p–2ØWC‰_ƒ#\^]}¹4'݈#ú¤ã‹­£^夳X0Ø"î‹„xEu‚µ»²+-Í'Mt/–p´èpÂà—œ Eé=Í–)z&À²â PÁÀg¾³~ûíù6Sb¥s-ÝþÞ8;h/Sê•:­95Øœ+3ž¦8(ôÂ÷œY\Æt (Rq=8 "°¨(µÑ¢â«ŠhHÔyN\ Íëø>eÀî}ªˆ0&j=I­%d%h1!2iĉKTdëÕ›¹ ”[5L›¨$d¬Ðùì$(À`~‚æ(·RÇTNU­< B˜M›9{2€B–ÁU–P0‹ã9 øòÁ™L´dî•&Ðã,=Žó`£6X©OZEx¬!#°ÅZ  )‹i­çɇer””ã˜g[­‘apUÉÄ8›ï»çÀºûäÀp ‚ßææXOsÆ_>o  –åå v¶~®á ÚSt3®,ü¾;&'K·ÑÓ³Ôp9&°èÆÝë¦úøëüØd¾·û1Ìz†#S ‡@ûtonR×Ѓ°§ ½Ž°ÄnëèFçÕ¶(ÚW.Y9n\¶Œ²ËQC,8ÓÖT³gI€÷å k}^ùaŒöàÿÀŠèà¢(ãõNy‚LjŸ‡ge–'ÑÊÐ(ÔUµ0!*ƒ$ŒÃê™”ë«É4p)„Ã@ÝŸ&K€R?èÛªbk.¦*ƒ¾kÛüܱ“i„)±ËÓÓÁ¢ÏŒšŸïµZsjÏ#uJµ´O³è ±0­»1AËÞgö‰]­ì»YwÍKû¢nW«~Ú‘­ìºLìºÔÖ§²þ~»Ó“†G_U2*Ìõ¤ozÖbI2±žiŸ/·+US»~þ+»>FèµÖ|ûŒ#Ó`»ÚuíXNÅ;­ƒI ²º´üLA•l,§YÂÎÚºÒ,Aomzy?ZZHŠôâɽI…uÙ#Lá¬/ÛB1´k»vtJö…4??h=´‹½9Bpz„Ĥ!Á¼OÐÂx†‘SAþÑ]ˆ^^v$0áÒæ••þ­¾Ðàq¢÷µó*m7ÒZ ‰*‚u)8y*fÉ„ç]uñ)Óœ£,;1ƒG(wꪰ½{šW´¢E1¸çd:]_vó¿)°m¨Ym„ç/7\]™}ׂûGîXå7U4ˆ 4”5^L8¯/yxáÑ 0—`)œXeMÙÝÎ`^''É©–WöR•DÎÀ&:´¬nŇюq³P¢[wŒß>ùÔ@GO¯4ˆÒ¯ 4?±{¯6»~[9‚4œêYÁíw¥#·Æú,ÍÚÀ'·¸6p5Ä"°æÞÅŒESД·“3Ó@:Ór~̲Å*nkw@?góØô°Þn·–oy³4³ÒHÃö³¹—^躾MÞÈBFÂÕÈeþ¬×{poD)æâ§»:2!B¾ØhÑ<ΣdžÕt ÒO¨ÛÑx¨PøXKÑ*!5…{öÃ34[Fé". cਢ‚i³nåcȆïb #¼h³1èZý¯JQ›ë8©ýðR»é|ëb•îq_ˆ¥‡Æ]b»¼Ü.O×¥A¿,ò°}ö¥Þ\=f"¾[½ÛQ¡ë¯võöy4õüjGE ×ÿ¢õ ]³«5]3ÓšÝ[ª=#~—®—ªO®ê–åÑUqXÈÌS<„à°”ï{×Ë·TÌòä´4©‘·Ã#-¡ÊŸßž¶é€M¬|Ö7ËŒvOyÍ5L4>³ËÓlbn_Ÿ¾Éõ-È2¶¾ ¦gÑv ç!ðmtž4u÷'‡[¿ÀŸÿƒ­}endstream endobj 341 0 obj 3371 endobj 345 0 obj <> stream xœíY]oÛ6FñÞåWðn2³"%RTîÒ,éRÌM;Û€´X[±ÕÙ’+Éuòƒßû$K›äî=Ô'MËÁ‹a7CÐÆ8â¡x>Ïùp¾ dÊŸâw²óúÔAÃdÇDoáßpçËÉ âW‚Þô`‘†ÞÕNîG± v,ŠaaJ]Ô›ìß¾·zŸa-˜‹ÅÜÄ‚XàÐìüi¹“À–kÒòá§pø%ÒÜ©‹-îºÅŠî¢»+žü1øüi4ô4oËÁ””ÞçÆ^«mY6)5z­O½wjLsnÒb·¾±±)L²2 á »xøç…~ÖÏabËÚÎý“?ZB[e˜?-º:¸ÂîóÅÈ 5OˆÖÁĶPÛæØqˆ›Ã0o lFlÿHç˜ÇHÆQ«íýWƒy«Må K“'ð-.ÄDmBåFSÛF½9À5Ÿì¡ŸƒÐOPt…¢z£8š G¨Lü]= fcb•ŸŒÆÑçK˜…Ü /Šm“‘òÞF- «eRS)|4&cÙçÂö¤9H¯ùíŠy¬˜ojsRô•‰úIŠ63Ë-ùp®Bâ5ßÓŠ Wà°b¿°6ó¬yõpãÛÿXŒ½a¿I3ÜêkâÚ|Sh¦Öa&†ùvú“ò3&A°Zz3B2éÍaÝ íII §"…Ô¤ͼe IŠÊë\#KH’2‹(²l¸cõ2§µy¯ùŽ•+´¨šIEŠyÔj$µ¦Ëm‡ÍäH[’š6›ç‹D)>ÊŠàŸ“($rû_…¾P¡¿µl׈Ʃkmjpû Üì±)JÀ¡k ¹Nßy!úM®†a–*Ëß!…*°m—ýǹ±‹..~|ÓA?yÉÔ}{qà'»-B v]füð B=?ÙÛ0žï!_‹ý, ®ÑqØ&S/ .ƒqÞ ÷Qê'z]†.‡Ó².ïê]ŠC‰ÅÃûÛÛ[Ý[àâÕÆÇxÑ—a;C¥òÕqS|µ”Ó¶ u±L«¦ðÿÕ 4PøeÍ€B9U²ŠÀ¯›†×|>¯ù5ýæ<·¢Ô‹‡*>ö›5ƒæ7£3PÌ—yN=öŠ»QV7(ï÷µ0töqp¦·è.¶ë&úù^㉠ÀùªFr˜¤..¢ÉÄ  ‚ÿÐY*%rBáuE‘䔕E’ ž¹œ}lí¢ã$™ùÚØMuU Ë !¦JÈ„pLÓ)ÙŸ+7s© ;Á‚Ó2²ƒýCÔúýà?}Ðk¤7õôÝsëLÑùèdÚjsx‘c~ˆÞæi‹[0u8ÕÊh6m¹ØusádYy€¡Þ\‰Ëx7ß,Æ  WáÜ=/¾,\x$rÍ3«Öüq÷Íû屆±ràÚÓWF¢»Õ¿Zôƒ€•Dóôxÿý/=MQ»Û8?›ÆkWŠˆðŠÙËÀ61»±$5’¼)!Û°{ aÖôa©ŠJ[¹>ÞÞ=êÎ@@º•ó· ‡G&’ÈRÄ„ìs|›åHþrV\M=HÀ7ϸ‡Ý^œ¢ƒ“Nçð}Î Iÿ^Wo¸ˆ -— ü]óüGy€£¼¼Ë§û;-ù`‚åV-›TDv˜n0™Ž}Ôñ‚1êÅ^˜\ù1úGiÔÆ:ò Vv^@ÂýBƒ¤jéŒÙp–¤‹£›¦+jnÊ®mâ `¯sÇÆhï×GktSH^<@WQŒR¨$GQ<ñR9KîŸ~؇¾ÔÐOQÏ¿NQÇOo¸Ô8R ]Ò¾UE·"ü:³m¾e‚…oþó_‡ûœF‰?@ 8a¢Ã°ïM“Ù¸© ]­³’w(ô)UàZÞ ­0­Ëi)hÊmìZÛ}÷ô}SÔ²c8ˆàfÃôUçG¹˜CKSªø¿ÒàÀŽÐM•_;úÞØøãv^WÏ8­p8)îž—mG?.[m»h<š&*×qºÅØ ˆédcζ€Üß>|[ˆ×Ékdg6Nƒé,–¤¨¹Ÿå€ÃkÀ+"Ⱦ±sÜ9üØB¼8E'¡¿WÈ&ð8ƒÑKT5ÕÉ›P©¨zÜ`ÅýæëËËy ‚e…q,\NÊ„Y¤¨]ã2¸`Uɸsãk z‡›ŽáOz¶ :ä_‡+Ò{^úÖ~)ó@»æØ/ýûzÐ)´0Ï €ìÈó]¥K>N¯¾Þ<Ú|‡z7ÓåWH¦×t-„vÀ&5~òû9‡‰•øµ-Ötê`-ix~› •뤅ð% M8æ:PÁE]m Fj´®ž¿W%ÁBûõº‚ùžzÕ”éó}¾ÚïgEC_ åø²À`·þúãký é3¥vnÁ`.{¾ÝÀÓú€þr5³öZàâ„°Ô$¨kô=Šfñ:õ‡A’ÆYÝ‘=GßÌâå¤ÀÌÌr*ÙÍI¦]øÊÁÐ| Tm†êïe[¡* =“/@õyS^ Û€«t+E,×ó­  ¾­¡î]É\ö¡Æl ™¢‡Ú寥¬¯=ÙêÀ[.¶s×d㿗ˇ½_àçö†üendstream endobj 346 0 obj 2106 endobj 350 0 obj <> stream xœíY[o£FVÕ—•Å<ÚR=ÆÜömwål³Rš4FÚ‡ªª`ì‡K½ù×Ù´Ûæ±ƒmÂÉàUDÒª²,£Ãá\¾s|Mª¥üì½hpta’0(ä=ÿ†ƒëºe û/"oÎÄ´’âÌ»UbéTa¶JL‹QM³‰ †#ççµö¬:µ ÛÖ8»ã†î¥»Ÿ~s“’‰éŒ2Æö·¾þ½{ðAɘé6ÕFƃš¦joÙ.Žß5¨5 c/äîþînw›³ïïS1Û"cU+Yj1âlÓ8Ò8ÈÉienã$ܼe„ª(ÜÆJüäÍ:]®š0…*ÜÅÊ‚ÛÛ/m­ÐòÖX5lª(7Içwä^ýñåë_{5<=9’Yàé2¿!›e¾ gë >Þ6FcTÕCå}U£êD©‚T„E–7ÍÑ n0Ww€¶Mí|üóþþVâãÞ!YÀ jiµ?mSM5éÄ®üeøûÈ¢Šª«“a]ŽÆú0HG¿:`P5uèp;;Ûó[¼"´m⪶A “û>Ùëû8sØmK·†Ó·³“ј™¥~kèlÕ–ù­YêNœBmÛØfètFÎŽÉììØ):µ5ÓÜëü¸õªäÕª°½¹˜’m´™A'¬¢^œ}˜¾sf-hy ò¬åÐr?wÑñ#wÇ£3bï€T)S+Ä£’ß°]æüZeЦXÛËŠ¼®É ¿®ÉG€|T“Ãúr‰«Ú‹š| È´&{€œÔä7Ä«É §59sûMnDß4¤"»û¼‘Ùá^׿‰ž.2¯ñ,ÝàF¬3<20W5yÈAS"J#ÊÑ›ûý¢7¯É‚ ЙZàÞz8zó0¡R@ŽñtÏ;äÞ"r«©ØÌ 3[—ÌsܨÔ5´ô ïR+ÏeMŽñìHäІAÞ;°€û¦¾LñD]ãÕ/(b˜¿nSûãõ0ÇÜàò ­ªFP´Và‘°® hy(—y¯alÍTDÞ+vP‚¦%¯râb¾Ü6ÓôÃ×âB"i#Rt"7»î½Üñ—Š9ñ’àHøÒ:\Ëå…Ì®È`‘¸ÆóXÞÅåÅüp„Œ–~¼ 9ñ’(rcŸŸ"þÍÉÝeßB Éð縓> stream xœ+T0Ð3T0A(œË¥d®^Ìe ÎÈv†âendstream endobj 356 0 obj 34 endobj 359 0 obj <> stream xœSMoÓ@û+Fâ²Fñ°Ÿöî‘"@ADñ-â’mbR;4vú¯›V寬? ô„,ï¬gÞ›7³³¾D|»¨Ø‹³V ð–Þ»d²À`œÒäÉ 8g=Q‚m¹hÈ›ñW?$©2ü ­…ôŠOi«Ñ{iøÙéË$Ó(„“¼èpSÂ)ÞÅô* RúT*VKH J‚K&ÑÅžñ)¬Ã.)¾±ÚSçákôyÔvp\Ãüi³˜{#{wÌccž¯ ]Ï[Zʆ–Ðéw°K˜S…¡¹ºha{Õ5l»*eæPšQdr4Î;Ó»f¼†}’S³Zf|»ÛL tD#Q;1”ÁD¢ÁÜŽ¬EøÞÂ>¶6rlÛøɹ¢º…UË&D~ªGo5ÐyõYÊzY.æmHR;Њ/±K ¼E“Ñ ¾gÅó?yÐbÙ–õ*‘=‡z2Là Ã0•õnо½9ÜFíÓ’ŽfÔGŸô¡‘ªcËb¤ÞüzD¤iýïpÿˆ—:…^zt}"B ÓÝÝ8ï6W |^¬ëùÅ&²² ÿ +ôg®3ïÇ“œÀ³•%ý§t¼;E=ÆŠRe5:ÛEcäuÁ>Ñó‚/ÎÙendstream endobj 360 0 obj 484 endobj 364 0 obj <> stream xœ+T0Ð3T0A(œË¥d®^Ìe ÎÈv†âendstream endobj 365 0 obj 34 endobj 368 0 obj <> stream xœYÛŽÛF…aæ)ŸÐo¦£6»›×, ‰í8»ŽíØ2ìd8RkÄ / IÍXß¶Ÿ±?’Ábó¶§úBÒš1° ’H¼TWsêTͯ,ä‚…ô¯û¹®Ï¿IÙU²oñßÕÙ¯gÂ\ÀÜu;^á"…O¶ÚžÙ“RñɳÔd$h™A ¥*NäˆÚõõ‚r”*W al02%ˆgþZ΀"B†‡Õö#_¾6ô²Ø–Õ@ϼP%<à ´Ã‚3¨ömST@fˆž³ïX±Ù tÏ“L&(ÝöÐ!?¨;0åy¦¢ íM2-X´BEcªõ¾*Öö œ`cq©Γ*Ÿ04¶¼ëêP÷¯¹Eå óÐSÍëž³ïÌ–Xð@ú‚ÜÒARál‘qóaˆlÝš'¦Yˆ @±¶Þwe¯ú¥{"tÊÃ-hƒ­qæ°Æž2Á¿ýv|忼*pß5 ðphŠAWÇ„0O DH«''*¦Fr†`›Ãx}褾. ±f„YF|éÛƒ9[’(¬é–N)ΪYÓB,í©2©eºÛj<€R9|Pk©ôºKG`¢¸¬4ƒÀk¼¯w%Mc…§b‚O¤È‰ŠƒCƒ©³Oê'VUãlkh+,‘®ŠsûÚ÷ƒnzÈ…Wݳ²!e^Bo3@D ‘qäϹ^t_QUV #žŒÜ!êP6Žaòqå6Â=$.5‚08K¹¾ÔˆÖRšQÉ™%}ÆÇûíÑb¼¸Š ŠWë6èØJª NЇ½´*¯M1½Ð÷Bý¹E^¬XÎc‚N—‘š/©/ÐCBóOd[•~¿GùØêÍ«gÏ^½\½ýbÛ6 Ô›§Ïž¾ùâ²¼´âÈV/ÎÀ}]•5ë‡#jýÞµÛíâÑY>rù3hx?ÛÒ.ÓÐÇ}tÔ<ìןj÷óµûÙ¿øê‰ûµ:—î·kW6ŧdzᲲ_Æ®ºbïß—këBB.?Œ„ ¤ñÐ`¢·ïZí{÷”›®NÅìAŸÖxþpè@"ù%: /¯ü‹7û<üÒ¶k¾ïï±U =Ée^pßñ S›&ÿbßþqï2Y=ö¦¥—M¿/;kŠ$OÄG¡u&Q®寵[j%èræµ .IO¡:Á=²'SonWP÷áhôêÑ]‚CúÓ~¸”1?ö»ˆ‡‚Ðöîåw?±•~?°×]K:Ÿ*eˆ—O1›6¼ eV"B0ë]±Ë‘ÛËÉ'÷ “к¡æð5é!Ñ>nÖôBFÁÝðá8á§\§¤àM*Òs€·Gr‹'q§ [š‰¹Šœ8]ã3í”Î/az¯ð?ö®×Ý£ž}_4‡¢º“ê@c'ÞéŠ|‰ïÿ’Ë4TS¥yÜè‡M9”7Fûe”@û‹¦¿õž=V“c z¢ÍŠ$ zî8F°'Éܳ©DŽ©¨‹²b…)_ò4­˜JÜä@ Þ”¸Z¨ÞZm–‘ ºr€z¼w¬†Ÿ²£/˜a1Ó9ìäh‘þàŠÛë»–P&Þ ØI% r>³½"sTzÖvã8ΧjÂ1.’¸eXe±]ö1Õp¬D&ÝŒä»O”(×}ÈÌú¹¿Ð|ôõû7åé°Ã"ŽÈ¾ko6å€`« oK5ÃvâÄa]ú;¯V(õÑ›»#Ø6µïùÕÔ ¼Ü¯ª ÃŒnÒ ÍÝlŒò“È£p`à vI–{ne™KR"f GÛºÖAÉd„¦ekqý9Ó¶³çÓ˜}Oï2¯¤Úb€Ëí9û냟V¦¥$šä–™ßÙ@ô‚`›‡œ²ÁÉε}!1An)dö˜ j祆å\6ƒO2Ø•U¹ß³×mUÝm˜³(ñÉ{Q6‡÷ìEy §×{R)ZfÌú»µÛuÛ´½›éb¼­0ëfðƒPDükKè ¥›9–Ì£ÛÂë±Á²†Yî‰ðKoLÇvÃCÓíŠí€R_½ˆhY–ˆ`µ‘sÌ=¨#µ/Sv;=Ñ> Ï5û¦èÊÂvƒ'%†³¢cÿØiÃ{!à–JƒÑ" nî±­&\¬t¢Nw ´Ua>ÞŠ,%ÃîX5ÂA}qt°n¦ŸzÍ´ßaÛÎÉ7áþ„ jf©Üt„Ö#Æü_vK"b•z‹Ž6Bñˆæ“™pvÐâ ÙH2”æj¿¿)´?¦†½Ú®až95ÆÞÞæ6•$$Q–xcín6™ÏX˜Ûc{î0q&}Ò7ºÒîÓd¬°1дü3ñ}ëFMƒ NB²œýY¡}ïh¯ï¸dĄ̃ù–ÃÎdOËfûï]wA˦ńÈQÉÃ,wËÈÃÐÖh˜ Bj»RŸ3tŠºÀ€övß°*ìâÿ½¥ýÙûrø×л ïèvÆSé+|éµh‚á‘=o÷n*ÅОÅÑ*kU ¿SE» Ú­ÕžwU…$³¯Ìµp²áD¼ |YÛ<øÑp.Ì€Ÿ¾2âe¸h7#„ôÜeÐ/]Ð-¥J<0~ÿóÏ{¶.cƒµc}9 5v’‡¥‰Ä)¨d¨Æ êd¼Šig¦>ÞÛ.7©É9:> /Contents 5 0 R >> endobj 12 0 obj <
> /Contents 13 0 R >> endobj 16 0 obj <
> /Contents 17 0 R >> endobj 23 0 obj <
> /Contents 24 0 R >> endobj 27 0 obj <
> /Contents 28 0 R >> endobj 36 0 obj <
> /Contents 37 0 R >> endobj 40 0 obj <
> /Contents 41 0 R >> endobj 45 0 obj <
> /Contents 46 0 R >> endobj 50 0 obj <
> /Contents 51 0 R >> endobj 57 0 obj <
> /Contents 58 0 R >> endobj 62 0 obj <
> /Contents 63 0 R >> endobj 67 0 obj <
> /Contents 68 0 R >> endobj 72 0 obj <
> /Contents 73 0 R >> endobj 79 0 obj <
> /Contents 80 0 R >> endobj 84 0 obj <
> /Contents 85 0 R >> endobj 89 0 obj <
> /Contents 90 0 R >> endobj 94 0 obj <> /Contents 95 0 R >> endobj 99 0 obj <> /Contents 100 0 R >> endobj 103 0 obj <> /Contents 104 0 R >> endobj 108 0 obj <> /Contents 109 0 R >> endobj 113 0 obj <> /Contents 114 0 R >> endobj 118 0 obj <> /Contents 119 0 R >> endobj 123 0 obj <> /Contents 124 0 R >> endobj 128 0 obj <> /Contents 129 0 R >> endobj 133 0 obj <> /Contents 134 0 R >> endobj 138 0 obj <> /Contents 139 0 R >> endobj 143 0 obj <> /Contents 144 0 R >> endobj 148 0 obj <> /Contents 149 0 R >> endobj 153 0 obj <> /Contents 154 0 R >> endobj 158 0 obj <> /Contents 159 0 R >> endobj 163 0 obj <> /Contents 164 0 R >> endobj 168 0 obj <> /Contents 169 0 R >> endobj 173 0 obj <> /Contents 174 0 R >> endobj 180 0 obj <> /Contents 181 0 R >> endobj 185 0 obj <> /Contents 186 0 R >> endobj 190 0 obj <> /Contents 191 0 R >> endobj 195 0 obj <> /Contents 196 0 R >> endobj 200 0 obj <> /Contents 201 0 R >> endobj 205 0 obj <> /Contents 206 0 R >> endobj 210 0 obj <> /Contents 211 0 R >> endobj 215 0 obj <> /Contents 216 0 R >> endobj 220 0 obj <> /Contents 221 0 R >> endobj 225 0 obj <> /Contents 226 0 R >> endobj 230 0 obj <> /Contents 231 0 R >> endobj 235 0 obj <> /Contents 236 0 R >> endobj 240 0 obj <> /Contents 241 0 R >> endobj 245 0 obj <> /Contents 246 0 R >> endobj 250 0 obj <> /Contents 251 0 R >> endobj 255 0 obj <> /Contents 256 0 R >> endobj 260 0 obj <> /Contents 261 0 R >> endobj 265 0 obj <> /Contents 266 0 R >> endobj 270 0 obj <> /Contents 271 0 R >> endobj 275 0 obj <> /Contents 276 0 R >> endobj 280 0 obj <> /Contents 281 0 R >> endobj 285 0 obj <> /Contents 286 0 R >> endobj 290 0 obj <> /Contents 291 0 R >> endobj 295 0 obj <> /Contents 296 0 R >> endobj 300 0 obj <> /Contents 301 0 R >> endobj 307 0 obj <> /Contents 308 0 R >> endobj 312 0 obj <> /Contents 313 0 R >> endobj 317 0 obj <> /Contents 318 0 R >> endobj 324 0 obj <> /Contents 325 0 R >> endobj 329 0 obj <> /Contents 330 0 R >> endobj 334 0 obj <> /Contents 335 0 R >> endobj 339 0 obj <> /Contents 340 0 R >> endobj 344 0 obj <> /Contents 345 0 R >> endobj 349 0 obj <> /Contents 350 0 R >> endobj 354 0 obj <> /Contents 355 0 R >> endobj 358 0 obj <> /Contents 359 0 R >> endobj 363 0 obj <> /Contents 364 0 R >> endobj 367 0 obj <> /Contents 368 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 12 0 R 16 0 R 23 0 R 27 0 R 36 0 R 40 0 R 45 0 R 50 0 R 57 0 R 62 0 R 67 0 R 72 0 R 79 0 R 84 0 R 89 0 R 94 0 R 99 0 R 103 0 R 108 0 R 113 0 R 118 0 R 123 0 R 128 0 R 133 0 R 138 0 R 143 0 R 148 0 R 153 0 R 158 0 R 163 0 R 168 0 R 173 0 R 180 0 R 185 0 R 190 0 R 195 0 R 200 0 R 205 0 R 210 0 R 215 0 R 220 0 R 225 0 R 230 0 R 235 0 R 240 0 R 245 0 R 250 0 R 255 0 R 260 0 R 265 0 R 270 0 R 275 0 R 280 0 R 285 0 R 290 0 R 295 0 R 300 0 R 307 0 R 312 0 R 317 0 R 324 0 R 329 0 R 334 0 R 339 0 R 344 0 R 349 0 R 354 0 R 358 0 R 363 0 R 367 0 R ] /Count 71 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 10 0 obj <> endobj 11 0 obj <> endobj 15 0 obj <> endobj 21 0 obj <> endobj 22 0 obj <> endobj 26 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 39 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <> endobj 48 0 obj <> endobj 49 0 obj <> endobj 55 0 obj <> endobj 56 0 obj <> endobj 60 0 obj <> endobj 61 0 obj <> endobj 65 0 obj <> endobj 66 0 obj <> endobj 70 0 obj <> endobj 71 0 obj <> endobj 77 0 obj <> endobj 78 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 92 0 obj <> endobj 93 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 102 0 obj <> endobj 106 0 obj <> endobj 107 0 obj <> endobj 111 0 obj <> endobj 112 0 obj <> endobj 116 0 obj <> endobj 117 0 obj <> endobj 121 0 obj <> endobj 122 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 131 0 obj <> endobj 132 0 obj <> endobj 136 0 obj <> endobj 137 0 obj <> endobj 141 0 obj <> endobj 142 0 obj <> endobj 146 0 obj <> endobj 147 0 obj <> endobj 151 0 obj <> endobj 152 0 obj <> endobj 156 0 obj <> endobj 157 0 obj <> endobj 161 0 obj <> endobj 162 0 obj <> endobj 166 0 obj <> endobj 167 0 obj <> endobj 171 0 obj <> endobj 172 0 obj <> endobj 178 0 obj <> endobj 179 0 obj <> endobj 183 0 obj <> endobj 184 0 obj <> endobj 188 0 obj <> endobj 189 0 obj <> endobj 193 0 obj <> endobj 194 0 obj <> endobj 198 0 obj <> endobj 199 0 obj <> endobj 203 0 obj <> endobj 204 0 obj <> endobj 208 0 obj <> endobj 209 0 obj <> endobj 213 0 obj <> endobj 214 0 obj <> endobj 218 0 obj <> endobj 219 0 obj <> endobj 223 0 obj <> endobj 224 0 obj <> endobj 228 0 obj <> endobj 229 0 obj <> endobj 233 0 obj <> endobj 234 0 obj <> endobj 238 0 obj <> endobj 239 0 obj <> endobj 243 0 obj <> endobj 244 0 obj <> endobj 248 0 obj <> endobj 249 0 obj <> endobj 253 0 obj <> endobj 254 0 obj <> endobj 258 0 obj <> endobj 259 0 obj <> endobj 263 0 obj <> endobj 264 0 obj <> endobj 268 0 obj <> endobj 269 0 obj <> endobj 273 0 obj <> endobj 274 0 obj <> endobj 278 0 obj <> endobj 279 0 obj <> endobj 283 0 obj <> endobj 284 0 obj <> endobj 288 0 obj <> endobj 289 0 obj <> endobj 293 0 obj <> endobj 294 0 obj <> endobj 298 0 obj <> endobj 299 0 obj <> endobj 305 0 obj <> endobj 306 0 obj <> endobj 310 0 obj <> endobj 311 0 obj <> endobj 315 0 obj <> endobj 316 0 obj <> endobj 322 0 obj <> endobj 323 0 obj <> endobj 327 0 obj <> endobj 328 0 obj <> endobj 332 0 obj <> endobj 333 0 obj <> endobj 337 0 obj <> endobj 338 0 obj <> endobj 342 0 obj <> endobj 343 0 obj <> endobj 347 0 obj <> endobj 348 0 obj <> endobj 352 0 obj <> endobj 353 0 obj <> endobj 357 0 obj <> endobj 361 0 obj <> endobj 362 0 obj <> endobj 366 0 obj <> endobj 370 0 obj <> endobj 371 0 obj <> endobj 53 0 obj <> endobj 381 0 obj <> endobj 382 0 obj <>stream xœ]‘M‚0…÷=EoMÌltãBcÔ Ôv0]Xš oogê± /ó>fæQl÷»½w£,N±7eç¼8ôS4(oxw^¨JZgÆ·c5D±=èp}”©»ìúŹ^e¤òé-AŒÚßQlÊt`Ó¥½ý{­Ê> endobj 383 0 obj <> endobj 320 0 obj <> endobj 384 0 obj <> endobj 75 0 obj <> endobj 385 0 obj <>stream xœ]‘MŽÂ0 …÷=EnÐ?Z@BÞÀ†Å ÑÌ\ MÔiÊbnOüR:h"åÉþlË–]ϧ³gU~ÆÉ|ó¬Üèmäûôˆ†ÕÀ×Ñu£ìhæÅƒš›EyüÐáç7°J ì²Ñ7.¿Ú]Tç"3Y¾m8jåâP¥G—ìí¿pÝçªÁý¥ïiѦª7diÑ„Z ¦¢wêé]¶´h*Üg´B“d p eˆá8ʶ V‹Ó"7Ù@ˆ¯*hS‹Ó¡I²uˆ¯*¨ÇÜ¢i®> endobj 386 0 obj <> endobj 176 0 obj <> endobj 303 0 obj <> endobj 387 0 obj <>stream xœ]’Anà E÷>7°k'‘¢Ù¤›,ZUm/€aˆ¼FÄYôö…?ŽÉ_3Ï |êÓùõ¦EÕi¶_¼(?—ø6ß“e5òe U«•›ì²fP{5±ªOo&~ÿDVy{ÉßÍ•ëÏn¿j¥ÈÎŽoÑXN&\¸:6yÐÑçA÷ï·n¤jôÓ´ªnÚr´jFPÛÓªºÑH7é–$êèYP¨’hG«æå‚ö@h%Ç@–žˆ‘x’¸ Î”¤Iâ‚zt¿)J6-h@÷Es²ã€£ì°bŽ Ñ·¨“Â{‰²Ü—ÅZ¢,²Ø^Ô@×"ê-ÜyØPŒ*¶?\Vöž‡oÞ˧ÀÛó‰s,U*Õ/(S¤ä endstream endobj 32 0 obj <> endobj 388 0 obj <> endobj 389 0 obj <>stream xœ]‘ÁŽÂ †ï<oP¨íª‰™‹^<¸1ë¾Â`8”Zûöv†ºK–„/Ìs˜Ÿæx>c˜esÍ£½á,}ˆ.ã4>³EyÇGˆB·Ò;¯Ó&‰æx1éû'¡\ /õ§°ùÚìö¬ti²£Ã)‹ÙÄŠƒZü²@`tÿ®µ*]wÿ÷ÜÃJTJ©v +[¥÷E!Ô$Õi*ºÊ™U5Y}@MV;¨ÉÊAMR½‚š¬6\ôPÎ4ß{•‚{ç$í3gŒ3§ËéQh!âï¤1Q—\¶xåwyV endstream endobj 8 0 obj <> endobj 390 0 obj <> endobj 54 0 obj <> endobj 372 0 obj <>stream xœí9P\õŸÏ{»û–„˜lË$…å tzl6+‘¾—pÒÆ¼'˜46Ê6Ô˜_•””h³ˆÆSãDÂySz:›³“±¯ÇˆæÚŒwaôÚIMFF®ÞÐÓëè •L:8t’Ú†qý|¾ovÃ][ÿl›÷åýú¾Ï¯ïç÷—€ÅÐ2|±é«Õ5 Ž«éòµ»ÛÛ:œ÷â÷¤5w?ÐYAéAš¢ÓµëÞw:ßÑ –í¾§mÇo¯\x ÑPcÞ8´ßdþ:~Oc;ihý:ÄUºîD‰ðW“og?åù[„'‹BL˜íÇN«Ë{è„{š`Èk‹±´ë߈…”€n}`ÑÖß4Xõ~©:½’oWZžh¨²?Øú«ß5¯Ñé":‹ ŸˆŸ’ØÏÄãÒòÎÔ[†§Ê…¼ž×¥íA0Ê5ffa¥ý$Ö©cjó:c›1š<*pkÀ‡ÿN¸ªƒ[Pª1 8ŠÒÉ&u ·NÖ‡7½:<<\QKš¦Ó î­î(<£Þ¬žQÛDÞÈÈàVAJÑ jŠ?¢ã—k ûÖª“3¸­TïqÜ:fÞÑ4ÎRÂð‘Ì~ö]q!²‡}nʲ&)ÈÞVñ\cœ¡µÄÃæEÈá·X`Ç‚~·â`WDC¤cÌ·§N EWM©$túo¬xyLÊÑÙbÇþ2éW¥ø#¾Çõä ¾9ôˆ=òúëXSŸpâìV‚ùÿ°+)) ò¥AÿX§?,®(£SŠ55Ùá¦&,:£Æ;ìI¾æÈ½,C%­ˆi!w5¦Ã¾Œy$;YŒÉ8ÞÁâ/›RãÇæò)¾9ŸOeá¥"Ÿbm"Á0Â÷ †sŽãý*KtŽìb8¶þÔñi²Zj5X·Gè‚·c­}Î>—Ñ÷Ï)^æxýNÔgü¹®eb'‹^ž ‡;ì‘8Öðežà¼dÖ¦Xé³µ(ç+m\'UHÒ«¥Ï³ßÒÂ$ ‘¦;†·üSÏQÆ/Mã/¿°?gšh,R|n0D U¥&‚u~³y¼þx›ý#7¨‡5G¡mžõ6Ö«vX­³z.¶Ëõ©¼L$ùDYA²ŒŸ-CňŒòZ˜I¤Æff°ö¢~râÞëøGÌä<ìWdªn*'1ÃòEóÇ ¤û(›?±ð‰¤úÓþ–”*|ÒGº;K˜{)R§”XŠ!½éà«›Âõ“-ÒÚ&}v¸°£z¯º!Wv7{tÌÇ~¥†4_$¦Ïtwæà I,»í§ºñ‚iç›WÇ@̉?ʤŽUÏc-ad#6/ Ö—†tàì2p¼†eókˆÄDîÒ2ËS{†Ø¸sëÖíË– eŠˆ¡ÑÐI÷Æ 1²?ÂâT/37§.ˆz“®Z:S&‡ cȾbv>%ÊËs´A°KÒËD5*¦bÑA¶¨-TJ‘euô¨8!p¼´žg8³<ÈCI, ÛS¨†íIêŠx²'èÚWrÖávðH«†P(åmpêŸó}‰c­HŒ×IòøJ«F¢ÚH”&zh(Õ+¹ÎœI}ºP7þë&š×Mße|,ÕÛwÙ>”뜳æ2V…/¤¨™"T5\®fꌣêV»#oqÆ“5¿ÊœØ‡§. ïýÀšÁÛÆÔÙtߨS¾yWøG:¯ÉT̉›LÜ!*#¦Z¯Y­\=PM\[RWuk)žg¶…™½",âLóÆçØ%MgD Ÿ—égìêœÿùKÑŸ.jÕ˜qÁ¦–IçžñÂ3…úoÈ5|§#sk:/:UÏ¿#ÂßÉãæà€Ú“Ð ÑBµë\îu'Þfó r¤í’›E¦þ+ÌmLÑ”…µ,÷ÃfêŠi´Z˱³|mÑœf5ÙQlšVìwq·jÿñÊäø<¡Õh¦þÉ™LPš×ñ¨n¡4_{ˆu 6ÍÞ/út‘CX—Nø«!ÞR%¶ý+…þCªÌh©Kôû ñCNßšî_eâN¡<æë#Í££Í#œë?>»öäeK%$b×}+§î°®òŒ&Vê$”0­¶QÓg^î7KìG¹£ÊÆñfá8ðÓÐB99~¾ ϲó<›žœ•ò|‘Úòv¶ …˜ åù˜o>Ï?)mf”ä¯3ž“ïØ]Ë6º‘eð—’sæÎZ“+ýäf´!Ò óãŸuòzL}·=íì±|øÁ¥;° ÊÞÔ¹9u[“ìÑK 3&†ÇšˆEó¢xiû>µ%¯µ0§G¹nn_¨(ý‘ˆCz¢Gxyc7EÐn¿C Ãú=GTβAJá)æ¶ã^ûY²7æÊ?—5'§>Öÿ\cÁ®Qxça—ÌÓŒejC£Þ(ªÑ~¾aJ°Íî·rð–:ù››v–Ÿ²wLמ}V{â q¥• ˜}Ǭ똓^ÍÏÙTˆ…p Ê%—2«¡@¬[ÞxµM¸Æ9ÛFîéœc%ŇI›ERÕ|žèÊÎTY©ƒ"¯Ú¸¿«¨¨kÿFÚ›®µjK&&Jj­=³—}¾ˆ'ÚKSÕê]HÖ+ÚOZ¬¡x‡›K·3¡A“qNQ¾$ï)8OíoíHç{„¥—ð;sßí ï•^êìtxIÿ‚ÏÑ7g?ˆFÈ«üZ|e¼sýòýéÒ•ª]»öîÛõÇÿ7pãܨƒF8?„w1ŸF®ÆÍ¸;ñQìÅïãYÃßK%Òi‹Ô)•^–þGš~/çËeòjy‹Ü-'å×ä÷äO\ù®2×:W³kŸëI× ®¹F\¹%w‰{{»û1w¿{À}Öý¾ÛöÒXéYë±h4{vz÷|ß3äy×3£(«•Ê7•¥_ù¡rVS>ñ.ó†½ë¼qïAïQï ïkÞ1ï'y×å­Ì[“wÇgñkã/~Ü;7½6®?{ô]-CtnίA\ըȃ=¢2vó~qþî‡.¸U<®†ØüpñÞŽúA/õT]©/\B})ÿ–Ó>¼üPøA1\%°>OûÛ2B9hpT@%„`%TQU½ ÂðXÕðEø;ÚÍG`5Da Äàf¨…µÔÖÁ—ˆ2o/×ã]À¿©5À—á+°nƒ`‚·Sen‚;`l†¯Â¸¾[¡î‚mÐ_§¾#ß ¼6ŒƒKì}] ~-›îž¥+ò•Þ]tý[ÖÓ¥-'ßá_ =ܧm¹ç¾ö=ûî?pû=;öÜßÎ:Ã>±Æ?ïðæ¾NÃôlÎDúKÚ7Ó¨ƒLК£´ÆRIè§«'è£ëôU']è¡Ó¸UÌŸ3|–ŠÙì‘Lß³¿Ô\5—'_dAµ¦ñ7ÑS2‡æ-Wñh%Z?Ã8umüÅçÆg±üµñ·>xc)ÿ‰¼ÉyÑõõ•¯¼<øŸßXZ÷[¸^¾ÀÓoîy¡=sŸž½KrÉëE–•´?ddãß endstream endobj 31 0 obj <> endobj 373 0 obj <>stream xœì½|U×0>!ìî° Aˆ±ì¢E©Q4ô.I6„ÒHÙlÚîÞ-éÉn*)M ”Ћ@(bA챋¢dþçÜÙD,øøø>åý¾ÿ÷ãÇdwæÎ½çžsîé÷® ÓÝ•qqqéíì°Ú/<2 ØoöT¼5´ã—Ž{»uÜç:†×ý”s}Ž„ôt%=»ï¿·ÿľחõéx¿wÇÆ;E7h|—Ë—§\f¹¬tYíî¢sÉrÙèR]®ØÕëÀÕ±ç¬ X:ðù焬[÷ˆ|v¨_ðÀé!Á‘×ûú…\à10D3PC¢‚ýN÷ó8?DíîÝùøGøEL”?7ÇsàCÏùû…{¯8gýêu>O‡ Œˆ\}G>êãã<Ð;ØwàìéðÒ/ƒv¶!&ÜÏ;ÒÏW|ŸM ÷÷øÐšÈÈЉ#GbW¼3"B3"Ø/r˜|>ô:pô¨QêGð:†^ÇÒëãô:Ž^ÇÓë¼>6Š^û-Zfœ²Î÷ww#£CFDz¯†G‘±ëü"×n½¡Y  Yþ«[Q¿jsë×`è÷Öï!¿þÊ0ÌS‚§†,}&ô¥iφOx.òùõ3¢^ˆöŽYíë33Îw–ßlÍÿ¹kæÌ_» pẠÅ'ºôq÷=®÷Þ§¼Ã<ÀÌf1s˜‰Ì`f.3‰ eæ32 ˜‡˜…Ì0fó0³˜Î,a¦2K™g˜G™—˜iÌfó,3’™ÎŒbžccžgF335ó3†y‘Ëx233™YÌxÆ…¹‡qcB˜Þ.Fâbr1»X\¬.™.YÌ“À…Ðd “ÎbÞe¾sa]Ƹ,uIv¹Ö­o·Ï]{uÖ}r÷%Ý£º“îöîõÒÙ²¡=”=žîá'Eþ©ü'E_…§b ¨é9¦ç’ž×zÝÕkL¯€^·‹n|oCïÊÞ{{Ÿë£î3½ÏŒ>>}Ö÷ÉëSݧ±ÏûîsÜCÜ‹Ü÷»¿ëþýÒÒñe‹ \·¸¶t\õàžäsxø/Ù⟹ü.ár‡è7r#[Â/‡/<>ºB$7Æÿ¬ôèÐ_ŸsC/uãf긕û:Ñ.\5·Ããy9_ȯò˜!w;Ú/¾PÛ÷+®7™ëçþ&ùyXäîÍf¹Ûç†&ï:îHÛP×÷*7{š8‚{Ðýq.½ã„Ç rïî¯JÝ«_”Oï8îáä)woš)w|–Ü-%¹©CÚäR¯,åºr…C=¬r>‚_ì‘)wk5lë¸TçÂxÔÑÆ ‘»q&ìx_ÞñÈ.׎û“=fËÝ6ò‰uܼ&ãçãtn û—Ÿs§<²äî—³å\?^ï‘#wÿ2z-ŒÊÙÝqdWNtߦ†Ž¨÷uSv{„ÊÝï “»¯ —»›"`˜gpNç›ÖÖõå¤^7Ü}—Í)<æÈ§ó ¹r÷åžr·fC]`·e§k ¬ëû%N}WÍ.÷qÜ«.¹¹ÒÊâªJåûÒ×I¹ßÆéÓS£„›jµÀÜÙÚ&0ÝØ¦~êîP§7¦aÈ!f£IOâô)ÆÂòû¤î;æÉÝýçËÝ7/»G/”»ñý®¼¸‰á~ž‹\zz¶yäÉÝëóån1ð°l—ÿ 8u»Ü¿æ’{ܳ—eçIiŒÅ++m+ÉÊ2n7 L_‡šÌžmp½_˘¦\·¤e­#iiúQºç ;‘óçñ ÎcÕ_˜Ç·¿Ç!©û»„ 2-5¥¥‘õYi¯è‹ÓÉxöÆ`’±@Ÿ wóÒ¦‹&qwŒc^Ù˜œÅ.°øYÉ»¬WrCG¦¾ûáœä}ŽÓà~e7Ô£@îþZ¡ÜýŠ h¶$¹‰K©ç^nr©å†s7‘k†_ê1˜Â&›]>@ wãåÀ+ìñl„£´ð¦C MÔ€ !GËÇfÞ®ÄY=“Ž·kf*öq^gæaŸÙìœ+áä„“Ö=¬ÍMÏ!ù,×CF¶çÕX²²HUZVñ%£ñ%ž¦å8ñð¬4yúxÄÕ=Å D½ðF»†å‡É“~:y‘G¸»€& 4$’ÀÌBh˜5âý!i¬gÛ >?ÀN¸!äü“ÕcÙÝY]SZKê…ÙdÆvÞúV$¿Â½Ùâò×ÏõtÇt; +Xű3 C?øz¹£Ìc‘Ü­!ùâêZ¾ÃZ lÖÜ‘Í ð(’»Ç.0Ôu¼%¾æÊIá•År· Ü¨ŽÑpïsXÂ%Ðf?ûÄõX¸q?6ªë(õXc‹­—Ú5Ü{‚ð•zŒÀŒDÌ~zD£!€Ž¯G7‘*_iAðӗЄrx|³CËHág|~É#9‘%…ز`TNàÇ-­mÐòDùHìøGÄd ü$bR¢Ñµ6¦eiŒ‚pq€®­í²†,1iœì*0è8ØÜ‡ø »pG°ZjV`bmvþ¼D`dÄ—8“žøðæ{!É#¥æœrö3Ž|Á›%Ùðrk[)@®Vã3¹ƒ® èŸaé‚Ò2Ða|w…Sdú`wÃñrÎfˆÍ~4Sx½1ÖF4dU ‡3` "¨íÈ¢_!¨g)ÊNà÷Õ5 ‚Ççß;Fì\Ü8j›u[”üʳ'¹kM}ws=Á† …á¸áÀê}Ý· .bS€ÊC`¤­­À¶ZfSìn˜Ã8*@†:ÔåõÛIAZVR^brrF a×§•ìW™¹Ánðèš SÁŠ£¿®ÑÌ„4þ€§öõÀ×6›À Âïw·¶n˜»Ôj%tØ '€Ôu" ¹¿Âà‚°)ð ¿*p€ø"lÓöXÞ]õ|”Ä=2Jnâžôˆ–»™]¥À‰/¾æqJ`« Œ+vÐX‹q¥|…=wÙ¨…ƒV‹¨Gü¼‡ÜùÞü‘øŽ–I‘]f:m:PŽ¡“¡6–œ\…ó|»í…o½‡ŽR¨¹þ@ƒŸºÈÍà§n­m+û1‡cÞCç‚@ Æ·íš­\±çhàÎ÷[ÛàúÈ+_²Úí$ý=ôˆ áÂû2úG\§tÎV† è? ó"PQÔîŸ ­. 0/ÂJ‰BØì…”F³Óú˨l¸2NÁžjÇëÉö®Ñ›w"¶>Æùà„7‘?æÝ%¿ÓU|h,ü„ ;`Žä¥U;¢ê}f¥öµLF'†Fi³Ãu ŽË<Œã2#avbZ””œÂìY ¿PB«`l·8П½Ê-©­Žv¹‚lo—{ wµÉã%0k–¨[WÈÝŒ|ü÷›€ÒùÉÀø½‘ïEÖë(Ô®)Øò6·p?ÇâºÛj¶l­·ˆ …Ãê 1«“çS«¯MßàÏæ7Hœø8j‘B)"P™×‹¡_qmЕ*à¨.­mìÎOBåH#H3µºäåÌN 6ÛèOȼ.ºì Ã:£îÁ^Wpü~IqDilJ,ÐþŠgÛèï»Ö³€Dl‚²XøÊ¡!±DoM ~d}‰’‡âe•ð-.Öøé2ldòkTHD×l/J3XÃd‹sÁõBÜI6åy ~¹ *‘îÀnƒ“_å>Cë®§äz¸vLüÐ#ÔÆQáÝòjŽõð’» $ ×”Ýױ˽þåŽy¥r÷óe°Ö“ÛÖ‚æjâÕUG÷EÃr*¨¯‚ËJœ¿Wk›Ç9ƒÜÿŠZí/wOL»H„AfäFåá0}9°¤Õ-î1×ýV ¬’»=ü§vpî"dƒ8wW0q7{$É99?ÔC /?–ìej–r7Ü•û¾ã†‡·œû‚wx¬m8tíµ.¼Éå®_;w§+ÇÝéÁå~ +)Î,PUȲŒÖåÐRnXãÆÊbbÏŽÈ ¬ßAØm•å»6­Û{¿j9™ç·Zã°” g£ ²€Õé)ªPYªU_¡láó¥dÂÝ,½H÷&S³é9Bvw9WÊ,ˆ\òëv@14q{W;Ù~&˜¶_r__ÀÃý²ØÈ¾r7?^×Ä=õÙk;¹¨}ó9—§¾~˜ëÉÝÁ¹%}ëþ=Ãíâ=’弌oópïÐêä\sÇ8ÍEõ¥a5~ª•dîÚà°Ø¼(³pÌkTT¼ŽLñ‰ÈZŸ ¸ßÞ@¶ùýÇxy ­QT©ä¥šEûà ¶»Æ¤Èa˜T¹ûL¢š}só™–ÛâÛOîv’ú+âÊÿFtY\;ªãéðþcÉà¦pÖ&®± ó¸¡îwÌéð÷Ðȇq³=܃ýåî›ÖÈÝ5r÷]k€ÉHÀÚÍÑ?pwº|ÉÝãÊŃE!çïéöÐËÝùßitiäúpOq}];&\Wx,ȉ*ÓyÕf‡ëqd¹«8É×q…½‹¿äPÁÌñû+´Ñ9*]ßÂ%Ççq‘õ£¶+.­¶+3¤ƒð †‡qqèÙ¶'°Ù‡Ì‡Å|¶µmô¯VÏR>O¦‰nËŠKßAžÎY”¯9 ²[»&Z`Œ`/‚ÒB£—…k£^†áJŒc ÂõªÂ%:?`Ãæ`% ÂC5óÞäÙJå5´²Ù}ÁL`Ÿ"»]ã[ õ×s3ÎH Su£?¾Žë··cH´ gçîp…˧cå\8ßìñ8%ÝnîØQNú騝ûr'¸{ݯp'6zŒ“»¿9^î~¥ô‰û›‘…÷+ mr×Эjt©ãúrS¸»]a17yL”sµÜ6IØÙôFnU ×Ðಋ»Zôuå®rƒ<¦ÈùZ~›ÇTh"B „„ྠÐQ+wK*ì˜fãÍÛ^¼9GÊëªe°fûÝ;Žz(å®Ú¨²ž=²zÊ={rýòzö2õtëv c”Aàg¸x¸<íòq·û»Íë¦évÓõNס®«]M®W»Çt¯ë.H¦JŒ’o¥i¢ô é÷²{dseß°ÓØP6Ÿ=Ͷ÷¸·ÇÞçä äkäñò+Š;-Š6Ååž²žÊžS{ìy©×ݽžì5£Wd¯7ÛîÞò;Rïh¾ãÄoôéÑ÷®¾WÝ»¿è~ìÎîw&yœöø´ßsýf÷[ÙogŸ»F¿gî½Ñ÷¿÷ýûúÝ÷ô}óï‹»/ÿ¾ÃÊyJ£ò'•^µ} zàŒ¿¹¿ÛýËî/z€}`Ý yƒNº<Ø{pä«CgÝöàêêýÐ[Ý6pسÃ^xêà ßúÈúG“Ý4Â2âÔȃ#OŒ|w䵑¨ûF=3já¨Õ£šGõƨÏFñÝ÷ؤÇ^{ìÊèàÑÚÑÙ£‹Çôóà˜ctc¶ùtlÿ±CÆ>1vîXŸ±Ÿûø4nÔ¸‰ãÚÆŸ4¾yÂà ã&xMh™øàÄ‘gO\;1a¢uâ§“ž˜4{’÷¤ “R&™Ô6ùŽÉS'Ïš8yÃäŒÉÙ“÷Ln}BùĆ'¾|òý§†>µúé;ŸÞýôÇSØ)÷L1eÊ”€)§¦Nžj›úò3³Ÿ97ÍešÛ´~Ó¢§}ûìÔé#¦‡OßõÜÏ{îÊŒçf¬š5£`ÆžÔ/<ûBÈ Y/ìá œ§›g?O/O­gŽgû̹3›g=5k鬕³ÖÍj˜uy¶töÜÙg8ÇeNœ·çöš{ÏÜcóÎ[8/sþƒó·Ï?3ÿùWæßX°aÁÍ… w-|sÑäE‘‹¸Åk‡.Ž_\°¸añgK#_*ziëKíËÜ–=¼ìêòyË¿_ñèŠý+¾ðznåÝ++í+7­|ÕÎUG½gzïïWß½z¬ÏdßžG};üÔ~Þ~™~;ý.øý q׌ñàjr͇O­}t팵Ekw¬=´öìÚOï <·NµîrP`PbÐá ï‚ >ü}¢ y.$<$'¤1äbèÐ5¡úÐÆÐ³a©aõa—ÃÕáφ·†Ÿ ÿ œ‹è±<"!Âq<âB¤käøÈ‚ÈÑ—Ö»¬¸~a”$êÅ(>úÅèÀè‚èúè7bÖÆÄÄhc 1§bÇÇzƆÇfÄŒ}5®cƒbÃGñòø¾ñó⿊ÿ!aQBR¾Ä‰÷':’†i»i{k=µ¡ÚÝÉ«’ßHþN÷¢.MwD÷^Ê ”C©®©SÒ†§I_œ~*£Æ×z¥>Uo××&ì†m†¯Œ=ƒjãóÆJã%²”Ä“]ä°)Ñ´ÕR`ÙjùÙêak]k­É| sb¦>³5óó¬åYÚ¬ê¬×³>Ë~([—]•½+ûTN¿¯œu9ÖœrU¹;r?Éë‘×'obžž9oGþ+ù—ó?Ï¿^ðD®ðÎÂM¶GlÓlÍö{ì«ìåE֢Ƣ÷‹{+^]¼¶X_\^Ü\|¼ørñÅß—ä•””œ*ù¦”-½·tdéÄÒY¥1¥¥ÇÊN•»–¯)¯-ÿªœÛè^1¦rae\å¾Ê÷+¿®z´êxµuIõÁê6¹o:³™l>VCj.Ô´o‰ß²oË[[{oºõù­«¶fn­Úzbë•ÚÓÛ&Ö©ê×éê²êªêvmß´ý£ê{Ô¬[?­~E}B}F}eý';ïß²Ó²³¾anC~Ãæ†½ o4\sH÷;q<íxɱ½QÖ¸¨1¹ñj“WÓ‘]#viw}¹{Éî¸Ý‡š{6{6W7l~«ùû=C÷LØã¹ÇkÏ–=­{¸½Ýöºí½ŸdŸ×þý¯µ|rྒྷÌ8u ø@ÝÁ؃× 8äuHwÈ|¨ù°ËᑇÉáŽÌ;Òtä³#?M?zúèûGoS{êXþ±ÃǽNÌ>qé¤ËIÝËó^xù³S£N=Zrº÷éa§ƒO§œn9}ñÌgî?c;³õÌ3gÎüÐú`ëäÖÙ­þ­{[/´~ÕÖ½m`ÛØ¶º³½ÎºŸrvÜÙ–u«c櫈ovpö°TPŸîAØ 5œ~@§ÇÞ³ÍÐi²ßMMöþôÚ]ËT £Ñ”šö‹ÁFÆ—ÆÉÐLón×dmËÙI¶³ÖTj” ¿Ú ‡£®vgCà¥O@ ¯JQ%!õÜ4{‰¾Ô{Õúu‘iµü“D¥ 4Þ£áÿ‚A}ó°×8È}4MݼN;±‘ªt²LŽpõã0Îô *öðëwøé â⤾ÁËžm$Žèi•P]Ï*ˆ&7Ü “À¦à#‚éÇQßÚ²—_úúÂÊÒe£Mž¤úÓ¦—ÈáKäkèTJƒ&u–]¡19Æoþ€¦É}Ô>Ä`l! Ù Eìn7 ‡“:Fv¼¼¼\²zåóiÞ0³¯©wö8;Lœ º³4)|ø¸?}JcÉ6{MM&“XÅZ¿¥™d!‰/H,&'HÂѪæ*_ýÌý€°’|RB,1ì`K,Ť”°Ûëò¶ä¥T®S­%Ú5^1¬Â¼¥b'ÙÄV®ÏŽR’°êp«ÏÊÒ¸m$‚èbIñÚAšsX»¹0½ÐÀ*¸ñSøñüSSÀ?w‘Ç=uQ¦ÓÐ-uÖT$¼<´4M`X$ÉÏ8í{p.à=¡¾ö`B-ã•f’ò{iEãò‰D“«QHDD.3™å.lw/>/ø€^Р'ô¿}\R-ÓHíR¥¢¢²¹0?%/DÅ/—F…¯ŽÓ&Wª~ŦȥJ¸4ȈÑP¤Ùø #p«û)üúΧ/‚FÃ=ù>—±w§C¥øšëw‰Ó ÌÈ!©É3Hù"Ï6Þc(ß_οÄ憪ÜϲC9Lj²0ŪS&“¸ŒHí¬ç"Æø‹ë€223 ߨì¶äÃ;Ì6Âfe,Uñà_Ö•À"„ó0c«ÙøŽ3ƒµÀ² XŠðŠà55·*I¦![Ÿ«ÏÖç|køÖ¶=4èLʉÓ]¾†+¹/†L®P‡þg€‹ƒÊd y^L" qRgð~›CÍ>>Q“EBP .|<À®e­ýˆDQ°³à|ö±Ä,5’¬.8Ô Üá~RK­ÓÁ»›:ü8¨Ry‰­m‡%@†h$qR÷Aµ£†ô *‰†#WºÁˆéºë²FSôFïÔ©s åMt¦ z|˜æ:ðOñòŠÆ_Lè@€bë#ø©y÷‹vcÑ“ ’lNÊJ-Ï*0ƒÇ©8øZ<ß“—=®Qù’¨ªÄb­=n£†¬#±a X¢òã7jwÄJÜOΓ··µœd·ì(ßCŽ‘ ËOËœÚì9e6{1«pò/‚ 8WSHÈ¼ *€oÞkh|:˜J§»ŽŸ>†)%’„ÌÈmd7)¨Èª”)°£ÉˆÂa¸8\ØëZ¾™÷”µÌ|-sY`ôZæÐV1¬cÈcR˜´–5PæcuxIÅ :¶Â üÄ#6a<ÄANJ––µÇJ2Ó­†JÂrÏúHÉx¿[¥ X{ Ò ªã=™Í^Z—‘¥U)†­™¿@MbÊ6T%–…—jˆ?‰§Ràk„Ù ë3$éd¬ïðÓP¤ÒÈ“&*F‚oÆr>ä\¸žß<ó:/W­#ž©iÙ³öeÕÖê_54ÁÔwóËVV15U“6›¬&Yó¬à˽©Vó¨êK‘¼¶©$»…°{w,}yc(vÞ/}hvDË”ö¸CöâÐÇ´ Ͼä¿tA7U‹¨Ê”dtíòù1sȸã§gn‹¿Ÿæ½ž}J`'œÎlò>R3f2œå×rrïo¹QÇ&^²Šì§)Y‡¯-w&"ô°òhMËøÇ€tÐ2æ~¤ú4r$Â2Ô³íľó¹Ç,ð3º}æhdm Ž=¤Ýÿ A…¥–•t5Or–{ê0÷0çÁU±i¹üGD@ y±V=1¢7.Ó>œ²˜Ý®—l|».{ ö•Ì«UdUªW`4»´þYd½Z˜2e+»7§áŒRñÚ¢“|þÙÏ<¡$ó@yS—ê „ã-åZ‰â‘å‹–‘'ÙA/âܹQ¿xSIN€fÀÉLptæÁÁ`ço“œ(>´Ÿœa‹¼7¬"[ô¯žßÇ–\ðËö#ËØá³âVüÞB$]¡š’2µ–‰%ì\y19IËpLíþ-G|y ¥–„µ€,ábè{”4Ô ú?ÉäAÂßO­Ÿ×7½!0S°OœÆl¢BºÀ¬¿`¹µ¼¼i(?j® èpàÍHÊ—xü’ƒ¯QÙë«ÒÂoôÔ2;J)g?Beè>ò<š³lºnžžý#Šôý_ U¹W9–œº1…EVvàõ”DÁ¿Â³dfÇn$Ù}c ÷™)QlÞ^¹› À"k×,ž«$K£5kÖM{Ì#«ÙxÙzj)%6èž[¥,”‘ Û7m.k©?½‡\$ŸN{™—’YdEBPx@HL$YÃúm‹®ÜRQT¥$›tY¤œU¬'©€_W¤(KGi6TJ“ysÛ5|²DqˆSI2 ³¬(Óæ‘£ü8‰mµ¨Ú™îb$\CûbH§Þô¹©4’£Æú®<à[49OS 4œv€åWwœ—Äëfƒ¿ŒÂJT«oäJÂf‚¹ªeÒÁ¨Ó2úÎNKh§GnéôBÛ I{ž s¦¨‘UÔdÚZ÷6Ékí4å|©â»æYcgGáïšf¯Q)|x©™¨D|D¿9 ]†üªÐÄ´Ä4«p3†“„ó&m«ä£•ÇîßÌšeŠÃ•MGÈrhmûPž^ ÜtÔ¡6P‰¯~I>Þsîãôܸ-™öÄİgA¹²#¹{¹QS¤Ñ¼-0‰6;§PqJÒüdõØ‚ jj1žmYéSöéŽ,Éôrð½ ¿„ð!ÆWµb=J2ÇCˆÇ,ŒöÎA!qèwfÅ[q_Âà#dGªËvpK7òOðÃùx—™O)Ÿ +8«‚)½cpaÓ0›R¾’f:Òü‰Ö¶}MÛ@ RÂt+7“ïÉ=ÂÉ"âmô®oW&—ñ¬“P¬b¿éNI’*ö}b *[Kf[ÎXQH$‰3Ã$fõiÊR¸Ñ îEô3^óŸ"ìPéú˜òM*.öŸ-‡bõP ~£äïn¶±ˆZÖÇø @ïC¦˜|LFùΧ ]%N ,!¨Ÿ¹¥Üi~é_kÛ1䯭ø«ƒÿåɻř'ùí—Œ«sÉ dI¹Þv’k¦Œ>-x•2–Äæ%&§oÂÆú„/?Q£:AT4nß]ü áýuf¯F#£^0Vb`~UÒ5äO´Û„+6;Ë ç—JÊÂl!æ Ô;ÿ’±ÙõVRf:iT÷:w•Öp9ÓãX/Ã(Ãù®@âŒ]Ó‚†ï©[ |‘C²±ZB#¾y°”¨L `ÿR‚Ù1åqdø!øìüô¢ZLŽ‹c.7¦PÄú‹õ`´²h"òçOT¼áÌ0Ž5;KX,ôh… ÞmÄË¡vZu —å|ùPkô}¼÷-EÚj³ÿEbΖF%”žTu ýUû Æ Ú…ù-++n%°'3SM 2]­–*jÚa5æµäµf¤• ´ ìFü„E‚Â÷8½›`ðD?£™ÿAÍÙ]&Šup/8ø^Ó'@¬-°ÅRæ~µÚI´ç,¢q Vaý„nø¿[#Mâ•)Îe—:~6‚w¼r‚2žD™Ì$&+Á¦³ôÆJf‰˜¤G^sCXBXîGøs¨Åú4æijG¥MB>¾Š &ã\ãKà–³ðÇ£µmeħaÕýÏp&Ïã(~Œˆ™"Z„-j™@AxIM çËX p±³ŒOè rŠzf8ïÙ–Â6Iœ^ó8½ž´´Šúr5T7¤‰C‘n8[Z®'ƒ)_!§àú‘Ó¤iGÃQ6n£d}¨r0Q“iŸòÝ2ÄYJ«ªnâø4W>é¨Ä‡Q§Ñ‹•QŒ µÊôÖ¶BÊxs 3½÷ϸ 'Ɠ֧ŽS®â–I‘¬Ê〮ªÿ‹pcAÛÍFc¥˜è`&ŸüäzðS%Š­^+OR)úµYÔ`áåeRoa•v–“1îì9^$²2¤‰åïå4’ÃO“ó¶,ó[Ž!ïÚ3ßìÒüK/‚³àÛ%€NŠšŸo‘‡EÈ{h*pÞFÜ>‰ ¼Ã,C渉Ì,²œw+8›ÓU\4¨¡bÓÉ.¡·Áè Fohׯ§q ƒŒïÏàŸP.#Î.=t–ÈÜÛ®yi¯áuÒ VZÀIåËXÊyÉà`‚$Åf¬SÓXËw4Kœéè­Î’O”F¾Ö4&+«ÞxÔØÖÃ7¦zS“–¶LOËwÄjZ4©á%”uwð×{ÁÝ£QáNÉuHœ<<¤3lÉHÕj?KgÏGhÏ%]=¯Ô;u>V£6¢EêÈgÑ»Zf­¡Cá)„i47¤7 ô­–©å]¸ëß+{ð»uŸ¥³4ðA£/YMæwÕ 7dÐÐ%„òEx M¨97š±’Ÿ|Ñõäg›=_¬V¦ªÜÓécå\,­mÜ£ÂÍ0Z\ÛßýßíCùÎw©¸êNk¢¤‡ÑÖÚz`ûI´È±u¯F³» ôX ú‚[걇ÐÀâ‹^ÄRj[\º‰p³¾3:Ì­ešPÑ`Öeêz")¾öl›ï48¦7` 6ר¢7˜Þ`h|âTÎÀÁ(ÆÒR?†‹ †iiƒf-C¾£µm#h´ ü\ïنż`P0ƒ¨¼qÊ-° ‚îà„‰f¨ñ%c$‰$‹À<ëœÜ#žm`¸º9ÔâƒØÐeÀùiZ9—ójµ&GÔ8qZ†é>À0:ð¦£xC<‘¦·C}Ô‰UãótoÂXS lÂB ´oWƨõeþuÐêÀÿç FÕqS© '@ÞuºÙÐ1®z¶Ù·°;N€†`Sü0‚=±+ÿ„5!"ù°…éEÃK$7Ë¡ÆÂ¥[[­ÀMíâÀÏ€ µš[ à÷Ãrï¡Èfî8A võ[bøPb,û1ú!^¾ÅyÑI€ …6;¿HBPbš‘F§ŠY2æ<áöç«=Æÿ÷+)î§þ÷{Ðà„“÷I€û@‰ +íhù-†ƒ5,ß/õiQ¢Õ6Á¡†ë4ЧÈ^ÑZ+ïªSSðË¥ëˆ9·°”å~ì(I*&ÂПæç+:Ô¹ÔDn“M£Iï㮄ë."5Ò¬ÔHÓÿ\Ý©±Œiþ‚pΡÎïÈ·Ž,ZÅr‹e­–z¢ÌMµê”š¤IÚiz}’I›©;¾ÈMjíÓÀØFӘ΋«3‚NØýõ^Ãa»F“ ÄfŸ¬.¢U¶Ÿy¶ÄT°ŠC©Vé£ ˆ&ìÓ/žåÎuË‘Cªzb÷µZB7E×¶¶¢jkó¼ /ôÿfj"K÷§q!ëÆ9½MDHá·ñÞ£´Žì9€ä$9ß´óâÿs\Kß \¥y«Ï馘ñRâ{Eè¾&Xå´ª(èˆ;èμyâ®w»è±ê|uV,Òì]´Â–Škð+Ð'¢U€ Í÷R‘»8?Šnhå^¡q>|Ž©^BIÔLH··Õç´Ï5gÊ ­NaªãðBޱ‹þˆN‰”NF2@IÇܹ9HÚÚK Å6(uÂ{^ÂK?€Ðô†¨ …}8—QT©¦Tì¡*,ŒQX£›ÈÅÝå6VaÚîôC‡PñhsºW"zú·væôäˆ20Sà½ú02‰¤‘DƒU¬ö^¨õ#OeÍä+’m²’L–K•VfÛÞ_{…ð^6‚É}œBE-|ìýa$7¸bI¨ðÕkhê‹ôyætžœÛÞò)L/II ›™rñÀÅ’M ʽe¾“1Í㉀åbŸ?SýÖÚ†#½MS®ÔZD$¼' ú¯sfÚ¶?;còdñÚO:R‘_–—Qh(‡±ÖѨû2Ê]è'SoÐn¡‰Õ¼xg™äwÔÙèJÑåuëŠUa+ç‘8‚^;x‘ÆôiÞ¯+ö1Îw*ÝÊ‚ó À©§~pàzˆÔû‘â ß{ƒ:8·<Ûª!@­Îùƒ«Sjv¨HÝJaË,(O¦ ظ&¶(ƒµ!Ì8Œ’fðë¤Æøu æàhH}À朼m%y„Í%Ùi–4kbIT:{Xo»ü–zÛfµiÈ“Ô$REsA£ùk’æÆ  tn_^9’B¤ÒhºÊ+½-ñ¹4€×Š+€†ÀÓÔÝå¤híDÂ:¶ÿQ1ÝûcêìWcø­5«bQ±â‹VAW©´CˤL×ÒÌÑf܉Dù‰5ÓT&pë<±VVk˜uK­ì0:+±Jö¶µ²Šµ•kÍÕ;ª·Dîð^¤Tð:™—ÝYø€Öô¿«eâh6,ˆ$ôlmþ†¢˜ªÂÆ­ ñ:º~‹J`fÒ Ñhªê·îÝYw‚psYÎ_Öò§³ao3_¥D¸TŠ?£šà[ÇXÙe•}е³êº] ö]öÙfâôðnt…y¾Õ2â®(j¡bÕ9U…!‰gI˜Ù !ÍæíÊÛål>§b×Ö61vÊò,÷Fô° õF~îÚ4×ÝSÜjÌÒRfŠ åX‹ £øoP¨;7KzÒ͒˵Y²7þ#^>¢Eè¸ùRÔH 0hå Ÿ¶¶E‹•>hs^Á_·¶óá_TφüÛ0õ»lÇò¿Ø»&yvÂ?bðÙÊàRî»÷–eËz[“)‡º´Ýzh~PŒ—€5ôÃ)8qóÈívüÅõ{‹zƒÚ'ÍÔu@ü¿Œ—KèX ƒˆ{Nèêûl·/öWœÛ3‘¿O2Ú5Ë©Cí?!ë}ñÓ¢ËgA÷ È+þ(· üé¬;œ„¨p†Æ‘Fc£G‘ëúh4çpt½èPWmBôÆáé>…:4ò„#hV|„2öM¤Á«¶Î¢õרA5©c ê{ô^nŒû{Ò‡ë!£ CK¯i3,CS°O½ŽCžEË‹y5è[ì ùñû „¥ gIë>ZÔÁdáš5,ÍKHícÄܳ{÷€¹ßí·râm…“àˆ[Y$¨CéVº_7Bâ=”æ èªëÅݳ¢%Û¸o)ßc\УcTZž¾‰2æ  º.¦¾`¡¨Û–fi°3–Æx(±zhü îÐnuf&z I~¤¡5êªReÔÚ–²™°5δ7ˆ¹¦ê -þª5Ä/hÅ 6CjØ’¾ŸNÞ¥”J8ypÍ1q.œÁÉ\Õ23¨£ȈùƒeÉý•ey{½c„³ÎÔür*æhì£Ó‹ÄOO#žÅOãAí¿I¾€®©²˜º!X­"Κn ý ý›»pFgÂBJ§,¿Ë¡^QÆ*|(ï'нµðö}ÐGEii ÙNê«f•èóMyÙdGÆN]m -†ôÓkÚ-Õ@GEÕ4l#nós]ಠéHQäw:C*ÂÅÖ6ïP’ì<ªƒvK+ @öÔç­Ø²qSÔñȆ$gM 2-ÚÁ@ÉcZö±6V]™»Ü„@ï KH‚-£€äï,2o$%¤,£,¬ðøi¤žÔo/>N rÀJöJŘD`eDmmeemmDU 20"áò¾Œ4»IÓÏÔ›Ä3ï˜ÓZæ¶þ`{† Ljm“93 Ö§¡¼¦®ð1uk¡×ä¥gÎyq ½¯V×Ñ è ¯ÿh“‡ÀÌBA½Š&)ÆÃŒÐó˜gQ|Ž|ö,¶ü”|ç<`i®¹CØ~<Ž7§¶k45bTCØßŽ…9§i¶¿Àî6û4ò7‹?ËiÁ>jÀÒ§ñH€S´ ¨o–{¶aµÕxÑvÂøÕ‡6ûv¬°±üáf%=…ò*Nn˜cL H­­Ðr`zke/Å\¤é+hÏôh×Ì%t ¹µ&¾¦F@°],=bžF!MÞÍÌ,vÖÛÄýŒþÿ‘‚Åõdƒ)Æ9†=5ûŸ*XüŸªéÙ6CL9ÐZj|Üz°f»æWk¦þC5ÿ’ÓÀvz ‹¥AË|¼üW³U1Gõæ’ Û55Ñ»ÂØªR‰¦ÑowÐ~öW%F T¿Š(1d ú•ÀW¡ÄW*Ž–Ï¥rйÏ4ši’2íAfåaµæ^ª8wX(z5=ÔU,ì'ôäV"žeÄÈ‘q;p–/ñص›6zºã"žaØÜÜøyq¹ó8Fºçœ3_Ey8‹¬h6~+0kñ)‰¤Œÿ-½ RoÒªönHŒq§÷“”Fÿa-ÜšG–%úÌ ;<½haŸyÄkvXqØöæ‚M6)HÍ'eìÆêÜú½Õ/= Tð“Æàʼnl£“z›–}àtÞCËõn&¶š8Òh}@CMÞ{èu¾–Ù¸ûH~õKÝ al]Z<àöQD&ºJxæ+9OŽÿRѱÚ{Æ?ÜÜûr² a&ì±K̹ÒåáŠKR!¬e"ÿÂZ&*èŽv,Às)#éi[4OüÂRâ쟮¦>l’ê×e8¬â‰eÍ_©þu8ÿé" ¶3[%Ö°âé¾ÎÈüýΧ˜i»G¤žú–çïvFÃDgâœú{žmJ1×£±f:ñ>êÑ =ñMšÚ{…^üóÙXQ£ˆé g$êJ_¢‡é¾‚O°ïÜj™æÃ±¢T¸Òî¿WŒ˜ÒsÿF.ùyd¦êS4¯×È:7=ŽìEÏd ôÈÔ1¶©[ÇÇžJ*=Rø.ÄïÏâ'\`DLySÒÓ4'æàÄMYo¡Ú^£øù%KNèéÌpý©¢²ÕïCíþÿÞòÈÿ¹)¤ÛeþÏ=/ء)= l ¢ !þ”övºãÿÓêÔoËçl'£ßÊLJä&Õ¿jð[à ÿú@{»HÙäW>XÅÿŠßùE|»_úPà1Ü*Ä­âfÿè(î¿t ·"2$*NEÂóã7¦çÊ ÞcÃ#|´ òÒÎtÀÚ=ícT**6—«H•Ö¾>3Åe"e¤¤ªÒ‘o- yÉYÏ%-öKÒÓ_«T,v’ë¼Í>FdZÍÙdYz~2îŠbÆÍ+›Xí!F>JÇñÇ#¨÷‹ê–n²ai¾‘ï…?*øS•ô!«eZÞè<´ kÒp"¡ŽÉtÚ=µ:“ýJ`–c|R¬Ö”i4™Ô" ÔB°è1^_ÒDW«x*™Ëf®¶wnéæilzCÇ=Ûø»ñG°ôþMú pýèLöøè,úÁ lÏ¢ÑÖQÉiuY»†s‘X3MYàŠß¦–X…ž•ò÷ÀÅý¸\ù%ª8©ÿj‘êÿw ÿÕ&@Góïý4Á?Dvý¯G¹y䟿úßßû{¬ÀþÝé°ŠÛ ÿÕZaöŸ/ÆŸ~P*nùí‡ßn[ýåÇXÅmAw´þ_†PüÕŸ8ÃU Äüÿ~ÞìßõófŠÿ·Eü϶ˆ³óÈ £G“qdÚË äXÅËÇÛŽ¾M¸žäS^IøH2I4êØÉÒ~Èûü]ÜjÂr«87ˆ[ÂÂMácT|O2ÛoâÓ·?ÁGõ«DÕ’øCs(\@õbʰÍ55¨ „²F<t É0À³}ëvùmˆP’èÂȺ ›¡€#+uZ¬4N üasnÆóëœ[\ŽPYóŸ=,è_µåè)ë l5¦rø!”s7i4ßÛLT\ ”Žžø r¥˜îúOøÈåñ y<.ë[¬[ÂúKÁà½È¬4–\5—)¹é>Ìý„–¢bk±ñg…¡Xkñóû PaùØ ®ˆ #6“‰äò¹•D¢xä/úG%æf×½«ÆÁY Ø½yË®½!õ~AÑñÑ…Queùé Q¡éã}'šˆÊ`$’t«ÞªÜ$m°'®Sñ{e|÷LÞƒŸ¬\F¼Ëƒk2¶’V–;"Ûl+jTVK3-–L©4˜$„—ý}šˆò÷Ý|$ãWqžÞs«÷`¾WÉÕàû›•¿‚Óy;%8ÝÈLƒ²?ÓØ£· }WÐÑz°{Ãý‚ãDÆ]¿ÝXjÌÑÑbpŽj-ìO2tþâ öÖ&Æ´ÛÁÍ.‚ÑY„òáÆ àã››­³˜¬šv=ï}4]bm®úä¨‰å’ ¿”¿.Ù›G@_¿üõb~$ÏŽý¤Ê‡,ßÜ_¾ÆîOØ¥BŸçÆùÈÍçzr½9•Šü8ó þÞZ–ϵHr‹óKI6›—í¯üÍQ–JÅ­!Í¿{–%¸´ÿ·ßvkV‘ááìJZ‡ößh|í‚ÎW‹Ga!• gˆyµë­­$ÕÉà×±ñušwºŽÖ;ø7c0wá/þÌ&hÝVàè¬öN$—$ÏY䈛,èþÔ3„G6Va\#žÊ'\B®¢¿6@O}§»v®¨Õδá8î5ÀD(ÑT“·I)/ZÑØt8'y‹ìó"ÃHª1ƒ¤³|ª4"=.áñm#¸¯q²+æ^™‰ÔÒD&˜Œ½ã©fb®˜ÖŽÑ ñœ &}…f õtòÜš¥SIbfl°Ä?¨Xè,Xø]híŠíç7|»¦¦Cl-¡#â’vîQ‘SZÞ-êÔ#ôô!z®;ÝDO&H­—ôüxÞ¼Wí´›o¯ÅþEG퉿á$£ ŽMQ¢†ÎQ¯C£YA·Y£Ã«eAÓº õ ¡¾¿†“[·íib'©1ôh&):ݱ¾LB•OWÕý)µï†_òGֆ؇FIîÀ„+-L¥‡ŒRkˆh9®X3üEÿë€[Š›.Ô˜ˆÅdf—ä¬åÇJ“”}PZX ö™œðj¾QÒ˜»9ÓNض£³&ðÒg¼¼U¡dýƤò„ŠõÙ„Õ$ÆÅ­9¿ú;î±w¿ùRE¾~áÇ—Ýl‘¤¿2÷ÈT2ƒx.L›Æ*¶åIR//:5‘,!Oø%?ÀÖ&K,gŽÙ÷ö4Ùn^ø']°}üÙOþã-ªŠÿ_ìQýO9ϘLesó9Ê›­sC:txkñÌ•£øgjt0ƒ-š?*šGâПϸNϰ}¬ë=˜Î—«Õe…9ÔãÏ¥ºÔ‡Ý‘*ËvMt’ŽBéhF]¥à:j$Y´è „¦’óH>qfSh šWqƒA0=æ–€aQ ==-ù† ñBi¾i58 5Fñ¬Â}çQrÝ»Òøñ´½;¸ë4:ÜL ñå•|xRAŽ=?ŠcÀwê;{^@{Žíêy·E¬ò¥›mÅÿdôý¼<ý”$Å”jª¬=t®’°Ù9q*JÁÉñk•1Òt½>ME"ñx‘÷Í;>0¥ÙL*$Y– x¼6Ù^£âêd›óж)K¥V«hø›%d¬Á×ÿq3Øý´û-úLx¼-oCÈépöÏN‡p–Z\§ÁydP<õ › €Doô!ˆ¸T”ø#ôHiÆÃo‹(h$þØó…nÎ0\©'ÔâÆ-xôBPx´Ò[Z¸¹âPa+²b¯d²-)Ö£‡·&Îô‰ ˜£T¯ð]üüšÈÙ/™rvÀã»Ì{Ÿɉo¶}ª"G=·{â1ö›¬gëÉöå¹øÞÊyd…‘`|‡J ½EY'­ÊIˆVñͲ5‰)±Ê@iªh)SðÛdÄ/]ïodäzƒA¯"¡&×ËÌõ1˜Ì¤Zb5˜3”ÑÒà â`¹û8o^)óÍ0h”QØ>CEÂ,Njæú‹í-à…0i@šÉ¡â¶É³³·h5›-*²É`æûx™W†ÙhQ–Kwdê|Uƒyïï¡mV² ÛZU¤Úhæûèù^cWÛjéö,òÌßMþÿñ©^¤ØΩ¿1,"|S£‘ÄIôVƒEYDrôùÁì¼·Ä’’™Žš6×bÍgpårÞˆ{™ùì%n¹$sa8U« à§}®7ÆDùtöi0ëÍÊ\iÉNMeçðÏã•hk²ÌÕðÅO±Á´À(‰ñG›¾Ag]B²ÓòÂØÜÈå¼Ç\x#¹Úœ fF®ÔŒï(Ìë%y–)¬%Z’o-°€Ó™oMLP)HŽ%ךYTa/È›%Ó`ÍÈJÍÉ€Ç%ù¹Å%É…¡ªu$$ .œ5ó‰x"QDh#Ò|SXs´¤Àšo)„~,Ð?ZcL‹PÆJÓÈé1¯™.I©Ä¢7àf\Š©Æ*2‚ÄZbŽ %Vœ¸‚6‘L]~û:?U’™˜¹ìš4cº>eƒ_̲d’FÒ3Ó³3¬iÖdÂ&ÇèbÖ×j T»IÅáÒÝ-\¯M­u¯ä””‚LͤÜ]„R1Ì·ÞÆ0va‘ÚòÉ*¢7¦2Øçø3¸Q Ž˜ÙœK‰Åj¶*~ëýÖÀ²³?ÕžÁZ‹%Þ9±;ÉFÀTvvcfUq‘¶mnœ,2Sg]¯cù ²ŠÔ\ýF0Ó óJ ²3²u*Þ MJŽKJµ¦äÀ„“9å’¢”œŒ,lɹ¤’l*/¬"¥¤.Ù6—­0é^—h³}óÖ‘—ˆW ñ&^[7ì‰a-Q9Ñ$Š„'“HSšµ¡(m“ÄU”¬Ø´Ã´‘‘:c©‘-—e§Xc•¦Ü‚¢ÒŠÌ”ŠBL˜‰ÖÇSõ$•’ýå}˜U¶ƒv÷ÕZq]Ê¡JÅ€ît0`BEEd@E‰Â=9çÜ3=ÓétšÐ3Ý=91‘8€(ItFŒ¸.bÄ1=W]C¹[jÿï9U3®º®ûÞûÞ÷ýw°v¦»êÞ[7žð;¿ÓâÚânå®s4:X‹|f_:_È6·µ2£;m}Vw}KCk}KMmu­š¡Öë®f Ê¥ÙF°Ô:j`sØœ˜É’ž¶Þ^[çªò@%kR®Ï6–ÕÚZÅ ƒ›Wê-kKìˆnK´ÙgÝP^j³ðN+ÌæSšKYm¸ßLâ0l”‚p¸´Õc&“<ü~ƒQ§KúéPÖä[þµîA9ù(òu‘V÷g’ÞÂo‘í /ŠEªA ¬®rŸ•}ή(9=@0FÐh3N%{4{¹öC~!#ä¥(ë ´2q|ÓòW€ºR9M~wµ³XS}E]…=+åBYNº™ ®º@ „X ¸¢¤Ä\b¡0XàÎL¯)màªX‘µÄ’ç·¤Z¨ððÆUB¥½ÂÉëÈn泺Íâ8C™Ïu·‹ÿ°ÎÃzo9ÿÔ eN‡ƒMSNÑÛù© fóÙkÄ/ U>§C‡Óî´³ÄÛUO‹_PôŸÝ|“¼ä 6|,Y^ƒþÖ9·<ˆ¹‚«Ÿ¼ûËËÕ¿§èå³VÉWñ·ý[º!hª­¶W™¥ïÒ Å…ÙÅbl¿YaÌÍÎÌ.Œgë ={76±ㆨNjêX¬!ÓZ]Ì„x(гd°”kÛŠd½äß0y¼2F>SY¬,TNWÆ)çò’ÎúòzYgbžù¨¸ïý×ñ5™?û» [müµæœëO0çd˜s„/aÃMÓkÍnL Q¾»d d'U&;’D%Ý ¬âºÏ/JVÖÝÇå”IbòïÿRÖ¿NŠözØ^_ÜõËs¦`þ¡ Fõø 2>­t«Y’Èþ̯džj|(fkù‘@ãÔ1â#W¾1ÞX÷à yfÓ+~lÅ÷¸l7ãu 5u ©1ùêÕÔ;ú¤>E©ò¨$Ý,J,t7~H‰‹)Ù!¡%&âà“áž8(‹É…øÛ­|BìåÝ|ƒIsöénÆâžÆiC`çƒÓkÞÿ›!Ó=šé›÷`Igq:2¦ÐC&µ©ìŸ¶ù-ý*EI§´ ßVüðƱ!óÝŠ®†©O+üE ™ø¶/m‡T#N5ò-]Ž•¼‹cwý¨©<1núêˆÿÁÃL¨_Bi=£7àJ)é¥ FN:ñ<Õ¯Ú^+h#w«‘¢*½Ý1òçkF$ %´ 1ZaŽ Ý$š™È 6ꆈ}’=ÖQ\urÅûØLå\=9ÝÞ *ïãh~<0¸ã7±Œ8GŽ‘å ›t˜¿È4H— pÔ˜S•ú¨eNìR©ÃJÙ’5ŠûßóÇ:Bù9}n08‘ {Ú{6‹n¨qÖ8üü?.7mª­ s«ã¥rHw9¬\äOÓRþÜŠzcä`,[¥FæÔdûskó7r‘mMUïÆ¥®QΛ{g”K[£ŸÈbÂb¸Â— ºfÊáeÐR™RŠôKÈg†oFÑxc"-*E_Âý cÉŠFd Æ–¢+}ã.vJЃq º%ÁDçœQЀŽcqJþIÚäûŽI\7ߢ ‰é¾†…¿? }{„GÅb•¿(M)ßâ±´›ñrQPåbN Æ·ZÌ~7"âR„m´«>9bú Ž øóاtêÕæ©h´`:…ð³¹Èd’1QQ¦æ ò›u?ŸIŸú6Ú*–2yÅ·÷ëÓgg8¡ k-5|Ê’U‚Ä*œo§ ™Ò€Å$%Ç?nÚ/½Çw‚Ûq¥ÝÊx•ˆÎ¦bjFi~NW8YfZab\F}“.—Ü,TR—•R\š¹à©ôÁg¶ïµ…«½Ñí ýËž^ýƲÝi™Í™æ3vÕÕö×Ö6nihil©‚ Ô@À^e©. 8j5¶÷ohÍ_³Xz–.N^˜›˜;77Z;ºÅU÷¶ž¼]´ç!tÚ¿’rµ1T¦ÕÇæLEé~kÒŠÇàËÜõ¹ûr»™¼séö€-ÎOÉ0µ¯l”j!à®öWU<5¼ÁUИÙÙ¸"Œ®ëÊgVc¦=3+-yÙ‚Õ7,»?aetÚj›:$Íö-Ž&h‚uî&/{¦¶gëÞ¯´·â\³òA<ù¯2¡©• ü¿TaØNή–îÃC‚Üç{""ö^ܳü™â&Û:^=k‚-îf¦An]úK%½©d.9æeA*¤4¦¬ÉêI?ô:È"Èã÷ƒ| ƒ¯'n¾«‰ {ŸÞïÀÇSW>Óî*‹0³4e𾦄§aëêƒÀj`lka‚r¶ÛŽŽg»ÛáÅ®õ•¬–„7 >ºåþº¨Ž;·9ÙQ§±Uå.›h1ÄAôÛ…swÄ4/‚þʦͭþž@£Ÿ¯"ŸÃgõ•×Ú«Õ756µeµš¤å`š—·$ç¡Ôè9ÀòdƒAèòúÄ* ,݈ÈiŽU1·©ÈµÓª k«‹’$Ågœ©ësö2!ïqÓžåÀLYéÙM9õR5Ôz|>ŸÏtQB`ySTÙ"ˆÉÊ]T¸:úÚ8tÉØÊ>˜ÇQ—~›«ãÅÐæ–§Ö¿ÁÐ ŒI¥±ü…øx[%ÈÁñ>ì^·éUˆ.74ê}vß±ÂÃ`n³®µö%zÍÀró² ï{>zH¾¬ÿ¹%8:µ7¯ÆWjë0ÙãÛ“Û"a•Ü0ϱܾŒ­uê뛟:lãöäy)…ß&%Ê,å%¥–ji¯AØÙ¼`©4uvNœ((¿óØ5†×¼BRÖ!Æ^nr²„€ zxͽsÓ~µ±*x!Ö^Ù.ÊQ2€R¬‡›…?‘h°©OâÏî]»^?þ ¾àb\Ö àRe‡q‹Ç¿W9JÐÃŽ‡£RFmQŸ+7]T¢È¥úÍÞšãîw¸õBWM W¬ÖVD#:~os¬Š¾ý„¡­T‡V8Ö- ¬ž„_?dÈLK1œ£ûù^à Hâsd–Ü?64Rû6Ðâ£áûà;Pú¡cÊ™z–`“(_¾¥ÏÀ¥0 e×ydI]E°¯""&¢âÅÅ–Y*´ì[|8ž6™Æ…à dÖ¨¡k.¬•ÒÔñ—jUpÄÌ¢¥“%Úah[ú>*¶ä¿ŒÔ(2‰ ™ø±u±²]o·ØÍ¶ÒÒΪÌÒöò)Qò©Qò)ÌepT8|PÅ•Müüm¬ñUI,õëáR{ÌêÉKJ Po ZëÄZC TúS”Ùô/’9 yÁÒ6húj_ÝÓòõå[ös-VhØê¬áãê³W–WZõÀÚúÖôF7-—&⛓§sÑzG Ï§ÝSU^_ÞÈïé tô-¦H÷Á’ØeŠ‘ …’6èa3”kž3€ֺܼR— }ô.' ,Eüà¿ð¿dA¾BÞ„—fw+c˜¢?zöØ{ðë§Ÿˆó]„˜Oh$®£;1bâ+žX»¶Ðó ¶Ä ö÷ÈW´]ZGèúaãÚA0Yô$lÂ]‚f&>§à™xƒs#£!§µµ±±µ5§!##77C<á?’„— nÐT¬¿¡Q^Ú©ÜÕ‰-KCñÕ+¹Bâô;=NOV`v!Ì€˜öÔí… ùñ% lÁSóž~xŸ9PÖêèc‹ )‰…©\K%uÆV—Ô˜«K˜pÿ#·ÁRÈ®«IfBEvU6jb–¢rg¡³´ÐWÆdfX»¾·K¬)})}LÈ\“¹ú ÙÛhyk‹·¼5tmQE–'ñtmƒ^è,èNêËlã?­Ìk(«±×Aô6´o8 =%ü~_ieúýÝOôJÂÅ3”´•·3¸&ïÎåâHòÃ3uÅÊ$˜S²Ð²’)OBÚÅßÌö¯nýÆÞ7‘~‚ãˆr?ÂÝôÓÅkyf~ÍWdBY?ÀuÙ\ÖŸ÷Rq«m*o/…  œ¿bÕ¤¼˜rsZyº˜XÁⲸ-ª‘E´#µë;¯üã8®óê66ô7nô˜=Ež¢šeþGÀòÔB-øAGmYwᆂ>–ן×Û™O754„Z[a{,®ñ~QI6Ai-¾àõÅ·/ïÍätÃý‹ÓfÀõåÊ„ &¸RÜIé¶\K1k3¬q¾ð¬³÷9Ö2ûZÇZXË„:xœøþ-3»|ªC>>\å¬)ð¤û¬ë&æÁC°bsÜþÒþ²¦Rç\&|°#0ij²# 2\å›®·ÀݰlcÊsöuΖ\Hd°¸tU|: 5Áü`á½¥±yµvLú>ß»½u´BGBeñ+"ÒS Ì–¬yÄBDœj'« ï˜fœ(UF/´b–ßâ$éum‡íÐ3Âë±Ò“§q€–©ö{³®IåùÇô.*£îL —ÇÏ(ÃÎo‘ì§¿ó§*Ø þ(ÉÉÊãr}öb]È@Ü–( Ïͺ•]VWQ@YLÈGiJþšü›?_UóQå|½›Ëp>~Æó^tñî”VÉÔÛkJ*sy ó l.«ÛÆ~öÞ¯<6ö™rºÞíðà1ÀÝãÁpþ«ËÉUZ6[¾\ïða¼ˆ•beE“Øþ“"†KÞL$áç¸a•\d?ø/XŠRüL“™T ’_i8¹wɉ²‘M@¾‘ÿ‰<3¿>)ŽJS¯^ˆÙ—á­áañQºü+ 8ç’膵ŸƒrÁVè žgé>½5¦4? XViÓA äæzýpa·Pî©OIŒCY ‘¿á#(“ž„_ l@E;·q2&Sÿ¿ÖA'ãkÐe¢F|ïñ JÄúGÙ½È.J¡«(hý|ý‚… ö¬) 5ǯ)&_pä˜|–„ÃðÀîÔmâÏ6åxP2~–üï ’16¡ßÎ1ë$hÏZ“S¡RFÚ;³“µ¨á(»(Xu[­*é~CˆRŠ'î×â²É>G|¼]We¢÷ñ>"ÙW/ø]†P6=ÄËaS‰÷7*¬»Ö¬Ã#â7´í›4t×}Bv•µ›$ouÿ=‚UßMV&ÕB8_E 5¨÷)øý¨ÈÁF „J†Ðs‰–ñ|J„D1ë6!¢O“W°TÌ}~ 'äFÞ¸ŽïÐ(goŦa«?Äâ_³w1á2eô÷޹ţ_¼÷kå öñ‘C‹·<Ü¿gÛc›·rUísyô‹/îd}Æ™ëï¸H>ƒM4>:cûŠ]+ç-[µü^Õ|;¨Ñ\ŒïŠp1Qiº¡ÖOܘ~Œ¬×p§XeqÓkáò‘˜Ñ7ú‡)ÏàWr…¨P•1Qä·ú+ï)g´–é,Š:ôtuóNCñXÊo¹¼Íû÷BüýB‚Áá÷ci:œœg¡¢òÅž¿Kÿ:L$%‹ö_l7n5êcÈüª»ˆÆî÷dÞFè+b|ÿLÓ€TPþ–+‚–:àlðGØ‚“°ýGG€iD)ƒáäjúwHü˜ô¹oTµ)ŪާrÒètø2ÔyPŽ+@m$2¬‡l¤€úÁ÷¨voG¥;l%´8FïS~¾¾A®tw™,¬ ëâ ÜŒåM˜R†d?ÁÝ8ý‘öP%N‹Í# 5YÇÏÀË¥¤!ághCAP6ï–ûø4xIå.×]M.¼ë<|J0G£M‡'÷OIÑzßE%9€Âh“;ŽêÝ¢ßâ+ÓJ–•ϱ8¬®l·u»Í_ ²ï(q̳Y­í³npõ¸¶òM¼Ã¹ÑéóA“ÕÇæyKÜð2RÓzÖ5u6µæuƉÑ9inU7v…p-øfÈ$ISuCÍB€NBj¾Ì_¥òIn*$³nO?‘~@žEF¨Q™ÎçC8<‹8åøK¯¡.zŠßM,ßíÙÔ¡Y?›àô¼6ó†.¿[9w™r {έï•G’¯xâ=–_£Ï³eÚW»Ø nO®Ç|c°;£Ì1–e¬Ç¡¯ßµ©ª¶C™idgç••y‹+Ë=Iõ¥!¨g¡Ö†QèÍ fC [™–—”Ô½N„žöndÿ"áJ N‡±üê.LYÕ¶-ìœßìU‹J~,Ýåp;™pûRs>D³Grv~±éùÇDؔڹª…%6è·6·×A'6z7övµ&_'¦ ŠKìyÀ¢¬O¶HBNõ òIbê¼A_þ¼•³'æ±,£<=ø¬< Þƒ§òûÓšR›“«V»&~z”$È£æ)£”Q+e~Ù#’GõsÕfú–{¾¼‡…õ3•n…WáåÀŽƒñàÜ›àn~–¾´â¹Kžc9úÁÕËaÜQ´hö½¬>Wÿî“ûŽÀóLxÕuZTÔé$™U4Úæ¤þ)h„#3׬{þ)LW7@(`ä¿’ú#,w’Ô¢e+30ˆ\ øÐ³šL“UõŠ| ð®¼}lH™ Yáptf¶åݦoÓl|ów´ãUéA-ª‹"ª#݈)6²ØÄ'e¨Žºy‘ƒ"%·2†jý$ÖÛÌËÝ{ÌG&®'g/“êäÛöƒ¹'›ºøÎÛïè¿ï#i'¬oíXDz›õÙ™IY˜ki‚ÁÛÕÐÛ¬­Þ2_Æ%\3wVÿŒ?ÜúÂÀž”cÊ(IˆLÏHJZÿÚ›mMÝ[ÚæßŒ;þi#“بšW#´ß¾ä»SÿýúÊ’J38d¡£¼ÙÕÒ¶ÅIŒ$Íz×ÔÅ8Èk.ó³Èôª9Ýn7Û¸EßÜÖYÉåh®‚{$hAÒJgzf¬ QÊä·;5iUV°ü„À+íÚ·Õ²eKãpC3Wwú{ªÚ{Ó7Üyã䩊.jëÌdUÇ D$»¨àïäq.alu|†%¬Ñg¥d˜Ïb/‡«5â´¡aYŒ Blƒ|µ^€E1ÙÉé±Kònö°¼ÃÐæëô¬vàh¢r*Ê)£ç˜uu-Ò»]HHÆ:6£À¬S®åàf_„‰mÅ ±±Å ÜŠô_áðX§b‰ÿ:$8Ä MÝÃx¡µ‰ªÖv.oOÇï…Èý¨Ÿ4BÊbxN±Q¯aóˆ§òcRÅ Œ„M"í–"îIÿI’FÜy¿ÐúWg$8“n῱ )‡£êr~´bŠ—ULÃq¼–"¦–Ž%=nÃS4çÒßñÝÏ!kÂY¤aŠäGTÛMÔ–¸ZšG©1†jš‘©êZ¢hä¿EÿjX÷GÜ($¾zÖ幞º†RF#‰Sô% ð S‘ùrÈ„öñðêŸõ_£É§¤pIƵ?G¦ò7ÆJ.Ǧ߿Ý1ÑœQ@îcBû°gÈ„áYߎ­J£äQUác±ãñªËí0už›¸Ï1t5ü…ü6E±ØN’º“Ì*¡§|ÎpnD2n‡’!~Û´Ÿ‹ã%¶’UR¯ÉŸ\"奘ø|——ñ\ÆOùß­”Ó’t¿»Kê&ƒ ¶µ€6CKïr Y±_ûÐn;óó7Ë Zô$â˜Y÷n8äu)Ëø?•=- †2HId¤§ò»Wáv;‡{ªûòJnƒò,ùråJå^þs…2^ýy¼|¯)_ÁîEDÕ.³Nž$O ëvâ¨ð‹2)¬ `U·\Lx‰ÆËø^xÑñ†)éq,eŽ«_5÷Ò%çúÊ¥³ñÏ|ÞË÷”;å;Õ§ð/,$‚ë^¼úbœ”8"u¼u•sºt|:÷ëhÜCŠqBº"¦(±…XSÉIž„mñ’——V:6ÈK³#• ©8¬€ÝïÆ±IÃï±5aŽA:޼ G¼Y—†_xqw’÷…¿?Äï5™·Ž.ø§¼o¿gù¥|¶|ö%_(g+g‡×/.‘ÏF¦¸&)FÅ8a¢bPŒ“>²á}~å‡ì½lY±uùS©ÏÂ<½fËÖ-[:ž‚gá™Ô§¢ø÷¯™‰iöH[µ|yÊýp/ò›Š:Ú›u¡¬@š˜š]T ÑGMü£ì@ªöѯÞ0nÜ´&N¸íÍ¿~qøy#ÎûúS~À‡ÓßšÔ×¼˶[ØÝUú¬¼œü‚Z vü`8˜>#ž ´+â9ø-ÞN{8A—h@þF±îßD£91Zƒ$¼9€;öŸF‚³.ÄF\‡ÏO'Ó%Ä–s1M"x ³cd‹Æ$ô˜Ec)Ðó£q¿#]æ “É1LFp*|“³ä -Žu‚ø¹³ˆlÜ ȧ‚„Pf|—ƒ£ö!YÃÎ$3×%tòŒ uY=A³æþ~`¯Sø¶¸ÈøDÕ>o©ˆÞâ óœäÒ§DkžOqxÔ“ÁP°dOk‡;,Pa[()ŒpÃâãÙ@Î&6mDZ,Fo¸Ð¸î…Á7yåYDžpÉiNÕRU¸@£ ¦êÎ ‡· ÞÏTËnømÊØAð¡ÏÉ9XDýfa‡ Û`[uû¶zOÈY]š³<#ÒšÀÂßïï0ðç4œ_wùŽGá{JàÄ ñ““Y ÅWs‹œ»õø¡èÇÅìá‡È%ýS6©fiÌõnîÑ Ng“‚б€)Û‡L¦4”ÜC+K3µ¸Šõ&÷#—¨s‚Z®¥ßÕâÆ1¼ç÷Þ!„ÆîÄÙ™£æÁg/о…oÂ|?¨(þܯNž¶G¾Šï¦í¬¼Zy—넱àðçzí€ gÎÅæ«, Ø:»¾åÈÚÊ>d¯tº Öø««ª˜°Ýù%€r…ÞT“Þ'®Ž@['3ûõæÂrT¸¬ %ùÔ§Œ•Uî \ÿ:sßuÁêöT²ƒòu>xZ™Æpé›sõæò©©iÀ”K•ôv©%X|{ž’ïA¬ú9âùF´Ü¸Wr™£ûµáJu²áQØjè»ê_øߢʞ8®2¢ÛååÅQ "å¤áúeŒ…AÇÇ‚<êq§Ep¨”EDëIÄ(Â[õ.QXIx/-t“éNH;óÃF÷—M&×òád½ìu¥ëÅ×K~éœãÒÓý‘â1®§Låò^c{CŸx5ä2)£”ÑÊ¥¦¬k¦•`^ûÌ/ mÍímâã†ÃжúÄ|gà[œ/úÙòñpº -[†b7ã~È-`¯·b³âØ`»Ë>œ:b‡ë+ðþ½Ñ l‡/¤àΪA-Ç性0JÔ0œåƒ ÙÓc’Ð†Ì Lzq‹ñy¨/Å$¡ÃIB çÐ&p>å øM& M†òrf(Ç…)J‘Òä–‘ÙÊ‘„{°ûú-“I>í¨ü;¢H=Ö-#ÅFw/ïð'¦¼t‘”aÝÖÔ7•„7Üj}” ˆÛøD †¸ÒÛe2ÂBa¡6“éjåeÙòLi)<›¹FÚ Û›7öm^ûÄÏc²åWV‘mÈ*lÜ/ɉ'੦:Óõ¤Œrœö›`@í¦4 "ñˆDšF«:jƒøÄt\zHBž˜’2eÊf^g‡W7#¬(Ú™‰°Œà>ˆÔ9`«¡*ï3B&Ü« Ÿ\Ô\ùYe™Ûa‡t½­Âá7ÚkŠý¹LYÃwƒÙ6ǦÐíÚæê†nXïìÖ >s|”»^žkT0xÃpÈäåÖSJ³OÚfqùð̸Y7N‰”Eùªõ;s ôZeôkÊUÊEŠ~¢¡\' wÉçs¹ñ¤×åD¡ÎÛëâçëÞv„I÷á´Ú‡‹\ÁÓam0$ Þù¾…U+Êå? ÃG›àX_¸>sMÒº…íK›™°²1½z` 9Ó;¸ÂÎOým°>¾ý^-·Ú&ÛÆÒµñ!S _óáÞìøØŒ4s$A|]jSF?÷ïÂ78ЛɅäŠU,®¤gtÏ·ºXò©æ©ˆÚû úñ¬?³|Å™&PÑxSéT…/°õªîù·Dùr#¼ùoϬë™r›Q¹œ éa]ìÀ |mÏ[ò™¢|/®å„â>¢ºWI/™„á!¾¹üP\ '¬3B¿Æ}G^r~Ÿc2±OäKôÔgÈ÷X¹ÍûS0µGí*9†°hÞêwxÍP˜ÞBî¤R ¨0×±»äQzʉ®Ñ#&­?M«£ü˜ëÃჼÌ”‹T&ödʆaKý"²E¡—eÎa³Û%çâòE–Õ¶G­§éµÞþÈÁn²Á0yŒÇíÐÏPNStÊ„iÊèÒb°ʪh©ÀÄäïíúÚõ½•{ʽ™žb`… ú´³²»œý+ŸÉ£å©û¿ ­ñ ]Ÿ×êÅh“¸w+±†x(­Èõ²:L†ã OH…úÍÛ„CÐÄ@mOU#¡×¬ûÙ“2¬ËFÚ0HÎ3×}EòÍ‹{Ä€RøtzP32!Ðÿ‚ ÀÏ ¤S1ºÈ$- çÝáPÁÿùˆ©ç³þˆJҺȦÛE÷wÖ‘»ÝÏ ÿ°I´¡™* _ÁjÖMWîVÎ:|±)ýúú÷iªÑ)ä#× D„1ð.^H©KÂáJKĆn1™ºåëdþÈý›©“¥¯!ÕvS­ÁSSaÝnÙfÙµ„Ÿ½/ ᩼2U1ú5Åt -©qTÑØáã“X}Œ„J{Å¿$ÛyBfbM ûÐÝÕýj¨ì“¼ø Ðå®öy* ÑV™RA[r‰ï=¼Ù›Í:Ù¨·k ¾Åä²jôÊɸN#M#–8lÞÕ„MŠà;ÝîU/(—€ ®,KþÑM‹ýIoøúûãŽø(’IsÈ­…«6Ö~椼SRÎø‰Œ”J¥RÁì(`›¾¢²¡º¢ª®p]I7°=Ï¿rÈtp¶” ©¥iùL«züâÉ›4ÂÞ¤æ:_E°îVô&•ed¦vKµL¿ãŽþ9oIÛ ¿Mõædf£o4{qàÝ××vöH›À›ãÉt犼¨Ú`ÓÚGúfKBvV ‚ÄcÒ[Þ{¥©u­ÔÁ¬º&´º|}^æX£7ÛKe|qÖ„$ù™ã{¹0S+SÝjºe–$ÜúøÂçÄV®Â4Ô1!¯¼$[,6ØN›™.§v¸ZÚžu‚èrA‹žœY†ìr½$_ö”±¢šë7èsÙÅ~ÃG­ÍbT”WgV×X€Zd©±4ùój3Ý\P^0{Ù¤xƒÙQf•rŒ¼ãÝâVƒÔƒ¡) ‹ós™PR‘S à˜ 9õù\‹‹ç­ªË¯+cB|v6o_á¶#ï÷<'BSi(/”ֲ̛ %ï(r–:-N;˼"_‡Ao·2PVoo†]ðT쇮‚¦œ»Â[YÅõºJ»§œyÊ*Ë0gÔ–ÇÓrY`ŸŸµ¼b“ÍîæP€ ³³ k¡³¿w»¿¦OÜÈYˆ#b-Ëä#’ÑøÞ+u­}##“®/¨®NR»øÖÝ‹¥Vh©á|©1ÓbÍ͇÷0ùL;Úöðîm3ºÁüé.g41ùcR~Ø¡Ìj·3“ä:‹ÓMjL½ÃåðŠ•¡ÑYá„4¦œi¼§;m›¸:×ëÙ‚f£Ðhñõz™çE Í à󂋆K±°BgiÒ#Ã…Ù<àk B}•5SRÎ7ædfò©–XT¿Kü'<=0Þ;ÜG›ªYç!ººj+ßv¯ÀÝr^.&/€Y׳)aS8ü†ö—ƒwøüäU¯Æp^Â5ÕuÐ~…µè¦ãg{QLüÙ¾_ endstream endobj 321 0 obj <> endobj 374 0 obj <>stream xœ‘]KQÇg|©¡ÄJ‘Àl÷é¢0¡‹/CI±%•Pgκ‡fg¦9gÔYw}Ù±|9šâº«î.º+IPÝ„¦ ØEÐ}¡/°£vV)»ìî9çÿüŸßó" e%‚(Š;œpŸ¡Ãzï†èÕ•xu¥ŒyËG·Ë½›«(ee‰ÃUÞ§kÞÇ+Þ‡«ByÑgÅñ«xÐõôtA:([¨š Ó±pˆÂ½¦¦Ðçס! !A¬!h~è~ÜÞ õ­í]ЊtdÉì> +І¤t‚†ÚÙCW1ņNá!ˆ‰ÌMhHAfQhYaLè·d"¨XW4[-âùÐÐ)˜–Áõ0Wx©€A(Q,lRàÄ@Ë£³iH¦E.Á\#È3UC±ÃˆûÿhTÆ:Іh‘Ó‡@ÅÄÔd‡sy)Ó§-Øëýçô°P¿l©"§u‹[9Ÿþ™Z6MÍ9õ§Yù˜¤;¨¬«¼œ@Ûùòÿã(2¡ÈÂäEX¦!KV±"k‚ ”” âŒÈ„R~d¡L8ë o*½©Â·/U| ¯]¯Îf¼­ŒÏ¹‹ÔŸíœ‹³A)6éNDœô^¯nŽ&bLŠDÈJ|kÜ¿;ÆXjRªÞßO¹n-1cjÜ~=<åN‘W£#Ì‘ìô`vu9±¹áû¼—]Í2©:·8ïÆ¢SŽKü‘NÆØ¨4‰æó™t.9œÈùœýé$ËI+ó‰Df-Ú³íÛx¹ì®2)“YÏçc)yÉÿ<Å]óœj'GKµ,ý6õ=½µ´’dR>º‰Ä-Û×Û34<\乓‰ÕìüÚÒ;z{v-K¹á´í«ôv '¡šBÃQshá¸ú×ûãnïÖñ–Lèçnyåáýõ ì»,¿GO² endstream endobj 76 0 obj <> endobj 375 0 obj <>stream xœíWoL[U?çµåÁ&tÏGy™.¾½URXÈ0ÔZ§µu3„Ž÷V'ÿVÆZ%Àè ²UÂÌ`$Æm&F¦S3—¿è'‰2‰.MÐD]qËŒ†óƒ“‚‘}ÐŒWÏ}¯@ÑE ‰úAîé=½÷Üsî9çwnÓ{`# €î{¼¶¼ŒVÀXCK¼¹ÛœoœÀŸZz[A᎑ EÝÚÞq칎Vš>kkn½ùÛô€ý~>#í|ŒÆQ¿7Oôfö³=:ºZšÍ¹ÍóA¼¹·Ûò6DHð=õ­Íñ6s=ÿb÷twM˜s{![7b¡ø-»ÒpçÓséŸ9+“¬hhè4AäsnQÂŽŒD!Ñvî<¡ÀÃŽ„rß(o…™Š‘Û×¾Q GC±0±‰Gù¼åE&w Šàr Nó¦/_æÎ/R¸0ó ÃË8Æåº zÜ·ÃépzœžTdh(2„ɤŸ>ä[†Bà Øv¦©H‚âòxÝ.Ñãä%?–iúEUßR4¾­Võ×´çÔ>•<°ÛÌŽÙ“}>Y{‰wñ‚ä•xÅ%«È‡JÏöôœ- 鿪xB–„ŠôE¡Ò¨fæmøæNRÖwÐVÊÅ%xEc8ÊüÎŽË"N¤^ÒPVõ“è _3íüp)fòêP¤bÞæ*.GÞA~AÓ?)ÂÒÍúT}â›eä[½Ï ŠÁ÷;Ųz#n?ùþŠ|°Ü;B‘Ǫ¾:,ôEúû¹‡4Ÿ÷맱׿˜+‹w€W L%Áiq rtFk' ¹#)‚c¢þ<ÅØGºaÒÍ3¡Üh⟾dàz ‚/úõÜy¼¿Ÿö^ÖÏÒ64¹ªÀÂç¤8¿„7«W.‹AÉD€ªŽ-°Œ/éø2œªK±àâ%$- *–o>ú·šfÁÍbÓµŒmº7cK'Hbžx§Ã+˜Î´™ÉÉÓ\ 3JþHFúǰ1ýšN—Õ“üiÑYw²‚žPÞMj›Ìjfç”gâJåpò«:ûi‚å¤úcúÓsPÝ?#½3›b‡ŒTu›§æ_ù¥²R¿ñV\±ã¶)*Ç;Åf{¤(å'Ssó7!J§‹ÂLFûÄá«j¶”_Ÿ}–ùÿ„·[”:¥2Mçó)|ZCÄgõê,½|COhöÍ+r4 D k¦þNñÂB1Öë¯kÙ{‹f<’—Oy\<1¯mODO28åLÄêÔ3ƒZ0Ñ^¯ ²Œ¶ÿ%ùÿEЇsp ¾$ú9ƒŠˆÊ°[q_Å‹x¿#ºÅmY§uZ§uZ§ÿ7ó–\H7^öÇ|õXµY—‡öÕµoÓ*¡*¸§´½û ¦¶®¾a¸š®i³ Yá ƒ¯ˆ¹ÞtšøVÆin…dµµa±¶VI½ ‚°ªi¤Á^Cºz ÔBÔCì‡04’¤ °wR½Ù«'‡Ý ëÚŽÄw>stwWG«± xlÛîÊéÌ¥W2¯/º++º}“ÿb7%™nú‹´¼âÈ[VÁ€åh=X2òÞ…KOÚ}7ánË4O~ëÜâ7½E9«e鿨Sû¯3×Ú endstream endobj 20 0 obj <> endobj 376 0 obj <>stream xœì}xTÅÚÿY Ã.!¬K,‚ .‚JSjè½Ù ½÷MÙ:[SHvÓ)¤@–Þ;‚  ¨4éšbųx¢ûŸwvÃÅkù¼÷»÷kÏÿññ°ÙsΔwÞò{ËÌ ˜Ž.Œ@ èæì¸Ü?<20Øêøª·íYí¹¶ç]†òi?)²¸‹ îÒñØsÏ·öx˜ÝÝö°›­ö ¦KòðÓ‚‚Q‚÷³ó+±¥ OP-ØJŠõ~Ô®÷ò8ïi+׆†zÝ{ZÈš5ý…SCýƒ½Ç†GzG¯ð÷žåá"õ–’Û!1ÁÞcÃýý½g†H#c–…û“æüüƒ#ü#† ÇMóñî3Î?Ø?|ÙïiQË×úµßíë¹’´ùš¬Ÿhd`H°÷²àÞSÇ’—þÖiûó¯ Ç„û/‹ô_áxî ð÷î³222tØo@SRøæõéëÁþ‘}…3I«Þo é×Aô:˜^ߢ×!ô:”^߆ëÀô:ðïÉ2Õ{Bä22øß|/õ•F®$“=rÙò5+""ãÖøK}¥!Qá¿ú*0úWDÆ>þ§`ÀÊÈÇ¿&?þwȯÿdfò¨ày£CÆ„¾öAøØˆq‘ã£&DOŒY6)v¹OœßäSü§J§L_9#pæªY«g¯™4·³÷°á½_é3¢ïéýú º¾îûÆRöºË›­·ï\e˜˜©ÌÛÌ‹Ì4æ%f:ó23ƒéÍÌd^af1}˜ÙL_fó*3—éÇÌcF3ý™ùÌæ5fó>ó:óó3–ÀŒc2ã™7™ Œ„™È b&1ƒæ-f23„™Â eÔŒ€y–yŽéÄ ¦3ãÍ™+Ìq¦ Ó•qcB˜nÌHæ f”@#À­@'Ð £À$Èd¦ö% 0'™;oÁpÁAd‡a.S]Œ“;Vuü°ã½Ž<ëÆ>ϾƎeº>áÚÏu˜ë×DW‹ëד¨}„®!{guçêΧ…Oˆâ»Ttí×u¾[”Ûz·“n÷»uêö\·¾Ý,Ýwß}R÷´î7{|Òã†û›î³Ý×¹ÑÓ­çž{.êÜ3¹gfϪž;ž4?¹ñéO={¤x”xìñ¸þÌØ)x·íËÝr}i·ËnÛ·bî=>‹'ÿ³5KÈg. þfyoný ·e²ü"ò·nc¶mèÏžb›êá´6•«Ûu5·j³M#àŽrâB¾…_*)t[šz”»xÔ·ª7ÜÎÌ•1vf†Œ¹ÞýSÛÜb¥Ð}“Jèþ©Zè~6}uÚr‹c×&Õàxgýö#ªlyV ²Û¯{Xbìö­Rl·Ûèõg‹ç"œm,5U"·êjÛõj]0Öl±3‹[¥.Ü3YñJ¡›R]Ïí«çp}»à3³å†Ý¾ÕÃlg|$÷ÛÜÛ ñ(¡>Èu9Ëuÿ¶±bõr/¾C[Š8Ãn¿~çÓb·ß`·_†gj•¢XK†äaiR«” ‰ÌOŽp,¡>ell:©Æž:.f±‘LŠ<Át’ÇÚÈ[ c¶ X=iã›æç÷­ä”´3š[ê÷Œí<¡ˆžî/3pa=,؈³Òu*œAˆò=Œ  õŒàŸ¼œ\¿ºd9F½ø×ø.üÈ‘eoßñÚ…w•»ŠôÖm¥º:´‰Û°ñónº5´º‡í…ÚëUîÃm»>#'t2^è>|‚Ð}ëD¡{„2†u·’ù¸GLº[}„î “ ¿-]mëq‚HŠ{ ÆmÛD(ļ(‘#ë ;Ó»¹™|‚•rBw3¹v“rd´LgòwäÖj¼ž>Ù÷uäö"Ñ»þŽX?rm­Ð½$Wè64µÁ沃[Z]#°½NáFÛqˆ¿R*t[Âb;S ¬ÞùŒx–Ð}élòÞòï\¡Ût>ùC{‡§œÍ laíD_*cžÌ#4™z„ãk—.rÓO¹pþ©â0²¦JÇ ¾xM¬ # ²p ˜÷&è¢(P˜8˜Ún•(ÈwpÃ.cH Úe»¶Z[…«q½f›étº""v ‚]ÔŸ:ø´Èé—( ¤ä6¹Áˆª!Ê“0^W3ˆcOªª]A^ÊN2FK®¤ÿm ¬¾2Ï\­C•äu¦#()ô“«™èxÆ©ÁÈŸ¤]±ZÇ÷ÀüÁ6+OU)ÕX…5M6êk3ñ/iÕju ô9í@Ùý,‘daÿ úÕΉœÈí·RôŸà…_`È©Q€O6‰ñ½ÚÙŒÐä 5Ð ^h£Pe Ÿ@?S:Ukë´e¸ oÐTi^§¥t‚ŽØvµÉth•*0Š} ú• .ƒB™œEþZ"¢ù™0]2@Äõ°MÔá/ÛòY]†Qi"ÚØ¨7f!î´­R‡Y·1©Ûm.vúâ7üœ ÷7G.|·c„Ð퇵ÑY°ø=Ü—>cÛ/žGxi>á“AD¨"|r‰ò gsG ùiüq”ÐíÇÔzÛ—õDgÌ…X:c+#¸ábÿ°£˜#ã›àÓ2Æn÷°xZ\%š×a.™-Ä€]1+ùq/xóÈÍ"PÆö˜ÔTÐËZ 5ãAm\žš°@ˆç›[¬œ”s»v #.Ÿß)^@†‰ù´:Û­&NVGàˠȬænšíq´Ðm2ÑUYõÜ¡úÀ `nÃíÙf .[mŸˆ yw^/^DÐÓb¡ÛÒw³†KµÕôÈ<±ùàÂϸ?›Óìþ¡Œ¬ÇÝï1\&·C+t?ÏÄ Ý¿”Å Ý/0£žL áýmÜúp¢“&­d(­Nz,Ú9NÆÿs7³ELì5 ôv‚â<þ#†Õ¾dÜZ¥ËÄtƒwwqéæaÉ&¢Är‘8ÄßÀ›ûsÝñQ¼½rçA””ˆ…JSCð<ùb/àYʹ›[œœøbËabeÌ~‚‹"yC?šÌ…OÏGFøƒ)ƒO/Ë4ÆØ¾(ðÍÓVb͘§¤RÄ °Û×Â÷~ÀÀA­RO~æûñýýùyNr“JtÞJû65…‘ÀÂ3ÁTA‹ 0®oá¡}ðø¸yû.ŸÁŸŸÉv[FØòÒ3Û™ÆVéibë{“c_l>ÒˆK°YŽ×à$ulz ò籿FÆÛþ!d¼‘“°Y Æ2\ˆ†¯ ÷›éà?íw†\”Í! ÇμC8UÐMÆÀ¦§>3`œ©Ò§áÐÔ1ÉËUHÁª´jƒg­šÍË’Gya™ÙïC{ÅÝ%’m·g6·´¥8@E á€;þ&:ò|xânÄš­`lDnòÔÚÈj® žÛéàþ;T8¤R÷A¶î±¯ÐT/v_³”øE‹ê–Æf\ [kDúrv)ޝ߂†sRv«ùÞÞ’œº¦+UÙ ò]¨žµk/X´pÿ9àå{pßÃÃ"Ý6Í8#7~#Y±¯ªòbÜëÁ-¾çžÇ-&nC¢ÐÎô"ºJ$â$¡û¶d"…)B7ïÔFÛÝúÕØ™7€«ÆC—…@È™ÏJÕºÛl©]Åó²Låo6ç3¢{9•ñ>- 30&ö* ÉÐÉ)Ð!´JWn´3/ACW(Â8õbsì߃’úxàk”0lÁêÑø-<³æk¤bU#Ô«ÒçÆ‰_`Î?¸Xüm;a`Î*ñ€0ô:ÚÝ ßö—1ãk‰úƒytƒmsÕ—ê»÷‰iÀÔlµ°v‹Ät’Hr?Ü»é8Fî?,#ºî?¯Ñ¶×IÊÉD•å÷ʘ{îÛìÌO¤]ÁHBM¡dªÐ=;”»AÈìOLû™¦¼˜]kÜOqq=Äî– ÝOù Ý7¬ ÿú|ÙkgRQ·Jî}Ò.]ÄC;-Nº}J\¶ËÄ=d`hS@¿IKɈv¦µÝ„‡owášJIº5Ú~!ÐðgÛnqAá\Ø™Ž3sÖÎ,‡Þ¦lëa>ë~ž›È}&κ!'êU!tß±/ù]þkŽ(\EQ¸<„´ÝÙÑöS¬’;3ܧ…¯Õ¶}âcm›Àqi•&‰ô°¤™q.¡¹Ö†^(Í»6· î}î'òdW`˜gáËnNªPeK_KÞìHq ¶qƹG­7Lé¼ÔÔÒh ϱº¤ÜÔ\G§À¡iW‡L!Î`kbóI72fÑ­2fŸÉdÂr“T³F†Ã°¯ÖO+—ãxPoú´(‰°C‡ß›-qvû¢…‰[uÑ‹)÷VsëYêÎÕ]!•îtè]Fh•īɰ`¼ðß×N#4ÍnW—žžÏ_èŒ_Iµ¨ì›îGh¸²0ä+pš- :ÇøVijV`?öh|›‰Î‡Ÿ…fì@Whú(!­7KÛ%¸ÂYÅi ŽÀ9»X7þ#7þnÓnÀƒ8f2Ǹ_!¦»ŸØýÔ;ÂżEì~% lU¨—û©°â˜JO÷+ ëÖ×TÄ…y‘×ø§Ë8¶•[þ ×c^Ýé~û“mbaI)Rä+-J‡Cˆº–1‹æ¤PõF¡™6,N'Šâ¬•TÝÄ{‘5²|gPpì/q¿ˆÝ¿éOx÷¥´ý³ëm*¹iõ=NçDŸr}ZÜß³µý(n(Š]å…ãñ¾çˆdkF .EØÖäÉu™-Þ·¤aÒƒ'¿æ‰ƒ²‹ñ’·'ŒÁ/#÷ä×?–Þõ¼Œo=t•ù³î{&mPÔ/pûú†OPr⿊´^¹…mc¹g¸¡göbTåjÀFÖ„ôù‹g«çê°§Z­Šg5*¬4`Tíš­Wfxá°yïé;œ{QQ’VxnÓ7§ðgˆWòkĦè#|Ç-#É0¦Œó[ñ>ž…}×á1÷Ô7Õ5½Ýö}«€+ÙéÂù>|Nü*ŸºpÌ“¥Ã›&š†J Ø™çÎdl‘שp#ÞjÜžµÃruÝù¦ÏK6m9{å?r©fÛ¾óu Zuúõ¸ïÍØ›¸9ýÒë·zp]Î7ݪ=·ü–»K³},>!tÿ‰ôä !ÇðaâB÷¶›ä›Vòï-P†|É[ç.|rKw.^Š{ü¥Þ[|’<{ªÝÅ äüv ¸k\¶¸†½ñ£ùÑ8}7 ¯áGíµÜ(ò1ØÝÉ´Î}§Ë±m”ʱœl¿à,WáÂâdâ~B·P’»TJl‹œ¯ÉŽsŒ ×ý®˜j$ÿúVÍï n Ǿ¶0òù²‡¢¶Þß/ÇüÏ?ÏÜ _n·)Ig+È¢~fÛ.¶mºeòil›¸¸ŠŒêß»@ð@±Èñ‰‹R¦#~6a/P‹zà «žôi)ÇTí`ðLj¢¸GU¦ö» Ñ:‚Búžïàå2|ÇQg ÉabA)w‹/¾íšƒ-]ÂÆ­^­SxÏÀò Üö^5)¤j¸Uºvrï_y¬¡´€8QútcŒ1:3¬ŽHfYö†E 3½Bñ Ù¼1È}SüŸò b¶P|†|¾UºŠJÁÇfóDbzàc=Œ—­x‡¨½y®q8=E®Q©R°©uXïy GóYju–€w¾Eò¡D’æÃ?Ê?’¦J&¢›¾6='#'-'£`E¤"fmÐÇ^ÛñæÚ'·_%˜¦q &ô Lí 1`únޤíÛš[VÝ,‘¼—65ŽFñ.!!È}Mbb*i:§gCãékiÓ¤éàS^[ñ¦uGw|±‘[¼““1ëÌOhà¬ë¹„ÁƒÏÀ&÷?ì tÓƒw3·™»Þ”ÃéëzØRoºI\.X¡éV‰Ø‰‚îÃzÞ£È*I„Ø¥D´˜N@¢Ÿ€-:ƒeã` »1¾…ßÃ*‰‚Ðå 0"?ʘØxBO˜ãÓÐÚmŸ–“^›ðÖâÚ-„-àÍnð0Ó؇àfKå'-í&`–~ðéG)éGÌA€ ?Ó­ÕéQ0OPßÂi–ˆ©¢ÆV œ1Y’$8"-â—³«SÿÌHüÀá¢3Ý¡/êŽz˜-ô¿+zˆ†;3"½î”¨Ô›bäîfäþA·_†áE0â®zsÎͦSõG·Šq>.Wä$F`öC!q¥•%õÛG5ò¤E2‚Oa ÷Á`_„]’´z’Y¸4Z%±v{q §ªØ8êߥ‘j•þõ„Ï;ùø&´Ñ*%…P°Ônß-u°Îè:®×Û³1îSîºx&¿‰è1vÇ•¯8Á•;è¿Iü>Ämcsvg6é³F·³X‘¡P—ðo â{£DZíÉMÅqo°i‹ð2U†\m”×j›´[‰{R¡©ÕdšŒ% ÓbƒL½Þ:ˆÙ<\T¤ËÕå¨M2L2©ûx7÷‰)§{Dp¬@üÐ… Õ‡…îW²Div–5pG¹÷jÞ”1⇮B‚ ^jn?ì¤6Øv4¸ë¶Óâ!Bî¹â‡"!¯o[*~îw¼.˜K /uÒ-Nˆv…‡Ôu\kífBŒ\Ž ù‰††*Æ‘)ÉŒvh´{ñv\ªÙéœÑx}¢1ÿjâ²¹Gs÷`¬ËRêÒðü„¥éCâ4)ºTcZ•¾R_‚-X'K‹ÜRòl#ó ͷמȫÉqåÓÖvJɵzô âS²:7 ÏˆŽ¹Û‹=….RiJ—Φ.¦.]Îtéêâ9²ÎLwÆ‹ÅLe–3«˜"¦†ÙÉü,è% ”‚ófu8ÝáºË—\®ã˜ŽË:–uÜǺ±A¬ŒÕ°W]Ÿî$é´ºÓI䉬gtÞ×ùTç³/ û ߎ¹ˆ2» ì:Ü­ Ûˆ'~ìþ\÷WºOéÞêèã~­ç+=?¿$ÖˆO>™ûdÍ“ŸŠzJþTáÓ÷<¶=ûÅó.Ï/}>ìùž}=Ç{ölóºãíê]á}¶×/X^Øþ½Ñ‹¼8ïÅÕ/*_,|éÙ—&¿t«w§Þë^YöÊ‘>¯öIíóSß}#úî~5åÕC¯^î'è×§ßgýÕ¯ øh8kà7’ I¦¤Nòà ¯A3ùŠd´sйA÷ñƒ‡ ^:8xð…·–¼e|kË4¤ç†lòù†>=4shÅÛÃÞÞ÷öOÃDà ö»>ìËw¦½3çeï$¿SñÎñw׿7å½Í#’F\ùÚÈc#/Œzu”yÔƒÑhtŸÑ¡£kGŸ}aŒË˜cî}PøÁ©±#ÇÎ[9îÉq“ÆU;<^8þô„—'$Lt™(šøÒÄC&ê&~2ñÖ¤^>Ý|&úûŸ;ùè”7§ÄNy0U5µzêÕi–iÍÓOÌè8“2³xæñYïÍj˜-š½söå9-sZçv™7^Ö¼–3Ž_¸zaÊÂì…­ m‹Æ.Z°(~ÑÎEw w_Eþƒâž2OyPõ¦ª@-UßÐ4àqÞ£õÔÕŽÓê4ºCºsúŽúÕú ýç†.†á†DC™a¯á[£ÈØßXbÜaüÔxßäkڛ鑓©É¬Êü"«[Öˆ¬’¬–¬+Ù¯fÏËÎNʾœ32'(G¶6nmÖÚk¹(÷ÜÙ¹ ¹»sù¼‘yy§Í‰æ,ÏY2ò_È×å—ç·ä|QðeaA¡­(¹xZñ’bMñw%¸$¿¤¦ÔTÚXz²Ô^Ö§lFYbYvY]ÙçeWË–¿T>­|uyNùþò“åËo—ÿXþKE—Ч*FU\¬ø¾Ò³rBåÍJ~]ïuÃ×ÍXw¿ªcÕUïW-¬âª»V­ö¯6Vïª>T³´&ª&½טk*jNÔ¾_»³öfíOë_Z?u}òúê<ë^®›S×\? ~A}F}CýÁúó lÃó 4(64\lìÔ(n|¾±_ã[ï7Îh\ܨÜ´!wCÃÆÌ»7~ÙôIÓÏÖ¾ÖHkuó¦.›†lòÛ·ûÖvÏó{¦ìY½G·ç£=m{_Ø;v諾ú½M{?ßûpŸ×¾ûÌûÊ÷Ý÷ÓþQûý÷GìO=ðÜ%bÈä¨?pâÀíƒ/œt¨ë¡W >4æÐ”Ck5t8þð®Ã'_;üÃ×#CެÖçXÙñwO:>ëxÈñ“Íù(ý£kÍ4iþ´ù›–{'ZOŽ9)?5ëTîÇo¬üøÜ'W?üiã§'>ýá³YŸ-ù,ù³ãŸÝøì—ÏǾúsóç¶3³ÎŸQ)?³ûÌÅ3?Ÿ}öì+g' <[pöäÙ«g¿?Çž{õÜàs£ÎÍ:çwný¹Sç%ç7žÿî¼ý‚÷…à -¾º`ÿâ™/~Qs],¸Øp©ã¥¥—t—'^¾qeþ•æ«®Ú®¹^{íÚ’k²kG®‹¯O½¾øºæzÎ Ï-7 ­n­3[?l½qËåÖ‚[²[×o»Ü^p;àöÏwÜïHîäÞÙvç“;¶»OÝr·ünë½÷>¸wð˾ôåØ(¼26u6ÉWi"p8á$m—±š(u(ùö½Ôê¤î$×)rjÙ¦Ùf‹´aE«JØå¾ãS—‘–o¹´³plÁô€7gdžš÷zŠþ3¾=¸öž¢<\X¡[‹L2UÆtO>ÎU†ã£U X£QcŒÒòLO Úð(Ô ÊÇy¶¬",gDÿL܉>‘ó¤o/H‹Çoâ2nDÁµœæäö-dÈŸaÎýÜv.¥è¾üÊšÃq 5sqÌ»òB~A´wî+›g•†Ô$m žä¾& !ïCCžÖ¨Â*<5pføË52Cj¦|GQ™©CMDF šÄŸg††QØ¡x v”QØaøì)£-q€'ë ¥º,IC´ 2[—e¬Xßø1nÀ[Ãcû¡”I«æŽ›ŠÞÍò®¯„/”MCx·®Ö“{ǵv‹{•í+ÿ<³Fa$`Eô~tøJ‚WG¸fï¼pÒdDú’m>°{«åL ÇŒØú.öÆo¿2‰6ᆰäI©ó߯oÒ¬f t8À'¢x6Œ÷ˆ`eYza†957ÇàðXUJ÷;zs®˜Cg+¹§K8ÁM³r¬d¯5ÕlÊÙgªQ—ÇVÄ—ÌÇ|/<­Ÿ|•*ÉS†ëqv¡å~t*·‚Ðpê$Ì6_¼Áu$8U4Ü R³¤ª U.W*F¼Ë¿Èåÿ¢¥Îû#”ÚðJv Ô–¿C©";ó"d0Ä„/ÈЀ÷ž0[ð¬ë—:?šï0þ"</¬¯ãF·n?I]`p!žrê'<×Ü­õƒ6À·ÓÀmZÑÀ=ogZ%º\Mv†ñ¥ qË&L5fá€ÄwVð¾ßùfëÏpîWQÁÕà³üS¸=¿r`¬ .WhMƒ4‰¸‘®<ËÏ!ÿÏíÏ÷G¦Œ={{ï27ŒÌU¢ä\6^) Ë=ßu6äÄTc*uaÔÔ¸¹9ªlÍZí† ë3kÉÌáü¥i‹SgO]ƒÂŠØ9›p©6{û†‡É]óiß}¯á¾xä”Ä÷d3 —ïñG¥ ìš„àø¨ÅáKÒWļ|xö·0ú ÷,gÖNÚ³d=š¶…Ý]vioîGH´O«-¸iª©øøÎ!d a÷ú[¥-Œ}eDüR »ý ÈxÜ• Iàôð¾&nêkXu/gw ×aÏîø(Þ¸ŠA\W¸}¼D8ˆ7!çö(ˆëÄÙ'­} ŽU%8ˆ@1 Ä ¢áþ ‰D¢MËT|WsrsKóg§w´ZÎ7q¾/[Ga¾Á»ÇFñƒ«ßãž‚|%ÍZön Èr†N ˜ü+]âÊÄSÔæÓؼ1+ -–›kó+Š=±QcTTF5Ñ«¨¦¡ñÔî†%³=1ïÍ÷ª^ÉOGé‹YM†Q•‰³°I¯ÍD™[YcyvyaņýÜ -˜ë…>¾c 'ÿÔ” ½È”¾ÙØ€‰4w*‘xaøìHªëœ)ä¼{™ËÔáM|1+ºÌ½ÌfæeÊ0âá þ]Ö‘Žpä¤HáÒlÉÏP7c¿ ·¾/ôG \vºá(ê!cg‰ÜùÉ*AêX­šmÔî×nÀM¸IÓðx™€‘†Ñõ ŒRµ¬¿!Á"oBoØšXU‘jmNÂii ¡ˆ?ÙVÀJ'‡¤.S)0uõ¹G¹ñÆUŽ.òi{  ýã]üLºPb ™õ[ €P?ȘB·æfì CÊd9 YES.ç2¹ù䌘¡2&‚(ƒTê¬øø&8¿—Hâßš4£÷]‰L‡B¯Ã#GÀ:m±‚|ø´ºreŽ|Ðê{“8Úo*ß›Ü?*cp‚éLÓCOÒˆäÙ!Z娻VÆÒ¸&íF¢¶òÔW17üuÁU:‹ça±r¾\ÿËgk{`ë°¬Á¨ÚÀj÷êv™öÏÖoæ…˜—`þ}¾·??ß9¸[´îVæ &Ýö°Ç5'Âl4Ðr鉾²©Ù̆zÃÒ O m•ò®äñtš¥ºúŠrëUZ Í_óiYÁ/ៜÏ?‹‡Y`´®Ž:Eºà.´¼….8]zb•¢ÓhUžñ*¹† /^é*rÒ^¤â‹ ‰¥ÿó‚d]Ì–t(Z„¬¤Æ£¥¼4@ãÍWÛ”¬<$)ÅŸÒ]ŽÕJ ‰¶i­D’·ÜU´ý %{+Ž—îEÁF‚ÓÆ,˜6š àI×8(C„ÁAzH€Áˆ1}u ­äq!Ë»‹3pn†F¹‚6 Ë³äâg#;kÊV‰ ©ÃYJ«0bT‚zÖ`5®3ë‹3kÖZ‘ÊÕ•J”Φ…$%­"crÃVNJ4¤9‡è²¯]O㿬±¨ÊÈ6îá,`òÿžþõ›Œ¤LVPãT º‚*×_­™'•ºfT‰ŠÁN#æX3ª;`ä?ɲnrVAº%òò¢yy¤Š–ÖcŠX‚3õíuEW@n:@{ßÁ²!ʵ=[¥Øà¬Ú‚ü¦íät¬ˆóÓù§–ò¡ÎqÜ…!ü vò.e¨{T°©ª[a•ðìL5aaŽÅ—ÎNËVeÄ]Æ!ÖÔP`ªÒµiÚX©Ö±ÁšhÍ#í¡V+Âhá­£rª?€”n`}Òpì=)Ø 6É#zÐÂÁ'ê0ˆ]±zZÂ\òLÅB{÷¨`ES ÑxSëðÍ8Á]"©çÆp=8÷$æ¼pÃÛDEÔ˜X¼YgÍ<=‡mã;SèqFÆðËyh¦Œá–³¦*‹y“ÕÆ0èò•ÙK4dBþx‰ÖW«Rªbô T¯bH©M\K-„£âÍ~M‚—ÊÒ‚Gh^ÔÎw 0ÎÀ§6 Z£b•Ju‚!m›¶QÛD´ü6ÍVÞ /VQ ”랃Åt& „Œc¢Œ„ì̉„Ss@‡“Í-¼úß×Õ—¶Ôÿ<1DÿVjü/"Y0°¾¨ ‰ ÃÖã ™%qB~ëð Jì{@2€ ÇP$ Ãø‘*/GZÔÈ "*Öi«ñ\ºÀ Óƒ.Pê”Z$ײ¡†èœ¸ZÄâòØŒM¦6K—iÌÜØ€¸¡\?vÿ®&«Ñ°Óˆ E*»D#Óøã8ôWµòDd‹@dŸ€~¡•i0žÙØhýó€Àýï ÇôMjƒÆÏã߇jPZñäa‰H´Û/8Œ”УñâÃÿËFña@cÒ÷·ðØo— ,â|]E•׉Á³,=T²WNp] jÆPÈK‰H“¬’ÅvûŸ°‡\i®ËQŸÏt5[ʼ¡7ªW¥ÒÇŒù[$5 7žž 9±®­Òd®PPÐ>_ -`¾¦š¢Êz´*e)b`dúöîuEjXÐbˆ"ðr‡& Jô)Ì€§ :Ú‹s¼´bÖ©›)Þ§½¿¤K|—nø †ã@ýt3”¿ŽjëÆ*cÕ29NÇi…Ñz±MãŸÆ*µšö)c´ÆF©©U•¬Ð†¡mËYy¨»f·Ÿ¥7dèáêöt¬c¬tð•Ã(eU;ö†lÒ–ãrâÏ?V• £f©ˆÑýÔvÐâ+⾄ƒu¼êtœÈ†€\†Ûw<´×4;vA°Ä?8É}ÏfÖ-Ë’åE!N×6™e&®MËÇy8;×P„D¿_=‰S=‰ÿbõdÌbEkÀ4I9L|9¯&néª:¯à PÚË`XŽûˆÖSCým»ŒÚïÓÅ…Odý¢yfªïë„VéRõH¤‰—­PG ÚZ+Ñh;…*ˆOµ’¢Šv—“HX¨*¨ìIѹ‹õ‘ü ÎfÚÂ…±ÅªzÌÁŸr¢ü+NãÜž¥!Ø}FDMøp Ã%hÁäp5ÁHŽ'§„,Ю¤>H4«QêÔD%mNuóq2!ÓøÃFý†[ôê(ϽÔF1±ƒ‰,HôOU0ƒ·ôÛ fpº¿‚™ÀÐ7á»·a÷茊2u‰¾¥þ7¬Ò×­Ò¾û»!¯c´ï"°ÌX]Pp’4§¦ù“Éû;°ÿôäû¶i¤LLYþ›Åo÷2)¤Ô;Ì]üðß”( Ùz‡/ãTZ‡îÙÂ…°pAbN$:ÉfE·pÞ4ÓT«fñNã:=¸¢ö›ñ™M¸^Æ’¤= c¢æöÍÈ稽„p6¡Fµ%c*Š÷atÊ•–«aphJß ž¯åп-…ø;‰IË•ÝZˈ¥÷.¤'Ñwm‰Dîó²ê1Úïº[ ÆC î;bÚË_ .‰d‡¨o¡²"Ñ*G•5äŽZð/ˆTÆ›OqîõÜX´Ÿ«bUù–MzTAVë˜*ìš(åXqâõ6¨ôí»ÕÌí ¹ ̘£Îë=z}ÌñóiÑPõŒfðÛÙ(¾£ÿ ?/Æ+K"«Õ‹ÏÐ ºOK-†êp3^ï,Qí¥714G¸ƒÄ:ççYg˜~šÇóo@¡‚“ZPŠíÁ"ÛÈBES\?¨}ˆVÉc¸~£}o[+õ àîmê’ߣª-i54u†6ɰ­‰uìî²+q–"Ù¹æ–TœŠ©µÌ¢œcAÃl›t˜oàÖeÔJÈM¸Àd²j*5VâMíÒÖiMr/—¯TÛíŸC›€©q¼DèùQÛtVOƒYŽ0›N‡¸$ÛXÊì¡èÞ¸é Úí-V‰¡½ƒ­šJ\‰kµœÌ‘“¹È˜0jþV!‘FiÒd«óUUéUÓÑWü2°Öœ„Øt'Ʋ‘uVƒ Û¬¦¶Z­‘ËÓ2Òÿ?• Zæ;S%Ç 5t †½(åÚ*Z“AÚPÌb=Ö+´(ú>=¤6*àNtë-ËB0!­.uÆ÷7ÍÊÊ4é°T†tt“ŸFê ­|G +ð#U@éÊ)l P·:0Š¢ZE¼jeŒôÎ>m).ÅVM5:Ŭ^cPx.Ó‡ÕÅ6!oâk;Ë’„°Ðm°|È1LªàÀÉl¡Ÿt٦쵹ˆÄ}ÀÖ5®«:¬CY:ƒÞËPL˜w…f•±@í *c1À¼ U©“Þ…î‚ršÿö¡ipÔF7rÀD~ î-Žø7ù1lFºB©Âj¬2(3Ñp`/ÝúÔ¸¤Ê‚1-ûn'²«‡ÅX@±Z¯cuX¾3Ѽ²R^K4 t‹$"æODLÅŠ6r³X‡gÁt§Z‹Ö¦·J3×"âÞf±%5y… zØ?¥7ŠU†`M0æÒ€J©‰Ö)Ñz[N…BKS1Á0t¹¿ÅÉYGIó 5  ©‘îß¹ÀÞ=iV[¬6¬ÐÑ·>D«Rèb dµÝzQLa¥3ðZ<Ý·Ô¶(Ÿ1€W€•¸}+P’@nÂÓˆˆ­ä'•ðéîvOËl1Õ õGJhkÕ˜4Œ隀3 ºl­Ñ`2e#Û2[>똨#Tä¨S£xÊÁZl{ìFž€SptF ñºŠ–`cÎJ}âìÈ1 ËQ•‚ÕŸZ·û4q*Â\3±^­–kJ¹<µ…·mdñ'r‘Ó!bòAp5;ì¦ckn©Ô“ûεâqJD¡úd½FÞüËü@~à̼w.{íýtêäelF¤*† (63¬ÃVkå!§{_&“ ìd*MHÅ*œ¦£åm¦*SOq±8LcD¢ß²£ÀTëÁ—¸Á·¼JpiFQ Æ©½Â'zù'ö¸¨ãQ襶ÅlÒäÊÙ71M•@Ú¤¹%¯¡ÜÎ,‚¿|¿¨.£7¥¤Ý“I{à±xžÏÊåH­eEüËv{ºO ÿA0V‰'d„vÄOë ï‚ʼO€y=÷»ãÀ¶wbTS9ÎKt“Ș'T9©™ix…¯U²s›i  t'b/(Htf9@ãNaí;=éûñõ³æ*Å*O,W§«Îtÿ(¨uˆr”“P°®¢¸¢‰Ú²Y2ÆÓÓäKOŸ†ËIu}DÍ üÙDõú: ùéîbƒ—×Þ¼ìÀu i`Ws³sÃ` ‹ œ1nF«3|ð9÷Ê­sWzáÈøÅÁs(#Œ•G(cÿY>y`óc-Í9Ö¿²© Z»ß.ùàâ#)?NƒÙ”šà `ãçù>üÀYæ7¯{íÅ;¬G¯#L4çZJ‡VéGXƒyt·ÎÃr€ˆ%°\_²ê8/ èdÞ£<‹7¢ŠÈ]cøÑcø÷x÷·¬ã/yžÀ69£X+7¦àÓ#Óâ%xM9nÅF\¢ÍB¢ÞU65ud2Áñ°x_®Lø º§[!œe±'—ht©ôßUû,¬]oZl ëéCkH[¥ÜŒ|;3þx‚n™×Ê žšI‹‡oc6û·ÕÓk9cELoêCÑVIc› ¨;+’J{5:êºG]2˜ÁðY(Üpêw2ÆóѹCõ÷©Û2/H$ï{Á,,híç2fÝ~ѧe¹³à´‰îV©!‚3AÅÆj2Ò]œ**T~U—x0¬< ¯Dþ~¾ãì <ñÎc[+ S¬“7&[Ìk3q6)z…1B‹4*ò晋 ò#½Â°êÊÕHUIÜŸ–|2F¢ºùŽØwŽ}‹–­#7ÃÂâ•FV&Î ~{žŠ†q.Ñ_pÏ·6Ý÷ÄÍ ëfç/­Ã;q±¹<» ?µ<£ £kÍGï{‰&'Ÿ:%íôÎÓ¹Z<·”Î'º%¬4ª²²´´²2ª4Ì3,**ÌKô'Á"Øb4È™¥méyŠþdÏSŬ´¦™¢ßïþbMspLêÖ2?ù«Zf‘ó „Whe¬ïË”ðÛáóWÆûhkÖþe–âu"j³í‡ n#ŽÝàÀ¸8òÖv»Ån?»œž­Ïý‘F [¥«7&lõ⺓‡mwÀ\€\|Oçò—7Lâm4̵ðøKî-6KŸé„‰'–¸š8“ÎݘV¸z-íÐ_O Â'П·Ù2¦bÍ&\j×ÌÈReÅGÇÂNÄ/)á)²éNMH y7ä@rSR•sŸ„E?@Û®f˪l„ {·³»¶®+,&.2‰8˜æõEµUQ™¡^«ñÿ1“±[­6N iŽNˆÆè41ÝI%SüÏ™ïßÝ¢Ú§mKl5¥v °!]¼pÂ@”á_£vü-˜©tõ\&ÉeŽ"3¬ŠJÁéXiÂD‡e,ÙVX¾#;Lã/-£z+=Hc#¢Sá³ç8ö`Ýz\ŒM8§h"2Ö GÄ·ýŒŽ{4¹E½È¿²­Ö±Ùx {…5Õ®ÇE8š—i‚Ó× ü@VDQ*Q\û3´Ubp ‘·˜ñ| ºþ¢:;ØŒ#üCBã `8x Ù„°)”xˆP2f=‘J‚jvpcY‘©ÌPKú>T¾¿gM™>ZŸ¯-Äyøã ‚<Oœ3mAJÎxcgÇö„G§ €–æÏ…ûï÷>ÏÅK£ßà¤ùÏ5»/ú û:ÿNwЄʢ?_°a¬èøÅŽíá Ø®ˆqnÝlâz?ð¬ÁK«gèn{ûuê3À:¶Òu€¥»@ƒWé:mwZì5 ÚdÌÌ¥4IHìÜyÂú(x鯼DsòxçîI4uH=}œ›C™çAgQ[>:íýK ÝXM¤ëtÜM¾?üõ»xŠœAwÌt†—= ½rqAjÎjì±oº?JžÆÎ…¬¤)wÇ'Âͺó¿—V—V• î °”Õ 86H¡Qhtò×Ç©!Q«guaƬz´•óa- ´¼"ž¢02ÎqT¾‡ÁŒè®¦~0ÆÁ>-û[Öħñå–Wð<, M Ð!+¸¨yÈ|¨~ðÑçð¥êÕæ†Có¢«Q ·­È¯.܈Oâœ÷ñâÀ¹~udÿg^xGèö7> *N-ĸ¡¸J0+pAº>ZQRI¼õ¬Âüƹ['š3iŠö+]Úì‹Dû²Váh<Ë/v é!ɨ*U•%Õá`œeK·KO)‘hÎïa”ñ¾‚uð´ý²ÙaÉh‰lÇâ€ÂT–õ'4iÙD7óSåe˜Rðâ¹q© A§êœÆ—zè=aÉ;Q`F€Ü.ÿ+Ìæ³+eY¨ÎÙÆ:y¤µÀ">O¸‡¬u:YkàÙ²„H€”à©ÿ€/t¾©þ(˜ïÀŽâ{,x>ŽÃ)9xÎוd®C[¸!lÖú¼MD›ÉÍAx!ž¸xš>Í”nÆ•5uÅ9˜¸­ œ‚pš<*# ùòï°aª(2áë#ð9¼ûØ'ß#½Z¶‚M[NQHæï¢ ¬zìd¢'/I¥\›t;eˆû%êê¡áaYi·§µ<@éà4’"g€¼j]™û´À¾°Î”Y+§¦›zTV ÚÌC¶Ìñ'5vÔMò 'Î@pZH_ÀîH¿õh•–úÊ~A*Ý9t¢ßÜèŠÁE OzBK¯Á§whòj4Õpã¸Aæ%Zrõ¢dÑBÏQèa)²ÛÏθæÌ€:£D·ˆ‹u0(΄‚‹ÓÔ2Ý(4§A'xç :}MõЧp‹&M›€FçàÒLÓWpùdÿæcI;nü‚Ò„*4¢ÑF ™¦¨ò§Ä/ÃwÃ`nC½.…™¿,6‰øo&­ã„‹IÎà aTôø¬Ý AJ'érù´¤Ò Ö£ä y#·¸‚hô¼ãe´í÷iK=½wÿÛi»Äo¶J¥þ„¦ÀDß@ûÄ~ 4ýØé»VGÀÑ X)NF€ÿ :*èj4q¤ ‚·~„Aô¦ùy˜c/z¸Owh”îÉ·?úÔ&cÒ‰N„FŠá‹=f /¢™ä ž dL È:ÂÛÌ"w„ö_ö°üÛE â“öà‰Î4á-•f;ª¢a¬…p)ƒK4œ‡Ba/=WÎQ5Ù&‘dÈ'Ó¥Ò ©ºTŒ¢¢ÂRʼêIŸOÃl`Q˜~0›÷šát•`Â~b@» Ò.é­‹UâGw'ÔC‰{Qí^GJÓáŒbgÉh8lUrº §aÇ8ð;¤šÍ >ÃudA$ŽÃŸàk€ƒ¢Ûè0i²T™ê,M醊ü\€×É×ÇP”X—Z…·àºŠãL:P^±ÑؽOK öŸ¬¡5n-ޤ©ŒixƒüûŒ|2<ŸBÁ…‰|Ð*­¨).ÉÉG¢ðà¨5Qù ¥å5¥ëKò£¼à›ÕÑ䛊êÒÚ’„ò 7€ëÁ¹“ë¾׃@þsçáß7È_=¹ä /®#ß‘÷"ÿ±ä_OÞ›ïȱœ'|OþóöžÃEÆ¥Æâpœ–‹ó!Ǥ5¢¬ÚÊÂ+¥HT€Krsr"ŸUªj™‹BmÈöÂÙ:³±|Ί ùÚ<‚ŠŽø™¡‚iâª4?¬Ö@BF–•AÀÎÉÓe!­ë0ü¯Õh‘¾Öi Zå+ü‰¬IV& é‰ìäßÔe¹FŽxUyL=®ÁEÙM5H¤Ñ` i2>;®” !eéóudQtÙºl~†Y‘ƒ-؇MÀgùÆ’LĽ{|â6¾×6)-#ƒX»tƒ*‹Ìu©« ßê¥!(;šÝ\ÐX¸eÝºðšØ†8TR®YZÝ‚ÿ¥Ýî(Ê¡Ö<—ª{3 a¿`)T²·…MCe (õ³ªË·TÊÏÍ-ÄÊv£W‚&“ÈUƤ”âí`M<Ì5`ÑEô€ 1†wd‚e?¥F‘Ñ=9…À©çÿ̽(¢ÿ›QˆHÖÉNÛÒ•OKm!d oznGµsU4{Li/©„m[ÜRn;kPkÒÔ)h_ÆŠ¸s®fG*4R¡Ë§@*´»k4NÉ2®C»¸,â‘ÖáÌmÒ¬&ÏR¬Ó³ºý6S}f] ¤ÓèÔžÑ ŒJµ¥±)!²„@Œúâ&nk(Ë/!«xÏõSlšŸ5UYí&ýã~ÄâQ˜i YŒªÕl‘¦ )!ñ_¶ÉØ5KÒÓ¥*¥få%Ô+ˆtƒÒ“+P§ÖV4"bp#°??‹æ‚ýÚëß•ôY5‹oêê!\ÒƒÒÍOGÑà !ÀÚ{ŽˆN‹W : ësfsMVeÐ,^ŠyÒÁÞV‰|=dBÞÕAOMl•îw¢ƒ[Ò…_X%^i´²ŠlHkjäL’knaáo8éDiÌn~ ´Éxô)VÉÿÞÃÎLh•òíL-¤^ ñÓR&9H¾Ýn¤[[„ûQDmHù}U„@yÂ^0¸€p./1Th¡VD‹ó£ˆ]ˆVD ÑýðT´ó©bcµz\’h§Âcáÿ÷k\Eÿ Š\ÿ•’è±RIûz`Ó*³…Œü4ˆÞX´= ‰Ïʘ÷þjÕì6貫öðî ôþœbé& pƒURN“­Y8ž±™žigÃ"ƒïüû«ZÛ?(ê=’¸Çqp2ÓÚv’»Ð*uñPÈ>\*ÓMZû‰I²ÿp~%ÄÔ‰1“€v  µR¤ÚôôúÊJé¡\·¬ohO³¸di×üGKóÍÜž‚å&þï*zô1 ÚëwskYSUaý&}¾6K«ËDúBŽ pÖ"&j#´)X‘¦ÉPg”9êõ?ù4χêÂeü3ü`¼”DU/ß—÷qn3:È5±Æªµ•ÙY:£N—£5i²Óq„&žîòƒJ^µZeWJ#^¯ZŸœ±Mâ/°~üRN¼ì À†’èÊÊ’’ÊÊè’°°èh(˜ÒR“¨Uà@2Ÿ›¥M,G´.ƒ¨ñ…D¹  ˆ«5 Ѥ ÌŒ©0iÔq̤ܟ©Ê¦+ðiáE½€å¢e¹|«T ØöMÄ¿€±WX—j D˜GC©=,œ€ ïZ$\P ™³–Â;¬ 5p v„ç»OÛlYl·ìÓ²¢•~ˆr%‘áöK±¯£q ;Óß*Ùhgž±J h €pl/s0yö)‚ÔHO7<ÌVš¼ßL´–Ù²ƒh’’芊’’ŠŠè’pÏðèèðÿ°ŠHô¯*#¢–w1=%Vºï$4z¿³D²\ÉðhEwãb vûI³EJc ‹‘hÝ•C'N¯µ"Ã1ŸM Ò™ §@2L3C 3e~ÒâÔ8$ ™¿"VŠçàèr\‡©Í´3Å0PwÅ·`ðBá(eDº¿Ý®¤Åz“am[©Œ%êbÖ¶€[ø>VÕ´ ‰,áë}[q >fÝ´%å°+VÄÌÆ“±ßN|èŠ Ev&‹‰(–@§=hä,,rcྗð <=|éub„>rÙ•Ðe h!ˆÇÙ÷ù´$f%–;ëÍž”Ñ3@鯏ÿ èË4#ä Îã`Ü€ è>Ý^tŠ0‚×iàCæ8öüÛÃ|Z؃Û‚îzM¸À>æ-©ôÿ~Eµ˜–¼ý`ê)|ByiÁ^ÿn-…þ^M=®J@“xŠþksÄ¿­+ùWä†ÿø×s~·~Æ‘Áú­Æ–>®±eª±ÍTczLcK©Æ¶ü¡Æ6ýgIi°ñÿ‚´´Sýì¯Ä~—pøôtk:ÍŠ-Ãüpü?ó]ð§§± ¹Î¶j: ½²JêB‰òÁ¼-•’©»{˜‰Þxz‡C7œ§†þãÙoLž§ü +Eñ>0’'À%f8¼>ÁÃ¨Š Ó_ƧÅqø_¢”ò}íP„ÿ-¨Ô§ÛÃ[Ds²J(Ü1SõQ‚(® þ£‚8Üá68>ÁIÑ4ñ?%K+r¤i‘ò´ž¿ÍÓ"Q†Ê˜ëÕÎåy°J éŽÓ\:+LМEåÕ®@îo)΢æ<Æ êY¤C>èC|vcÁç(Ô5I:;bFýÕ‡ ^!2×K.b»FÞa),}‹¨Éæ–ùã#ø³]TÏ]%vK*Íei¡Ñt¢…eÌê¹x6éð ³îÕ߇Dñ£qu:âúpº=pœ ÄyÞ £™µ(ØXA¤OÆ”R_¦Òy…üH)œ®Mqb …¡ÿ{EÂèϪ„ÿ:Ðßj‹ëÆzëú­Õ(µ˜]– ]R\P€bbØšª Âò»]‰àJ¶Ðâa&xïÕÖ€&Dý›<–þ C(¨¢í§}Zü©×ÔêÀ\˜J5Ä }Z’‰NyÖç„?UžK€ºÒEHô~ý ÔÌoý Dï¿ú׿Dÿâi¢ìi¸ö¾OKŸç\ÿ¨MÔ­éÖØ-™nùФ›ç¤4—†hò8žÌp‘dêS£IûFäø˜Û¼ÁŸ²È?!¤è凜´B|Ëà Á so‡‚¿9(ä«¢5’jšŒTR­C÷ó ^õ°DÀ¾¦fý ˆ4øÁsØÈi`-›–ÖÐw"Zñ¼—µžNy:‡MX4á•O}ãpišËýhì«Å™Î„c185i„ž1[ÖS{“K3oà"67gS@dX¡p8òŽ2‹»ðþ]عµ…14ÙEC5äÀ/º·¤‰éO´DôÇ¿ZòLj*öDÿ›~®=†Åþ¤\ú`"=nÍñË Žs™‘‡å Þº¢[í;Ș| ÷RÓÐâ{rýÔÄi€õ2ß‹µÎPovìŸLpnú§åüC}ûý*Îm´çÂôôÁfgUH 2 j›BHð¼5nƒ–ˆê\ƒ“±,K‘#Ï“ƒ'HO" ìó•UêÜDÛ¯½ÔÜ7¯Í¸>s[ÃÎ d}`tËðs0QV€ýÇÅ”D¶Jyý?ò«2Ûè*A‘ô3„m;±™9Î0!ÝîÚ•îÑF·Ñº[s‹Î=Ã÷dëgdÇ­Ç;pcUÙÖŒ¬ “ '„G$ÊpÖ­­C}¸‘{ö³;våþ^½ótÿ‰“ЂS­6 ¦›“£Á›ê=Oý»øëú—ü‹Ÿöü{噄Ӕòt4„ïÄj44ú-7*LbÖ굈s½ÊfgrI‡…ñ¹I06’¿rp~š%‚8:éÊŒtô&ï ïB6TnRizZ¯£pfLáÇw@€Ri4NÁ´IE ]È@í9V ïÅÒ“Ê4Ž]¡T%“Ï¿ŒFà hT‡)ÂÓ‘¹©¤R®TÍIÞ4Qʤ‰™ OØ,õIŽz9ºÿ²l_77ƒ¿/ H&}–—´7í¾tôöxŸ®­„zLÆJKÑ"ô›l•p]Y£‘Zn“ÖˆDÿØ/ù4ÿÞ/i~ï—‰Dÿ†ßˆ|ÜAÅÿâ_†ý…Ÿ†ýOùU$ áŸý*Ìö?ý«H¢?,þó"ßößÿ¿ÝþŸÙn~o»½ç_ ôú4·z©.…7 *Ñþ‘”¶O3Mi;Ö©¹%‘þŽÓÿÿY'ÙýÏ:‰ã£Â›¢ë½h#vn9ìô§?CêKÏŒ !¸d‘zÁ¥šŒç0·™-ã\7´lÃô»­Z%ÃŽ`T•WTÙ°´a–×t¼0xõ츠Øe±o§¯ ÒH•²tm†)5R׌-tœ¦é(Øã!D7ùÂDp²J?2ÙcR)¿•ÐiC:Û@õ9|¢Qñï£éo1~I¬ZVäk•„=Û+~!æÕ]¿ªœ<Û‹`ö$•,yòœ7ù~xNÊ"Xޤ̈́­¥ú\[Ð)ßÏùyž#ðn1+2–›3¡¬åyדù&yay‘÷gˆø˜i•8n@™ð›NësRã½ €K#GÞmVOÜÕpW…R¥ðRB ­uà\Ô´,çªýúbé$²½æºü•~¯õ¯âñ©¹'‘¨eï'»î`ŽÁ-1ÿ4^¥\™&U%©R”2Ô¦pUǨ‰¯yáÑ~Ü0ÌÍÆÜK܋۸¹™Õ†Z\¹žpø1˜ï€'JûB"C™®„LôbЉ…ÛþwïÞV•ô;ÀUˆÐ[¶ØôÚ‡…]z‡àBzoŽ[Ü»%YVuÉ’%˽—ÄIìô !À&ÔÐYªX`iËÍ»7‹ÿgæJ¶Byßw÷û¾ç¿<ëDZ®Î=gΜigæ7OÙºûª¹‡g•Áû zÒ¸œ-.5æÑ-¾ J|%&¦¬±Ôh¡‚™&êS—i5 ‚ ›Ê•Ø´Ä¿¤@š*]“"-0æ›ó¹l’¦Š¦ˆ×pBÍñJñ¢õl$Ƽ}»tUd›2 ék¥.”&H ¸å>_hµµ9;6ˆIâ™üoÐÇÛø¯ïzxzªô°tZlÆôñœ8å¼vé4ñlññ7ââÔX%ôU äõ<ý=þÇí^k5·ÅÖ«ÚPU•êq Üðb ª.í0ùÍ>=×0[,U©+MN²r[>VWç:¹E/Ýr­/§WÂ!ñì®Yv‰ë¸f Õ«Ç »ëº=;mø*/¬+oKç¯Ê+1æ“…g•Wݬ\6—Ýa„R³Ö˜›§U™™EwY’ïµB¬ÙÖC\À·+z•Ü#ãµØ|i¯P$”È5Ìm°Ö4ævæwê07ºËÉÿãŠîiTt8vر p­%%qÚÏŽ=SúDàÓ,DF™"NL{o,–l†l(+Ó˜ M+ `K¥Bù\éLéÂdHƒªçŸ ½ÃÕÌ¶Š·s÷t»ê¡E_“ÂÕÕŒE©‹Yc©ÐÕªp´ÚÄé[iRU¥±eÒ½‚Ò¨Ö¯‚"X*|ž†ç·¼)ž^ú˜n:Æžœuܥش¡ïYV\+d'ª Ê0×Î>¨v´¹{ØóâFá)gkìfëÕ­±+Ë2‹â”y°6Tà`³¥y\û·mûèUn†Û@òIß A»já |´ƒÞj‹ÊX¢¾F:EšÝÒºówV6ær€¥‚:›Bæî™âïÓ^qˆ×‰§·ˆqöZ[-„àã…‡¥š™˜ÍUv ¾:^æÖ9‹c•â”ÿŠ[ ÒUÿŠ¢(”ÿf(ŠãGÞ”ÿ¦ÐÛÏÀé)£ðô¸€EyëFˆÕÐw¤ZQêE1û ÍD¦ÿ…68óᘊַ@VãDÄ@œ†Ñ$ÊÚÎ@E´Šd©ÑT 1 óëŸ+n„CGÓ`Ã&ŽŒóŠUئðçÁÔ'¡#CÅÇ#Ÿ‘WO®¬<4{(“ëeå:|_Ì)dcRÝÖJáÌ# ‰?)çC7ÐT·«Á}%W!'b¼‘hû4ж'EÛûã>Úž0HÑöR·PP .Ë€dÈÃhîã„.?s*.ª¥¸gSŽÒ5ø·eHñB*»ÁÖýj :ö?Cª#˯N°ÂŠœƒ3(Pƒ{ò&~÷„ÁLÄVÂë«ü=s6g>lúš:·±±ZJH¦+%)Ñb`ü%¼®¡â¼¿ ÷òn!¬ ÒÕ´f.æâ%íD]   mäÛ¸)©Ë¡qÞ¯Îĸ0™V‘ˆ8]òÌÈï)ƒ«˜†¯¾œò©ø8œqeµYuaç‡ö¿ºó '8>NP “Â^Q ‘e…c+*²b îç**s)ňn‹¿¦¾aŸ' 1¯Z9ÝÎ:xÚéî/F-ò’‰DÙiøÏ¨8ÿùþöþíÎ$9PY_Õ¬k,ua€F¾µ G—ÛŽ ¥S®R ÷âã¹…qâHLN®xr0n0õ°41Véò»¼q`ÏþTÐ5«U\µfsio´m&vøFÁf±[l¨w 6£ÝÄÞ¼I°š1sœy½^wØ’D…`òêìåœXEƒBèº ü™á ÊõC>%ĽÃ-éuTì£g„<#aìcB `&ׂaŠH)ä› À„C+a]XùšŸO1Úr”"ÄÿÅ?ª xÓ{xÛÈ%ê`]ú›øx‹li½ÃÀß;ƒ¨“è½Á¨÷*ùYqÊ2F·Q´#&~½7ÉF÷öv&×R^"P4Ò«Cå£pËšÂ;X›¢vãÍ{` äC 3uN´º¨Š ?ÿÉ©ù½&ưQ Ï¿ÇåøäÀîûàQN¯-“ƒ‹øVkbndä¼T ˆÙàó8¿kbzöÂã@µ^ID†yÿÃÈSfd§–'s_#³¹°¿*hl€fh´·ºÛƒÏwl®oܼc‹½Øvè,®Y=ŠH΄Ÿê-N½rxm À‚•êµI%©qù ³æxYY‰Ð¬ 鹟øüõ{z²ƒkã´ µTaBÊ…š˜=#17ñM”> ÿ¯Ž­ßê¯ÉGF®ïWP:Ù·ƒC* zWßèè´WÉð¤X)5fHùdUGq©‘¯q÷NG¦£g(œ4L¡Ÿ·(ëŽ{ºiœ55÷r­ÄµÊÁÊ‘yÔf—RŒivzE¥N“‹*)é¥Ð¤Ñ\NzÕWÈ(§ã&|CQB½W#?‚½„9Ä(AŒt”€µŒCáî˜ß Ü!báð•éS4Ø'#ìqà¥Û×Ö«s=V¬ÛÓ¾°ncO è]MÅkâ8™5¦ŠŠé+nã>ÑZ_Z?S«…îå݃ܤ¿ž<ìÛÍ”}z\ô·€Ñ.iBÜët»»™²z ¥³©©¶¶ÕÛ½Ð\(pUÙª  Ӹʊ¸a´ìFoeµÁ ÐVëî`Ê©+ó³`1,Û[“«-ôr{„›"̹“+eBYròŸ›Á‘€éQŠó¢aB$À¥M-Pé¤ QT(ïîâ„!ä›@Á͇“ N !ŸL¹ÈÜçôñ‡æ '‰Wpå:œ$]y̳îÑg'ÊÏõÇ‹KR’T ëP´ô$Yà 9ر³ç’ÅR\Èôqg/ 3¾””Ü2<“®ÃØä ‘NªEYz2…ª8[´kb¤)þ¯•ƒÇ^ ¹å×Ûª)¯ÌZGÓ°1†éöÑiý@™˜ù$ª,!}a…¸c'?Õ‘vuà2}”ÍHÊæs48$Ëw„fa®–g gjâ57°l>yAhAQQR w3ÆãÛø—°¾Õ¦BsÒqDñý)A ËCJÆèħcC)sN¿FŽ éH(¬d‹% ÆÆú§šM”2obTIŠë”èRaYƒ†b¤kJøö`Aµµ¥ Áu†,|{Д­è"ÑA ÁjFyóÜL¹Ù'*‚ˆEŒò㤄ÁFFV¸ø{þÅóû§5œJS£œ‰B6á?Á CuC’"Ö7[YãÐÏ£²¾û§<ãÏ KEû?ûeÐS‚Ÿ¨ç3žÌ5â{ žÇëß@ë2Ä/à¶]r &ôÄ«™²¨MQùè]ŒÜ¨ÿ%DF§52¤Tÿ]  Hî~¾ßøbrð: ѤdB¸$ÇAºÉEÖ[?ÖY?9)i;á$õŒÄ<˜”¼‡Ñåjˆ/®=fwn6kbæcŽN`vt\Ó˜ÆíÙ1}Oó0‘ ‹Öùh¶ŒBwPøãXÝO¨ç磠»ãZ|àãØtJ([›‚”MsD––­8&ðŠ“FShÏ¡0ØT~Ò°î?bïp‚­YK­µáT&4i­tÅfµs£~ƒe]€Ð÷QnÕ©IIéóÝ\¤r1DÒÜ &=,'y©Ò¬…Q‡«Ñó¹xn…z詤…ÎbT†d¥7HÊò=kr°:ÁÛ¬•'H•ËÈ0RÄLÁ처kûã Edø†³Ì‚R“ù@—d~j<æbè« ÖÒÖµÔ`K¹ÂÜQ[„®¾î~ ô`¹ƒœ&n=N—Nd­~œ”Ì'õä˜L@ã\+ë¨MN9—›ôtƒß?WNÍœl „œ&™$‘’¯41É?ïïQÕ¡E]†º†µ{)÷J¼P Žümô9Lƒ}?ßOLœé›h™ýòÓläGîžñ‘«ð·9± ?'„/f“þ[³Ct1+×ðüÒeðÐ1—ÁXõƒ¡’ Ç•pý)‡J¸»5éG!šŸ •D…hŽ • …C%h~~=9@uïÉT÷>HuïÉ£uïIQuïSeÝ{¸ö:ºî½b„êÞ“+eÓõŸÜ}¤lù¼NÀ¨Ý[HKvâOîúa¦nK&Iÿ)‡¿1æ¹I˜+ù§¯‘1-‘,$¥Äy)¹´¼h<ãÊø©šæ#’yHu»H[Ú#ÖüÖ“c‰îçoW=^dVFx[Ž6áË£hNE$ ý%½qY‡‚x·BÜð:‡DÁÙô“S§–,†q7Ä S(ÉÁa~ýÅ7®èbbh ÝçG]L¼M^Íg”N0îÇÇGàÉÁã`qã0e™žÈu#`”Þ?q€“’è'à@@>ÀòáÁtµünÀüŽß’%ËmÆîðOÌþk–ÔG4ü†|0)ú.`œ-òÅÏÙ"ÜøñÈ,FÕ&gpõÕ ­€ÞØ`#I³ÖðOÄ jÌÌÿ*”¿,vwºoÈ[tÈV›–ÌÙ$æ”Q>KÒŸ<|ÓŒ%5“‚óÓ©œ˜²mÞÏÃsðTÃÎþÝý½»>°lµÜ×Ú¤(nNïŸß~/°`fÆ‚y¬¹Lس»38ëac^ 0PâÄzï ]jå*Í¢‚G–%çg”sª>™õ™»™2? Ì_˜Tü¬¼šÒúÒzCt@‹£ÍÙ:\ûÄŽþÖÆ-ë=M¥í YW@ÈÞ·´ë¸¦g/^½25ñÁŠÅº SÀJzCN×ê]EÏáã/tíÙÇ”(Óë4ìÒ%‚Ùd6€…Ð], wÐ q:&*ÅÓ—Óæ´:­6JÎ •0C 4z£†Íç_¶È`&:—ÞC_³;Ø_ù·N›‡è Á"™Q¨`„T<ò'NÂ"ÀSúãäø¸èj†³\<·˜rÿ&¨õEÆÐ@‘ÕˆI?‚­ÒŠ­-²ô™†"¶XZý3°ÀY¥(øL9$ıGeP.Y¦¾[9XxN¹è#ýñ†x†&ÆÀ̹ÝÚÉ}½NX]p)—g¸1,ÖYæ½}Bî tšDÑôs(€©·¥%WÚJ;;xD-ØÛj6ìUF¿ » 9ŒL%JBá/°5˜mÒY í?êô•&#ÞÉZ/»êˆKºÔj6›‹dw8|KJèPœÈn`혅p_h“rBsék Êþ3 ww¥" gssŒI-tÙåYf¤~á(=@׸å+ :uZ{­ÍÐ ,þa%:á‹|YÆ29û'ឌŸË×4‡9Œ!¼¿AÓjà u'cRÑYG¦Ûà󣵂Mç4b(ßiwz˜øò‘6Ø·I½ XŽÂFìÜc"LÏOl}›> LOûh#ÈEjYuSBüXì£#ÁÙÕè°²N…“3vœ£^PšA:Ó¤çÂf H‹ùèep±]ÌX$`ÏÊØ.E{HŸFJˆ§ÎA‘×Ëé)¿îåï)”®^·›¢EÑâÒªã¸C¬·è˜²ÀR¨W•%gjVië““¥»¥É©ìiñÓ±,8ìÔÃÂ=ÚkMɉ7Ú!v\!‡bݸ,†Ï…9¾Ùý˜¬Ødkqv0¥£É†@FOåu/¶²tEU”ÇÁiq›k m:xJÌù†,¦4曋0ùáÜ—~¤eùÒä¨õŽ6J²D­Ø:Ö$)[‘VŠ+FÐ*k#|'­­ûºß×äöؼ6ð2ÖVËÝ9Ñ,T€Ú€x3jg°?Kƒ¼‚ò½Äþ¤³f¬t™Æl.oÛ¸èc.`÷¼ð%³$B• Le¬‹í‡Î¶¾gY¾WÈϨÐåA”wÀfŸ¨Üç›q#§°E:…y«„¹WÏ{d%°¥%ĉ±oŠ×|«ô@7W¬Ó^ïöV9Ëâô°Ò`¶6Ç70´mÿž¸AH»e°–úææÞå]IÂÌgÄÁÚº¢žR¦œš‘ý̃¥m‹¾†ðdçÆnVY/¬È^]²‚¿&·k n{ÏK‡±xÔñï.}ö'ž«¨0!Îo‚Ô-äJUÓ‹R™»äÍu‚§ÖÙàjñnòîôï!É‹'’rÀ~À¸}yìá͉Ÿ‰—½'¦‰,\¿¦wƲóÔó€]Ó_(îgÅ*¡aÁ†[ ÚË»«6À'ðöº—ß8x¨ïPí°³ÝÖÊõÕ3ê=kw²Å/>Üu ¤À"óôäŠå™Z5kͼÁ­=!/S¾îÞûY—S€ûӮǙdÛω²Ž»ë|ú"1\ˆO9jtéªòÕQŠIÖ Ø6õ}BºÁ%)SË} qax¿Ï˜¥¤€ÇÄ‹kÅs»|mö~~XöCãÚçø‚‡:]­6Áaä¦i±»q[£FÒ(’aåáµâäÒ§+vÜï·nøºùÙêÎöŽ&¨¿ÎËOXÐXƒ­ÛBÎV°ÉCêÆ%pÌXT<«hvÎÓ×f—Œ¼DQžÉAL¢Æ¤ˆ1ŸÈ•–œÙ×6>•î:KÊêÇRéÂJ¨7PYÑ•ØèœëŽÒã©êõýïGS„´eZ©·1éaňÙÐ,(û(s8œFEi„ M¥k#¡øø&鄺ûß²0šå&`­|–QªòSêš›mQ³tà,»Ú"L85ZôÌT~ôÊ£w|rd†ÀG†G¯ÓÂ×yƒ95 G0¡§G0"À!»¯ó'RV7¾ÃWiÚ­Ez9­œV³¹Ž\yäŽëÞßWËß—u¬¡8 ðµñÝc8‡FàœÃm",)… ŸÞ«÷¸Ë`-””²,fÀÿ27õÃÇðâ«ÏŠ˜Xqä*¡¥ßïßÎßì¶ñWË‹[dI_1]ÞÄ"lªˆ‹ëT´úÍš8ãD‹ÞX¥«`Ò"éËÄ/³¼V·­Úãj¶‰[$QÌðgËÂU3hŽc7¹`ø]ELŽÞ",½3³p-çÛ’Z!'yeN6wöÕàž»Ý Õ¬¦ÜSTš¥KZ½=ë©Ø°«·sÏx×*Ò ép®8¹üiíŽðzëú¯›žõu¶t4€ªunÎâ5F?æž¶„­ÄàœÅËVA<¶¨dVñìÜ;]›]ºÒ€…c?o!]<öÆœc<îøÉtщÇ-Èãr»ìD!‹ì—#yZŒA¥ÔfÝ6Ø uÖµVFdÊ'Öl» ääJü¯(Xâ :¼^¿¯ÆíãR¼&²ßrn•£žû÷Í€ì%É3o—&?tg’Ä1VóUxÙºù…§ÅöÝ2ðÙTDBð§ˆ^üwn¢âX¿Ë(ÕÓÉ˸²‹âA¼K§€i]Ià]U{YH:!xÿËüÄÝ ùëtM=U5ÙThÈÑg³ [óúÓßÀÞèâ…ûzÄ«Yó÷w $4¼Ú¾wwèÍ†Ï¦ì˜ ³ ¥â&`³¥{:̦·7½*žOÁžeVÌY|›4Ør…ªªL³Æ©ó{Q!žAi‚fA¾sÝŠ8/%r X8¿1cx¦MT˜í‚Õn¶›€e*rµ®P¸lk5ûòˆUpop9×!k;Àfã«r4JÍ’Âf,àn«ÕL\ßæ5ªQ(T™µl…”+ܽâac&Ì€”xª­~»Ÿu‹7 ®n‡o3°:Ê*5Ár¡ÕXfÁl³Øcë^#å³ëøH™ÒÁˆ‰ç%pﺅÃ\œ¿\ûζD2 úT]y2_ ù›£x/l䛹‘o‹2òéÊÚ‚1ùí‹Dä+JžOù¦¾O’gœm^æmŠhåʳWã—³ÇsÄW¶ŽØNè6÷8 Äi¡^ñ{­-!öÊŠç¥%±À&q©àêª lŠòLä3Í’˜rÝØ±Éf}ME‘|`ŒLù¡â»Ž™³ã Â\a®¬˜1ïzéXšj.\\¼x˜2]Š&])÷Ã’öª—‘Á²@j2XMzg°éïr/ê&cÅ3wˆÙÛÅŒÄi*\ WÎ6•Í)YR0u…-ï¿ûö0¼ß›*­*Ôæés8½gCA÷Ã0Ì2äšµœ:àúÚ>þɓлæi`~ØO¯cÊ–ÖþVF-„,HLÏ_˜Áf¥ó×®\Í9xyï¼W9ÓÚÔ·…©š…µé‰…)|!yØ=¶·oWÛÑ)lï||<ÛR6ÎáÖì%™éL™-M¸g«£ÖÁ¼=Ëù·æ¬X²ˆùs…æ¦ÍZ9UI ¤ßÜ+±åqkAÕ^νgM^‘ª)¿%î9Oz¯_¼½d¡nœÒ…¿fC4&ÌÅüT_ô"åK +¸8žÓ2`hóÖ}LÓ"äç­HË–Q¾{§xÆxÂ@\l–P±[ç¶pAú{ ›ŠâÀw.“NawBë·‚£ÎÛ…PÚêtXÖåÚ5LÙáya3¼CÔÏçöFsÅ bAy¢z%k1‡úw½¬§¿håÊU³ï‹KRTUV–ëízwÜÓ e_(#ùö„ù³–6tqmÇ…§sœ)‘ú“5•ÂÒœò¤Õ[3à d/SÖw5ôÖijÖÆ-‚ås3—ŒÄ\ ºb÷LC£˜Ýgc×"ìE&üû<å f›ÍY/€KN5R(q$fpˆéðÊëMŒ†P{Í/PaÌí×m¬Ü•Ú8¶»{6·n©ënhªÖ UªîŸwž~TmŽÔeþ‚ËÅŽõ¹<=þŸ`é F°„‘ÿNxa7ƒ%I× JC¾1ŠáÁ ¹Ýðì{úÀ«ŒK}‰™®§€È™2-¯msÞÒï«Þ´¾Í_Ï]ìÆüeq—ßwïlÄôs‡OùU»p\ÿq…´HPU¦b(es6gî•âY_‰g?ž¹mIl"<–1ó1fVüŸŒH²HH24õ+¹ÿµ´ÄXÊ¥¢oÌ}N®ç”½Ð=°¾¶Ù_rÛ£Nã')¿º™r=ø‹`¶×9\„Wë¹7PiÀÄÛP@Så%Ë Å]»ªŸnØ’¶á!éÏÒRš¤—[./Žý¶ö÷ïb.Eâ¶Õ_÷s‡Å™=â5în{7t21öž¯¥nžùØCEnUûºum;bÁiáÒõöº|Omœ~‘tÛ©Fº,VykáŽ8n z¸´öí–w™„¶p­æ˜Ýl³Z¹å]U±¼5ó…ʉ÷] ìÖµoü=N\*ž(æˆ'Æ*{S3 ʼ•ÁæúæÎ6uëRé·à+9ïæu·ü%îeذ©y³+\‰õ‰Ørôdq‚x“xéGËÜ:=kQ¶Ú« Æõ€ƒÁo®±Ö4ÛYŸôØ´yR†4!N¹BÓÁ…IÐ^Ë•¹»[pwÖ»€…Èâ§™£æ}Øœ’6}³aT‰…Í^­\¤fÖ1]ºP•Tððt`óKwî‹{w›˜†ó¾}ÍÒEª,c{Öž™ë™x³˜+(?O<>nHU°íÒ™Âci¹)¥y¦ÖÊMKz1‹Â¬1W¦HH1ÒnõH'À­oq«‰ù'nØò\ÛtCki»ªMݦêVx®ú‰W¸µÐjÃx«8U:éKérª*»Qºz´ÀkB‡[ºîûkÄ)€5eSÄ‹6aMÙwoÞ-]W81iá UdCvmv(«6»6‹»Ð3V&/´ù¹uS3 &‰g½ÿ9ö”þ“´gÉMeÌWË.{mÀÓ©¦²¹d`Lî\¥$ÞfGB™JùÞ€ífG¬_ÑžRG&ûðèÁ^ê¬òA5T{¼A&öá²±çÉ–¦Vþ'ŸÉ¥sé}fÄøn©uFL÷–‚`p2ã¶U÷0åUR|úBÓ¾d1S0,«›)íÕծܮl|:Î#ŸÎ#æÄÔyÄq†"*îró):ÁSîLeû¥/[…«Ê¥So€‰w‹½‚²oóÆ6ðò™¸uN½O3©÷»ZÂù-é>°E°8õ^IÁ”GÏãúþþñ§ÜÈþ^šî‘ÎåäRÜý•xI´Ù:œ|r5¶»õÀ‘$l5€ÿ‰g%|¥…×tÊõ3¥ß±JEÂBo_œg¢³£»±™[ü¡:{-]­Ø Xá)‡eðÈcš‡-:ßgsö”¾Û¥Ð Œù\F»}þ¾Pg ÓÙËMˆ¶²ºÜPž'›»\Öq[³Ò¬7i™´E¡Ï6åCÌjÊ –5•tk¶ÁfnlÚ¾ùÙ†w­öfhdÐWÕUÒž»iiÝÃp5<ú`NSêJÊsÊŠJ‹Õ¥ÅšM‘kÃÕîò­G4×£PÀÖmµöÇ1â°5Bl´75V½ ×™’§‘/þSaksùÑ+ŽÞñ&÷Å©NýG1‡kÍ)ãG ›xݨMldS)æ0Þ¬•cŸÚÖoz?:BO¾tJùX„Þê:rù‘;nçÞ8á8Q áx1~ïhÄ› v5÷:WÃC…¦QÁÞåFÁÎp*Vʽ md'KßÉý‹n_†GþœÂµš˜ãâÚ…1¦K}µ¨­kõáÈNPÃ9¶+S‹YÔS!zÊQo%` þ”Ÿó5Lý  ¯~b°ÈXv…ì¾ÇÙaQ\Ͷ:Àöç*w±#ÍíØmæj+f›±©„R[ó6ëúu-UXEiÑš*˜òðúîaïfW«½‚¬¿°zAV*ôÆ:ù÷VÔÒ‰ÐÃÚÖ¢í–Íæ¶RÈÁ¶ £fiqâ*κV~€?ôÛýòœÍvšB¶sµ»hl ó´å³-z M¡-o@7ž‚™¦iy³3§«R¸¢7Q@EãåÌæšÀÓ‡¶ìêÙèjaœàxZs(½‚ÒW1+3\>3såϘ©튛41 Gb®@cɃ–Ë–ÉÁH‰vÂ&Û³ã€þ :»|'‰CÐÅi?š)þ2DœŽ‘ïÐ:Jµ>Ó'TéÂŒU¿Ô¦*ànB««èylvrrn¥Sª VbÁev˜¹,±páŪîP½O«Š…ÂòÊJmiEY™. -¯Öºšß±yQLùïÍŒKŒbÿ¡Ì(pDœ­Èa§##Ûp/îÁ]Ùw1«ÂÑKʼ™ÊϲñɃCFL®•;RG„Sˆ]O’¹ú_XõËb K«£´©ŸÐ©£öß$EàR%l&§4Pú2BtRûŠ“ñæsõ”ƒ:Z -ÈÇa23V¹‘V8Ý@r8‡à,þF-[þNé øª¯ î ßLŽþ¤„¡Bú‰Q㸠áòíCüôääÙr5 ^À¬ðd¬ÛH–Z 5æw4¹Øí,º»#ÄUüÒ?41 r¶‹Ü»™øû\}ÌTÊG¹ÿ@-5~<É×?L1’öE‰ð:a6áw¿'Ìkr¯£ûÎÇ*£:ÏÇýRçùH8Š\e—ÛÛ¤éB8×ÏÄë·Ïãj&&A·t§`ÅT-ƒQ­Ò¤cãµq×-_pÇðõ±‹^º–ŠDP×WmbWÙ$˜ªªUP Z]Y>“>9º•¯  x^ÞËxÎÖÖòå1÷âYŠ (õÚk¹{jw9ܘȭ·[]Ö0ô5¢mbA'Cñüƒ9ƒ®3hçaÜù ¥}‰D†,¾e†¸ócm™·"LW˜ã˜=L‡O‰^W §C2tÒÁ¤.‰Ð!êæès[ߦ׎¡ƒF±šÓA'ÓÁØ «.9†…H‡Šñ=gkm¢ƒÊät(C:§ƒs”p:Õf¢ÿ0|öe: ;»î¾R:©ûñ¤š¬'D¬JñjÁÏV,/œ ‘ƒ…„ðp†øïÂ!G Œ¸?"„ 4ÿ;BŒg$„âê0!h—Sø.‡æj†vÙéË•ã'“vù éwc"Ë„p !®PÂÄ¢„1Š«ñ„2ÖÊAãñæ"D"¨"„O†ªŽ=cÜ?u22™Ç;BŒ;\&Z£dbî¨LìzÍÙÊÜüd¬Q Ò Å8—Q|¸¯e¡h·:l~YF­!ɇÜH`’|Þ8,úŠÃã’¬µjGEß7aYË5¬ßЄÍIk»B5ǽhôíèÙdBÓÑÓÛ]qÇJ Y¯‚œÌ<.³C]µ$Œ7BÓòÍ\ww·5ïç²ÛÍ…±,»GÉ–B(Œ9ùªeÝ‹R(B=ÿþõû¹ Ôkð@x=v¿Í¯u•€–,°ÒBÁX`hws7lO®»À¥r«›À­W§§oAßí )aá-ÚÕL³°1gkñ”ŒÒYúüÊù¾;ÄXxžîìïfõ²ì•ÅKàQÈÜêüÿô[Yäµ²üo»D.nhÈâëq24¬tjÝñ…Ö„.eL#SFTœ|êáCOÒÝôYeêÕˆš¡³QÎÄ8×&(ß°ˆÛáIqZŽSȼ;qÞt`R‚¢Ê]rÃEnØ ë<¥™q–tÁd3:c›Áa dßæ^çîõmð†û-(VÞÈÊå~‹)|œßÀ˜*8[ļV±šfZV°vûñూ?rÊ¥j¸Ý"„W…ØwnÌåÛ¾±u•»®óøº^·ˆ;`¿8-×)dܽfÞCÑëÚÍ×õ»ðºÒ'š¬F_–Ý.XiY.j#iåË2+ >’‘uUк~Gërðuáq¿&z]¥ŠrPkR*ŠôIúRnÝg uŸ55àÑU­awIó¨^ìŸvtà˜W6=*õ%,ȶ’J Ö úuÖ=mâìi±_hYÒæàHx¨8Ÿa³Ñ¤²ü„ÙHsßÏYÌh­þØb6–š"ŠXkÒrƒ$<æ°£ç5²˜ûF-f“ÕìŒV?ºhõ3f-š›ãL8ÙÜ”M81—Çân«ƒŸT=ª!b6—ý ë>ñØS±šIAüøØüø,jù\­?qõ4ª€•7xãìcÃÚÆ {<ï†O–¶'ûš«Õ½A&,ZѳÉ<–%²¬X6FÌcY"™Ç£œ¬iù±­ÑV´,¸ÞŠ&‹Ÿ[)ˆªsÜü¢qga “ÃUUy»›}Ž%²Ü~l¾iòüÎ6E?Ô”é2Øj)Yz‹Ÿ¡ä±/;~9‘¯üeú &§Bý¨Æá'¦šÍÍšêNÑ)¾¨"³"=ŽkNG¬éQ“j¼myl—ñ˜Û¦èY¾G5.™L?•–E&¼!‹mç"»×¹êÇDúõþé|±ŸÝÏ]œHoFˆ4Î Kî°¶³F÷“5jµFÉVI.o•»"©L½ð¤þ»ÔsvÔýõFƒÿÐ/bÈÊ>Ò»w®1·&,L>ž±9&¢dößvB¹¿Á—÷ëgT–­  ÏØqüh8{§K¦Ü¸ã‰+šód;³Åm¦—D›éQ!4ÓmáˆL¹ÿС¾×þ_°üåcÙnœGõ«Ø.‰|§Q£JkæJ|Œíº;Ð ëšr9“™?‡œ˜c¬ÿ¦ˆõ_¹A]ƒóÇÂ* ‹¶xÔdñÔs‹§àÖéÖ°9RµPþhkÚ~nwïíëÙÎÊê…¼¼ô¼µP –:gc´‘0æZR«ªC gãry-²N,L-­,¤ÜÜ_ŸæÖcÊ~•:quɽqfÐÿ€_ŽWvñ‹ÜÙ5¶ ²§†4{t?ùΦ”Vâν ›nI—®È’.¸;{\jñœÚ×ë>xòÓ·ø‡…—m—&Š¿ñbÏjú{Ó·éâÒ•Æ}õ™Òïâë,ò}´ÙÐd‹õSý¶Hì4¢8QôdcK:Ó1!L;¦Ù‡C˜v”t EúÕâÙðÑE«¤Ä¨t«óáFQØ Î¡Ì'ÂÓÞ$.’NÏ—n çU!ðëi¡¨Îï’º#IUâY|¼Õòx~<ÞÙ4^Xøäþ µÛ\øXÈ«‰•=c ,{ÚÄSË^¹²¡¤ØX¢Oï4ø,†ÖŒ¢« ¯ºý’x˜ECÜ7mü¼goía¦tw—…ò!ÉÍS1{±ë¼5±!pW 5 ³Sý¹ðê¶©â•À†áû6ˆw3åÞñ–sdÈz§‚Ãû0fQ¶D,J5Y”=âÒ/§†Xq±ðÑTÓ•K §¬ºþZ˜ ù› /tí­Ûælqwë3`-”eqÞ5Vyç&ß“˜<î‚ä¾6ñÌNñ·â„÷ûBLÛ Hg&\{yáåéÒ¥¯/ûá‰Þü·nËß âiðÆp»x6SK*³Š–A«¥Ý½ÎÙäö{¹§d*1i~ÒpŽr­#†óO˜¸Õ®Q/#"@þÏ­-1ú2cœ&ŠõF»+lümÄ1Bå˜ÛƒÑ}üåø8òs´d‘K<¥úѸ´=‚qÛøSÊ}¦5è3AX['RÔÒ>µT+1é~r\.-qÜÈ…ÂñïoVD®„Æ®odÙö‡Â—Ð ‹À¨IrÇŽë—:>ÉÊ;va2/*ÏÉdʻÞåþcîÂáœLr!­aw[yÜø­vÜ~ŽÅjÇ¿ÝZeg4Ž‹…IŸc#jƒR­ 9¸Í_xX:‘Š-ܾ±\siÌÀž.^.Xœ&‡Án°1Œ :³Þ„o-Õë5ìfB0,‹Î¥wS¹?‚Nœ,ž&86—Õál, Ñë*µšÑ×)ñ}6þ>;½ÏAïãòßj±¢Ò{©Ñn —êÍ:zi™NWÉþ4Šwa®Š@VÈ/$8]v§ÕéhPÕáv¿Ã*뮲®”UVýûIc\¶CÖxÁ_ų¹ÆËàï*Ôx×ÈO­­Ò˜Êù3†Id3ÛdYvŸ4 ‰2³Õ;øÒ¬ÐñÙ"‰4Ç!‘.z¶c$R‰Jþ,TÌêÍÝ ­°+Ðù"Ë÷Ù…y%PU;Ǚo_‘KPjíÌÝÆEöº@û‹,Ï!hR+Ô9üCƒÿ Û$®ÔÕÿ™\(”ŸéWVÑ3]¹[#Ïä;„ŠãFFžÂ ©k1sé L3ŠÇ¬¨ï†<.»×R=2ò&$ŠYQ˜°sæ’ÆœG™›gcj%INÂU÷„á¤]ò’q¼À eTJê[›+çÅæ+ê µÆ J kddP³dµÿÒÒHá䯉Ô/²ÆŽa/ëÏoIÏÈ,NUÂ/Œ<:ÂàOŒðäæ¿ì tkçÏI¾~vlINpoœr~׬ƒïnO8ôòÒúÕwͺùލ§R®Ÿ]’Ü;þ{øµX¶Òé+Ù-cÀVãýDYu’¢/©Ã>îÈù‰/Dd ™#YbÇb€ˆõÃý&°Zl\–\&X\c²$b‰’ïsë‹Û  :ZœT'n‡Öâú~:³òô™L¹,wWÌUÝžwû£0ªßðï÷ïkþô>ƒçá…]m¢²]œ´¨ÿa¸î¿§ðÚüK7Î|RÒ•˜¿=(2Ì7”@÷eR2AeFð”MQXÊýñã°”æSž4ŠRøíä rèÌû!þÿ?Žâ?±Y¦t>õÔ Pšž~däo|˜ã€+' š˜‘pC¯Ÿfí DåA Ä:+´ÚqД¿Æä;J¹;Bùë”–)7Â<‘ ï©—1²=e>Ÿ4ŒÍèåÿ}‹Ólå4̤Ò>ê>‹ÈÛÁFl|!³äHÌ)”‰¯ú²³ñ·ržhœÂW¾ÇQ÷àP!Ô‡“Ÿ¿MJÂ’x­[çÕ{tîr\Æ÷”ŒÉŽâä`©Ü !æÆþø ì…Œã?‡¹¦ä‚ãÄŒ9ê…ýñ­ü߸º‹)Ûózªƒ¼W‚/޹ÛÃiPÙ†J=ëz[ü-€µftÌ•.q™„Zw“» MÂKü˜R÷?Nd¸”÷Ãë"ðÁ0PÚø7l)нSøÎâ¹ÿ¾?qE?¥DÇ ß€&sƒÜè&ñó~O©ÄpRk¨ÙE§ôQ_îñ eêÆÄâÔòétÜ´ßXº„þ=Nó[üè:œÉfþµ\HW©ÊZì~^ê1n<2R†Yž|Z·ñ'¨nÓVÚåAÌY¦¢Š çìCZò¶þø}rûê˜)ôžK‰(¿Nâür.J¥³0_ýïŠäe7KgÌ”NdëÊÇ¿{O<í•anƃËýKºõjMk0 Í;=®:hçábÎƆŸQù¨Ü‘ç$é»(ô¨'Ë÷œ'KªJ5—sye´¶3h6“¨aõVмq vpEóýÃI}#1'SMú·|ûÍwdäMä„óp°×ðÇÓH–Ç‘D§†bÀž(¹©;Dȫ̧çSy  ðOð(¿EÄÏ!äîȾîæ@ œªVb•ŸR'r¾3 CX%{>ýïðÁsñëÄÔ“ð赕 Ô±<ÜEñ+Úˆ¿S¦÷Aœö»¸gE²¼L áq²ïQ³ejÙ‹¬ŽGù8÷)x*ÎÁ‚iµòÁƆ’ü¯øÑpR7P*øyD!ÎZ¥@¹ÿ 'â‡QdñµfÇÏbŽ*ßP†‡­Ü{2 €óñœŒtãì^ÄÉîÀÏŸ#AœbtÉzø!®²[¡;TȵèAI(æ_øB‚ÞDbÜ…:øRMÌ.êp²Wâ)š˜*dàó¼•*DáÖ¡àye8)V)©€r™SE ØÖɸÎk‡d¤m¹¢ãÛp«çÿœL§NHÒoÊH/$ì0áãš•8 ME&rƒ3„4ÒÛ HšB‹´…ˆ“EüpÒqZB|;šUM6 ýo##žØ@·'ÑA‰ãÆÃ%H– &š©åHS#8/È6¦Å˸¶PF9¤”ö‚F¼¤Sšn>ñ×KŸÉݽ#þEÀ£?ÐJ í:jUW`ó`‘öòªN@ÂR«´wI6QÞý¹œ'íaìÈA+•ç0êY&ž‡-‰05~râp!(–7Ð*®¤³ÔòsÉÿ€)ð¯% ¥JTa>pÀ{¬5NÇ_ãíæh—®rIÅÜÌüyɳ“–¬Ô,fâ*E =Ðíï38tV ¨²ò¹v³¢¶·±}W×`ÿ@oõöÀssë­¸@Ÿc*÷k°í „' j¾ú5îð·øÛWƒCåXŸˆ0×xœ>¡J‹á$ƒÖTáÐ{¬N«›¤"U:N-S{Mf´äÎ=üËÃÔ×gr°œì¹—ÜP‹já¾à;¿tn“Ïä×:Ë Ê´¦r¹5« a7BüGÛü‰¬‘„·UR[·XjZÔn9"O¨ãÛ4ÂÕ•ÅfÌyÃI=Ñ WËíÙP¬ ‰úQ¼Ü—)¥$A¹­rQÂÐĸ=›Œî³×DoïõO=I¸ jH¨šÿ@™áf±Ô_-™åê|<9ÈÄÛˆ9¬:²ü·´ì'aS³˜«©N†¿|úÈÈ:œæfMMàÔ‘‘gpÜXüãk8ø}š˜Øí°¾{Ю—‡kQñLàá,\Ôÿ|spÛIÄSñ7maý4'r ài(ͨÇÞœÁm8¹¸xì8‘G¡–Û€|'° Yâ¥þi(AŸE‘E™_ÀoÞƒÿÄªŠ˜é8Ú#ø#ßõ䥿aaÍTüö$™WwM,ŸŒUÚÂÕl,•Wù×€KãÔ°Ž‡ÊŠÈF5†j­Í}ª×­¬v“ÍÈÙ©²ÍXÍ?Ì6‰ê6¶m³ÐÖÒåkÆ\›ÕÎ!t1-ù…Y²‡©Â„uŠ©¶˜«,F£N[E%‚IxL’I½…­Åï09‰÷®þ@È®(Я52cà·{©—ŸˆŒÔîv¦ä …fC¾…é‹É‡fqŸµ¹¥O6‡­þbà–ëì>DG#ôSPm¯>v°$éÁÈËÃÁŒ8˜A¬u#̉ƒ™Pàj:»?Rö¼N¼Thnnkj€&VBT™+M,Kš$òôæb Þ“… l´¶Uùpœ„ÆXœ™•ÏÌŽÇžu‹ç#h9UÀê U!Ê‘Õñä‡;~.þí|ä$2ÁÏâg½ øz­¥Ò¤ÿúѵð—ƆX$L¯(Óãë¹Wgs±.þz{ÀVÕÐ_L23€z,ò_© R¿ ýÂ¥7›&%a7En$¦ÀÊ•Šù÷Ží›òAi@0Yô2UsÊŒJ~”®c›T‰›„t¥MjþJðU„ªêá8ôlèU{;wïÉë_Æ™]šWÊ<ÝV.ÖeSš‘ñMõñMuñMµóMeá]U6Õ5°o@°VC™Ye,*¸n•¾Tï…^p[Ý6/S>¡p—Â,H3f> MŸ­.7k„Š%¥y‰ÀÌ‹9NŸ'˜­`‹Ý+¥‡ÎÌØ #;¨i‚vhñt·3MH(©ÐÔ £“ÏØk¯q„˜r¾û_Wü«lo• \;oÑ¢H÷&×úÀÐ ßËçæÉÓçX´êåE)LiÖ˜‹˜`]ý®¦ *Ui¥+ÌíV·ÕåðºjØÇâšE‘*˜ê5|—îéŒËŠ.×%y;Ĺ`]ÍúL³­M^ +AÕç^ïZß½q lƒÀ*ÝZ¦¬œÓ·ì xömó=QýDò¶90æ-ÓÌaʧ` kC7+hÒ3W–r:eÕ_­ûì™'7ƒ Fc‘©˜Ó‡ÆQA%T=g«»Gµá¸.üSSµªû¡A®ÂªV§äf¥§.PÝ l!<)îZö>`ápF¾t j¹<ÎV'¸ïéB¸tÚ%Ó²¥ _œöÂâ…–o?àý@˾6lØÛ´À¾¼kú’šçÃlx,~RÒš5óóf{ æ7¯Ù˜´1/<É¿2½mÖæ•[VÈyá©öÍ[6on;ÏÁ³9VñmXÌÊ]¹jÅŠìGa:S–ù4¿/¨ð•—i4e±ô—€ÿEã+“ÿòýû7^xá´/ºðÆþñ÷?ø>Nù—=³îŠƒrK…©¼àº©·^7Áüð* ‡Ô’#M¾!;¡¹ªN¨ôCä›Ô¬jõáì *@<ùõ6ñ‚Fq½›æT3ÛÄ6u Tïsu™[Š[UM¡… ]3¯Ö§™Ê\EÍ\:V÷:ê™ÿ¹ü­xiwÍ#÷Íâ~U«¦A*ã’¾ ¹ ¯Zõjê *᛿¶ˆg±úÏ—| ÅÀ*HÒëØ^ña½±Ó€=q;¡×Öï`‡ôA9[?ϰ€–jK³³x®¾žhès¬ö ¬(”& "H_ŠZPq1ÁEžÁM©OÁ~uåÂBé„… —ÀLX´®W¼#Œgq>ƒ˜[ÔK%FIF¡\àõàó#1‹PÁÏJüj$ÆŒŸÝ08dó›½:祮|hú]÷,þCé­‰Òò¯W¿ âYðšxvè}z?óué|ìË ££à£nºï¡Pû]}ñN…$Hóøÿç_#]Ã\º!»ð¡xû{âŸÅÅ6¦Tq3!˜´P‘Žj•ƒ[G€Å;•‹ f–̯6y->+ÛðV1Ô//ßw-\w>Rz»fvݪ=kX£ZHWg©² –&ç.«J,ºìÀܯq‚oý-øšï@Ùže=læawó_öúŸ£æhå}ÆMõ‘÷Èç¥B.À¯óߪw7Š'ìÞ½ž†©iÒᾄ}‘{lŒ.ÏwZ”ïàmø×>4OjñGàù„!s…Uë6|ÓuhóÐà«/ï¾¹I\~iÿ] wHg«ndª»nÏÇ–ÔôôrjŒ3ˆ=7°y¸Òér;ñ^ïÏP/1›ÆXyP^Z• L¥0šL¦8C!ZÊoÛÚ;wÉp¢ vD×xuýìÑ#' ¦fµ­‚™%ÆòB&yž.ä%èr± Ùd11yˆ­¶úºÃt#ä”q8鯠ÜYVDÊ.ì\H“Å€­ß™xŠx•›?oÂãO?ËԵ¬¹«‹‚k õExíMŽÆ>ñÖ¿myÿ« <È@ßfìöÍÞm¬JÁµº;ñ¢]:ë’tér“ʬ5\õÜTñLÐ,²™¿° °Ýüˆ'€xéö â=<×µ NøÓ»œí²a¦ež…]e3›©„OX³¢µÚP&ƒûêÙ}Ò[‚.½¼,X>·þÌ&İ|YüPp¶vØ7ámꦻáfÈ5ær3¤K§­åª'J}Ü&rȽҸÛ|%¾¢@°Xs[-Õ:5ÖKãpwKŸ Æ"MÅZ|…A¶´ 6ó—¶—-â2<=µÍ»X®]È^°vé#x}\Zi¯‰#ÄÛ(>ð!­nMQ\ÁD“ÕäŒ a剭ÙÚèlu¶T·»›™ ¬æXÎßÌ_XY(h‹´š,`Ó G¼R°‡|îz`_(ž×£ödƉlÛhÝèÙÊ”ù 鹫U)p$Û²†6ñ¬×>ü¾†žyðS;¾ß1àÙÁMc¾¦dx¤~>HWð}¹!EºÙXl.áâìâWïÏvÞì~i‹Ámà® ½.8ª}íÀ¬£È¬„K¼Ì’•q WJ°4âM*kP´ùõH4¼1aJGC¿X£‚³+ùlIv·9+ýVÂn#hW¼ÙÅ/út¥jß#},‹ËJ8µ ¹_cB‚ ñRó/¶ŽîçåKÍF4é¹gÅŠ9•¾ZÙU²s9mr»zÙ%u ±*(-7D`|37TláMO ­qËúu¿`o9…¯¯Æ×ƒ7“»ÍçlD ¬{ø$o‘'Y(˜lf{l'Ÿ"­ p:7,¬•®NMNç|üŠE\½âi9v¡`vúêÅÀ¦(Ê*òöó9½"~%8eZ4à)±iñGþšå×(32wc„X÷Ä9ï3AŸ[¥K W%ÒâM«ÏêÅôצڦn"²gßdâ{3Çœ‘u?Ö@³wš±|PZ%Cp™ØI/U&­ÿ[箬eÒ£âóÒol&í%ÿl€êbW »_z“o…:/¼:ùõv¾C¶öîƒi Sl¡"WE€¶öŠFÁÙâðakw•WÍĹÒ!AéS{ôAÄ„v;˜ò­Ç_¦\}VŽtöÝwÝÀÏé‚=ð —,-ÎÖqÊ»ó5:êÜÄ“þøª$7ó¤S¥“2¤ EÄ·Ò„7î'‚xˆìÛ.ñ®pn^XÈM¦DØ Þ/ÔÛ›­°Ú*` ­YËj¥±¨OsÑ8šÂ+|Q/’”E‰fŠÈ;Gy«îŠO«á…PrJÜC•iÖY¯ÇÖ@“­ÑÅL-Â<ó@[œå-Öçt¦Ù˜Õ*<å>´«æ M*œÑt#äÁRs*wÍV[3¬ÌG¹´]­æÂت‰J‹"ŠÚnûà†Uª?Yt—é¿”ÑW¶§x BÂ_±òY‰kñ–qI/¼ËÀ›e”ºôËõ™A›ÛQÃéU]ª×á#x驺wø»=üÝ/Ý»~E°ÀsO;ì”óš˜wËæž=üáí»ÖΈƒŠ6› ÜÞÇ=¬ƒ ‹ÞmÞ­,OaÒkôj®ºßV¨¡Êeq±\…vyåRÕÖjú^µm¶GÑì•9ÖH§÷.+Ë0‰¤0¢Á¶/Û:ºÞŠ0ŒÝd'†Ñ¸‚‘“û²8,8Zü>¼®o„ÅDÊq>?:^<:uãÅÈ|svúÃãNhã8!²\JT·dOáÊ' òjJU úfh&g³³™mÓ#G²Q–k‘qù‘̘7¬oêÆ¼PªŒ%5”ÁÅÍ;ÄLš3ÉúVf&yÁVYßš÷º3“k”™ºÅËÅ©â"¡¾ÙÕ’!…Ûj·Å9Á&¨-KùîWÂLì°k¶ Âá-®ûjÁa¦—¡JÃMhiÚ}â4Áè3;­«Ûeb>×:v«9š¸¨ÖXþh1ð¡fØ´ÀL´,£ƒKÝN¨©ô²÷¤eÜϺGá?“ɠ׳£'=MÐ U g»©:VüAáënÜÑy€åº‹3…”y9Üo’.U”ËX»Óåbâ×âBCƒaGm{Yl¨Ì¹&U#¹9å)4ËJ—/bm&aýË›»èvd7…v/ŽãµÞæþxR’øû‘˜»Aì9ôï1'–Jºvdd'ŸRU"†DÔÒolgüô‘eÊèC{œ3‹E}ŽIc(e~£àvW{=_Yse</¼zÕ° »ò7-Æ|m¶š3Ìä2Ž Fy£#ŒÊ–ÚW+4!$ö*(3« Å…×­¨ˆŠEáæ(ÿÞ£ºÛXf)ƒr˜×±z¶@_KÏzVZ+ää&C!µÍ&¥|à·ì5uoïìí‚p•š3•ž™&–Uëý\¼Î”+|o:sÚæñMÍ-,©,„\> ÷ûjmõ®æÐ«½í“Z[ä+fʶšfgƒÙ›©Ò¢çt29À…;ksqyˆVš¯O§ÀltØ WjÖ³²A(pçÂ]0ï¶Ò‡Me– ¨`Ê9=©{c›¡µ¦©SÍ«°$ãfn©0£Êj ßÚØ¼×ÂO¦Õfnx)Êô. ‘"œnŸxÝ~øë¹ÔQ'Ø,VSìt°U MŸµú°G“Gg/²kÜ„UZã³ûÃHƒ^ƒ·ÊÍ*|e.Üøÿ¯¯kçmŠÂ,7½’g$¦db„Ú_@[‰µT „„*´´!4­†4/'vl?â8v“æ[u@­Q!DYØÚ ~@;1{ȹiŠÄ‚¼Þ—Ïw|¾Ïç_GçøkôY¨•2+ËÊ4#ü!Äa×lRkÌ]!ÌCZL¥)W²3õv»µ˜›¡¸ZϺ¹µõTR(Ǩ›*äæ=i)•\––à ÃãýÂ;èÃÉîæª£ù‚¦ì½µ­yK2jN+ᥠÔë´éYø1–Ww7J­Ê6|†¯»o”3d*Ú҆شlÇa´UUt‰êåªÌj©ªŠ£8Ø¢Žâƒµ­¢?t¤¦H¹v±&a”a†VŠsÑò}Xƒ‡&ô† q«êÛ­­åb¢¿WG<½O¯Z{(Ç6³GZ.ªæ3Ù2ó¾ Ð4:Uÿ_Ÿ‰¯B{Í4Â<‡˜àNoé z¼ï!äÉÁ"ñ¢œaÉ^°êiïõíKŠw "Å’â½bB%Øýü‹˜ì«vJ²‚ò•©\4ÜêÓ3•Ë6†¯v¨ikÆ2za|p‰àc”Ã[âgzðö{í6-Ük`Hú¯‹ΦWæÿNQ1ÙF°jÔ”ü9£Æ— ·Â'yxÈÖÑâŽîš”ÓË–„J\³æÑàbð€ø{žÕ*Ó˜m6¾ ¥…ØùøÈ!F§®ŠaeL•Ié•ÁÕDphµáª\ÇrØô¬2*ÂúßÕHzA‡Èhu†fB,Ù^¤œ([f$*'Ĺ8õ5²õÑ·;@`0;xNTµ,±a)N8¸ªu¯»oiÊÊ¿$B,_BA{‚™`´º20ÕÇt³2<å4¡²ÿŽOŸœžLOLMM„¹þáaÿçatr2:sc2ú½æþ¥¬ endstream endobj 177 0 obj <> endobj 377 0 obj <>stream xœíWolSU?ç½¶o·2¥LXûÜ ¤Ù´/–lieÙ`Ð1ƶ,e£•º6\aHù³ºŒÉC¢ðAŒh 1ÄàŠQ£s Æìƒ"ÑñÓ>LT2uExÏsï{Ãí“|Ѹ{rOß=ïþÎÿôÝ sàˆðƦòðQ0H¬¥=ì1׿`wûÞL1x„^ Ó´mëîÝj¾G-ë:;’©[¿þ ~MÂ$°‚3ô|æãéÌ~Kÿ$±‘îíIsmop|”NîïOÁ Ø,Þ‘LwXû3ÄJ{vîΘëÂ÷Ù{î ù/®26@+N­FJ8Â$3ò=mp$¾¦dð”Y‰– '( ” !”Wæ$ürدWæDaHdb;ç$Þ­Ì!“«Ež"ŸZ¤x0üâEἭ!F:»P„—pòÁ k·Xâ ªšT$·ÚÕ}úˆ|àN¤ôZtÙ7x8\£–_9ÐTkÃóñ’0yPà“UIu‹’5ʼnj~.ä¿Z½%¥_Æ“×Â¥cí‚2\£µ¡;ùÖqµñá¿%ûÌzPuK>ºÕ Û‰¾ÚÄÚú…ïÔÔ*g¢þìM/ÆÓ±@]ù•PÔßjk#Û„æOÙÆ ê=¾.F¦ÏúCŸé£ÞúÄ@êKR£Ãå÷>m»™ÖáJÒ&žÇþ̵¬Û]%’ÇW¢9œèªMŒU‡õ,­Òox±¿¥¥ž¨ÉÉq±±íÍlâ’«P?ù ’sMÉ¥º$QÑdESqá¶ÜÞTâål(›æe"%± Y?¶Ÿ óاrWp?s„Óm&®oeb,1“öê,ˆ–÷A˜pÏ.Ÿ!eâv“59‚ª4Ü÷žoLù—TÈT,Mÿ-Á•½/vònb¸}7 u§o k"ýÉ]œ„¿}£ÜÈ´—šB Ê>±°¸‹«û"ÞèÒг¡l*™·ì±2%/cþ ýÃØA¾²-Ggè*´t™AZjx÷XaZÐi5’8šj$Rg”h¼KX…¶¤¨1úÏP…?aåaÝÕ6œdŒÓÆ~ Ky’˜i§`vfìs2½%õc_gyPhäÈAå+Bœ0oP~Í^–TsÒ¥ø¨&ýaj Ù›=ïMf©‡+ä_B‘. “­Û–­9¼¨.*ãžü-¡|µK{I¿¼ wiúíî è}f}F(6†™;#y‚jP™žÜ®O”NÔéÓÐeõ‘8ÿ7YþÐÐ:Øá4ŒÂ8Œ£ ‹9­À͘ÅcøÑe¢Ÿ‡E¥³4K³4K³ô#~ú1OÎóéÌ>„‹h:àß5«×Ô®]uë6665C Ä6‘<þØ~aƒFÎm,?½†A<É8­éÞ5°Ö@-¬¥ï-@¬ç¨ØH¸&h¦çš1Ødé‹sä<Ê7»‰8(ßÐÜñ\ºkÇžÝë;R]{Òk3Éî®v¾ ð5°?°§y3—0aÌX7#:ˆz2tãºñ'#:ï÷×é$͉¤Lþ.=AÜøÝ¢ €øy`qÚ6/zïìÇO;+oÁbqœ‰G»N}1õKwÅ ÂqÕ ×Æ_̼9¦ endstream endobj 304 0 obj <> endobj 378 0 obj <>stream xœeVyTSW1$÷U[Ò()5/§ÓZ[—¢§J«S[\ÆQMвH„h6¶!!yd!p³•$Â&‹aQQ©ŠV»X—ÖVm‹ži§­­=sŸçùǼèÌ™?æœwrÞ˽ßöû–ßÇÂbæ`,+6S"W®ÈPÈŠäÑïåT"‹z~µ˜ iùÃö‡8‹±Ô{>ŒeÃØ˜®çç)âÑ'Ï Ðd|c³Xµ®¾…²®BRZV%Zš•‘óʲeËÿ÷ϪäädQqÝODÄ•’R¹h ó¢KJ™X^õ¶(…¹-•JöŠJ¥uʲJQQI‰¸$*–]$m’H%J¥B%ZšòŠhuRÒªÌÏiYqu¥è±ç¢4E²(U”!.­–Uüÿ †a‹ä eEeUµª¦¨¸no‰x_™ä€TöÆJ ÛŽíÀÒ±X&–…ec9X.ö–‚åa°Ø&l3¶û–ŠmÃÒ°…Ø, ‹ÁTØyÖVïœ·æ„ØqlE 'f€Ãæ8w¹yÜI°XÁœÄÏ>%êǹlÊGY`zî<ëî,Ú0Ën§^à;í^«âMA[ÌÐks›p * ‚\‡¦ Žáhœ>ÙÝ6 ñ3½Ò--0µA½+z©$òZumð ŽêÀOÞÝ#UoÝ,¼Œ¶¼:‰>³^ÀX$¨Õ¬ÁïQà{6²S…|zaÒ2ZH'þ¸Å£øŸÿ…„hÑkèg‰öÒ2z1Íyóú’}½ã*B1]ÞÀœºrCÈè¢eêP’‘*îÃø[³¨úþ"žÙC-æ{¬.èøˆ‹ÜM<*0G¯ßaÂyKÔÈ xï‡Àzkƒ~„£U`t/yâhî(½„žÞøÝ«; *² ˆ¯€É–¥*kÈT ЫëùCÆ&¿8óÓì¼õ)»3Ɔ„qè>ƒßº0ëËY¶‹zް{¬mïóÔ´À]FãVƒ‹16ÛÕA8ƒ£j™˜êwz̤OØ®õ™üï v «Â’"yÕ†<â`¶eW—6ì¨eÀݺ0µ2ÜÐö J¾¾ˆ·}†®ò›Ðó=·¹¹ÑØÒÒ&HÚô­8¯Ã]]í(O\›‘›²3²÷^>qqÿhMG%” (r%Rw­PÕרÓ0ƒ×ÓI~®Ëë°1þòR=0ÐÜÃÀÓaèo %~õñÅëS•ÃÛÇûXÑ®éƒý‚ñC“3C’Õ=LÔ‡Èi*6ïGfzÛì"Þ=䦲ù¼kKÎõ¶ØMBc£©ÑHŠ3 óë›pÞ=½Ñd4?-Öf{3λö}ŽûæPá¥3Gz§‡… >U…𬆂}šþtðîý“-“‹aê­m þÆ,ÚÄXé *§øfî½o’@?Ó«oX ®XÚH¸ §u*ÌZ­^Y-ÕÉ ^r`ä8Áë@wè%ZpÚÐÀ=8Ý ÖžÎýüðÑöþ~áÄg à¥:š§Âc¾³h]jÃÔÚ0‹*gB¡ 7b ’°’Íd¹”nKx yLKz0äsÚñ «Gš]ää‹(–O°™ìF»ÁYç48¡ºüÁÃèYôEÂàgN×{¸ï?>c hÀˆÑk„j¨1Uꕫ芄7Q•zBèÀnŸë”‹Q_ ‡›Úôá,W­«ÖY—Dç',E&o³z°«Í=â`nýQzšÝdw.J¤$´ÉÜZ'l…nÛA¦œ ¡õ}“ \°ÕÓ>Î4×ßBÇí­aƈ£v3©„Þø ߢ¥_/â¤Ò>嫵:³âUÆÀ å8mÔôVvî€øŠwóR«Â5=½]ánGKk‹‹hö´¸¡ ïtŸé—g Ó½r›ÚP(®®ÑJà~œ—›z¢àò‰c]Ó—…<NkHu,q„ñôsD¿ö-JÍ*]¥VѨ‚x™bd‚pxéØšVB„š÷ëÚ,ªù3­x¸Žo¶i”†Ý ¹SœVtA|ÜÓXDfFM¾ºŒÜªÔ·Õ Ý?ì!‹ : ˆ#Jß^ˆÓ`%Í¡_ Ÿ½õ:šsáHøÔ± V 4u¤¾®¦‚”C|Mæ]´qÎ|ñågvgѰ®!y1µ­áç¿S(ß 3`á |¦îˆq¸ù2Ž.s ŸƒÙØž®¸ î®Kv+7ÀdœÞ|·.!츾–ó}·G_†—a¯Âÿ:þdè¾AE¬_™Ø®DS·€=;é ò°½¼ì€xOg¨g¬ààömÙÊ=åDy¡´åm<ùÀ7ôU.|O¯K‰R–?’íz¼…£«([Z ^xGð¨\¤â+«ªŠîªÁžîÁª9ñ$¦5AÖ7 K=dóMV/ć½ ùÄ#CKJ”¥‚ Æº×¦ ÀQJHDo·7Ù,6‹Ý"p“v4ã&°VƒäAn]ÚYt–^²ûo|zerÐ-:6ww.Ôr¶øš µZÃáq ÔÐdëä†ôzÌÀy4ëo³ìNÆ''×gm³2õñjÂ.0KÛjf¼ÒAªCç…çqê'F>G-&7©q;™˜O³îÏ¢ÔèÃîd–¿Ý]^zêó ÚÕ¡ÙÙÂ訂l›Æâh@›ÛërõõLtŒBüDw“T€;õúŒ( UAaÕtÀ+8jCáIˆÏ„”kº”Y† †t#sIå6™­! P1@sK>üCznyz–°nFÒŸ  B»&¿Åì=¹µÌÞ£yÌ/‡©™;,ôð:m¡îòQ.·:lvבï]iVA-æÒ,šdš´6 Ì‹;2nl8&D`ßÛàR|YÚúu5jW·Lx §ÊËLK¹VW!>UyköfÿÙ)bòd× üÞ¬Ü5Up"£‡žÛÅÔ–]f¡gþÁ—U”Kå}ƒ‡ö *?(#âjÂTve†¹CsïÍrÇÆÞ ÅÎǰ*`À endstream endobj 33 0 obj <> endobj 379 0 obj <>stream xœì½\SWû8~“\Å*m·uÔg«Ö½Š[Ü 0dïMaä„v2).pTíÐÖªµ8:mkOôÒÞÿyNµ}Û¾íûöûýýŸÏï£^3î=ç9Ïyö8±`:Z2V¶®ž¶®[œ|ý]=Ã'ƒŒ½-Œ¯v0¾j9—‹yþÎ3?êl‰:w¼øêk)ÝŸ ìf ìj|í%FØÜÜÓbˆÅp‹‘c,&q‚û´ÕgKHŸ%.®î®ÞÞ}æè³ÄËÝ}¸x±·“gŸ9^žþ}<|û¬pòõðëã¥ì£$_{¹z:÷™ãëäÔg¹—Ò?ÈÞ׉ çàäéçä÷¦xîÛ>¯Ïuòtòµwï³$`‹»«CÛ·Cú¹ú»1<ýßp vpòöwõòìcïéØgñòÐ/“¶Ý?B<Ó×ÉÞßÉÑô |7ÇË×Ù©Ïë.þþÞoŽ C)á“~ÊžNþCÄËɨ}ÆŒ¥×±ô:Ž^ÇÓëzH¯“à:z½Žþ-Z+7)•›\•›ÜÉ‹M® ìšî¹z†×š™ÞkgùÌöã7×^ÀüÀAöïo± qXê¸Èi±r‰óR—e®ËÝVlµs_鱪“´Oßþo¾5°yò )ûO}ýí!Ó®^7|ƒE—›FnXv2L?f13‰éÏ,aÞd0K™·˜Ì2f³œ̬`^gì˜!ÌJf(³ŠƬff0Ù5ÌLæ f-3‹Á¬cf3#™9Ì(f.3š™ÇŒaæ3 f3–y‡ÇØ2ã™…Ìf3‘Ibü ¦Ó‘éͼÊ™›ÌkŒˆ‘1Y ËÈ™NLFÌôeî0˜ÉLf*cÅx1]™ËÌ4æ%fºE’…ÆYh™Õ„ Èp.3,–XDXäZì²8ÞáD‡;8Ë*Ë{3;î,Üü(ì*!œ.\"t•Š.ˆ‰Œì+ì$v>»‘õaÙ}ì5öI'«Nƒ;Õˆ³ÄûÅ×Å?Iä}:gvØej—å]œ»Z}ßղ렮s».èêе±ë]Ÿ¿4ü¥/míVÝít÷ðîºîÝŸX[[»¼<ëåà—ë_~ôr«t¬tŽÔE(Í“’^“>ìñUÏn=¿ì5ß5>:fA®ŽZ5~#ÅS¹tŽüTl$¯q:¼p}ðqúµ¦ ¸õä 7ëðC$høSo©1ñÙ¢ÖD¡î›T…•{’ œ‡k¥ïˆ¹zn³ÔVlE¾0·øâ&Þ|ÓÛâçÒÄu4Ò£žomPðŒ ¹ðœm3ψɅÿ©EÉ3õžÿÙÆÀ3–Je,òRyÆÌ‰IR'‡%«OÄgÇ£¥,·J„&E',ŽW«Q N½G[¦Ý‡v£mš½©u«ÓbRÑ',ž(BE™9™õu¶ïF…¨(2Ç?+(Ùy°Üp:ƪøx2Fšz¯¶PÛ€ö íš}š42F¼nyšŠŽ1D„N&ö¯ Ýîžã‚Ö"»ÈEsY«§IUÆ[UÆš'R±U5Yç‰jŒª»?½ƒÝ?v}hmÄË—¤ Å®¯­X$ÞlÜ/],¶6.[­‰®1v­±Øs§ÜµÜƒí¥)b¼¯“¦Š­ŠL£â´;–øsl%õ[=ˆÞc¼WgQ×b\Pe‰ŸEK—Š­\¸È*¼¼Ú(8hqë&VݵÄ3ñ§Ò4qXUüW˜m}[„&ªâ%š0»WË3½l›ÉuXƒñÌH\eMÍK&LÏJ%XºÍbF„rɰMdªŸaz±¦'o™ž*†ç„Ieþ¹’"×Ð)t4ÏîCwœG£§Ó¾ˆxþªŠ!×&ãé¸%@“§øVú9€ÏØ6‘ÙE6Öê(ª7žÛ—Ôý\…q}¥õ‡ÆÃIR?±õ±õ‡b+<8©ÚøQµÅÓ;FÑ–xùmé2²ïJ—‹­VSÜí7Šª-jîâB–ïóÞJ¥T'.áî£7H ~A@™v?Ú‡JÛ¼(….ØX*Ò'd«dqÞ禰Œa…?4("C£¨€Ž;°à—UŒ#ϰ°'7ÈÚYÎjô`®çˆ ÜKx€|YUX €,•éfcÈ*æ™.Jej2 d­â“ªÜwãºzœØà^ÕýË;xAÕë *\†’®[תìÄÖΪ•bëªUbë Õj±·€ä×ç-¾! œKøîฉQ Úв‹rK];Zf§E¥ÈE¨,§8g[v^qUJG:+:+¸±%Å¥¥ŒeÒt²é;âv$Ôzúnúš r¬ëÞ` Â# ÓªóL¦f:‰öÔW£íèLlîxV§.Ô’%Ô¦Õi«ÜÓÖéW¡éhÞ:ôšQåþáÖÛ®h3»v] Ræˆr£³ýŠcö«KYµ.X£V³DöE×â¤Z|©®û®ã¸;öÕÖFc—gƒ¤Ü4n:÷ çÍMÇrnÞ Çbt»æòUf|ÊfqGµ¿B‘Ï3ššËS %j‡&X】“v½– ÚO§æ™ñ@T”•zS~°m&4÷A‹’冈\·. ³#ä4ç <÷Ä3ÀÜ[nýÃ:‚®˜è“ø«Ý÷oZî3N—f®˜EP¼o/N­"Œß±4þLdÌz±•ô¡¸øQU÷ÏnâÕ7­`hi¦Ø:8‹ 7›Œ”eKO‰TZNžØ ¶Z–hAÕGÆ~ÒrG87íÀ³òA_rO ±Pº‘Lgg¾i¹ÉD%J»Æ9ø*Zžÿ¼©Yk¢("[`ql–ü,µ1¬by&¦EÉ} ÐEd¨³P&ÊÐ¥ç±ßbÍwœö…Ït¸QoÀW<óðÜë-J‚ÜWm ÇRL³ûjbèìžZ¥yÖ÷ÈDÀŸÁäOZœyþc‚Xž¯R*9GA´¯&–ð3ÙòQEƒ{ xþ+s(9«1µmE^ä‚ÂÚÇ<–@Ƽ+èc^S(pB¥2l67[éFØŽ JŒßÛè ÷«ö-¼F·1ÖæNa­†Á/©ê^{ûxâGÖñA! ßä&JCˆ” [? [ÝNªâ-¤ÀăȚ-Ä cÙ§Mb«wÈÎY’-X@D@®ØjQtµQ´o¬ØdñÑMìJ4Ç ÌKÃÅq•Ò±•ˆ㵪îßßÁµUÖÁxpÍ„ì )l!ÿ;ˆ­¹ð[ÆCdÀÍÜX©žl|÷è#0AÝ]¼ðž¥±_‹4’l|½‰^øÙg¬Ô‘Ü×UãçuYAÝ­‹Þ3¾#5ˆ­óÄVë(á}SC!ê¾û.ö¾i} …_’F‰UüÏD¦JUbëÈh±õ±2îÀìÀ ¹û“#Æ!G¬ƒÆL©L)¶ê};Uc+˧xYØK¸F+þ˜[!#¾NVþeµEÝÆùD!|ú¬£ÔYŒ?ãK]p‰„/¸Ý8ª,ùÇ N­¤jÂäóÔj|²Ú‚ $à¡%^j<&-7Ô\»rÅŸ³æ˜U›†Ê|‘C²*…7J[!?Û¬;Žh+´ÇˆXª×5 É)©~TYNm+I¬A,^pKî¼ëø#·PîƒfÅ9 5„:ט)éjb~<šÈZÙq1uxé¹{•X]Ù}ו-ŸLoÄkom;iýT…¯á]Òx1·˜Û+ÍNÌKÊE•hgŠE{5åa»r";³¯Óh™õ3•ó„òËrT\Z^Ãâ&c_iÁ¶m…EÁyÞdîu¡>®Qn…KK†3iñH9²+qßéÍZ¯J“§í¶zm ¢pì'ÞâÞxPfdhWx©g‰ã®ÙZ% A¾I~‰ášhM<‚g<]ôûä¨PW”“_±3n7ú }|}…Eìð¬HÏ*Ôç힨‹aSc‰XED”¾Î9®ßö6ÊUlFÍIùQ¥$ºí-Þâµ¥4QlU]é_…s«ñÁj _÷Ö“q©ñg©›xbkœt«Øúˆ»Ø:܃lw-æÇåA¸Û7Ý?ÿFqÓÚø¹ñ i’Øú‡–V©Fl5'ºÖø¸ÚâÏÌAò•Þð©%o¡ÑžI¤<ÿ®B‘Á3Šž/P*‰03•>fêK^+ÎvØ!°ømÛæ <”»hÚ¯ÀŠâ“ÉõMž¯©ÙžçëèGÅÄü!jj¨Š à"ˆxhP¤¥t6)hþG¥’ZC©SS}rÖ^ :¤w‹ÒŸgV7Œ%¯ßû‰"Eê¼¢ ö'©˜Zž@Àa¦èõ䦷 Ì<³I¡Xp˜ç÷ÔĬ#^†ç^ñ k'ŠlÚ)ž£7ë›-d½Œ½ <+·1,$ú¼E9ŸÌ3 E³©93¨)s8a']ohd­¸Îo¿ñœé_3Ž ýk3Òõ\‰­ö¡qm·EJ5¾ƒª-ñw„ ÝE³êkeÛ…ï£C>ùS³‘^›™w0þ˜æÒ&%kk"g?±ã„S'NsJIBIIH“°1z•j]VBŽ&Þ:XÖŒØ#º,§EòV)åÒ·Ú¹´V{@5í\úVJháR+{B&sJñDâÛÁݽiy—@¤[ýH$3o÷îàXâiDÛyªø„ß´|LnL[}•øLHœ„ÆçR/"„T&wèÑM¼þZ¾<Oÿgl³I‘ñ+Ú¼¡ê ÝÓ Ðj²1˜ÆóÍ Å‹žÏt¶mÎ0Ù¥Ì` ÏAðj læË±Ø[¿Óožœ›A&‰·Køµ»¤ow—֤ƤÁÀ qïôšœÃrw“‡·‡g¯¿ê7´?¼ÂüðÑýð« qšÀÈ9 Xø Œ¸‹-ʉKMÍêø$0 åG³‡ç?`û(•«ÐR´ÆeÓJyäBù^DzÖÊ8À´ÏNÏK½Éf,Á1G,Žà鳎ÂÜÜœÌÄ •ü§ŽÂ¨ˆ ¨Ø”˜l¹· ³8Øâ<¶mª¾=‰{VYgß–ö¯0Hˆ#ŒoIŠ9×U:¨Í]½ÿ¸ûž»êGï?Š»KL‘.ÆkÒ»bëûxJòßw\r«Pú´Ý‹M¸Ž?µÀ2+Kð<,ú„]•QX…—Tuß÷ÉñX~/)²ŽÂ)¸Ešx‹cOO[;ÏÙy²Ev5è+½·ýÄw§Yü6—(-W ¬ZP—T‰jÐÅWɦ‚LÀöRc‘ð‡ 9ú‡»¡0äQè¾u>* Ô|šü*¦x°-ÊÃ?!}š⬚ø"Hã¡qE®h‹6Ȭy‰µ6¤íOÀVÔmÖ¼©TÎæù¯Á¤»_?1yèóÜs¡A±áüÒÛ!•lB†àöáæ&t’½°ôÀìÁv³–ȓޱî®çô•óÐdÖ:гº³éGÙtrÏÁ ,×_–ú‰ªGÅló‘ò²=ÅeÈY¹ê{Ö*÷?ŠÙ£FG|^:Ol´áÞ$ÿYEFWù‚q‡#«º?¸‰WÞv»cþ€â¨Å/k÷_AT£¬vGÍÙì¨]a&‹¾o,UÚÉÐ '‡y«ØH‘õ¡Oßyo"ÁŽÚbïáï*d('#å³…±YAaáÁa› W}úàâG?Èf]ž|œMY‡_mìñpføðá Ã÷ ÿù—ÞXøÆ©¶#Vˆ¹v¤rdúÈò‘GG½6jÔ(çQÅ£¸Ñ–£ûž:zéh‡Ñ‡ÇXé3fÔ˜©cæ¹¥¨xC±yìÚ±ùcOm7p\è¸âqï6~Ä„ Â'ÔLœ>qùDlj>M’L’M=iæ¤sonxÓéÍ’7¼Õï-×·|ßJx+ë­ “ÇLVN®šüó”¾S<¦ÜšzúíÎoÏ~;ýíò·Ï¾ýhÚÀi¦-0M?íè´ÓZ§¿6}Üt»é.Ó[f03œfDÍHž‘5ãàŒã3šfÜ™)š9m¦ÛÌ}³ØY«fif̪š=`¶çì+sØ9sçÌ9<竹›æ¦ÏÝ1÷›yîóŽÌûa~¯ùoÍŸ>ßv¾óü˜ù|cÛÏ6Ð6Ú6Ãöì® '-ô_¿°x‘Ï¢s‹ž/^»Øm±ïâÝK^YâºtüÒÂ¥‡—¾¿lñ²ƒËg.ß¼|ûò³+¯8l—½Òueä*ëUWXÝmµËê„Õ«¿_c½ÆkMãšÛk{¬}¼nêº뎯ï´~Æúëoo˜½¡b£ßÆÚM›¬6ÙnªÚô|óøÍÓ7Wl>ºùÒæ7óöK·Œw”:~áø³ÓN‹¢œ.(•÷ν휣÷8?pa]&ºDº¸\p¹ïÖÓÍÑ-ÍíÈVfk÷­Š­³·®Ý¼5ekéÖ³[º÷v_êæžé~Ùý®ÇÉ{b0Cüä}0e¶Ívèuô'FÜZS„™!ýÍçõ3¾øÓç!¨÷*˜Ÿ/߬L°7!>I¶#Bg‰=eÛ|Ž\¹Ä~êöÓOæ04 ’±ÏÁ¬ŸÀå" ñÀ¶Y±…<ÑC$èStdLý7TLéÈVñÌK0œ¥Šñs•s7‰mäýBn‡gú7AaÄxZ1’FÓ{*•íQäÙ¦(²$° ¤(¿dü6ÊHÒ%¥'¥«3Q[ZV{½ö˜ï0zÇÕ’Åìô‚!ƒÃÖ¡%,:–¼K†g wL"DžÛ˜õ¾¶B™:+Ô×r¾BtøÊå´4öÛ/’Ó'÷íG°˜QìSÆYΙ´X.á™a€ðÁ-Î><¼AÐÜÔ¼”çù€ó'-J6m« ?yÊ%˜=}#Œp6c¼]ä«QLqÔ¶h}dNbƒÃ>õ>‹%O?Ä=å[LÚ½$‹Õ$ È,Ë J6ðù d†ÐüÂX²S!"µ^Æ€P¹õ!¤6kŸàPñÇÑEV²qnåçrT‘{õîiö—à¼Séz´Ž<-t£LÂóŸBLð1È–Oáò3ý×Pö3$à‹£¸ÃÞ£G.œvå`gøGÇO@žŸeÒR¢Ï€¬yþ>€^F8ŠoT*q6<‰Èš¨Ô˜Œøo+Îï=ÕtþZe ºÉâMœ¨a*÷Šg=nÜÁ©øUYÙòA-Ê žy do—2Þ‹úT Uþ{Z•ü½€¯b‘ W¯­ˆÐ±­½¸¾ò @ÿ5áß0žé‹xB¶ÌØ‹ë'Ðë4‘zVÒ®–Z_¶«/ w• "#4z5¹“¡èãL7Ûf”g–±" ·öÂýj­Gna‘†’Ó§ë—-¡õážÊKâ— ÍìQ\FbFFfJºl¿•hKrK3ó óŠóUŸßn¢–ùg¢•È>ÂÓ×Ã/Ð 9±.¥±y…9Å2”›¤KHcÒ’tÈÀJP\Š©Ž ¢Ê„j”„Š,:4(tèW*œÄi¹ºÔ"$œÑnŠ@¿…šÞ`Ž _K«Þ`’uÚ“ÚÝhªÕÔµçà>¢¹š†YˆÓrŒ°„ñŠ <Æ[IØ#¨µJà³çïª5Ï_W1‰m£åÒÑŽ¾0ÚMàúzÃz¢Ìl‰<è ±!+©BY÷N]÷8~‰ÇDÙt¡¿vzêè^‹¸á³#««ä’ß©4øÝ†}HŸtáu¨ñt}1ïäØR6YD$ǃù‡‡( .‰O®—<ïq‹ˆÁµ>i3aÚ/Ñýƒ—ïÇgÆéThÖ”¹î#7ÍÀ£Dî_ ;Þƒ&Í4AM‡­7œ;³ó8A³ œT6.'Gƒ‚lŽÄ¶Y<öpÌÉÕi¸®h<šå¾ÄŽçŸYô!ìB d©ùBAܸ¸‰x«Lb ÕÔè`÷÷¸™Ün#×e ×wˆª`—ì/££íMúŽ@Õ/ºˆ5x÷~ƒ[!-Lr$«…× Kr Kd?ßGyÛçðLg*ha,± ­¼êØ ˆßþERJÖhQhb¬Æl†P‚Ðä +9¢ýX‹ […’÷ˆ ?jhÎ8Fó& ÏÿÐ&õùï¨d4ÓeÉÛd’W…y;äXÝ"ºƒRüS6êÔEH§ÓÔh P5ªÖn'Ö†.©ÕlâŠÄÈñde~›ù®XI–ŸU"k>E¥dù9(;9#…fíöÑ ;»¹M&2"Ø0^¯7Cù3å&?9âÙ\þ ™>ž‡çˆ G,3žÜõW°dÚ²£¨ü·fÞ ’àè!,¶Z'ˆÙ«nˆ»Æ.FÎ8+²V#æv~ÚUsáØZ‡fõï•æpc¹Çxì_»÷/ƒ¶?æÖýµ{ÿ2 ur Œv¶}4?Ízd‡\ÚG»em‘ˆ›·ÊËM¨ÞÏ v^ƒ"‹Èlàæ.4N Òûå¦fwÄFx87†l—@•{jh-11¢àÖ7ᢠª÷[äP‹’˜z}›š5´BJiÇš*ø¥’Å£¹µ‚_ÞSÅFëj’‰æa”ÊDrÕSQ¡6UK\8dÐj”_ÛubºEU.1žøÛ0È=qô¼p®ÀTÃËtüœš-J”ÒµéÕ5,Œ‡ iHnH3¸^«q@ÈÇT©IK´Õ+3ý(éÂ7€j߃9&q³ÈæG°„GPÔC9óc¸üdŒµ ŠxGyæ:0 1Šl›9‘u4«IwœìÍž4Oáˆ%þ{ZlæGÐLå’¾ˆ!ô )¨”çüe $¿’Rf!EfïÈóoRó[³Àüå!rqµ‰ÛEw¼¯Ba}nŠÙì¤ôœXSÌ2ZœD Mã$PרiúËæL–{%‰siM$D'&$¡D¤IMÈd9{c70Y`šìJ‚.)nK g[G Ì–ÖiC¡¥å2s+A…v—¶• M…–ùiä^ØRµœb&àÞ80a‡Öœ³âDدÀÊïµÈ%Øë­¸¹2â)Bñ?¿ èõ*¬ð<\öÀª¯ƒyz ˆèN=õºË‰Á­Áý¹®x*Ù]O¨åaVƒ2 8„zffõÖ@àOlPlç™yD®Êþ·“Îç™`ø< &ËG¿Ö:ЊsÀxWà–áíu(åx“íS›‹ø©²ÁÄlØD6W0¾—Î|W*w€a¬@ ÐK'ú¨1KXÑjè!º0÷@Ð޲ݧØÐA€·s´'R 7?á: 5÷LŃ˜0Rê ϰm>bª¾3ùt`¢å …þ‘šÔ4Þ¦åZÿ‚»s×81×m–×Pù:",Ï©yØëSDŸìw‡%?¡Õ,0ïC²º¹༿ ß\… ƒonè g‘å'g¥™¬TSI ’1!c#ò%¬ª7øˆLæºc¥`Ÿþóãèt4tsõº Sl‘/Zçô+ Áþˆø3UdHû°]â¸iV¢ È¿}¼³f Ü â6ãöŸcû#ØÏ‘á`UÚ³íÄIÄôFØþàûqùxP#â:†s½¸)²uPO)š¸KãåÚCI &Vr#ž*â Áå1PÜy"Îy~‹¡u !Zº¹EiFÄÊCØ–·[êz©˜Ëém ÃEãHF(UZÉéøÔH2•Š™AÿÓš) Šê[¥2…Þ…²‘)h*УZQ§äRƒÂ˜NˆÓZ1†0UºÿÀEs†i6¯ÆŸøqŽíê ‡­ë“7À¸T@ýQžkí›oic¨NùPèAÔ:˜m$šÕ~îg-D[6,[”Q4µ‡bP¤¹²ý{ZÈ|ô=—ëÎ}Jæj´˜ãnýaQ½`ÞŽMÍ5ɦyÝ4[(‚"Ûç=˜MÛ‰¶'œŒƒ´î¤…eÇef¥éY,ÇÏ©9i¹i(™«ÂžPÓ ýŽ(2܉Ã]hN\.y&##ÍÀâ5ÆÝ‚œš‚â“)m%ü~äƒ6µÏ»'¢fJSU&ÿ¨âD7ˆ­¯˜5g˜ëÌÕ‰ð{Ê$TØ¡,Û‰Ö•…_ó¦è§É­‘Ãò;Ãc”•;ÚškÐ<4Jº_öí@;l› Ý©¤Évê4‚)Ñ•›) â S±UÅ$¥G{DR)ÚÓ uê€Kšš ¼ŸÁt¯3f«L¢PœJi£WºÕnZ3Mî…aj ¹ÏP’K±mæ6‘¥°ðÑ@r@ 'Q4"Pp€¯i©m‡"ôÁ½öš)þúža«¹„ಠŠ6[§-FÅh¯¦¡ÝV»~´BÔS¡¨fqO¼Ì-h€Êk!ÁY ÝïŽÔæè ±À0€z‰BAî{fø aŒÙ€xjcXn–6 Újm± «¨~×ÙìÉLß%v27gQ«,–0Å „ÒDéÛ¨4µ–¼€ R1Ø]°“x€«¶Í™ÿº«tW½þeW»RtµK”¨DÑ)œ“ –È€&³‚ðW ½›åÈŒMt?DCõ†TJ{¾—Ý(õØ´™¤g »…‰%{éCðÔ >ºgr<EJæ±þM}4QKJ%DºiŒÛïîGtÖoê¥%i§²ÞÍ9—¬J‰Dîs|—qI,g— ÏKÙe¢´]Zæõ§Øë±7I]¦7µA© Ey6JOEQÈ=Ƀ8«>BÉz44M™’`½,vKVbfR61*‹®ÔQ¢7¼OƒŸ,vN˜c› Ù‘ZãĆW£øDu|ÜPÂ6˸‚ÜpulR,Šc£Óâõ2ÞÂݶYH üÁ84( Úþ‡ ¢ÙNÛ#Κ;}€p Zµ6¹"ÿÐX5›¤ÂBÎBž¯A‡ÒPº&=>‹ˆŠTÇŪ}]¼ˆ h@•è@ÑÁ¬DHp®7ÇAœöHmCZzLV‚l\…‰Ãë¨Ù}Pއˆp¿);fÈ$“&.³óËQ— så0ORª&EC¬?¶ò@v}õ¡PN Cq‰ ‰v\ @2ÌoÎJ4M>åyDû«ÙÂ<¤¬¸"³±çŽNÊ 7Œ.wGÛƒJYœ"BE&d5á”|Jˆ|žxÜqs¬£LÛŠšRÛÊ‚|£§E8$&Å&‡éÔÇsÒж5\„5!‰i±i 9ÈTeÒ^¨„¤Fð Kc½¶Í9d1„šÌ¡ þKøB—´‚›é>ÿ,yˆØjôûc ¾nÐØÎG-ÊPw/V’›£uÝ´9`3qYÝÀp‡ÃÍÍòwQ†KªKŠ·>¦±E;s+O.közß1\?Nzm î.?‹ Ž~BL`s{…Øå Àð}S³rëÖ0_âÿ.ánèš¾ÁPTyhoJ!ªE¥‘…þ¬>,%¹Sç@·„ :Uׄ„ã_¶ B‰)ÚŒdV²}[½áXµî´˜t„5®ùs[M&–-ÿUmc ÊmŸv‹iVžYI£JÖ4„âÄŠ&—¨Câl >F³ƒC”­¤EÆ^BtÉk Ÿ?„ohÃÉ·*&5œn—©5Ý”iþ©E™‚ µ9Ú "è‹Úã®Äk¡Æõ€Rú‚éÖ¿)0µ§0Ûâ›ð ›œšÊ~Ö"¨ØU“ÑÐÞ`A›VýÛLO%˜ë.?ðiö…Øc¬¿'!»…+™Ö¶™È³Gæ7÷çàþRÓë+ÚÔ@d;o±¾©ùÏÅä×üN’˜…æÃQ„‚“b#¢ˆîÚêDÔ0ë±F_N6äÏ>œ W¡,·B4§bÞ×2ɉÓ¡  ÍÉ4C/6_K,àÕ„¿Ï?¤Â¬=ùð- Óxãþ%¶Ðàña¢9¨G0UaŠþÒ¾åW=à´ßÒDLxõ-ýË šû˜(½»"Ð…ëÔ¹Äw4Y`7èñ„"©¡V*1±÷™îFÅ.\ll §ÌAèMq]•( }f°ÚÐz špR*L°¿Ú uÕx ÜþLuâÎÐ[Ø{œµÀdƒ›üDKÚoÛ¯f'pŒÀÞ.¹$µe"5ÚZbjd¾‰üœ†¨Ð±5wh1RÚDHPy¡EnÒ4Z ’Ù•|Ú `ϼ%¨[BÃg[©çÙ6Kå¿ÌrGŤ˜VHSjüuÚÎEf­f{‘…Y-)84·D›' ~ú£ îϼ¢bÒh¦±ýX€0ÍVäþ«íë«l;s Ê»-°‘Þ_ñãÖ¶ã ¨B„ ^´LAš€íM)Ü«AgˆøŒ·°ÝþïqG}yÅ®ºöÙC4^„x`;ضéåzC"íjT‡92ÌojæBÈœÏÀ‡ÿ¦Ã`?üD[SjÝiÛŒá ¢è˜¡¹*f¥ÔDmÛ¢P\‘w{·¡½!æ;¨ ðÃò©ßïccà ÈMÏ.ù‚öCÀ´ÄŸö2¬CHÂ$½øûJe¸»*("ÆE „b=Ã=" ÃvåÞQ{Èó'jÑ<9\È[¹f£Ú%v-™¤©ÍÕè ü™62ëM‰"r¯WÒê€ Ê¨,~9E0—æLéGðcý@[°ô¦, Šgã2â 2Ü”(È©Î=ž~ÔTÄXRñfNŽF!6ÂS`ÞÝ‹€´/ô†ÚqJ3’,g#¼ñè{<úüÓÒM] Ì5FDi%Å#¯$O⪾#äùO©Ñ÷#À-¤¥tRêQt†…m3qàŠ÷*¯A¥„ý_utÚ“ªéeIHyx1*AM¹•?š»ƒ©?ûœúa-ÊXĬYê…®w!ÕæXÑ}xÕ¥©Ù-Bv¶‘ XIIyÁ 9ºQóYìGêÏ“Š4ºÄôh"Ëc4ª¤´8’c¢ÇEØÑiW\"“´]¶È$>EeeEEeeÛ}||d< ¿‚­Éu÷ îÎ"^áàÿ‘¸÷2-—`9f8KNNþXp9×§`–ÿˆ-q¹d²ÈÇ?4:Т Zd*K¶ÝÙNüT“™ESyæ• €â(a´'&Æ'% 6&>oü}Ñ£e…kíº9„gG Òs3d(M“¦I&RQ:›W”]U\;M¶4\`æà…ìÑæィ mˬ®H Ñ–Òäíx úŠ˜ôÇoÒjÂ,•ùŸ§ð¹ ·¥RŬáùËðòœŠYËF syqÔô!³Ø|“Y摳M:ÈZE¿ižÈüj(¨|W?—-ö~Õ5µÅµû:ºÉ$+lš)_¢bÔ9Ñiˆ5™¿‡¯0pÆwðö,b­ï„{)·Þ=xEŽÎ¬ßá–ÂJÊó¶£r¶Îmûª±ÞëBSà dňvmn£"2;=ogF>bó¶ÇúψߣTrìDL¤ïiv¯A‘€è¡0(.]G¥ˆ¥(‰Ùÿí45­ ¤Ö$jXÉβ²;}ʼ¼||¼¼Ê|vÊ%ÅY>ò ¤JõΊ‹KŒCQ¥ª|õ.Äž;X¹¯Þ½ÄAƒb4±Ilé%Wä0L§ä¥eA ±$'9f«œë!B«Ý’âcµá©ê -ÍP"S´¤Š°S…&5é2\“SÐ1ÇŠè.¦ÑÜ‚épS]$qe6yûD­EQæ40¦mHpóeifJCM„Êßh#Y ôU“)AGg›"'&·–q0v*樉È9ް9"Ê.GÖ˜)¿Î|“‰½àA•9CX/úød;š8j yrVÒºé§þ{cŸõ üm›‡ˆL$Bã™ÌX “ùÔíFÁ#hKä¯0Õ¹ST/C‚ŒØá¿`,4íaKŽŠtÕËÂó¦PMÓP0Æd”Ù£™¼ŸJ(aK]3S3²žRKŒy‘·8o1™-üE,·i‰!¥,¸ó¹©p 9Þ|úÀ-ì 2ú€Ü^z=”'65 %­ê¿'Ö¸ °ñ×¥+Ù¶+n½ü_ÄÀo¸×ļ~Ë–9n’¡C†ò†º¦wÓÞEû؃¢ôØ”ØØ˜Ä8Ù&òÓøEúÆ„…ù‡®w]¸ MF£š?Ah¯¾¼´¢¤h'ªgk|3‚ƒ¢üe(2YϦÆ'«Q8û+m#uœ÷ í‡kO{PGä+Zi™ ¶‚¢}bD_Óá’ Se°î¥q‚Ș¤xâ†Äêâ2Q&ÊI)Êdñ€3šŠ2Y¤ü´Ì–—ÓÔ-÷óßÒ’$ºqð)11"ÀÐ2¸»º¹(½’cRÔ™êúü]ùu;ª|«Cv‡˜Ó<´V°#X*,\¨yK¾`w(«=jYI0 MËa%Aú€B´ù;F,Ñ©³4ÙÉYUY†2” b·©XIQDQÈvˆíÎ9«NNQiØ{UtÙ+ŸíeeÛ·—•l÷‘ùÑôâGð‰ìª2Qò?PšX±-ÀÝ+Ô×Ý=´tgE~q%1ÞÀ©IÚÅrÅ¿)"i/usþ…ú5šìF´iÑ~y-­þM¡Ú?P§7 q}@‚ЂÊ`Ì5 49—w!šÐºŽà ½ÓðÍg´ÄÞþ‚BVbB"+ù}4šz! ’ÆIT~‰ã9ˆ¿£OÀªÞT1D®ÙcJUÿBøð …âÞDþüŸ¬×„|:Ìã Ú¯®Ñš-pùŠq/(Ãÿ¾Øò·Õ“º6ç û/*'Û 'ñæÏD9™†ì´ÄŒùP#ü%¨ÜšÉ¢˜èðhuJl†ü7Iø· Rÿbå‘ä©ôèO+ä´ôHFŒQÈŠ·!ÛÉŒƒ¨Í‡™äðXż÷·ŠŠÈmŽ@h·(–P‹Þ¡P°Ä8™Ò ˜ ðMç¼Ð™®6†`°0/©˜EZîa–? Þ¼èb/=…ñ?¨QâùíH_¸s7L6VuŽž:ØÐ5ê ‚”p}hõL¦S)öÜCý:8Û –ÿù(¡íŸ}‹ùÏ‹GÂD s˜ÉĤ¹†(2é ½õ†54’±€L_O,Úá„%…N{&¾ŽùŒ·ÐZ9­¥ÉM;—Ò–ÍÞD³Ù!ÉÐúñ,1€–è«jârC h55a\/n²l²/ò,_Ù¨½ŠšXœ.BòŠ+Ó2“i•D%uv‘/¡Ž-Èmz!ð2™ÈCÚxõKqÏ@ûû/úŸEÄÿ $úî7™VV²& ¡RÞ–jýoMw¶Ív§®N ÁÖæ´PׇPŒç† vκ˜tufÒîíUå»vU¸×xÕû™ Â,h­ kcHKg65zbåIËÀ•–ÿJÊA!Ê$ö:<ÜÐpà}ý† öŽd’b¿Lwídž¯ ù# Õ£°²ï t|ƧôzòþqS³·=r ë| °‚…~SþÿKe[Œ'SÁ*19á‹ôP·1-JÃÁC,Í‚iÚ–G‡2ŸŒ %j@=´1ŸƿעlAÍèÌîò¿8뱦L/Õp.ñpqñµCÓÐ’ûès–r°}ÌVoj愲eh•¯ÛF奩)DOš²iiP¦oe©>?ÏœèNJѤ£,T^¯'ŠNÑx¤i!ÕBk Z£qKf%á«¶lEË‘÷."»ÌY†Î¶ÍDô„—1Uqöh{Ô\Î1›Æ*ÁGȸ³çòetÕ8¡­hÑú î$öïêUÀî$ÛfÁI“ÆfFÓª2à«€n[Ûæ?JUKþ8W -:ñT6(ÆñŒ7=OÙ¶‰È‹[ i*l /¨Cs˜•Ôœ ÿ³40ÑhÿI"ø:[Ø–,üû…³’â¨p‚¹ú°ðŸ´þsY°ÿ‘”ûG³Qê¼îÚè‹ Ø6ç®ùËÀBŠœ&<`S/ûô¥µ[z¦ïùF…Bž£Êúñ Ú/:k¦ÌH(ÏL âë?XñêRoÀ Ãõ•B›šl ‚„Üè¬PªGSe܇¦ùaôWÀc¿CÏé¤G~ö¢ÆÄ÷M—Ì-Ë”øMrõ5b)@:’ŽÓâøSÕÂü*äù³DëÐÔ%¢¾¹~ ˜éEkÄl›‰'y•g¨˜êÔÈJѶCø¾Í™KÑb4Öw(>ú„"ô~{¨ò3²§Ò9Šf‚â©ow¶åfåè²£å\€P¥ ŠŠKUeÊ%^Â8ÇUkÑJ´~{ìnÖK˜6ûÌæëDÀ_Ü«{•xG ôã­¹ŠÞEäÜe½sÑK7l]…X;´¹NÕÈJ~U»ôbå’ìßW.y•øíÜYR²s§_‰——ŸŸ—ìw« hA&Ù'¬¨Þµ«¾œ /8…m Vú¸•º8æ³aA‚Z¯ %+9*,?X f7œ+Pz»ú*\kÝJËÙ HASÝÆòõ¬Ä#"$,,-`O†.6RŽü•ö1lZ¨àjƮ󨖭 ¨s’ýAu$&ÿ´>¨­<èß•þüî ƒ/ˆþh3ضÝx_2@˜ü?vRþ™¶µ?:óœ•üoœzþ¯ ]íý\mD¦"ÓAɬäŽJ†c’eæc’%pD²\‡$ËL‡$³Ó1ÉcФÅh¤ùŒdÉ_:™X(ôxdOä¢':ïÎFf_<Ù|6²Ä30ØO޼Kcò·%å&  âã·V…b’ctêÓ™G*ÐYö¸_5!Öš¼Ò¼üèóé”4Cù «µÞ GÅ…»NçNÌLHuŠ'ü à—^·(Ââë\¬Ü-ûçºËضšþ¨è…  ¿Y¢"ù½s|ÉÜ)õæ'J@/¼¤PDQ{Ñ“ '.!>–¥ñ"Î\Ô(žö˜âë4¿™ˆb3âÓP JÑ&'³_*HMMIGt¤WÔG Š63Ù¶YÞ6âyÃu˜E­F£•ωòHBqºøtD‹&Pª9hÜQ©Le?£¾³ -5™xM0Cw½!”†ÍeQD†ÇǰS8¹@£!chPl&+þ$³Xˆ;t:m:ÒÁs/ÓÆ{šG†W_Ød (L£ŽdßáÁóð‡¬K×¶®'¸‹ 5M«Cid¿ÿ sðoýŽ+ùÛ¿dñ· ü߆‘mÎ1“Aå:œc%¶ä3Cƒb̼¾òÿî sè·G™ÿû“ÌwÒSÌæSÌ÷ý¥ÌÙß9Â\ò×Ï0¯\Xøçg—7(ˆIóŸý¼ÑûôFþü÷EX‰éFüÂú½_‘À)ç2É/ÇœKþðœsVò‡g¥³’ÿìtÉÿÒïv¨˜_ýnýœÿ{»ãÿ5üåæö®{„Xj¿ô|)ĽwY¶Ð}<7zI¤¾V.©B•IÐǨ9ít=ñö`!½A²Ñ ñTÂL#âä%¶à6Ë8 ¼A()ÉI/‘ánÂëhûª¢ ´½Ï\JÜ…Ö嬢­bågØíñ°C´¸p¢Òä8œeÿòa¬¤ñø±#îp}·E (ŠmõfsýÞãzàˆÅvOp¼ +ÆáéÜV9×­WNžÎJŒ6ÂÁï¼Ñ A3/ºã´VÞל&ë\ Îë!È&MTŒ’gÛœF)‘¶¢£ìa÷}Naá~2”ë_ ×ä£ ¹nŠU!Z_ÑVäD«&!*j:Æá PXO Ñó¶æÎDè!û“p9ûÏ7ÿ71@7w¡Ì€M» «n:/‰†Dè Ê[œ‡=ä³ÇÉ3”bKP¨OÒÇ¢HVâj¯VÉh} 2•ýÓƒª Æl®$'68œ„E£€´÷éÒÿrøå7?G#1ÿä}dX n!Ì$(¢këNf©éÑÐvDÃ(*½¡se$õk•ÊwÙÖNH ¤´ýŠ-u7×HSnW—9iEË¢€Ä»™«Y¼Š+HÒp>\– F§2ýbƒÉÿ0™_¶eÌ¡à‡ä¾ä2ãx¡ùeÚŽJmí …Ï&ÀV`Bš‘m·섵‚fú¬˜J˜»á\\¥Mã<ñNhhJ}TØï SÚÇ ¯sò 2‘rXQ¼©Œ—G«n¡RÅ À°ø‰h# úO{…!Ïñ7-ƒF¡È¤µœ»h+ñC.ùþil ·¤,Iº¿üö -‹“·š{*Чd£<Ä^Á";N1|(×e¬|ZS±õHd‘—Þ±®ÑÞþóñP—[x,q‘»b¹aKÛ¯¹^;X<Ÿdty(‹ÍˆÓþÁ¹82ÈJÊ%<áù"€{l›ÑÐò©7ëE¤'4Ç¢80xõæFY!å!å3ÚFcä/)LGmÕâÙrƒ۱Ļ€4¾†¥5§€L% ôp¬Ï!íñ¾§þßA4Ff¾¥õÕ°½çh†ƇvTbŸ˜kiè¡ý¨-& Yuò2ÝôQ¢Yzc“3Á)´µ×¤SÉ+H"ݧøm ihkèyN1ˆ}Ó®ƒ©·µ(Pƒs‰@©²úÖÓèh½¢ô‡ÌT/ /;ÒñÒ;˜QYVÌ fÇøhcúe¦šêÕ¨åÊJêêËóΠZ´7°ru¡[Îp# ’QqjÕ„ŠÑX~ nãárt*â„[½kÃú’™èmdçâ°*%ZŸ£aÿRv‰•üSù¥ÿ?¦—þ(»”®NAaažH‰"‹œ®6î‹•PôÄ™Ô×°1Q¡³Ó†¦ŸßÑOÿØá½©ÇÔ R”¦,—î?÷H/ðÖ¤R®·«:ŠØ=¨¡°üÀ, z¾™^Ôü~›‹ ê¶7m‘jQLçI0ÝÿL‹²¦L‚ì/gLÛ{ 99Sƒ•©“€*ÍKÐ;Ë{ÿ‘)ø/KÒlToŠ]Ë–% ¯WÁQŽ…„‰O.2MÇ@þ@ëI`ÌVjJK¶ŸA•ÀÄÉúv@èUhj'0äP£}À3[h/ìn':îWðˆ5°ùtZ_I$H ÓùU¦ôðŠðŠI‰KM`¿ž H&d˜‚ÒPù‹RÌ”´f‹žgÚ‘J•ÓÄ…±ÄgÄ¥ª'Š¢§h"šï'CÅ&Ç¥%°Ÿñ|-y•Ê„TÓ!QðÓ‘zˆ’MJ˜êUs‚Ú^ç‰+ÒŽh¬™bGP L‡…HÌíLOªÿ¯¼ï€ªÊâÄ7sõÙvuÕ¬:ÏÞ5º+ŠAQiJ/aR€„ô2)“6íLO&ÉLz%B ô®A±‚ºbî«®>vŸ:ß=ç½°¸‹.»î×å·o'3¯Üw˹§üÏÿÄý"*,A)n)“õÊiü%Üü%H¦…È’ ]Åì^Y¬å%îò9Žû¤Lµ¯££%°ºJ}Vö•röñÛ‰$£ Tw&IG¼¿ _åÇÞhoüÓcû嫤«´ðÛ.ÓVooÜ;`SzY [¦·¾4q݃ð(<6¯t7å+…¼#Ó¶>à±w²¶!¸{c×v`OÃ:SÅ”_5*,QéçšÂÚòÏr¿ü ÉýzûGÈ/Õaû·} Çm¾ÿswOæ_þÕÉ»šú/?…ÿ‡Ø„ˆîaZúc_àÝlÑ­à]~›É¤†÷&M\<9<€¸œ#‘7Éiƒò1Þ˜°J AõN‚OÐÜz\ýk¨ô$ßrUKŠD¸µ­×ÐÔß…B™%¸Üb-ä‘ADð—&ýê8J—¡ÏFí'GåeÂõÐH™<@,o€úH,‘`¦oàv|¶@¸j¼˜© m“†Ø9 ÕÂB^f1}" è Iu9‡ô²óð>2žI:é7G)­ç7ø¦ Fžgœ—”¶ˆÒDOòS‰,Œ=F#Æ8}ª-r¦5ö%¼'µÂUýs™EŒ‰YU@_œJVÕ?äT‰#|j•î÷´ɃA5Wc]Cb¿N}Tøû›øLº×Ã.BwXÒ¢]2@îÖíZ ½PC|H´2Ég«" È«üï¶èŽ• ¥ æãl0™ ½ ǰ©Œ¥~Õ‹Éš\Ùú>ÀwØÏps%ò.BeÛÿhñ­K ‘Ȭ>NøÇę̛O…Ž kÉŒßR¯UéŽ4äAìEäNàKšÕ„ S$qçòå;å°¢´ XS ¢²²°†ÓótÔß¿UçutVjfV°ÜâÐI¶ºûÀ˜[jvdA¤¸J]Ìájâ\s! y·*<{µÓyÎdp¦¸žÒLؽ¶ š°ãNdz–®*n,nΦK/ÌÎ^´ûñ#ò¹G>–ÅoïÞq“$ß${„ê6fÒq}[Š™tsõb-¬u¯â*Ü(ÌOúOG.oºMþýç_‘”ÏŠyulNN~ŽÒByõ–vsW.ÜÄnxB9mè¯þÙ(.ŠOŸb£¯\Ö²ï9`kƒéy’(3CG“óöžÂq -g÷vÏ›úȬ”Ǧ•¯”D8à^cìå´ò^ /Å;î¾åð!ìœÙ=³ ÉrÛ½Û{aìïQ.„ù@2ÊAé,3}}#ßÊ@r8 YpxìcChqó!“)« —_œédñ¡Än/•Ò ",´•ÄØY’C°;v ’]¡ËµÞµŠo&«œ]NævC‹àu¸mÆt·ç)öA/“ °¦ÌÓíanÁëv{%>`na‘3ÆÃçãS®E8x l\ù2.s+ì奰]­,þzàʆ“]9ï§W¶á•A¼K -´bK—þ´¥ëNÖÒŒ¿·ô"y±A\ÎmñÁ¸‚(‰½"o“Úõ®æò: (ïô”ŸDí¡YÓ¥ 8ŒÓ!·=Ô}yo´ƒ éä¸÷x½¶yÓœ\”" _ä(דҹšæ²Ù ×kã·Á瓹Υ%ߌÎÁ¿ßDÌšK n‘n“é'íQ‹ŒHs»”pBþÞÊGÁ4;ÕÌG¼Å/´©ðx›–ÛTp©Z-ê\ì |èÆc+&t&î©>5‹›v6Ú‰T×Ç`2£B¾ ¶'¢+ÄöÝ + Ülø™kœ?{ñFtëèqgSð-¤Qúªµ$-4 ¾NžÓâ4Cä &®u·‚Ñçp—Í%³‹“Ì•-pµßmlp Uþ’y’b1@qÛ¹šÆ•Vìl`wHÙèq5·ö:ÁXkðÚ]£Å%h$¯ä%<¦n°\kdòe†º¦†Æ`õ9Ó$EO7ýkŸÊB¦˜ý‘[¬~s§zs¾¡4¯¢›sËÅms±R¼=mëƒÉG a ŽÉç^XÒ2Ç qqyf&fYò͹Uù55UUa)TN7ŠŠdR—h´‚ÍëôÛø—¹À ŠŠÌ™+òÛ¤j¨T×¶uøÚà“¯5ˆmî¶_îÑ‹l!6I ¯ X8T[SeiH–ARRÞR[±cçËUö€“›0V¾eåg–>Uê´¹ó\¶åör+,`—~š‡ÛgËOÒ) îK7€Ê½>VÝT] %dߨ~å|ê;ç$ùAK\–ÈKŒs˜¤Ny"‡Â¤½Å±ýÊa€®al¿Fœ‚¼ò%Pê´Ú‹Í ³!™—¯Ôoó•zŠ€fe§uVJë¡iUÝzJþ“ÏææÎÓ!x"Àø¨©ªS%»%¤á/ÌM¦5Íî%‘G{,¦/Œã¢+|ÿQóÖóʲ{ ‰Ux5¾–šjKm¬Q”ÿh(ð¹‹x{K…6¦ 3TÚÊe—wWp¤*X[°Š$ež¾ 0§ Ä[\Æ·BÙx/ñsq.ÊA"¿D_¿A@eHýa÷—³¾œ.«ËÆÍÿ´4K6¹Mï*órY¹Sðxœ¼Nü!Jn$²œ<$ï›LòÀø æ ÏÂå¶“|¯‡{£ùϺÉäŽÿ½EÇ/Ô=A–ÿEkÌkž˜——^P–[W^¬0B™ÝÏ%+—Èàe>Ÿ¿®¡¬0ÍÖ‚âKN~º3ž-Ó»[ƒ55ÕÕÕa.Þ™˜RŸÙÒR_ßÒ’Ù’’™‘büyWÔ€'jqSZggSSggZÓâÅii‹bŸ|óhC ”K\qÞ`{× rQiTÆé͹ù)Ú°lÜhá¿{Ê'ŠœÏO9ÿ6ý„o‡&®NÝll¡ð‹,¥L(YjNÍ–YÐôŒÛÓ‚*â€Dœã¸ˆóˆs’ˆ«U<ÔÖj|ÿüsv¶úÙR¶¦µð?jâÖyk¦‹ ØYâ`e‹ŸÛÇ%[Ñ”œ°8=)NâÏr•xXÁ¡ÂZ°Ímk×lã:ù¥ _Úó©l`9µÂ}ß;Y™ÊpÛ·÷²œláE/ˆ‘oä’ﯩ'”wOý{q^q4$„leÉyÂê){—¼ìKù¬Mò8ù·#Ž*·H£aÊ’˜)¬•ÿºµ5Ì-ÃoºïPDÅøÄü’¸¼¥­cybkâ¢ä¤Å‰MIÝhx¶­ê­kXÛ°ú¡%·w:k 1;žìxFÁÄÔ˜qñi£aÜÑ8mÍ‚Õ žÎ~žŸ·¯cõ–æOKÈy¦Â}- ßÊÄ|°”Ú,lªr•à´;‘ܵÄÏMQ¾ë{=^ö¡|Žàõ¹Ë¸PŸ΄S?Ÿáù|£Üóö× ŸÅä믑£”™Êô«””‹ \ðîͲÎļ3¯AœYvë‚a0…aGûe-€ óµ ÿëÑlòXlGŽ×WøýåR1×Ä¡ûbö‚|:“/xI>S–ä ߸B¹‚?L·àÁ¡SX±ò;¡Èg­4Ê1zѻ³ÑsÇ+Æ­_(´•NÊÌv㯪÷pìIƒHu)äsõ¡jzÃÃûyu‰÷ReïÕä6ê9Èh«{‚|øûµäÐGÅá ô¹Ç8ïv"³}Lþu‹AÜ×XÉ5]ßÜX0Núþ–Ÿ\¸ÕÕîÚÊÍÆç–¸9´Oæ²éΩΥ¼1'}òNnf <ù^o*Up½Ï 6–4Û»¹q=æY<²'æ;eœ” £Jœ à+Ê¿‘mB>dXs!²}¹h¶¾È%%ª?P€•\id4¨[K´êž}—ŒôÍ‘È:´uoU~3A+‰ÊyO“/0î‡k¶~ÁÊc±ztkB¬‡–æÆçJ%ÞÈY’_’Â÷ºÌö|®8ÄßEpiv°tÁý]L1Ž”/äcZ&ÿvÓ!é+xuRy:ko¾GßWŒü÷;•+£2]-‹Êy‚Ä{ûàþîçøD_D¾üüÛ©J™2x†r¿òGãåpß É½Ìœ#t}e$?“ 9ùùy¼<}ˆ,) %E€».Lfânh_Äwþ=ϵ·”Y½6©Ìæ…\¶ºŸÇã“ Îáfp­{:‹K¸XD/W–`õÚ½ÆV‡°Ú.‚%ì{0@Rey¹lv»UúשOkYçá •Èãû:N°ä‰JAá ¸îé+Êüæ‚ò Ö«é½]åÅR/PK%Ö éÑŽý—’7TH‚ºÍSJ¡Ç¨°ã DGä…¡ÜRÑeb¯šMÏ"ƒ~–?ÈéîW#/Äzª3C[ÖʱS,c“VS#æ¸Y¸0œ¶´0/kêž´þþ=MÛë CKÓ ssàp•‚•å¤å$ =°Ú¢ûþ"añ)‹ r«JÊ +ÓyÀ–de&-Úœ¶Vúž9°NÄ_ÂÍ€ï‘lqlßæêžŸ/£pÀjOɜ̔AÊvcéÜ´@r™Bá]Îê_ªõÌ%¯È¨š\‹ir%ýÜäRb ñ0Ï•z¢+ïùâL,Ú—¼ó`ÓsÓ,õR%TùʃÁŠ2_%,‚/18®áÎW’˜Õð(˜žJ~h¦rɬыì,×)X89!¡.«-µcéþÔ/A>ŸËŸÝ _GƼxK˜ù âKõ{·ÀÛðÖ£/+<¦Œ*a©Ê¡õ½Ý¯Èz`ﬞüÐÃK¾BZ ±~®xäØ23k¬•R´û—£»áìžÞ:áñë¥{aZWʦüÖÜV.¥2óÍ©ÒOUqfÑŠå’\pÐ _ÐsÛøq‹oSn–NR!„KÇJÌÑÙŽSg ¢qÞ•F…ßOþ³’$EË7êOi‹cá©…`!˜«‹Ù¬¶â”ç÷ü´Yÿ…BZ÷8•óô¢Ýíð»B#P ™èq¼ä6»–½^ÓðlCÏ\¸]f€ÄK¼Ý›V§ÝÁ§0d¹<ë^µv¯Œn7Ô à³º­.Vìâ¼–JhGÇæPojžß>j³“½èðº¡V€@‰K;Ï·ðˆyu涘†iÀ܆UÁÖîðÚ`gEc"©í^›¿´ÊV[[Wß\Ø#͆¤©æÙ“›ÆË– zh¯(ïöò-Ø%ø\>7ßiÒÂãŽy Ç»ÁH¬‡ÏÉÊœB·µ¢™bÈ6ŒE=Ù|¶š·,Ýη˜ÂŒÔÌÚ¬Z)U^¿ßëõyÊ¡*Òƒ‹ÃóZãV2‡aÄddN3ÇÄü!ÎÊJ°+JœP»2=ln0·d¯Ë8 _ÂGká]xö‰5÷™Ï î©Ú¾œk¸»g®WtÜ”žŸþd)KSÄV›P·{å¾·ín‹›;7멇¥,XêËVT`5›«låR4øýïýºis'ÄÇŽ&Aj[ærKMa8™¿¼9ÏŒAçb3vŠoxœ4š½v· æ!WÄ9J806ó÷øÆ:®¹oTÙ‡cÑ9×9™ëxœ#Öc p]ÜòRÙŠE€8[¿GÂñ{¸ÿ~¡äµ0öõÿô‹Ü‚É]€&7`­×»ÚͺNŒÍpá´.:Úxl¤!½áE“I3-N³ÒîʇT¦,U\  °Æã]ã¡»xè.öŸÞÅ(Öå…R³sòrŒÜÄt¸.;ÿ;KÏÈL\’ÙÐh7x\üþ?«.¥§™s³Ÿ|&¡Ïøüî®gø [Ùàëô0¯ÏÇ…_Σ Žù¦‘j›ÒæQ=F*ò¹¾¢tð}µ¸Ðdc™Ž…!RËù¬rø¬|ÄoG~1&Îxˆ«-â°éùSfä»òõ/6͙›X\°ðÄ{@.®ˆndTØMay#meHÄi29ÔÏL>ãÕ§ßþø–Ök¥ñŸòu¬ìö°zÞ5>_‚FlüHÇü…ZãÓ(hü*[™…/qÊÁ˜O¿ùö%ùNùìÇ?S.7N‡yæ©vûBk¼e&ã´öùå›û¸óΡ|n âHL2ñ}*ß_¬ÔQhËÛ’½A7A]c/„ ÊVeEœ5áv®“%5ç·åvø²eäó™º jÓ7[·±6äuK¥((ÍG>ˆÿpÄpÀŒâTÃS)]§œ1M*ß$zA>óOõµyùFÈ--á'¹>yåêÀòö­s6W.WNWnTUnÞ®Œ—g¿†žÞÎ-̯ïœÑ³ù‰fíàú×Íò£Š ߨ\>|ÎÌ鉄Õ+Z[%h. @˜UÕ†êÿ´_9S¥Ü4Uªœq]òKëŒÛ ËBÕkŒ­ú¿ï™0ÄsÇ€ø¡ý²M¿:\°HL%=4Ä,_ôª¬[öÎë!¯µØV'ßøìvg)'Y¡¼ºúpuCGÚÊñÊ QC” ¯Ý§\(Œ‡ cuõjæÑWÇtÄð‘Ù^ùÂ?ËŽúH4>-vIFØ\_ ÕIpøþÏÇåa™×:Ôv§¢{Ь\4ä¡’ç{Œ†ö`x¹±NïõoñhGLìèã-öØ}üçåæ$I¹Ð4£ ©°mÁ¶‡º™|¶œ‚ ölZô1h•4¢q.:mŸ@ÿîÛ„~B;éeTÃ(Üx‘ |[[²é t%â–ð¼¯I¥¤„&S,#ˆ—a€c É *7ʼD¾DäÁÜ( Ô¬kCŒš‡"e"í¥T†ý 4Ïþ¨6hÌ(°zC_ÿ*&Þ ÉQÆŒWîŽSt,ñ=å7ò1ÁQæðc&huep%µAu p»3.æ^ï"çÀ úõ«¡6'˜Èäéßï|¹åÅ„Š2¸OŽ{NŽþ—×ääê`34ÏE›e3K™[ÚêW6{篜oC^[‘¹'ä°ôº¼æe•-ͽ ËGC¼i‘2˜MT¦¬¹SNJC¶2ð'Xî¯w±½Çï ðæÙhË‹‰ŸÂGKLÁæã#X¡ïàVTU<“/U>|"$ó.+÷‡Ø¹K¨ëkßÔA³÷UãðuàˆFm=?úF°G½†µæZvS³BËð VcϾí¼ P?‡ŠÓc˜HÍLû u #Í_ÑtÀÛ¿€.ýÝxؾ…M¡Ð®ìˆnlt´DHeÄQ|î³PØ€ðþ”¹x›Ñøi êS šàsxkL§ò;lúf>ÿ‰ôáœxSOTnÀ?RâßX$Ì¿**ÌZšëêk«jBÕùÁüùs§N·Í¼ßHa|4 ëVúè£þE|òœ´f‰ò{Jµ« âœbh+í! vc¹Z'ûkʰÂu@šÝHÏÁ{~!¤×Ïu}D"¯çѬ¹¿`ÿc Ý€¼h.è,ƒTÒNµ°Ãw”Åð»ZŽfYÆ„Ji%h,öU ¤ºó’#T3ýyºaE²]A²«)_½¯8AõYÕæººêêº:s8+Ëœ›eüÉ7FüJûh½ë5ö©¿E«†B¦¾áÝ>p‘?â,lÙ_ç;æI@T™î–£¦ç×*w¸Í¼°29ðÇ֞ʌj€„bxbšS6p1w?LWçWB„šŠ¥(F˜[ªµ¤<.ÏrkŠšœí,_Ÿ–bY KaqÕ’–D¦A)ÿd2a”eaµ£Ô§rã _bOõ<KÀœ—ë°9í6°Ñþä`Ö7·ttñ]{ïõ{áYP1T„aÓÝ=ÀàtÚÁƒZÿÇwûú…pNy†;¥ Âë :ó;R0ésvóÃÄF.lÂëQÒÓy”ÝwÍÕkWmmvVó†·uJâåú¥Ûhmb0£häüö%[$yˆþÍÆ<åV ÆYbŠ¸Î·R¯;v=4}9 „Õ;½‡à&ßàxKnaUÙëÐ{çŨH€’s a4LÙSXggâ¶’®B¸”Ëf-¸"+ÝZœnMæ›’•ÿËóX ”ÉçxÈC ˆ3Ša#øËÝ|ë‡JG•#ÈÌo?±ó¾“uGR¹‘±>¥vŽQIá-6W”òÏ+1¿%s«$»ô“æ$‚Ûø©3½³`,dØrŠ X…¾y}à°/Y^€™X*Ë|¾ØÿDy†7Öoí˜V“a~÷¢-Å;Š[ a¡¿;xÖÂÑ캇`1ÄuÀ<+<s;“ŸvlqtdAƒÙ…1qÉL\ ÉK,“óÆÅA6äTÚ9 ­ßßµ¥i4Cëb?B¿•B$ƒÅ‘ËB6Áàò²¬:¯¥‹Ê¾§_<°ß´ÑiE)f¶Ûð/!"bCu¥¿XGLJW±€cÓª¶£þÎG>•H‰æ§£çóUy^ýÆå=+¤hʬ΢ NQ¬Tî#¹$¹ó=%.»ËîãÍ®)«÷¯ó»¼ŽÓ›à)"”Òâ_n`€7p¶ÁΩˆv_ÌÈ{$ñ‘•ÓŸ36Co]MS ³2·± Î†amn\¹¼L~Ä!¨x3ö#xívÄE´@}A8½2˛§;W­6¦<â´(ÑÜZÎÇËvYtGø-ž¤l•›Çö¿ (Ïo2 $Œ»âûØš‹ÇªpZŸü»¨¼È·ø̆ÙiÉqšŠŠMS q$IÆÝX]cGÍ*ô?œ…x¾™,XK!•÷ØŸz5Žj‚eéÀ7¨¬†*ó«R¤tÈ.2g3±ÈŸUžSa ·) ¡&«ÆL55,:3¤E— ^E©äuä²çÓ>3+ ’Ù“Ïäm8üP_Î §6Î÷¦C!ä:òœEÜ’µ#'ËǵÝ*wE *®µ5Á6ØÑÁ…\»%œSçñûËÜ0÷Û=¥Ì]â·rË\ôÛƒd*,w•C™«ŒÿŒ“1[’jBReZóùIÍSÑÔ\šó¸mFÆïF#4¸+ëj™8n©-}Fñú®Í5á.cO}ÚtI<¨âP "€"º?D¡²@<ǃP4ÀÔ‡0,å¶á1¡2‡ÛÄ¥ Ìh]U»›{œäºhÀ£B}lZ)Õ·©ŠÇ7]MIýH dn„h•ûàOj*‰/^’8?fÍ¡Ãëà¢0:z튉|³~Í*XY\Ï÷-oØ×;QJ-&EÕ@>§ì‹V U­æC‚7ÿ5ÂNÉÿ;¦aìD¢¯o£Zw °eMæ‡Ä¦¥q‘Dy >Z*½L|Q¹hýù™»V &y(˜àBsÏ'ú…ù`fYRM§Óat¤ 4y´zù6ÃÄ^å1ý܆œvã2X^ÖÚÆÌ5‚¹ ÌÀrKkWIâ5†GÚS6{ìß÷‚õ‘á¡f+ôkn|ÔxçJåg?ïëwÓê/ï™:Cƒ{— N·Ýhw:‹ ²Žc;eE0›)gĬô´Ì `K2«·IŸþâEL»êß ÿ_Ðý/ mïœ;òÁ{?"m€Îæ–nn/™éYÜ>‚Ôp^×@šùÌ|síòNn‹ùRÝénsUIX¨¢¼~EÂò±|«ÈVY,ÔôÉO±¿çýUàìTüÀAG°1Èq;XÃ¥ÿÓ\ú»\P#€×N‰R5Y9ÃM¹ýè°h•4j™|óƒ¿Ìí—j n‡ËnÔÒ\QÁÊ’²LŸ%X\ •PQ‡’ŠüòÜ ³? ØÔ)sn’ë-ö«”gp€Óc\«±R©>VÊ[•dK±.ÑÚ l³e ^…ö´£¦Êõ þ:`¯r­’(X‹ÁÉßÉæµ¤á©ó·W¬ÔÀŘ“Èe·A$¯ân%9BnBa1×øF€|¥lªê°²s<ÜÈ1: ɑ͗ÆÎW—\ó‡ Kî’F`~ên¼Y%Í:LBü?XÔú€h…FiõZ¹*Ç·H§«ÒQsùΦkþ=—âÛxþDOù:uÎ7Q–Ò……%°¦h0„a {Õ´ÕŸgVÍ·>a`8kþ¥L¶ÙÎNÈ÷#VÍ–í­R¯P±‘+lÕ²ÔG$åAþ˜bë“¶Ÿ¦õ…ާõM÷r¹Âom€ÿºróŽ U«ùÅéüâQ˜hú׿ø íâÛ ï羄%=úhÏ{f@ Å2PO¨4¥V‡V’«YkÔ}KtM…‰0=nîl5ßV£Ì ÜV>r ý?apilS2ZZZZ2RŒ))h7}® •õ@]±”ýÄý„+‹l”FíÀ›|Çqæ<*~Ù€LTüL-G/§ ò¢f‘iü jJ2 ½ÓÕ·¥dil>}ú^3ÿO :ávvǯ$‚ûþ~ÃOÉ)‰žo"måÄ ‹:‹G©ùL|û‚*„¼!d€OåÅDÌŒ5’ ‰ïÅwØ [kÖ¬Þ´±m¼ÉÄoøü>Ï^"LŸE—3[ƒŸ|?àÇâ{úÓ 88'V|ÿ*ùˆ üíÏÆ!ý«†¡ƒ ”àèðG*""ð2ù!>®Äþ¢bT\ŠÊÒü#啉Âíóþ‰òê·ªý K©ž«ŒJÉÞ)¥Åg#5„…—d>f1ûq½4ñÕ{ø¸ë‘y—|@btô/“_ýv@ñ#Fd0â‹Î3¶_™+h¼½Ái'ô©&ï¦R3¨ÖýAÖ¤aÊõ ²#¿…ürTx‘VŠõÍ¥¾f‡«‡ÔõÎÞãR󬞤b>BG¯`òÅò8F»Œ¬v¿‡o,´jì”7QÌhÆVOˆæ²@w)>áµÞÛùøÀo£Â“íé’+¸\ Ë©Z-&gÎóhr Àá¹QÕ¹½=™ŸQÈ­¯®(¯4BÀæsxT{ùÊËëCXÐ'¯¸¸¨¨  ?X«ÞÝ®¬­¬©¨®€Fö«ðÓl@­1“lÆ7ã‹©¢}”„ü Ca©²+®N”Xê!82BKá‰=Ðâ}ƒ3bem‘9ç"_áMÎÆAýEà™ùJºïPnIÄotˆäèáùý¨^òûß®¦±Y® Ç ’@õÁ[ÚG½*â©”ãúLRü…*%þ]†÷õkŸ¾'Áñ‘Jþ€b<£õL…É@ÃûÇóÛIm£o/ gÛ¨‡ŽÓZP2ìé}}4‘(õ†\Oô‰? ™>‘¢(y 黑 ħ«¼gÈ4[—”› jÕcʻÄèÉÚEÛ_¡R`èΠ×+¸Ào)¥Nw©Z†‹¤ïu³¨…-ÉçDœ¦QZ•7þ)„¢±¸.p߸ºSÂ/®Á›ó r—–â=kŠ©ºÚ7Gc …õDðT›—²®?ä=ðë&;˜í\eÀv6Ìùšß⌠í–oªPÚÖ@(>¢:ØÔ#ñ Æq?Ó¢«djÅÝTÒX)fB÷ý_õ7ø"è¦×¦M uzàt!£…_KŸþ“BØé'+e1PÉâ?£Pû/¢ý,ýÉ ÀÄÿ;ÀN^?4œ®Å.$¿ÜE8+nÄ?'Íoð×+økµ²M)'rÓ9ëœÜ\¶€%=/ËÁœ†â…)¤ôÂQŒù—áŒj&Ü[Ê%‚Ûîrø€}Ÿ‹¯)F¾Y°W²Ñ4Í3Ø\V·í¿† ]96›™%(CÁ)ØÝ…•F¾kº\^öš, n¯ËËE_Eqc"¿…大º½ìàONÅZ3 cÓ02òŸ`bEG¨ºkn@çìµ°Z;*wréòãóò1Aãä½&þC·ýsSÅÚ*þ´±§„VSîP>‘ïø/á@5d›ÁWdN–QT¿Oyž…Ïð.9)þWjNþO(9yª¥ þM‰y ò¯M Ë$ ¯n2íäÙž,wŽŸ‡ +7n¯‚ #Po™8bã[czÊõºnPrÌx zvæ³"AFÌjn¨œ1€9$S«â7@4ÕøëܵžVz‚ú4¶,½a±Q<0³váý“ÿxÿ¸•³Ÿ~{½|úóF19»µ÷ùM‡6Ô¶åΚwËDI\µ®góöÃö`a™Å5üÎé3'c ì3¶Î<|g…+Xæ N=lÚ¼«] Ÿ2Íœ:ÜS,®p~gëæXxò–雇¿cqÛ ·ê)TOßCƒîΘWq·ÿ+¹­Þ µïRˆÉSÔ4ÀÄt9?ú¹Ä4 ¯EñƒŸ"꽃φ½øå\­ÍÛp9˜Î%»ëJg)¼Œbó]Õ/œ^çj³ˆÎT•RdEðùexþe*¤Æ¤zŸT'2ÉE•÷¨IRC΄îRùÚT•=¤º­ø ƒ¸R ÉEáƒ/0+yCcU>)Õ\ù-Oþ)Û*]žî<´,>B…˜:þD6¶›ˆ°ˆ‰Š˜KÞEGªJI¨F;¿Û_Àm4 ë”~¶»*µ`²tQÁM±£·y×®U“ÆaVnâþŘ Ö ð›m@.€²rOÀ¸Þͮ檖òšúꦚM+ö­‡ÃpôÑg¯)0//1eIjF,dq-ÅÕuõ•MF¨røm>n[q½–‰›Ã>y_é}ž,>´s‡ûã}ß1Gbû†õFo‘EùlÂ|õF"Ûñ%7a£Ÿëy WW£ÂÛ"‘GM/J¢9?ßl®Ê¯®®ªª–ªó«ÌÆŸðhÌ*Nv8‹]%ÞR&v9*|0…)ƒNŸ#M ìÝ?ÇéæçÄÍ1¦ƒ%PT^\VàÒ©° 8?õÙü/nÙñìÓ±Ûï•ò ÅZTÊ*ß”/pùV(„tå*¿]À^ñLX"‰ Kâç&-hzÛ~(sùjý!`»¼O¤KbMáá)°4'/¯bw÷ ò :VgPn±L¼†±«^NÜz¸½o¥QüRŸ¦uHú‰­…2±H˜YtZ–á­äòG¹rI VÑ}ý‰þ%]Š”hP~£Dò$ï‘U}½Ed5žõG¼òY"FŠ:'ñŸ=ªÑVªÐ&îN¶´QHNŒÉàÆžyqÕO¶íZç Û2%ndº!ŸYüË‚e-]©=£î¾u˜¢›¿îÑ>£Xd²¦C:,iÌm„XÓ²ç%–Q#Ä/ÈÌ2såÆ^AºkÊW²µò‚óòã2“Rãgå<lš¼Eßì[æé¶÷­%Ê™’‘ӷ誩·Ë͵zr¥ï†$§y¾ñßXìâÏ-óc í¡šuÆnýÚê¼EÒ÷ Krsž2Æéç冖K¢ÒmH´˜ê[ªÛ%¹Û°¬¢ºÓ¸J¿<ˆÀðmvÕoI„Ä*îâPo4»]IÊy*g#•5tçEø³ÏÃ>'çú`~f[ðàÆOfÌ€Í Vù }A,•ƒ%öX¢c–ÉoлɛTÑÎþ\)¢þ@ “ò‡Bõꦲv«S[ÏßM\O9?ºñ©Ø;L™ª\¨Œ—Ï*?.u<ØÝ ]𭣋kËç~%—O‹•ç)ïIâßfmÿa¾»gÅŽ®ý,F?wÆBÓ¢”EÉ  f&Æ–›Wdt&w¥¬2­ŸÁzõ ûvÄõ°¿îÞ®Wªã·.jYØ3w [ _>zù”nûa÷T½øã¬©Ý£3ÅOY4š­Ö¯ß²ª§«¥«uyÃòj&Z­V½2쇔säX!>y^²)‹U%=ß*_®”®ªÄ”ù#Æpcv”é­þçº6?/텃״NãÛBÿ½/ vå£W߬œöòôW¥päКÝL¼/W93ɘyKeeæd¦4fw}þüQy·$‹xÎö ×å¨úžhwïˆæúšÆ–ÔÚÄ+&*§+NI¹È÷¸“áÞëç}ý¥|ž|îÕ_)ç)ç^sr®r•Ï“Äï;”Æ9ÇÞÙ 4ë0ˆ‰©©‰‰Í©ííÍÍíí©Í‰¸›®‹¾Ï¤õ*Ç¥XNêÓ:¢u\‡ÚÑ–¡KôQ\¹tX‚ã½½‡¢ò(Nªþ°çźèhDL7áÌ(FU$š³u6ÞÑŒó&×¢Sîä_àôÌG?e1^Ú„*)Õ@.D1SŒ7æ÷Ávrß¡ÿt×ak1꨻®W£¶AE 4¼Ä”Ô☫ñ¿EÀGlóüôUó= {TJsŒÕØÐä©QIU#°ÙY&T“1­&ºþßâcRånFø›úßs>ú¢º/“k [ñ½z@Gù×xçÁ/ÅFKÐÃ]t6w•]$oé¹ä Û¯Õ•¤õGMLlùg“ßxGOÔ ÂKHÆù§Qw¦ÿ¾F“‡Â­™â—Bh¨0‘\äç¨Ú‰bãGÔCO§× o-|l¶ z£ #O ýçáX\¤%þS¢aÚÕJ˜‘§CaTMšL¹j¥mU1\ñÜ­~‘ u;°eÛ°¡ßâŒPAù‡¨Ü;•ÃF!»]2b݉¿˜´mlH%ë•”„އ[ ¯‹}{þñ†£ï\%*D²S{7‹Æ§J!NjòGXå9qí×k‹CÂeB.í›i £U Þ#ðA÷G……>xÄí~)ÍÅÛh =Œï»‡vC|1*[ºö þÀuU"'"ö"zNÔÑØ Ô À¤ •Ê4yçÕv\lßQP‰€LŸFG Ø5/P(•BY±8U¯‰ mÆž ‘4éÈ RØÈǘò65Н¯¤Ôlê Îò~B¦Ñ¾þ|쉯iÃÇF|C6G(œL…p莫#ºqcû_ÜÊ7ò¾~4OÆŽ|Žl¼îö¸žT4…ÓðÜÔÐEዟƒÓçÚ„®$m‹FL!‹…BEÑÑÕ*b ')f8™¨ T<¶¬¿y_›gèæ ©1@5´D¤Ð˜ ¥æTœFûh߀?PÐÙ€WðiŒð†Qx³â>,d|>éNSìÆˆî PãMîÅ’8OFt[šôhjâ{}Z„äÃÐdÓ2"°>寅˜cË "^bü6gìì×PFôcÛ×àùAœ¨»,º!n-–N˜bô=ŸxAu%xý.J¢ÿÞÅ»|È“t\ê„ÿA꘴U@+‡¯ŒVMâ\FË9ŠÜn€T~ð!qŽ`ÓN£~«b€RˆFúm¼QäêèÓŸG¢ÂóMæ—&! =ÊñJûHnHþœ>b_&bfüö<÷|ãÇ“Ç/h"*¾±~D·õikn©úø¬×zì÷7ð€ÕÕï¨Rˆ1ÈG¸8¢ÓÍÍíø¼'±K®ÂÞ›„Íû#Î>®#/Ù‰,ãÒKn¢ƒã(ÁgðN”!#Gdˆ<¹_ãnóÉÑX§Zm‰i"ô+ì£ûè(u — l XÜwMm]‘ˆ–ªŠÛ¥Â,¤D‰ùç*Çíe”¤s_kžI’äm‚z;>øÄIL…ÌH ÒÆr=žB¿—Æøçõ¸ ¡° vÂ=´ÝEó'ÊG"kÇö·ND:ñ½ßÄ'¯À‡îÅ©¼Wó®L覙bä'UÀ¨Å€Ù„AAâ' gšL6m( ™‡ÙrTДF?òåqµãäÆÕ䘯!4þ„ìL.Æî y¥¾&îžØÙ;©p ¾c6à.üT÷¿7ÍËpöçÏ„]Ϭ[¯1Y½þneðÃÃÆ£T¼ [rÝÑØdš¸vûûú'ò 󏆿+Ÿü¾EB»ª€í:`V%êö¥qÒ4(j*¨- åWfËÈÈ2/x{é³²øíëòÅȃ†­ždNÌÌ¡Z5×’BJb‘Ã;Ð÷¡%4މ.¦ÝÛ„é‘·BW‘çQ)×Í»)!/˜ÙÜí]^÷ü‹•­’xóô‡ÆB~Kn}~MN8ƒ[=Y9™óÄï’Ï{ïCù·Ÿ=ò®rºô˜Š²KX½|Ðcë²n†Xá^ãeÕûK¼Â¤Ò'­SÀ±î8‹WÖ;êWyWëÛö”2HåÑú{•)Õ©£•›YYÉ~°K¾ïùnùt¹•™+…kzéBÞ¶ùúxp³½vpØ3-ã‹§j*iÒIVPâ»wãË]T`4ê€÷â{“,,ÇéT‹ógtôx>™ñïÕ$°p©<Œs¾É$ëžEžüØg%13#¿$X|lÖµ`ŠY#¥˜¥¤ ¹5Éå‰Àî3ÝÿØ}ÛçôKMPWQW9é,ƒ(¬¿"ø"_*'«‘±÷k°1b&n¥¼š:d&&%×F;=+q jÍg5œÑ+PÏä ~‡Çn´A©Õfg¢2F¹Žÿ«Œ‘¯S®—Çð×Éôÿʵò Êc’XKŠrKXQ›°©¦µr]«VBúôÊܱMïñ8mR†¦ºâNà i0¸=¯q¥¾:n”ä› ]Ž`¾QÌÿÙ[,;~‹)®„…ãæFríK&ijÕBgNm ,f‹O¼mî#5}FèY¿rU+ð êr[¡mØÜ¾}ÃÆ$®hËs j.ò€­Õ‹u6 $ÉDå¹*„ì=”LOÛø;jχ“™ªA_©”ºýYtÛJáßS®;>ãl¯T&Y$ 5ê?î<*tÇõïcû X €¼ù¨ïý€R–Á)(£9Z€Êãj#GŽ—KUÓU9Bââz•H÷º„Õ9¤ÄQ[Á‰8X ¿‚f~¯ý=]‚}6õ4Ròn aí6‹N*áz.Î~P†òí 1âøÁ„‡X<<ˆÝ‡]ˆ[öCèrÜþVã~èÅf$ãã¹tÀ}SûŸ?ÿ\Š×{{£åQò(õ*ü o·R™?¾[™‹ï[Í[7D¹0¢KÅ«cqDbq¬ p˜\Ñw(C°yø¤Â£&y(¶ÅMŠ/n0i8nnÚTSшÃÝ'ì77þ”‚ ÆÖD<8Ì©(\x5R±)øƒ»¯Ïª]‘Ñ”„õé€Ê»QþÝ_þ"ÿNþÝ•ß(¿S~wÕUxüæJùwüe  U Šá–!Š^1 ýH6ÈúùQ?õž[‡Ž~ýõ#øñÁ×?•ÄïÞ¹óòËï¸óŠËï|÷Ûoßy÷;IÌ«°„B¡¥"/ÏbÉ3Ò7U•ü›‚Š|õ~Ÿ¡¿Ï¡OñÎ÷òo†ñoÞúðã×^ûD?9|ø“O¿ùæáø¿ÃŸEaІå |®`y˜|õó‚¯<à_iMž)÷=à° "È“^徃Bžµ4¬P v_“¯~ ”aB°Øçä·€ ×dbZ]VSS]]SSV]ZZVV_»¦¶éYEù©°ÌíÜÂÌ-,ÎËZ‘¼yóòö’|~­©çÚ f•ÚV.8Ó3 [4cÅI¾Qï÷zý›³·=ðä„éwŒé~ò´V44v01·² ®ª ‡ó+s¹¹WGeŠ* *œöù¿Rq cï"†„?“î4¶•»×QþAê®à?àõ#qÒýžÌ§(Õ_#©ñC­ fªJUÀN@PêÈv ]—5W¿!*ªK€còÒ~Õ7@lNõñÎìëŸJ·Ef¨ŠêXdh¦h'*(ïQcpâLðãóÇögM¹E˜ z--÷Ëð¼‹úúðˆ–k T—VZj›L.ýØ~ Sîˆü˜G©Pßak†âƒ~ŒŽÞÎïs5×·eçÞø^øº|Æ!¹@‚/RÌÝ­Å©å$V¨v ™š§“‡äÒ¾þ—W05ÙCþžúújø+`_ˆàkñz¸E9|é6UáÒ‰7¼×øŒ¿¢—™[!cû» TW´î!’æ„¡bŠ—b3¨ªÊ•ªÏÂD $˜¹|È—ÊQüœ»ñÍïÂÁ¡:­×s+y#ì¿éZ¸Ÿ–3U¥­S Cž¥âABZQÓÆö7ìØÒ°…_ЖSp ìs|$j“‘2ÇR× ¾²"Mºžvµ“¯×÷ gÓ×ÜR»»ˆ’ЍÕEjiüD!uJié$ÌN>e%Füw´6 ÆÅBŒ3“=¥L®0À~ßJ]Ãk«ÂPÁÙêÂîtˤ­ü¬Œ’Òc–^eœ²¸‡Ü‚¸Ùùå:ÁT‘ºÜØ­U͢%(äZòJ1Xc­]%Égî60IKÌœ[˜2Y+ÓèªuµB4Gc<é-®jÚÊ–í<¿—/uù~hP¨›Q™?Î:áXæZÝP}ü¢‰g8cS®”?Jj Ê2 ò¬…|d¯Ï„rŸtPF²üÓ¨àái´ Ò®F¾ 4 ÁæöMÏi®%½¶wríL¦ÙOÆe>ìú‰ß}!?Ô}Pz6Í­|(hþ1¨ÁA1Å‘#Z"É ´┺%*¼æTßÊÅpÍu \‹ÀSrÚà¨lÆËnÃË^&çÇuøåd>â—ŸöFÀñ?hhiñ¯–‡7)g\¥\>ΤœvIÍ2£x²B;‹ORh§V:Þà=:X>o»äd“ä+õ5UuÆ×õû *¡vRÐYî.óÚVr°ZŸò%nK( ô£ÿe³^ eò}o?7~ÄÊ5ÏÖùŠÝ»yBâô±ÀîÒgçµÔqÑn¯7¤¤,ÈÃøä,ù‚·ä³Ÿÿß»¾€µÓÃijÿ}0,j‰®5šé†Þh­Ö-cû—ÀˆêÉü.W)g UnWÎÿüjù*i?n߷މ%’r°ƒ¨rPI’ªÙ«ùºÔôuZ¾pÀË Çg9“–Ü£&ާ `óP AMGf/U-#ožê¤â*¤ŸjŤ“ äÉ*&)Õ呸¤ÅÆ|( ”‹*-UIÀòÓò3Vç4p«akm÷ÓëVôƒü[&[ ÿüô9tÂÓ«ñé"@Ó§'ŒÈ >"sôiyÕ|DOr‹Ÿ{Ç ¦~rñýׇ)¿WÎ}üÛo|ø=ù\ù’ƒûråçJEÿ‘r¡"]~-75.ýú&ùù®÷¸ t¡QÄù8T>¢F>+êeüô))—|ÃáÛÀ¼PX¹F§ôêp(¢›jâöŒ@Jãš²e;µHwf;“‹œãO}ÚÌ%çøÌãåUäÚ™¡“”üQ3A+hWD¥r^YÑØÎ¥÷µzŠÆ€Z~;òÎÊhû+òqUŽ`+µsC€•zmFùS½·³bSÍn¶4À•›´)9K'ò™"ê#‘©!ºÞ;*h‰†˜ì’ ޔ1Ñ_ê5-cOµ2qš|“þ¤›¡|ñ6ÃÉ6Ä[‡Ç¾óßÝåI¸ ܆ƒsí ÃÄeøº¥ ”~A ›«KÃÀ*ƒzI~íÔfŽ2ÞKí9‹×2%[~^¹Òí°Cª`ó;<ÆUöŠ‚`6SÚH¶Ø· dúu»:°±”{GÃî³l9qE,è{MI÷ãå?èëª*·ïjY:Þ(>tï‚aÒÉdOØMˆž¬…8þºƒˆHÀ@ÁŽi|¶ ÿpל±WæõF‡º·ÊÖQ³pgñ“‚¸K¾FÐrtÏ&ß…Ì££«yO/‚½ *cçPü¥ùAô F3ìäÈß5'Eþ¾MŽndÛÐE£^=ïØjAåµVɃ(Øfot)”:óòó¬åU&ökÊt¢ VþD‡€Ù\_e+G"Ïi!~•W/@ALIÔ‘ÆÞhq4às(ëû]¼ "Ô˜kz©Ê*pô:L¶Z*K|Ü_Û»÷µ×÷>~ÿý»ïþÇ÷½f‡qôÃ><:âàÐ[xàV£èúþÅGÉH‡h…AÝ$Sûú峘ø?‚,» endstream endobj 9 0 obj <> endobj 380 0 obj <>stream xœì½xTÅ?|–°»‡,% è.ETŠ,Ué†.Ò!!ɦÞ{6e³e¶¦ï¦’Bz,½÷" EÁŠˆŠ» pNäüçÝÄîåÞëýßó=߃9îžœ3óÎ;ï¼õ7Õ݉âñx.!›|#¢B|Ãgmx¶§ºÙžrB¬Çƒ÷ñQO'Ô³ûù§ž úÜÿðñû)½ï/zŒz¦~¸oïÞÞxÞdÞTÞ ÞÞ|ÞBÞRÞ Þ:ž'χçÏ â%ò´<#¯œWÅÛÉÛË;Ã;ϻƻÁ»Í»Ûß­G·^Ýžî6Ó7°‹Œ›â.ñ  øê¨KBƒ‚F:/ó 874$j`tˆoÄÀ×}#‚#†ÊÊð¯CcBüÎðõ¸‘QñA¾Qþ˜g¿¾M†FGüú^$Ü ˆùÍsQø^d@ܯoEÃ-ßß_ߌ2üü£~}3ˆÂ#úõ½x|/~|#~Caèo£(jÔŒ™³ç¾ºpÉò×W<7jý†ž^›¼}|ýü{nºócÈO¡wÃî…3¶ÈûÑ1?ܦ¨ÁÔj(õ5ŒE¡ÆQã© Mõæ©yÂÒ©ãéy,£&^6/‡—ËËãåó x…<3ÏÂ+âóJx¥¼2,Á[x¼J,ÇÕ¼­¼^-¯ŽWO½ˆ—µˆò§ò¨mÔeê+êg^f·wœüœ’œLNeN{º¯êÜ]Ó½™ÿ:?A0V0OøšpÞ£ÉÙß9KÔOô‚h¨¨§GÏøž–žÖžö¼ÓKÔëL¯;½Çõ^ß;ª·¡÷[­\Ù¾<ÌÃ×g9²}ïÆLc³Yüïۀ?3ÙðÏdŽo¨ÃÈg×á/ì4ÆÄÜBüŽI?p³©î/êP \˜AêFF¶Ë&Šå1EL‹ÛkÎìvÖÓÍÃÙ¥ ÿâXƒšúܽÁ] ¸åjc–Û.¸-tè~IàúÓ"gOÛ·Åή¶%Î.Ìsê&ÛûM¼»7l¯˜å×Ý–á_Ÿv[îì2 ·³w;£²5öùæãѸ­Þõ;¦†y×mµ³ëõ5øÝÙø‰Ý»C#~ùꆓí!ãâ¶ÿb»ºÑöa#ë–o•2´›³K~ÔÐÄoâýxƒ‰¾åÄ,µv«µ4¿}éRëÊR+7G o\OO`6¸u ¢I YsT Š1)jë´‡Ñ ´]sHc2¡r…iª!Ò€®ÓÌ4á–ÌJU3¢™ÇÑÓ>÷Ø…’p4;Ó­F!ÚÕZ{—UÅYhí27­ÅöUï0GÍ“É8ê[³åc'ާ1[î‹Ü8î´TšÃQݤÒRŽ+•ÉÇYÌ4öU4¬hÇ/ÌÄîbkG-”SwÝ£íMŽ»i¶p”/¾pßJ¥øI¾¾Äqoµ¶yqÜ6r«BN¡Å5\NEs”·œ¢9îG«ÔÀqwe~÷п{Ä=h—¦ ּ‰8j@»,Š£VYÇáÏ/à8j„»™£Døij0Ðàf•rÔd9ÕÂQÏ`r¨©f3~èL3Gm”Jà¸=@µ¸µ wxÞ{¿ÇÅÁ؇`¾E'8j¬Ù‚¯/µãñR^îð®Äݲ£\ÛeóqoÐ0%•`2[Ûr³9®CNPÖ`ÒÍ–£´Ën<Õoïà雘¸Œw“sË€­ð|ÞöñÁ;hxñ´|dÖæ2÷eÖìEZµNƒT¬SÖDLC¬³ÑW¯Fj5Ò(7¤­”¯ÍSh PÙ‡ûªÛ}P°-Ïw‘¤ÃHÄË]Ñ¢=ŽŽ¡æ.‰xYŸ`Äár/m'ÈÞ§7˜{˜é¶2·gv‡-°’qºÅcFïpbÜî/r†o~šv—wò®ÓÉÝnƒœ]ÌXB61e±¼Û?¹Ùn;·³ 7Ûg—uøþúFfRc†÷3ýÝåŸâõ´ÄÖÏ­>;ïÒž#òW‡„/Ov/®ö <ñ0çÚe— å¸Ã 2Œ»Å¼Mâ3Ù­QŸ@Œ;ÚߊΡÖÀ=sŠhW›µ¤a/ÚN„c‡¢Pä©^žMüDøHOþéìü7×éo˜Äáö¤ kpÌb÷°jÆ$ÛXg„ãÑļê¸ÝßþÓ®·¡¢®×Óõ¸Á[Â-¨*ËK3N¬˜oNÔÊQ ,Ì×Vi«ñüÔ „Ÿ/S˜Âôw Ô…3¨‹; CzK¥4û<3“ŸeR‘ å˜ò‹KèO¾ãcõâuÑ`xèPH|w‹Ugï7L“  G!È·‹Y‡TiáÓÆamt¿D4)÷)~‰ûA* DôMÌê\ý«=5‰ڈµ^¬ÎÊWÁ´³½Q“Mb瀭w_ÛÏÎ.¶ïýš›'ù޲¦›L·)Ì€kWû?hóÙɼôEÓËõÝ6?·ãŒ`×|ß"Y€Æ&)²ß9nm,.Ë?Pt}ŽNû7†4UÉPŠMŒ Ct0’WF•f%©S‘œÕem¸ØpYŒj²¶É+s•VÅv´·)›ÿÞÊ#ã›ß+«:…çñà†£‹í|‚cV ôˆ®.Oôؘ ‘£]°qMö«Ù«Ñ«hN¼W¸OK½ŒØ1´ëêtM¢W/6¿¹£fëÁ2‹®¥>ig°$­\¿9+ù!é苨å¡mx­¥˜'Ùìæƒ6m Û³%c'ªCFdÔ–œ(;ˆ™ºÕgéÚ%k^‘¸ÜÉÉêãêi‹°õqÓa]ßË£-À“èd¶Lâ8¬Z‡OÈ9°gZÛìŒß¡mÔÖàv·hš"ÅqçÁì ð³6¢;ÌåýÖÖkxr¿q·0>Çý ’ñ<`Ÿ`°ßÞ G=çѦ¦Ç*Õ«ãpCcêvá†î5ÐÆvl0;@x>JÆ J[H¨Ûª)ë¢î tÝPH& t.p·ÐµL¶1ƒ;zó]Ë9Š×.Ë"b«2"2êuFÚå@'«j?³w¿ë^æE¬ü˜eB̲1Ð`O æ4ø$ó™Gͤ²m|Kb‘‚肼ì2 óîoTG°ÆOŒ‚‘¿6øwªc±…©‚vÑlY¶XÂ>ÇF¹Ý§œ]Þç9»&Ýï½Íldí· ÀÎté»NL)ó™»“/l¸ñ!Gµ¶]⨠X2ÃØn3™½tËHØs <.!v²ÔºÍˆŸ‰ˆ‡xtÀQÖl™7íÇNXÄ>«O2…Õa¾ñ¢­÷EžnÐZµû°p=~'5ÀlÑ48ø´Æ W£ýô§…fKiAžÒ$—¸°R51¶}v4D_bƾ¿v«k#ó‘íu·ûNήQ÷»;»6Þç;»ÖßÀè^kf.b_Xôvæ­›®·˜·ŠÝ&8»¾7ÑÙõÖ$g—ØÌHšx•[éÌ0lèwaY¿/ÄoÊ›™ÓÍLX5ïÀuÆïºG!©”9ã6Ù™£zÀ”<ãÑæö’³K¹áX¢¨ã~'ÛkØ&ݧñë6ªÕÛçtƒk93×F¹Ù¾qÆšç[gEê÷Ì—8> v·Ë˜‡ØóþÎÝ‚Õ;àÔöµ2 ØÊ—ÉìiB5›?JÔÊ´Šb2hªûðX7øô¼ú„L¶Šæ¨ ³…½ÆÏNÈ*E%(»  ßTÉḋXÏõ1[öäWp,ÉhM<6P2ÙÕò1¥1•ã¾¶JqK\V?å|J­R!ìêÔ,®iͶýÍ}ö]ðz‹™yÝ×÷˜ÛÛnÓœé·Wœ]oNwf_îðt›ã ¬ÜÛBˆƒ´f ó3g¾LÆîÆa…œbaµö=v¥QîQÃ/ÃôÿÍ0+±\¢ù†÷8¨¾·±’…ãlrJegÇÂ÷ÛV)=‘Mä¸bÌÕ:hÞÝrPc9 ïl>Hã‡|±tÞ’Jµ÷yk[7_$RJôHî=èÎÕÝòî*±]Æ~Æ7¤„” *”S–]F̤aNö€(ÂÌ~7é8•ý;׎µëÇl ߘœ^ªQ~µÑŒ‰Æãÿ¿ã"§vâ9h—ÕvP¡I'T…t úejÌD·š !äí°K ovkÓËm¦3¦HýÐ*u›åìòªÃSòý?²GÝî÷pvyû O5eÇö9Píz‰Ø<Ýî;;»n»/r&óØ»™×ð•`Ö'×Ìbù,?ú¥1“C¯1|Æyû…·%ÍÝYÞØ±ì“ìsŸLÆÎ}ý:ó,#žùÛGâ2ëÒöú]Xi¾çÄï8ìWA+²09jÄ€Ô‹$.ë'“u…,sì! ³VxF‰s²téâ5‰^ã±Ne÷°ØÉlÆÁX!Ì%jõÕú-ˆ.2ÈWJ\R l3 K ˜'òš ëòlz¾ð··h|«G‹ó¢ó®8æ;;ås={˜z:·ôìùAvÏ^Ýî@âc,5›ZKcK~žúˆ7——ÊÛÎ;Ãû¶Û¢nœ¦;y9E;Õ:}Øý¥îk»Ë–/å/ãòo ‚~‚¹‚M‚Á%Á7±Âtaž°^xNø~‚žO×ÑçzDöÈè‘Óã­¬³Ò¹ÂùKÑ‹¢å¢ "µèDÏ=s{¶ôZÕ«Îå™Þ‰½Ó{oïýõcÔãÔã^bxɈgGL±`„çˆ-#¾I9R9r÷ȇ/<öÂÂNŒòµjTê‹k^”½˜ýb틇F?=zôh¿Ñ£Ù1Nc†Œ™6féï1ƺŒ8vôØicçýP:Tú‚ÔsÜšqÅãNŒë?t|ÂøŠñ×&<>aÔĉ“&6Oš1iù$ŸIá“öOMO3yÖä³/­É÷¥Ê—ö¾<øå€—#^V¾œ÷ò›SÆN‘Miœòpê ©ÁS?œvò•ž¯Ìy%û•ÚWμòåô¡Ó'N_:=zºyú¡éW§wÌxzÆø+føÏhŸIÍô™:S73oæ¾™Gf¶Î¼1K8kú¬ÀY»gÓ³WÎÖÌ.Ý8ç™9!s.Í¥çΛ=÷ÀÜoçmœ—=oë¼ï_ zõà«?Íï?ÿåù3æ{Ì÷›Ÿ>ß‚ï={Äx¤yäxœYØ{áä…Q ³V, _tvуÅk.ŽX¼cÉ“K–NXZ¶ôÀÒw–-^¶où¬åžË·,?óús¯X‘ÿFÀ)+]WnXylÕã«üW)WÕ­úqµëêÐÕGW__ÓwÍWk§­}}í‘u=ÖÍ\·aÝõõsÖ×mˆÜв¡u£ËFxNðœáYçyÈó‚ç5OÎké¦ >n>_û<ô}Áw±oªï›²£²›~|¿~+üÒüvú}áOûOòOñ/õÓÿf`¿@Ÿ@càÁÍÔæ>›¥›çl^³9n³~sÕæ3›o Z””t1è“àQÁ‚uÁ;ƒ;Bž ™’²#ä­BÝC—…ú…æ„ ë6(lFØÚ0M؃ðÕááá­S#b#²#Ÿ ŒTFõZUµ-êvÌ̘¨Ø^±±úئØâzÅ ˆ§‹«Š»ÇÆ‹âÆ?H˜š°:¡(aOâ™$AÒkIk““’“~J~&ùåd¯äøä=)©RG¥ú¤f§^MýQÞG¾Fž,o‘w¤©Óö¤wOŸ™¾&=&½2ýAÆS£2fdè3îeöÉ”fÖgÞRЊ±ŠEŠxEžbŸ¢=«gÖš¬Ø¬²¬ÊʾÊfå{ª0•EÕ :¢úH-TOV{«3Ôùš¯´nÚÕÚDmžöX7W¨ÓëšuŒ~œÞÏj8fŒ4õ1‰MG³ûg³9Å9-¹sr—ä¦ä9çMΛ›w¹`oAGáŒÂÃæqæýæw,3-Õ–¯Š2Šö]-§—L*9Wò]iÿÒM¥ ¥Õ¥—J¯—¶—þTÊ•õ-Z6©lvÙ²2[9Uþ|¹±|ùÍòŸÊ;¶<[ñb…WÅ©Š*~ªTίD•y•Û+ß©ü²*­êýêÕ뫪W_ª¾¿upÍšÖÚ§jGÕnª®ÕÕž®ë]7¢nY]D]f]yÝκwên×÷¨]¿¬>ªþ‡ú }V5Ò³#MÖÆë÷šÜšÆ5µ6Ým~±Ù£9 9«¹²ùTóGÍ÷Zf¶¬k lIj¹ºí™í¬¼ú»v÷Þ»gÔžü½K÷^Û¼_´¿éÀÐ_œ°æàW‡ºÒj9tçðøÃGòŽ|xô¹£~GýàèOÇ\Ž <6öØìcoó?–pL{lç±Ý>Þçøã¯ßp"ô„õ¤ÿ)—S“O…œÊ=U{êêé™§ϸœyîLЙκœ}æläÙëçFžK?÷á¹ÛoözsÄ›ož}óÖùáç—÷kÛZÖæs¡×…þ&]_¨ºððâ3']|í¢ÏEíÅ}—~¸tï2}¹ÿåñ‘!q+$hŽÙ?Wš3Õ4F£Uè3óp ©ÏÕæëÌèL!Cå}bÞ…Zéc!¥‘bQHedmmeemmdeHHddˆX´ÕÀGÌ䢢ôâðà˜ÐèôjVŠ$¢S;?>h®I_¹ú ”­ÊÀAHRAJ1ÚŽ²OWí­òÉ^°™‘%û€Ö5yÛè}‰¶ÑMÍÙuy™ea’@”¸y}¬®®ØŠ¶Ò•Iùññ©ñ1b^fðÙX߀èÈôÄäà†Ìƒ 2k U´ˆ•²“…©)qI¦Œ\ 3‹&HÏQäXpx!fÆ1……押enš„ÍLä¥2Ò¢’SÄ¢ è˜P ö½nÈ©j8–¨JÕÅ …büÖ¯LAiºÌìÌ3ù§ Ëô™ðÞbQ¡¹{ûy¸¥PAjJT|š)=W"*FEŠy}øÖWÛ½¨òH^=yMz<¢G¥1¯|ÊhÎîÛ+½ÇôxŸI• ï"ol ½~—óÐÄmÒMø ˆç‚†»C˜¹Ø›_ò9UÊQ}å” OG=Í9É©È ûð?r¯D1¥ñåÅuà?ãöûº[Ä(GmRg«³¹(‡®ªn¹Òr8b„½µrÉbzÆLþ°ç×¢%4:¬k3³ ûÔXÈ æ½£­SStiê„Ù ~ˆfç ÐKFú‡oø¢“ÇwïAïÒ %Ýó’˜uš;y±DÄQ#€áϵûá`úˆU ÐÖÚ¶”ã¬ÀbàùívmÜÌ/Ö• BÌÙ“W±ê>6Ì_² ¥W¤–¤™S b—èýqØFt÷=¦Ÿ1¼É;–äÑ÷² bÑgŸOB‰`)ŒÃ3U‡Ã6Pý HúâÔ~ÐñW@U_X€ÁŒ?tœ‡‰eŸó˜œ[Ùlh,•œ¿TP-áHx¹£¤ÐÇ2xq.´j¶8¢bѤG‰ˆAî“ôÈ+§<8n|GpY —*9ÅéŒ=ÿ.>ú›ø8†ÄÇ—~‰E#WÏY,öE)UIe)Å –DÇÅ%Änºp’yì³/˜>ß¼ú)Û]â‰déñ™tó2›²!ëæ~jÒí4ÐE3 |Ñ2ÅŠ¬7ptè§ó×ÓìNþѲí†D·ödy0¹[[9Ê Ø>.” (w9•ÈÇÁÝ0ÛŸÃå;9M‹6ù%l@>ôзWÜež<ÿõ»b„µÖÀ—± TÞŠbQ›½›¿¿âÝ#è<-Ú0¯þs ª+¼üÉIz(ÿœoÕ:´–~nz±ˆã>–böè–áò„þ;¬!èaÑ_bºí:tðÍ“,Ì ÷%Ðñ3ˆçç ™€ðÏ@¬9î&^WwT&{–uç¸ XפÒs²~¨;·ëDë¹·ëÛÑ4³‘Z§±O®`]Çß7yJ\§üÙvYG=M’84ÿ=ƒA•ü™U EÿÂ.0—!¿Ð¬­K6ÑýÙAê¿Ãë7‡á0ˆÛxÊlýÙÁ|³IS—b¦E]f©ã)A—ù±—Y!?%YlVàÇ™A|ûëÔãm¨ÈÞ,å‚IïèÏ æ'+´Á…Éx‰X+OžÜ¾l­K ñ–-X’µyÒë…™9ªœœ\}¶xUj+ «r‹ËŠ*Š÷7Ûƒ>@íóÏ Eo ¯äˆàȘPäKûWe•–TˆQ¡Ú¤4ÒJ£Ú„,´(eê±Î¶9{€ÔȰñºY¥&ô%[Åg†ò…&C%V~è;•oÞ„E  Ìõ%’v3[ìzc›ö¸vÚ‰Z4ÛºrÃïƒX:‘.ô‚ƒÞøÃxIØ.ñ“ÒÃä)xyÄv4òÃrÜ'rJÁqW䔪³µBÒÚ¡_µö¬únfË:lÌ<°>è ” sÇ#iDyŸž¸Ú³Lè£v.‚ÖÎtµ©Y‡V ÿ®Ö>t´¶HȾº24PœŒˆÝÏÁ~žUš‡u6¬æ^0Y,hï'ZÛ‚íw4~‹d/ªÏÙÙŒ½RøÝPxô%¸H±é`†€/²¿]†]½A­mìž ÆÁõÈF»LF3cØ5ü_¾ÃF0:ly(™L…¯f‹Ê€Ê´-áE³¿KQ~ˮӇÄäb牻 3ã@/”)Ä–Ìä@i8Œ”°]†rP¶6»©™fžcFð÷´ê¬Žäý:M†Æy£píº®Dö3ðj‰XˆèBWAjß‚>&³³q_Í_¾ô Y™×àò3VÚÕb•þÃ3ÊQW`±`§È£õ ¬'ò嵚Žà¹Ô¨¹K @ûÀŸ‡à~ÄÎ’-„虂øÒz‰mî#%ú–r()Ü{wŽ{‰¸ßšŽ_îÇ$C‡]dÆI¥Òçé~ ”P¹Ø›¢–v4m“ù ]ãŽÍ»Ê¹OªYÿ_™¦Rª‘ i Ê\šõ²Ù¡ÅÝKJ“:s:nâÝvYÇh¾ÃÓ:énIŲÔ.[–ÕYÙlÐV¢JdíªlÎ7âgaJÅV{Uˆ£&aÇ`»m¨1ÞEX »—hz$ôt·˜ ô†š‰¶Uë_Ä~*ŒCòLq’—„l£Ù¯m‹Ø´íVÕù›ÂéŽñB46A1'³sFKIͲä—ÍN0 vš9-lB–± åË‹£iævÇB¾(?©0½ÑæÜ‚R‰-Uˆn›.gwÎVÄwÍ}9³X‰Fcw½ß=¶;6ƒóÆd¬ +dœ˜×Ù½OÛ%"Æ›¸°óÄ8R´Œ¬äõ2)ÏÃe'Œú ¸§'@ˆ¾ÑÙN¢îZ@°«™!lofžÝVp V1zx88µˆDk ð'Y¥[8êU¬×?¦ÿÛNçsTÜWCgðê·°´NÀ 7`ÂÏ»\ƒ¯W ¨uŸ”³Úe »°» ;bñ䊀ÆÇàEwª7Ñ;°`\@¡ ©Eõ3æ£ÂV ÝBoŽdú¢7Ñ®ê'è„~t˜_Z’¢—>b»!¦÷>tE6"ýcàýg<ÚÚarö˜®t´\*5_ÀZ“¸F@Ã+pù#ïξÍ:³Ï.YËÄ j šßÂþúTáǘû}`È·:è÷Ý=v&ïOÁo.ÃFÀo®š-gëòŒv/•PЌʜ (/U³%¿€u2Û‡‘ñw›??‚~B‡vú5­Ý»Pï"ÐÂLßßhú/TÄß™"‹ñ½.¨y­GQ]íqX`«õdžñúœñ:ȸ2sÅL¨*í™.áOÁjzŠézñÌb ¼¨²Ý“ØþìTñZ<ïÂDºL|B‚ãvÙšýêwQ+-ºšEŒ ÐàòHÜ9¬Î9n“»¥c(‚Õôl—ÙF`µr ¦åeàŸ„^rêbv§Áð×ø`ƒ‘@ †Sr2Ë‚»’S3±â?%§:rùØPý “ec¡0[òP>ž9a'€ÅÞ  J.X¥¶l,œ®Ò±xQ£ ôµJÛrì½yk"4Q8Žóé2O>ìX§Fì3¶¥|rÔxëRçs·4é!Ôù`–y;^=Š-«; üìǸßá6/¾#ï6ÕúíÞÚÖìÀkj6¥tõ»W•Í‘UZ‚ƒp€¸,èØÉ7&ægXåæÍ4#að ÆBÀÎØµ3w›¸Ö@íMô`¾)¡ ³¿““c´ÐÌjÛ~AsiÅñ®Òt¤&…£]ýîTAÖ \f²l@*®Bvûú2¾Ãrö‚¾îC_=ðzÏC¹XJ€;dÉxÖ4ó43‡oÏ~Úà ¿'¼F–rwË8à922_^]Dà'©±ÐÛ-4‚+Ñ›ÅÇêŠ!b‡œRb£‡ÞÚf lÏÆÒi¬lmÃô~Ý=Oñ^™H*=¡ï”’2Õ2¹ z„~ˆ4 ú>EDNïÑÆnÄC¡áÖO r  'QÂT°¤tbYmX>ØçÁ_³ç_ßr·lÆïÁËo%k•vZÜmÚ Tvi¬]¾ÚÛçqߺ[°ê'•6ÑL?f!î›oˆ´óLOæ»;ñùøfK@€ê%R)~î)èá]ëX‡q×ݲܡm¬Ú&­{†Ä¾kR‰{ú$±y¦ç%’S‚+)”V"ßöD%õ<û4(*VN1Aü ¯úz´åþqVƒÉ¬†þaV{vui”w‰F1I¥¬/?Ã(±#"xméäišÅ=¶’ùü(n¶ˆìýý\>N¤Ç½Ó%=…⨠<—á˜OíOInRæG¸×ßa±Y’É ÓMrÜö|÷`l³~‡}Oä.8’©“ëSPÐ܈e,OM³+”üˆñ,dy¢\dÔ›Œ¹Wî2Œ™qfFÚµ.5€ø Ä‡Â†<eg2P* Rã`5\ Z‡†ez労e›òT¹ê|ìT–_ÚŽU‰ÙòI~ÒŒŸïÈmRÐdwâc^²TЬÌáxÙ,cK‡²#ê ”I§³ÌbŽäÑ&ÀàõAy[¥m¿Ã¢½[¶“^ˆueOîÅœR«Ðf¡•¡ ÕrFÀòøEIÙY&ˆLȈ²5ÙYyXE¸ QŠ"3CŠ-`´Õ£½åû®–Ò"S æ¹Ù‚ yÚƒ-VcvzžR>®Ô¾€cí£Ù±O 2ƒ§n)Mž´lEd¼¢ÖRV(~Ô^ƒ½?º~oþö¦ý ,_Œ2UJ•†Ãˆœûš‡¦œ¹Œö¡Òœ=MtY_T]Q—[‹è³‡f gëÇ”¡˜-±U4£¢r;³@šìJ„ù)Âú ÖÄXM7‡Ä:Ê¥a«ÁŠÄÙJ}º8"mz²·J¡K4)ލ Œh"Ý‘$D>šxU²1è,ÀÂ"€¶‰õêA4$q’$’äz=Ú ð`¸HqßÀ/!uÉ=á1ÿmFt‹‘2.cÞ‡ùu•ävÞo—%…Ò"en†!]°Ñ3Ú‡,‹®2=˜nÚÚ$§QŽ¿Á_fN/GtyMaýñeÖÏËfÝÞËô‘œAGK}„]8Ç>2 ?¶¶É6oNŒÀñïòÓˆy½m¶ZÊë÷ïÒ—¡T•RE›õ™(ˆ7@º$щ¹æaÎD‘ùþå¨ôÚ-ÚR²Ýr<‹Âôš1½¤m«ÿžìÂLµ:S¬D›ŠÑ|´1ÚÛ×Ó3| šÅ¬÷¹1 %Þ¶•a‡ñyPX¥ ÿrn%ÚŽöÆ ‰(]Iˆœà^i‘Ì7$q)òC^åA‡cS÷¡S4Sªæd›ò?þœ•Œcù“Ø‘´Ü¼¢Ñ·É{äÛè]t¬ÙzD•§0¦j±c^~K˜k6äJÊ„•.KÌR'̨}•â:T”jöωÏO.GŨ²•¡byILQxI¸ÞÑGÍdGK¼W ã³R3$)Â,­Æ ¾Ä– PºBÙ‰Ïܢ݉¥µ¶ Ÿ9ÏŽÏZ'›˜þÖùËU-ÇÅo6­Ÿ$…F&zâ•èWZ‚§Ž(¬y{B<¥íŽäÂXf²KÅ^¶y_Ë€r(Ý/Ý-yXؤRÇÝÄSL³#…hršreV&ˈÉ*ÃÖb'Ú‚É2b²²LËd‹^œè¸cQŒÕy ºÃ§ï¥Ø%çn´¶øc ½[ ÌLY4Ï‘Ë"çûV…û|ÕÚÆDóÿ~MÍÇJ™ØOåRe§%H:pÌ´»±IêÅ*ÅÄpwK—!m“J é„á•á•5•Øé‚Ñc†UÆÔ„‰#C##¡’tÆ£Mˆ#ë8Ãy$6dé3pøõ™œÂÂóžœJŸ›®Vèu¸Ã Ä1 ‹–|‹pÍ®üP[Úµ± !ÛOÉö^-–£CfvZ^jQ4¢å1±ñ!-É¥’rtD¿­~ÿö𷳫sá¡.zBåÞ]tÐDzò¸cHÐò. ªÐîBͨ°«ÛMö^9ê ’Ur%)DP'.¤¸DPoxRò œ‘¸mØØŠÚe‰ô•aØ–< öù=ø 3÷ƒœ2$‘é"ÙG¥ùçv™•i ´uXÑ—wå °+ÖNœ;€¤ ×­ó6áÄ÷íÌoÂ'.¬Î` ?kç×54çX»p™É¢ÕQ<—ö-ÐÉ× Üj÷Çè¨,vViîÖ£ ë³/ÌïîÏ!ü%®×·0ôŸ±nçxëZÛþ^ý{³©þ@­—ƒÕ·yý‹V†^dùÌ`1GM'‹p4Ê©¾À—ÁP+| ÚsÁÐÂ×id3ØT¬ô\Æôb_À è01ç¬Ò0ŽûPæçI—$·†z ò ÜQPsŸÊ>ÃöY´nHÓç½OËo~.U7 SžOÜ }þø,–?9d(Û]üñØ¥®|Ý.+±¦±©jE$™‡#»q„Ù"1è ƒ‰Ê0‡Áƒðwÿxh B¯ÉJq¤nï„ Ãçðõ!X•€‚¥ãv1#~ÜuõC Ö„+ýôð#YšðÔrŠÖè×!¯<]ž;È„²Õ´(Yù‹=ÍÌ®Ý'Þ‡mÙ±GM,©‚8ÉiÚðØàŒpD‡)êÎIÓ¼_«îž;dΰe&t7H”°mb’ÆE¤˜‡†Ð rv_æ—@2$1jìë`¨¿Krô&(5í@ûËZ†l6{Qù~kö˜×…u†+H¬Wé³ÄYš$MÚŒÖNé>¨*LEó±ã(DqêŒäTl»6ûb3L¯6ß”à ù»—(Ír´€f_έ{õ;±è˜’„Äšã)†uÐf®{À«¤ ÷ß#ʬ«øðÉ “|ãžv³‚ÿO ÄAìŸMЫJ5[ØK|S’IQˆcG{’fó¥#ñ…B&cÚ5YðDíÂÅÝÝò{ytWÏàµ}Að¤à$“)í‰ð¿:© AâºÞiRÕ$Ôl¢?e]ùvÜ':X¶G[–‚žÈR|¯±È_ÝY‰Ôh[°«‘û«Jäç$@”龺Á'Øúf;?Ûn5H¶<$G(y×*¥O½Ìß¶*ž¤Ï6“ȳ³—ú?ôrCNéí#$%5î s*îa ãÊwø‹4ôêÔ‰^¶Üœ~¿m?G=)§Œ¤ÒØOÔlFA¿™¾A0U,IýkLi‡‰¼†×þÈwt‚ÖíÛ-l­mifpIv‘PpO= 3~ȬØsç(ÓÝ\[×°­«÷xM(˜º³{‰Ù‚×å@™L‘è‡Å°¸µÇ}Þ‡þ{²¥üØà9l܈´Öx´1>ø±o±¡£†æÊ©¢J‰‹Ú9ÿÞØ  0ml×pG˜-JRï ÓÃ?Jâþpw In²‡êk²ºÅñ|Z(VÀ…ëvE‡_¹)“%Éc“Ó#P2RêåˆI N‰)KÜŠ»5§å<ˆçÏÄ "ur¸à¯Í…ÆÜIkg¨Ñøì86Û 7Xå^©'è€:²Piæ =+xŽ}fê`Ìh ël³Š²èÌœ,‹˜iUñ š d²c€('¢ÞÅÑTD'‡ð³{˜öµÙ?Âxb¾²î‚«_þÈŒ9wÛ>tʬjÆmì d¢,ªÁ¡êkŽû˜8}÷È5ý ’ˆ ´3¤,<ÚpW±gm3ªÂËÿI²Óä´1Óí²ÊøÚ¤ T‰Z ëïÙóPöxö‰ÃÚeˆŽ^½&!E£¨Â°2b3¹¢›ð©Wk[Z„Vx¤, E•µ¥Ç$èrrsúgï+>W—kLªì4¬ËUé¹:-Na©´ñÉ^Xu®¨«‹:A— ±(¼<¦ºº¼¼º:fKxxLt¸XÄŒfžd\ñu4û$Ó‡ÿ=ÉÂÿ_dú²O0c$"FÂP¬+ÁÿxlwVÌÈð1#¹Ç81%¢)Â𨄴,‹ò2TŽê+KnlÁq *-ÈÍ#¥¼ÇÈù qD01ÛUª,µÑéYE;%ï¿\V¶Æka wR~š¥4»0GŒŒ£F‡ÿP6]TžßXQŸ1]¼4‰ï‘èмgsØ.ÔˆJr›êôñæ˜*Rœ ,ò »ôG> hÂ<9™eǰwJ½œZÍqáãY9µ†NÅæDüáý&µØñCçáóí 9È[‰ÿÀÑ‘ãÓp0ù‘þ›¼"›š[*Zvï-ó ‹^ß»áøñ={ŸØ¸÷õ×7lX.þ–fÀ¯°4yȬחØ7nØ×ñÏd? ‰K:ÑXP[JPC&Z‡VDFmð[+óõBkif”ÉþD#Û*I¢²;47„$ˆE°J3ðÉ»¤|a•ÊC“}‚=IÛhÙº«Ž°66¢}ôù¥¥«§„® §˜åbÚ¾QáPY$KÈ‘-&«@2©r*GkÔfãé¨<¬\öÚÆ”ÉfDò‹˜ b ‘œR¤“íH2ÿ¿b`eܯ7`s ¾^ì/•~xzß% :µnk žÕm©@µô¶À-+Ç…­MP’JŸN*-!*2?»¨&§ÑE[2ÂqdÄí”ÉXÖ ¸q?’êžUªBülE6vÍr ì) ž*Ÿµ…”¦µáa„•†ÕTW×Ô„W‡††‡‡†V‡×HDyÉ1á1ÉÁ’X$7„åefª2Qj•¼XÑ€è³ûêwoªô–¤£tM†š®º€¼G˜ü"c@ˆEºôͶ¯­ Ry«³2´IE–T(‘=[Òˆ—SÆÌÊœ]Œ¦™ !™E#©-°Å‹Ä¡ÌưðÔu (ÕQ~Ú¥è~»¬*·ÔÐP» rW;E}å"Ðiùö̉=,$0XÔ 9uÈ.ä°8ÒB²\®vHþ6ÇCöå/Ê)¼ôÒŽL±/GûŠêèœulüyÈ® Û†ûCø˜¨(¶aB»ˆ|&5äd> û¤Ñð Ú”òNõìâ±ËP Ã~ø/KУtå!¡©i9BÌ«|{ªŠ”ÇI*cb" È‘JÞC"Ø?ÐŒ@ÀaiIw òZ»ß&»ÛÂÅr@ ‰dÁ“ìÀ¶,{ˆiÏÀáˆ-ü Üú×ÀÜþf3À“cZÛ¢Ž ?Ù™aÛÜxt-@‹J2×Iþ ~·zí‹7Ø;rÙ2ß“­b´ßRkÝÖzÚxí¦÷ ³3ôéªLñF!ŠÔD¦D¤'Ä&F%¬ X¸MA£ÛßFGÑ.smU]ey ÚN7Gä$ÆÅ¦F‰QŠNaÈ¢ Y:J¢cmÄ`n`å}ÔêØ‚f/{@ä[‚4„JÐ(~yºY•Ù×l¸(MòZÄ>6žŸ’®ÎÂaH†)3å¢}y.Íe' þm@ê#"Dÿ— G‹<’è‘;£RЯ@µ“Y›÷ 2Äá+9õÖ¿*Âù€ ]¡XBEBJ¼º ã«ðÀH3T凑MMî¾²0-/ØÑçˆ1HÊüÐú“±ß j’³9ûgâÇÖ Ž-ËDøízõiì)@9’´Óòø×ˆie~êÜluHé‘X _?Îô'16I^æ¨rª™5â*T’nIÚí™»-Fã"†Ã)¡· Cov¥*?"ûÉüRI%(‹Ä&pÂ&L[a~yI™Ÿ&a£rylj¦Až+… 2}VF¯Ao u[2vСãœSžW°‚?¿Ëô- Kå›'^}Fç|B‡ðÓ–®ß¼Ñ+ç6ùQZôìÒ¯‘Kâ\ ­Œ¬©©¬¬©‰¬ Œ ÿ)j@ bÑnA]SCÃöZ:©Œï›¸9NXPêSL'Æò[B›ƒëd´è vßö½Í;è¸B¾,, BæÐXåSKǦð›}·m¨]G‹‚“ãÑ;sL)#óJ§ üË9 çP ݽÍWüè (Lþ->¨ô¯ ?úÀso ÿj2èÎÙø5¿ÄÀ0ɤü3ÛÖØéì öI6ŒÁHØg˜õÆ]o¾xŠÉs³rð´3ÝQ9D*-&mÕ‚cY Že.úÚÁÊ‘àNhï¬À‘ͼÄß~ªìÄ›—%®€ð/0S™~̬Ÿ3@òÇ ]]û¹:DvQ¾ªH ÍzT£7£Ch—¦6qGtA2 §g òã7±ö¢5éªj›±=-))“ˆÊãŠÂÄáhmBx-JÍ ,[‚ƢɋыhEePM-Z±9t=ò¤Ç}ö3€y¶•¡Ä¨!©*¤Ò§aŽV†âQ„:R…=Mš& … 3¶ye¦ò‚âÊäšÌè3tí8úíOÞRGgç•™ ±sš­2¥2 Óê)AaUéŪu¡Å¢øðÈ5r”®K7)Næ¬Cgè#‘MXX›‹ªŠŠÓ*½&Ú¹™΂£\Í ª(k8Y€Wb®Òà›…0ù{à/¹|Õ.KŒÍŒF‘´_…l‡øŸÛ]Fwbúÿ!Я@ÿ&DEôgG~ɱSêß÷<þ¿[A©4•ø‹!˜=™Ê¬ šä‹X„¨©Ùk`ϯ“ú¦ eäd‘éµ:ýÝÇ|ƒAŸHKäXÈ/­ÒN7Ù£MœÔÙâ99Åvã;TA£‘•°ñP£LSV6"  dp$»Ëdú3;óŽš ‡>fKI›ÇˆS±ÏJ§§²¾FGÕ¡Œ\L—þéhFÀtã›LÚld‚÷ž ïI>}ín+Q¢F‘B¿Æ> ïÃ?<.Sç¸n3½ø£Ö„Œx¾ÿ wpRªraj¬8rÛºdfŽ1αd$BT]PQPB‹ò‹* VÔ˜yiyqØ=¯¬¨ª"GÔÅ“"^’uhÓÆ(…ëÄ“ÊÿÛ4ÒDÂãcsˆ^‡Çb‹ïY¬Ò±¯’üw'ŽCC¿?sü_9^CŽ—:ŽßýHGÓrÖ¸èѯ_Xö÷‡Œ[¥Ø¥Ùš¹U¹ @w¶¢ïð‹³a*/´:áJíÛ·µÍÛ‚Ž£-M˜ [ЩŒÂ &E™O[‹q›¶1ȸּÍ@¯®E¯¡™Aïm¦E×Jc'Z³6F†-`4V÷‘é{U´Â§Q(hœX.ýrd¹è/Ï,§Eyî9-úÏ4ý;§7’ó;î’ s·¬Äê4½]ƾË7%ç(òP.Ê1eÑ?0š;¬öW÷L€tJ—SÌe¾csÅó0“Ã>ånù»“Éa#܆\È5’Ek”ÉX~Z„&ƒäzjñ­:«” dŒœÚ¯Ëû޼Èd‰sØ9ü”@ǧ‡D¤!ºÀáý2³‰OЕ´Eôÿÿæ‘G߈éK°òöä4ç*^÷C5i’tˆìx6#‘D²%¢íö NLŠ£ØÂ¨&¥YSŒ6°1C޾¢äDP“µãp $¬ˆè9ÇÎDØCö7érúŸßHüßä@Hݱ e&LÚeåHûyI$- „:@?xUÒî‡9ôþð¾! „[æè&•YmÎ@)´(ÀK!| ²ÃþÉAUcv ɱ'a‘l0í2ôGN¿üîϘˆÇDô²¬0 ¦@t»“iâzX;hM´7ì\y‘ĵ2Ùiº£⋞Õ:`êv@90Òdµ+*±žt!°(ñÇhgšYÉ–ª5l8›ÇO—§gÊU¤tæ8‹š8™ßtVÌðƒr·®Fl› 'ü;¶£^à"øÜ›SÁ`ÑLé<¸ hÇK+vVøëÓðâ®CL!Ó¨5²!L lhNbT˜ï¡Rû6"´›ÞŸ´Í7$Ö.ʉåYv/!Ž n©‹ÒQLbÖ$´Åþ§{…¡ÎñoZÆTšK°œ F@‹"‘q”‘Ža—T«ù†=µ×¯jiF‡ØUì]¾YŸŠ}‰®`¥#‡³½ÆI^G«ë6L)5‡!: -,j>3ÜÿCf‘{3 bœ<¾cûo¥™)Ìq~®ÅT„òèœLSÌ_œ‹#†ª¤Dô7ÉŽ+¸Ó£Ÿ[>ͻȂö„ͱ(^³c£¬€¬YgdÉ‘?&µµMKHgÊ öØŽÃÑ ñ,X‚9ýÄTd%‡c}e»ð{²ÃÿdIf悯Žé=K*ÜÐ>lGÅþ‰Ky0ø³6ölŸTÕñÇlû-•C{3r*z‚S<ÈÖ^»MÅŸ ˆt“¬Àoɶk熞ăÚçîA‡k¡ë’v080•rÈ·™œ@GðfˆÈrH=Ÿ|ìNþÚŽ€ì GT hQËŸ“‰]  åèc”k°ãÕˆçJ‹¶m¯-:…ZЮ˜úUeë!Œ(ÕñS3ò‰ucɧ ÿ:3R‚N$ Ü`]W9 ½‚Vø{¯Ô§™² 4ô#U—hÑ?U_úcy鯪KÊl…!EG'&† J)GpºÚxf( VD‘g‘XÃÝRN”N== ›~þÄ>ýc‡k S(QÚ«\|xþ,<ÿ¹ÀW»I¹‚e|ÅöØCˆÞ‰¬eµ{ÿbh°ç›êOÜoXo“`ÄÜ [¤ÚeûyTŸ¿³¢´½’ ~äJ€Ýb;r¤&çøëd'1š`ï,÷Ìýûö|à†¤Ù Ø˜±†®VñË®4•ÃQŽCxŸ^äÂJ´ùÁ“@›$Õ~—@¶ïÊ€o_Éæ.BÈU`ßN`) NýGm"{©`v{v¿…W\a™MH'øJ¬ñ@[ØÏ¯²¿`†Ox-¡t}¦AI7‘¯Ãb¨GF”ƒÿCz€’`¶Èy¦Ý‰V9‰C?+'Ó G!(•œ¢‰H½7•¡Ë4*éÏ8®…¨¼î2™Ò@ÂX;ùÙÈ{ˆtv#Lìª#A|¯s8éFšNB$W„ì¹#C ûa!"Çv¦Û@Ѹ߹[$HûUÐŒ€í†¡Ãƒ :‘r‰d!-¤Šé©Œ„Ÿ•›©K%‚]¸O²SíŽT*AYZ…1‹¾ÍöêjNDt4Õ9ííka(­R=&þ˜G3„ÇUÊq³5‚ìG¶DGÑþèºFuyéî™h>zÍK1‡òüä«ÍAKÐkkRÇÓ[Sùy§ö5Aô1´[–ÿÆ5+tˆ}VȤHþŠº“–?&`Húåø‹oÿ} „þ}äïþ¦Ú¿[èŠùþ?¸w÷ÏòËÿõæ]G~ú§ßÂÀÿClGÍ%Kßãf³œjÂ,#“ÙËû±M\ôçðûß⮑¤ 0åKh˜`•XÕû|‚#­‡Ý¿òSçæ[ìjI8GÛšúžÙ›š ËÍON22€þž”Iow¡tÉнÀûI°ŸËëa ÙɃÈ)oü?rXìT¾ùW /ÓvÐ¶ÌØén ÁB>a1ùDŽ€îK\â—=í0ð$ñIl'Ûz‡‘1œó rI¶í!@iB&Î=¦†,„TÚY† Æ0­Ž?3õ°6|b/C›˜r;Ö Võ_í,ê<1±sW"7eWÕïöT‰fí¨¨þd’ ñ¨±kJÔN™»¥c–¤'a=œ$è–”Só2;wkÖî@VTLŽàƒƒV–•…(rð%9eËå+(ϳP&KCU°©K„?*ÃqØÙêÈÆö0®äð.‚ÊüÀ£m~Fç±.Uä™]þÑ¢µÓ½6‘ p·863Þ%\o·wäˆAf76“t^Òt±%-B":ÑØxBœ‹š9ˆ®ÈÎ/(HË“d¡ Y< ž~[.µí5ÕKv â˜ü輄¼Ä-ˆ.,Í©mYÚ2uöŸå ô‹VûÇæ/ÀȾÁãQ E³"âÞÀŽüÒÆL?ô&:VÛXïà:ù“w€$¡¬ÓÃÅÆÏ'Ì7q¢_÷²•@ 0}+–9uB¼íÞS¾ÍÙÇØâÙü÷»v¹–ÆEÆÆ…":)üS¨„ êsHœ¤HTÇ¡T¡Uhiµš_ì¯ÝˆBáÜ­Gùƒƒ Çã¶glɨLÉ‹BttZ|üæS‹n0½o|Ɉî¾tt„„ÁèùE[Mù°“ûHü°“n£@T‚vé¶cn6ìOúOG}…+Æ0ý¿ýî3“éésÅ#!!%AŒ¢ÌÉeòÚĆ$4‚ö:ÛíÅé©W~‹6D¿!^ (¨©:÷&¢wåE'KD -¬«08²-m¡÷fï…bÑÙf¯•¯®‹xmezn‹D„®êvŠ·¡F²ò.,Å'ºÖFô:±¶ym!–[k8bE‡ÑÅ€ml_´ ¥&ÛYfúLú>lÊD­Fá|µ^¥oSó«4y)(–f· ‘JF¬†Pó3U*…$Z(B¾ÊLªæ«Ôj•…kÕüíívlL¶k4´N‡ªøµN)ŽÖñýõFd¥™r!Ú™£oÖÓ[t|ƒNgà Óñ7k|4>X=µ›A0Jì|‰kÔü&U®ùÒϰAw:ß,ÿ³7½~ûæVx3Þdq¾Y@iØo)Ýýg”ÆüBé“LPÔˆcq'XAdìÅ}Lܮ˰šsÍ( ûN?ýIŽvçˆÔƒÇô)|âfÏêh•ª $$îõ²( Q¬Já>®ûIÑØ Ò*•(É ÄÍ@ÿ$\ÇÚ#ø~ 0?ö-±ÄáÈ5Ëd¿¡ÇþÇ<:·¹=EpBW¡‡ìGmvö0ðCSZMJ;¸”l¾¬²£ðA-*ætlܳç 컸‰e#–Èžúp"¡¢»Ù˜OŸæ¨4 oœÙÂ>ÉÇaÃ=8 ÉÉq&À_¾FÎ%ä¨Ý¤»^¤øfvékÿ[GiÀ>œd\“ˆ¢Pr×0hÑ.]5Õ:…81s}F¸šÖÆó±Û¯—kø…¦L/ +¢rV° »iØI¡34|%R©%ñÂÿSÞ{ÀIUãƒxgŽ^[Ô¨uÆŠ A]5EPAšô&°Ì¶°½Ì–Ù6홾;»;3Û{eaé]ÙK@Á¨ØÐhŒQc®æ¢ûžç¹w F4ä—üÿïû~^ùäfvæÞsÎ=åéÏ÷gSK¯ô5:Íi×›‚ òJVÂoË¥F&]««m¬o¨ÖQ—3Ç k©Ñïú2’x\c5óÆJ㜡4­¥Æ¹æâ²:Y)6Ol}(ÙÔ@¨eÒ%º—šé£!&&ÏÄÄ,s¾)·*¿ººª*d‡Òõ¢lÐ(ŠIÔ[Àêqø¬üË\`EE¦ÌÕù­†0ÔùÃ5­ÞV8Τa:±ÕÕúËó"z-Äê+ñçU kª«ÌõɆ””·ÒZì@ßy›½ÊæwpÆÂYVNqfé³¥«+Ïi]e+·À2vîÇIqÈ>›”6HIp_è¸Tîñ²pc¸ÌOBÈIýòe4wŽéÒ傚¸l +1îa:ë ôÃÉ#„A¸†Iý*p âÊ—@©Ãb+6-ÏŠ/B0/o©Ïê-u+Ì*ÊNë,¬4l‚Ƶµ›(ùOº« ¸OG`#€ÿø cU§vK‘†¿°7™:4›‡FñX&.O_ÃIWèáVæ©–”e÷@#«ðøýë½ÍÕasM´^”~«+ð¹ŠøxKì…V&ÒUZËìeè—wUp‰¤*PSé·ú‹ òmAaNA‰§¸Œ³BIÿñ‹q/JäA"»D_¿ƒ€ÊúÃæ+.g·}%8œ§•«ÿiiæl&rÞYæá´òÁívWq5µ­°¶8À =ò7 f3þÁæ4c¬“4Zëöº¨E{¹%À&Km)&ðaªœ­”vèD­Ä^Š£wûŠ˜(ÖÚ,Ê®"o!; k´>ÄÙÇrûxÇCûtn¿Ò¨­¬´üâÃÏ`qÚ²ºëÀN–W-<8ï©Ù0C±ç šs`N‰5ÎÎפÀc­ç D3ÿWÍu:¾pA«'ÎUâÂÔÖL]/’™ÒEE)v‡Ÿè²—y`6Ý+\+ Õç 8ÝP y°úðv,¬SÏÄØ`a94Ak}U3ÔÂêÂà4Öè,:"˜ýQx˜‹VÀXÔiÚ’ÅÄe™+SÍ©|ËdU–øLáÒVa?\À 7åQ=¹äÃ&¸ eÄÙŽG¤B®3AžÇÚîP‘,$²‚à…$àp,›Á¢÷uàow>žèÀn O=®t Äé A­áûAáKÔ2ÊsyP°Ù(dapÑã=Ôþ@ö/4î"WâÀxJ›5N¿±ÂŽu¢Y¢ÓY¬hj×{‹[—Tf¹‹ƒ´8›¸¤ ¡SO(m·âë"\‘zäoF9,‡1Æ”bÊ ¤ö*À Ži62 –¹bz”8‹<Öµ^u*?º®ó7@[“Ö…YCM8á£ÉêÄ;‘sV‘…äC£QüÁ¼áxÜ^ Ûë±ÞHþ³f™ãcÖð5ϦÅÄjÓúg–ÄŤ”åÖ–W*ôPfóqÊÊ)2x˜×ë«­/+LÓC¥ ¸Àœ“ŸîˆemZWK º:‡8ygbJ]fss]]ssf}JJfFŠþçMQƒ–¨øÆ´ÎÎÆÆÎÎ´Æøø´´x½Ø' Ÿ ó—rj€'Î(cïëDNª3õòd­)7ßlˆÔùm~+WZøïî2ÿé$çóÓHÎ?¾M?íÛQºiëR·é›aK0ô K)JVšR³e4>o€]é~A!q@$Î~ŠÄ¹‰Ä9ˆÄÕ( ^jjT¼þ9;[ùŒ—lC¶*µð?jôâŽ%ëçè‹ ØQbgeñ‚×…¾ÙêÆä¸øô¤ïËYâf B…¥Ã6wnX¿“Ëä×€tMÏg’ŽåÔcž~h†<ägàîßÏr²…dAº¨¹Ú¦†‚Ɇ“wþèÁÎvç®6v8¶ÿÓƒˆ¡}Z`.›ë˜íXÉsÆž_àjÖ`ÏyRQ+—ÆèĆ’&[7W®'>/‰Ç÷EýMžlH†ñ%ËÎà+J¿’¬B>dXr!²½¹¨¶¾Â)%Šß“ƒ•Li¤4(¬%R1ϾOJú¶¨ëÞ%ÿjª<É Ê—<7Jº\¶¬ßñgV%ˆá -q=° š›^*õ—x '!¿$…óºÌö|.8Ä_2y!°±‰ïKI÷âk/^„–'ï8s”§]Ùö•®BON°° ØÚ¢Mk š?›5X·f$˜5›ÚÉi l¿oÖDƒÜ¦Yëx2?–Ud¿µZð„uœ®³mC £W'é–nDwݲ+¾/y/¯¡”zˆLwøöTʉô9®¸bœåuæ”y3œ6o¡éÞ(XÉ’-Ùy¹Åm½zh,ë®ÿÏcPÿ7Ì û¹),ë…m°—Õµå´nÄðŸ Ý)iïþ£|aÌË_òìÊ•q± ë™<‹áólƒ ^7oêúEÓßÁ¤;uÒ°Z7¾up¦|^‰Ýùñ›U["am D„ ˜0jüztõxäsã`Ät'¼ê)ž‹M¶ª•Éæ˜x=dºŒUqñãÓŒ0V¾Ê)HmßÚ·Þ¡–Á’É7ˆ/ó­Ñè‘…ùù|&_ùÖ£é÷ÀªÎÖׯõÆïäÁ¡Oákö߰쉿hÚ“–뤛I7îÓ×@ ÏŸå˪¶p–Z¬©ë^Ñ4Ï _óä'Ц2›Ö,]:U®ç‚ﲬ´DðJAɤÈ9‚ЙŒÆ†š°g´CWNÇôæy¡p “?ËàÒìja岇Ÿº˜¬']Á×´LºtëQ×ðûéå鬽I°{ŸüPÖóß—õò\y‚$Ê#¤©>ÛGu¿Ä7ú¦ãÒuG¥KgËeòÐyòÃòoõ×Á˜—“{™)Gèžôú8~''rÒåÒÍÒiîÉ /7È<ðxa2÷Bû Îù÷½ÔÞ\fñX Å`2-ç„´Å%xÝn¯jí.a—ºçr²˜ÀÉ"Z¹²‹ÇæÑ·Ø…u¶P$°“ ƒ¤ó²rYm6‹á_§N<§f_A€/®Dß7Éq‚%Oør‡Ã•âž¾¤Ìo® ÈŸb½šÞ{\,å¥TÅZ!<Ú·ÿ¥ä %$Aaó”R@ÑcTØñ6‚ˆ#ðÂ+‘n)Ñeb¯’Mφü*"$}"Ñݧx^õT£#ƒ׬åoϲŒM\Zuµ0ÀÅB…¡´•…yY³÷¥õ÷ïkÜU[\™V˜›«»³,,'-'õufÍÉ+…øGR2V@äV•”V¦ûó€%de&­Ø–¶Áð<x£4„¿„‹+'lqRß¶pÏÏ—Q8l±¥dÎ`òy—“±t®Z ¸ÌGÁÐGø—j=rÉ*2þ'›+ž6WÒÏm.9J KœéÁgºò¿ÀÄ¢É/<lnNbZb½¹ÎP UÞò@ ¢Ì[ mà‹ó&&×ß÷z³èžã³ÉÍ—¯^0a…å:‹7'ÄÕfµ¦v¬<”úH—qú³¤+áøÄWî 1ŸN|µnÿvxÞ~ò5ÙÀ“)ãKXª|o‡]hù`ïë’Ø{ëf<öøÊǯ7¬„h< r¬™™Õ–JC+´ûV¡¹áž±Þ5õé[ Áœ®”­ù-¹-œJeæ›R ?]ÄùE«W¤‚#:éòž»§LŽ¿[n8C…Naìk0GgnYx‰Ä}Wú0ù/r’!Rº]{V^œÏ.Ÿ ËÁ.fµX‹S^JÜ÷ãaý i=h_¡—/ÑŠ6—Ý£ï² =v1,g¢ÛþªKØæl{-´¾þÅúž8q»V‰æX š7-›oaÈrÙxѵvÃ~;è].¨ÀkqYœ¬Ø)Äx̕Ў†Í ÎX?%´´}ü6{ÅîqAþ§zŸwùqÓºÌQõs€¹tk-Ý¡ Ί† Œ¤¶y¬¾Ò*kXMMm]Sa}”a!$Í6ÍËžoœ,[Òi¡½¢¼ÛÃY°Sð:½.ÎiÓÂÓö%˧¸@O,n»×ÁÊB·¥¢™¬ËÖM„=Ù|·š¶¯ÜÅ·¨ÂŒÔÌš¬Cª<>ŸÇãu—CT¤âCKZbÖ2»nDedÎ1EEÝca%8%(áS™2Õ›š³7fƒ/à“ ð>¼øÌúÌ«÷UíZÅ%ܽó7É®J/MŸYÊÒd±Å*Ôî]sà]`{[c/ÎzöqC¬ôf+*°˜LUÖrC-Ô{ýïÃÚ9‹§ÆF5L‡ÔÖÌUæêÂP2ySž Χùfläßp;h5{m.+,A¬"ˆ±—,³£oæþ\rߢ aŒYãØè`ÎS~Žh·ÕÏe pI+%'Èfb¬E¼¸Sm¸þÑÆH²ZèûúÜÆ —`t•ú¡‡I :Øàñ¬s±®Ó}3œ8mŒŒ´c<6Â!oxÅhTÖLõÓ¬±9ó!•É+e'HE¬w{Ö»©7µbûq+z±6/˜š“—£ç*¦ÝiwÚøÿÛXzFfbBf}ƒ\àvòøÿ,\LO3åfÏ|>®Opo×óü„­©÷vº™Çëåį÷ÑTûRã8eLiƒû¨½Gù\^‘;8_-.4ZY¦}ð`ˆ4r¾kí^ _ñ› Ÿß¬…é…óãb‹8jnþ¬y9n½tëkº#‹fñn‹ –ŸÞ¤ááÐŒ‹¹È-¯'V†@œF£]ṳ̀ó~ÿÜ»¼³e˜aÊgü*»Ý¬ŽO×í3@~œ}éruðé”~­µÌÌ8ëHÔg_óªtŸtáÓ’¯ÓÏ…%¦Ù6ÛrK¬y>ã´æàªmGý±ó¾‘|o â"HL2r>•ï+Vj/´æmÏÞl·BmC/¡ÊZeY\0õ.“%5å·ævx³eäóºjÒ7Û¸¥&è±J %PPšxÿÃÃÓ‹³uϦ»›ÿórzXæñ¶Þ'k5ÉWŽx¬ä`¾S×­Ò×j=žS#ž`ŠžpjÄn›—ÿ¼ºÜ”dÇ-7Î+H*l]¶ó±n&](¥`{6ú(ÔJP¸¶Ï }÷]Š~B=é5ÃÈÝx#8[KØzPt%Æ-á}_‘HI MÆhF!^ºAŒ%Ô)@@\)óøV#G¨AÍšV ƒQ2ððB Ld¢½†Ê°¦…Õõ€9Voëë_ËÄßAòãå)SäßÅÈ–øü+é[Á^f÷a&h¸2°†¯Úà¢:¸Çõ“O‘cpQ}ÚuP“HdÒÜ“{onyq ¢Ìê“b^’F£ýå )9h‚Fðš¡r³Ì`béASskÝš&}ïÒ5KõbÐc-2@®Ù9,½6¯©­²¹©7nÕ2ýˆ5®‡²iòÜ‚õ÷I‰BiÐZ~Îqå¾:'«Öº}N?ž•X^Tì,¾‚œ‚d V/_Á m×¢ªb™tü¹à-ð!˜wY¹/ÈŽK]Bm_ûÖò˜ÅQp_—¯WäJëù‘÷2 {Ôª±Ö\Ê`jV° ¢Uôì+PÏ»ð‹¨8=º‰”Ì´/QÑÓü%mlþe4éïÅËn´-l ÷dh&EF(Rã((|îOÁÃ{x/‹±™ øiÊSËOásx{b§ükú6¾ïèÃ=ñ.vSGTänÀ?Pâß$Ì¿1"Äš›jëjªªƒáü@þÒų§OÞi:¤'7vèš+}bQÿJ¾yÎX³Dþ ¥ÚÅ« âaÜb¨+í£@&œÆr¥NöW”a…ç€4&T»žƒÏürH¯[Êùø=!qžÌšû+Î?:ÒuˆËê‚Æø€žwqŽì»Sùó$`T™æÎƃät\g^^™ìÿmKOeF ®‡¨¦”mœL`ëÇÈñŠëüz¢¦¢)ŠQÌ-ÕZ’Ÿ–– ¹ÕEŽv–¯MK1¯„•_•МÈÔPÊwŒFô²ì¡XíeÇ)Øc„øÂس=OA˜²óríV‡Í VâOvömSsGçÚûoÝ/‚CE1lš»"œ.G=xBëÿð~_¿Ê)Ïp¥tAh#tBg~G &}îÄi~œðÑÈ„Mñz”ôt e÷]ÂWsuxÃÚMvÿò `žÐÎNƒxv%ä6XÌ+·´=a»A¡ýCCž|—&›£Š¸Ì·RoùöVhübë^ð…ç™t›ýmy´^„µeoBì_R±R JV,.„ 0k_a­‰;Kº áv¯]°ìú¬tKqº%™3% ÿ—ç6C)“.ò–FøA;æÙeÝð•»8ë‡J{•=ÀLï>sŽñ¹“4ÇS¹’±)¥f‘^Ná#6U”ò/)»´9s‡Arj§/Jwó[ç{À$Ȱæ° mÓ&ÿ1¼j~^ab©$ ðy¼ï™ò O´ÏÒ0§fÀÒîÛ‹w7 ÂBwàl€ÙµA<Ä€e-À <‹;“Ÿ³o·wdAƒ……Q1ÉLŒ‡ä󌼉E1 9•VŒœ7êÚÞ¸š %Þ‡¡ßr¡’ÁlÏeA«àószYÎk.䤲ï¹W2@CtZQЉíÕý˱>\ékÖѱüÑdU, ÄØô¸ª](¿ó•O%P¢¥éhyÅ|UŒ<¿uxUÏjC34f†³¨‚S„Vªî#¸$¹òÝ%N›Óæåî.«ómô9=ö Ãç.¢(¥ø_ Ÿp¡ÎÊ©ˆ6&j܃ñ‰5s_Ò7AomuS ³2·¡ ÖŠnm®\9=LzÂ.(8sš ”PƒCzЬ¹ŸŸ›Nb#¯÷Fއ±DÏBNª:_0yuàcÊË@2H5í®¦4™%¶À–Æ–n5tÐ0©ÚóÐײÒrÐú%_àˆÓ÷v¬¡(¾x*2ìà³»0.¢ê Bé•Yž¾Ý¹hí°2ù — z‰6#k¹ ÛcÖçM̤l•á“ú_¤çwÆ ]ñCÍU“8Oþ]Ä`^äÛü ´äÕEŦ©„8‚$#7VÛÐQ½í`¼g&Ë¢©"¤ò{§WŨ¦°,Í#ø•`e~UŠ!²‹LÙL,òe•'Âl˜Åu ˆ«Îª6QM ³ÆÄ»4kR!Ò«(•¼–Lö|Ûgf¥A2›ù|Þæcï·½¬‡º¢PN(µa©' !מç(⚬ ãp²¼\Ú­rUøÁâk#ì„ݜȵ›C9µnŸ¯ÌÏsŸÍ]Ê\%> ×ÌEŸ-`G¤Ârg9”9ËøÏX0³%©&$U¦Å€`¾?ixJ45—=m—1˳Eõ®ÊÚ&N^iMŸW¼©k[u¨KßS—6× ž)¨â´ ŒÐÜÂጀ¢F§>„Ào.7³ÍO •9\'.e`Bí*ìlhêqé¢A·êcUK©¾KU<¾6kªKlÒ'%{p%D­Ü7ôÄ ~â9œU¬]/P6—ÈíO),øçU¼1kRsÍÍ %ÉeŽÔô.I:\T»‹R}Ü´o»ljÂ}*õ~±Ôo …d ”ÞÆ/Fc6&ØG«á}ERT˜5ÿú¸‹µ55õÀ:C9s Ãu°Ôn‹µ[‹!ÏS‚Àã:’ë¯$±†àÇɉÊgÜç YÊWY­ó­ú‰¯À_uà#™HÍî ä$”Ø. Ò¾ ½ŒÎžƒÎæ³ë<Õý2W±›º{9¶y!× þ@bU™z‡DÉ?&G0v޲ŒŠ1cÖÄ@4¨uYþ„$Dø¨E­)„y{?JË8»¨4ÿi{Òö£¨4ñžeŒjë„? hfà\Œ8a|•KgOD`‘ÅÇOGħã—F­?zŒ‚Á:8)ŒŒÜ°zgÖoè‚kŠë8ßÙþÖáC1½Ó ‰ ú¤¨Èç”bV‹¡*Õ|ˆp`âæ¿Ž°“óÿEˆScìD‚¯o%—Zw3°¶FÓ£#¢ÓÒ8I¢</•^&¾¢õ…‡9éüù˜«F !¹É™àDóà§Úåù`˜Sv‡Ã®·§ ´yìtz9›ab¯ü”vq}N»¾ V•µ´2Sµ`*ȰÜÒšµñfÝí)›õ=v‡ï{5…õ‘â¡d+ô«f|”x1ΕÊÏ~Þ×ï"¤Õ_æ™]½k'§ —Mos:Š ²NÅvØËŠ`!“ÏÓ‰Yéi™À2Ã; ŸýâCL}êß þ¿$@÷¿i{ßâq>ÚûôqÃfèljîæú‚™ž•Áõ#H å5r ¤‰ïÌ?lXÕÉu1oª+Ýeª*  V”×­Ž[5‰³ŠlÅBIŸü çø$Ÿ¯»`£âvº‚•AŽË!ÀzNýŸãÔßé„j<6J”²+ÉÊ.Êå茋T@3 †IÃ÷é|e.Ÿ¡Fç²;mú í§Muè¬,)ËôšÅ•P x)©È/Ï­0ùҀ͞µèC¼Öl+±òtvp¸õ´"V*ãëã&1ÀËJù¨’¬)–¡ý{Šm6Ö«ÐO;a¬ÜTï«öÈÃäDÁR þNV-€AîZ_{Å5¸s9mãë6„èõ ß­$GÈ+,æßXnŒBU-VöcN›+9z;$Ù³ùÑxá÷ 7ß?5áÃXÌOÝ‹UÒ®Ã$Ô¿âå{³RµÐ5£^-—BåX8 €Á¤qª±ŠA:J.߅ıæàߋɿ÷ŸGð”F£ÎeFÊRºWÅ #° Ö´5 a€b {•´ÕŸGVÍ·|îÃÜW±¤Gñ¼ç…P,õŒcQj±«u ¹˜µ^áX¢k6Lƒ¹1‹*ù¶*då¶ò•ðÐÿ÷—Ö6¥>£¹¹¾¾¹9£>EŸ’‘‘‚zÓI4m(¨ÊɈ¦ìG ì'ä{O!àý³ñËzDr âgJéf1ûð¼4ðÕØÝ­ˆ¼K6 12ò—Á¯.üŒø¡sOê— *nï_qÛ }Š Á§©T‰Têþ jÂŽ0ùVÑ‘ßÆ ~-"´B-ÅúºjR^³ÃÙCâáGï)ªù:VÏ@P1/EG¯fÒUÒdV»Œ´vŸ›3:56Ê›(æ4ᨧFrZ ¹{x£÷~vøMDh†m0]r5§ƒë`U«ÅäÌ%nÕb@fø<¿Ã(ÈpnïS3“b3 ü¹uáŠòJ=ø­^»[Ñט·¼¼¶!ˆ}òŠ‹‹Š òó Žµh]͡ʚÊêŠp4°ÿ(~š P«È$ÛðÍøGcªh¥!¾Âß‘X*èJç*%šf¯Œ¢¥ð‚À¨ñ¹ŠÂ1‚²¶ÈF‚˜s_b#â¢~†$ð|ü)ÝßnAÀot‰ ÈѬÀûûQ¼äíߣ¤±X®Ž?$âo©µ ‰§RŽƒÑ裸â/T)ñ4¼¯_ýt’Ç' øn4òñüÎ3y~  Û›‚÷·“Ø(FÞS@}[i†NÁZP2ì¹}}´‘(õ†LOô‰÷„HŸÑ ”‚<˜tŒÓHâÓÜ3Dš­ÊÍ¥ê1åÝaBô õ¡¿Oê¯P 04 “‰ËǜුR§¹F)ÃEÔ÷r u3+…-ÉæD˜¦j•7þ)ˆ¢Ñx.oÜCÓiÀ/nÆÆ9ƒÜ£¦xÅšbЬöõ‰hÃAa=ljóRÖõÇ|þ³ÍÎw;pœõDsþŽjÆ7¸#ˆÝr¦ E ²Šâ#H¡s A¹ÐP\÷óÍšJ¦T,ÑÌ&‰•|&Ôîøª¿ÂA3½ºEhc(Û· )-ü¡húô?)d“~¦Rƒ•,þgjÿ%@´Ÿ…£?3˜ø'Ø™ë'ƒjï!‡Ó0œB²Ë]‰»âv|ñópÓü ½ž¿V Ûšr:6£ÖÁÕe3˜Óó²ìÌ¡+!\˜BJA/üŘ9N¯d½-_-¸lN»XÀë÷:ùù1DIÃ[E¡?UÓ0ÕiqYÿkñÑâÏHBŽÕjbqòHp6Wa¥žsM§ÓÃÞ ‚ËãôpÒWQÜÈ›0ŸñV—‡ùÑ­Xkfdl}–BF\þ3L¬è†ë±æt.Ü¡¥£òNýB~l^>&hœyÖÄš¶ŸU½ë!C¤XŠJY夫œÞÕòo!]¾Ñg‚þz°×ÝS âò’ØÅIËßՃʜÞúê_ØÏ3鱺ðØíúX™“—W±·ûeiH-«ÕÉwš§Ý£Ø¯%î8ÖÞ·F/~¡M^4C¾$FÊVk;ÿºGºh÷ &?ª5YœC¶Vt$—,³$±z›P¹Íïkãܧ¹)o¥3’LE,3 ël|ú;šÊ›ôbï‚ÖE³æ'.ÒCb8¹7‹U– âòÌEFˆfO2mú¨sO—:³›ã«YT½°oµ§W®=OèÍt&C [š\U±Y«×­ c5ÿêMm½iè3ué9é–<`3,Ï5ÄœòÑÒ7Cku(X0-ö yHËÒIwV¾ø¼Í¾Û6wtÒD. øΧ>šÆBaÂë¹=p×n>ø2Ë­ÆÌ[<ÆsáµÅoŽÙÎrÍÂKOÔ.â<þ‘<ã„q,T(|´·ó ¼ÎÄÚÆÕÿŽ'þg\á©Í õh\zãßrmÏôŸ |Ÿ·»X3fEÍËëºûw|±«¶25ÙE%‹ób¸ÂáÊ\¥_ µ½ëYfµ—“_X‚qÚnDìt•»«Øviù|HJjóB±À¹ñæaÆºé‡ ÐUÕÞÆÄ?Aÿæ?°’7°ˆlIäV{òeé÷sæù«¤Ë¥k¥é¼þcI»&¶Œ¨@»1¡µP&3³FÍ2¼‹LþHWî&jÄ*²¯?Ñ—Ð%ëAŽùWrÈ3ùŒ¬íSá-Öá]¿Å'_$`¤‘(sþÙ“*l¥úÃÄ}ÐÝÑÕÉV6ɉQ\Ù3ÅWþtçžÞ5ÓÀ•Lä3³¯ -ÐYÖÜ•Ú3þww’5K7>Ù§‹Œ–tH‡„†ÜèõÍû^eÕBì²Ì,nle€€«º| Û Ý'ˆ°$?&3)5vAÎ#ÀæHÛµMÞ6w7°ýo'ÈçD8çi³&L“ ¸œ.¾€¬Å“h8éÐ%9LKõÿÆaî˜;M׬ިïÖnç­0œœ¦KÈÍyV£]’\eån]¢Ù´B¿\o·¤n][E¸S¿V»*€á;mŠÝ’‰•¸‹£½‘ì9)çÙœ-®¬Fw^‰?‘3ûœs2®åwV»7ÜøHí 3`gˆf‹—ì†^ –ÊÁz,Á1Kd7Enòª‹Ñξ\_)F;û}þj&é¥…ðºÆ²v7«UFÏßM\ÏÚW¿ºVð­Ø;Jž-_!O‘.)=mèi¨«ºà{—Ÿ–.þRš"--‘?0ˆ_°ëû}ÚîžÕ»»±(íâyË+RV$ÇeÄ™˜­[eZљܕ²Ö¸iëÕÆŠÛÓþۻK+®ÑÅ…cëã[V4/ïY¼-Ó®š°jV·‘}¿w¶VüaÁìïöicŒ±³VL`ë´›¶¯íéjîjYU¿*ÌÄ£ëdÁ¢•G}ÿˆ|‘-Ä&/I6f±ª¤ƒ-ÒuréÚ:ALY:v"WfÇßî©kÛAÃ~8rsËÎúzy4°ž¼i¸|Îkso8 Ç®ßËÄ1¹òùIúÈë\ ,+3'3¥!»ëóƒ'¤½IÔÁKÖ×¹(EÔõÔC¸âøD4ÕU74§Ö$^?M>Wvä+uð +ä³~ÉW_H—Hßô¥|‰|ñÍ7ËËÿe˜t‰A<Ù!7,úö½Ír÷:11551±)µ½½©©½=µ)¹éÆÈ{ø>@X¯r<Šå$>m$XÇ(=üašDŸÄ“K—\ïx´>‰È“¸©üøÃ Ü##1bºwF1Š"yøÓBÜ­ ±Eî›\³F¾Û3í”Åøh#ФT¹ÉL16ÌÛÁqr_7@ÿinÁÑ¢×QsK¯ mƒ‚¨ñ?SRõcB´ŠWü6>â˜÷᧨šï·Á[4G_Uî â•T0 6»ÀˆbEL+‰®Á·ø#‰rÃ1üMùï%tý¢º¯‘i GqR¹ ¡ü+ly(ùKqÐrèaGWž ›»Qñ.’µôb2ÐNêWëJÒù£! %´ü Én<G=j†à#$c‚üs(;Ó_¡ÊCîVòLñG¡Ô¨0‘Lä)\Úbã”CÏ¥× k|¶ X£)Fžú/Áµ¸RMü§D)ŠiW*a< ¡hzÄhÌU*m#©Šâ‚ç!õ+Z·G¶ú î%(ÿ(•{§rØh  Èný€&cÝ ¿˜¤mTHÖ( /wQ¼.Îíe§޶s¨dÑNõÝÌ*ž*¹8iÈŸ`•çç¤~­z8 xLȤ=œÖ0R à30;z8"$ôðÅ#l÷kh/ÞMgèq|ß}Ä ñŨlé&ììuü˪NDèEÔOĉè Ô À¤ Êt`àeÜW»ð°ýœJÈôYd¤PSó2¹RÉ•[õæˆà6œÉ @:s#và˜ò:5ˆ¯¯¤ÔlšrÎòyB¤Ñ¾þ|œ‰¯ˆáã ¾&#J¦B8ÔâºÍäIý¯ìàŒ¼¯ÕÓÇq"_"]Ÿ;Š3®¥*ÚÂCiø>®jh"ðÅ/Âís51¡HÚ¢“Ic!WQddX‰ØÂMŠNF*(‹#«Ço>T÷š¹‚ŠPq-(4&H)9çß ñÛðr:ëð ¾1¼a<6V܇…Œ¯Çžî3Foлۦ·B©Åjc¢=ôlZ³¶žø„eµ¹-ÐÎ6okßµyK´¥Å:%yP×êÅ::¢dDå¹(„è=”LOlü=e惓™ª†¾R%(…ý™5ƒì©ðo(×û¸É+•I)†åWºãò÷ØIý:,@Ö|”÷¾G*K‚àä”Q -@åqÕ•#ÃË5Šjƒ¢Eâây5ìu5ª‹Hˆ#2Žj7âPÕý ªxRý{)šûÔØÔsHÈ»+H€µ;Íi¤4‚˹¸[øEÉÙbì©‹/Ñxy§/š ×ìGÐãÈþÖ!?ôà0’ñާñ^º ßT¿Ãþ'ãŸ+ñyOo¤4^¯<…a#œ•J¼ûe.¾o˜n„|Å€&ŸŽÆ‰Æµ*ÀerFÞ+ÀAäaO…'ŒÒH‹‹_d0i¸n.bª©¨Ä!÷œ7þ”‚ÆÑ ¸q™S‘*8ñiº¤â(RðW_ßU{~@UvÖK¤ þ)íDé×ý«ôké×7|-ÿZþõ7âõë¤_ó—Ñ}2RÖɺ;GÈZY7òI'i?æWƒøùï¼kä¸Ñ·Þ:îØÇ<òægñoïÝwÝu÷Þwýu÷½ÿÍ7ï½ÿ7ƒ˜Wa+*‚AsE^žÙœ§§oª*ù7ùÊ7¼‘ÿhçègØòCü›Qü›·?þão|j?=vìÓO>|4þïØ§zÑW°b9(¯3PÆ@%ÝtPð–ƒ|à-­Îó2yÌ#v« ‚4Ýî‘Çò,¥9`R°y‹˜tÓS Å^o_€‰iµYµµYµiiYYiüì[çBdå§Â 0µs 3·°8/kuò¶m«Ú·ÄÀÁ n„žk-XPj³[8áLÏ,Œ¶bÞêãév­ÏãñmËÞùÈÌ©sïØ=ó¨a=¬®oè`bneA(TU åWæês r)\…)ª4HQáÄç¿£â@ß’¿‹þB²Ó¤>îÞDúÿgwðßÏÃM÷RŸ"{Añª%0sˆ¢ªì´J é$kà±&åêW%Cb)à˜¬´_ö ›S}¼óûúç¡ÐÇu‘yŠ : šÉÛ‰Ê4Üø¤ðãË&õgM¹E˜ :ŒŽûµxß•}}xE͵Â¥•f¿REE£Å!“ID;©ßÌä{~È£T¨¿áhFbG?DFîâíÜÄåmɱËfÎ ß”Î;*àÏ©ÇïUýÇ4r"+T»†TÍsÉBrM_ÿ«ñ˜:0°ì=ŸôõUóWÀ¹É ÀÏâ­p§|>ÈøÒ­ŠÂ'¥¼Ïø>ô¿¢•™k!“ú» S´æ1¢æBůÁaPU•›…‘H0sùZ®‘"ø=¿Ã7‡ê´Þʵä-°éÖa0žž“3[­S C^ ÄƒÕ¢¦ßOê¯ß½½~; 5 f1àØçØ%J“e¸ŽA„®zCEšp>çl&ݪí…ÕŽj‡·3°½fo%/Ѩ‹”Ò:ù‰Bê¬ÒÒé˜|ÖBŒøïH1lPŒ)І(G&{VžQ¡ƒCÞ5¾Úú·6T… ‚ ²áÂîtóôü®Œ’Ò}–VAœ2»ìG]‚¸ÍñWùÁX‘ºJß -UMmÌrÍy¥è¬±Ô¬5HçïÕù1IKÌ\\˜2C-Óà¬q¶@4œŠÆ˜é)®jÜÁÚn¿Ïúô0´?*ÔΫ̟l áhs®‡nŸzhšßÊØÉä¤Ï„’ꂲ (‚rè~nµŸÈWȆë†qU㚯ø€‹@WèÅãeºC Zâ1½”z®Ã´NAð«ßàÜ‹‡&Ïï{½‘Û ®*¿jÝ=ŸÌ “”€5Ù ¹Á¬,öˆPЙ´*ÎÍœº—}»7À+p,ºG¾RÀhú™7º6=œ. ®Í|o‘×&’~ÁCË`„=TßœOÓ,ιŽÞ½u^}jÅ£]° 6¶µíâ÷m‡Mq¡§Êmåœ(2>9Ý¥ë9añê+ÛÛô«´¡*³nœšžF™”’¥!c ±òÞÈ’mŽÍ°IEÇ¡ú ($`¯ ðþ}0d/-*6ñ#vXk‚¢2»O½›jì(wÓ ôF:`1,,^PNÂr’”d°º×+ë™NÛHL7Ⱦ³=—é嫮Ëï½tÍYnÑ»uòíZz\¹þi˜^Òþè±G´# †ÂZO{Œ Û'õË£J¸‹õ <²Q'¹çkŒbÜ2*MIŽ¥¦S¡òšQd³¢YÆOŸ‘pÉgK‚!ù^+œÕ«ÃÑÍl#×g×—µ½ ¾@º#Û‘ œäœêõ9k —ŒãóO•T"×Ξ¡<àªÒjy@Ë’"*•[ÿúê†vN½‡iÉJùí/qïPFÛwˆÇ>y‘`-µqE€•z¬zé3­§³bkõ^¶ÒÏ…›´Y9+§ñ"j>¦hzï­ #d’SúAÕ{üPÆD_©Ç¤7CŽ-ÕÂÄ9ÒÚ32C骺31Ä»FG»ïßå‰Òtdwãâ\@„|˜x ?@³tÜ/ˆ!S¸4¬2à¯3HoœÝΑ§è`¥-'~“³¥ƒò .» R«ÏîÖ¯µU²™ÜJ´Åú´u0Ó¯ÛÙƒ¥Ü;Zv¯™hËé'zð@?dLzX+ݯ­­ªÜµ§yå½øØCËFÎD{ ÀæWaB´¤-Äð×B@:rvÌá»°Eø§û¸äŒ³²¤72ؽCB·Ž’…»€ßìÄ=ÒÍ‚š£{!Ù–Èeæ3½öË(Œ]Dþ¤æGÐ0Õ°3Gþ®?cäï»dèF´ M$ÊÕK¾]'(¸Ö x9ûÏï,…RG^~žE…|£¢Ê„~M™N”ÁÊ{´;À#›ëÍ£lå—T¿‚«7àGBLIÔ ½‘2ÆÑ|„ýPÖ÷ûØ e¨1—ôS••ÀÑ[0Ùj¥dàëþÆþýo¼¹ÿé‡~zò˜‡Ÿ>ð†^ydì‰þøÄØ##ïzä‘»ô¢óä+O‚‘þ£†tMíë—.`âÿCoË^ endstream endobj 391 0 obj <>stream 2012-07-16T08:26:00+02:00 2012-07-16T08:26:00+02:00 Heirloom Documentation Tools - dpost 8.59 (ritter)10/20/07 Untitled endstream endobj 2 0 obj <>endobj xref 0 392 0000000000 65535 f 0000380972 00000 n 0000559363 00000 n 0000380369 00000 n 0000369410 00000 n 0000000015 00000 n 0000000455 00000 n 0000381038 00000 n 0000393933 00000 n 0000521203 00000 n 0000381079 00000 n 0000381109 00000 n 0000369561 00000 n 0000000474 00000 n 0000000580 00000 n 0000381139 00000 n 0000369695 00000 n 0000000599 00000 n 0000001004 00000 n 0000390587 00000 n 0000436634 00000 n 0000381169 00000 n 0000381199 00000 n 0000369848 00000 n 0000001024 00000 n 0000001130 00000 n 0000381231 00000 n 0000369982 00000 n 0000001149 00000 n 0000002671 00000 n 0000388610 00000 n 0000399097 00000 n 0000392650 00000 n 0000483061 00000 n 0000381261 00000 n 0000381291 00000 n 0000370135 00000 n 0000002692 00000 n 0000002798 00000 n 0000381343 00000 n 0000370269 00000 n 0000002817 00000 n 0000007181 00000 n 0000381373 00000 n 0000381403 00000 n 0000370422 00000 n 0000007202 00000 n 0000011941 00000 n 0000381466 00000 n 0000381496 00000 n 0000370575 00000 n 0000011962 00000 n 0000017321 00000 n 0000387559 00000 n 0000395071 00000 n 0000381559 00000 n 0000381589 00000 n 0000370728 00000 n 0000017342 00000 n 0000020564 00000 n 0000381663 00000 n 0000381693 00000 n 0000370881 00000 n 0000020585 00000 n 0000024145 00000 n 0000381745 00000 n 0000381775 00000 n 0000371034 00000 n 0000024166 00000 n 0000028509 00000 n 0000381838 00000 n 0000381868 00000 n 0000371187 00000 n 0000028530 00000 n 0000030529 00000 n 0000389876 00000 n 0000435075 00000 n 0000381931 00000 n 0000381961 00000 n 0000371340 00000 n 0000030550 00000 n 0000034029 00000 n 0000382046 00000 n 0000382076 00000 n 0000371493 00000 n 0000034050 00000 n 0000039342 00000 n 0000382161 00000 n 0000382191 00000 n 0000371646 00000 n 0000039363 00000 n 0000043403 00000 n 0000382265 00000 n 0000382295 00000 n 0000371799 00000 n 0000043424 00000 n 0000045571 00000 n 0000382347 00000 n 0000382377 00000 n 0000371952 00000 n 0000045592 00000 n 0000045700 00000 n 0000382429 00000 n 0000372088 00000 n 0000045720 00000 n 0000052156 00000 n 0000382460 00000 n 0000382491 00000 n 0000372245 00000 n 0000052178 00000 n 0000056355 00000 n 0000382555 00000 n 0000382586 00000 n 0000372402 00000 n 0000056377 00000 n 0000064212 00000 n 0000382639 00000 n 0000382670 00000 n 0000372559 00000 n 0000064234 00000 n 0000068883 00000 n 0000382734 00000 n 0000382765 00000 n 0000372716 00000 n 0000068905 00000 n 0000077428 00000 n 0000382818 00000 n 0000382849 00000 n 0000372873 00000 n 0000077450 00000 n 0000082615 00000 n 0000382924 00000 n 0000382955 00000 n 0000373030 00000 n 0000082637 00000 n 0000087893 00000 n 0000383030 00000 n 0000383061 00000 n 0000373187 00000 n 0000087915 00000 n 0000097377 00000 n 0000383125 00000 n 0000383156 00000 n 0000373344 00000 n 0000097399 00000 n 0000104847 00000 n 0000383220 00000 n 0000383251 00000 n 0000373501 00000 n 0000104869 00000 n 0000111463 00000 n 0000383315 00000 n 0000383346 00000 n 0000373658 00000 n 0000111485 00000 n 0000116073 00000 n 0000383410 00000 n 0000383441 00000 n 0000373815 00000 n 0000116095 00000 n 0000123507 00000 n 0000383516 00000 n 0000383547 00000 n 0000373972 00000 n 0000123529 00000 n 0000131248 00000 n 0000383611 00000 n 0000383642 00000 n 0000374129 00000 n 0000131270 00000 n 0000144710 00000 n 0000383706 00000 n 0000383737 00000 n 0000374286 00000 n 0000144733 00000 n 0000157128 00000 n 0000391681 00000 n 0000478368 00000 n 0000383801 00000 n 0000383832 00000 n 0000374443 00000 n 0000157151 00000 n 0000162132 00000 n 0000383909 00000 n 0000383940 00000 n 0000374600 00000 n 0000162154 00000 n 0000170678 00000 n 0000384015 00000 n 0000384046 00000 n 0000374757 00000 n 0000170700 00000 n 0000178060 00000 n 0000384110 00000 n 0000384141 00000 n 0000374914 00000 n 0000178082 00000 n 0000183978 00000 n 0000384229 00000 n 0000384260 00000 n 0000375071 00000 n 0000184000 00000 n 0000189912 00000 n 0000384324 00000 n 0000384355 00000 n 0000375228 00000 n 0000189934 00000 n 0000196653 00000 n 0000384419 00000 n 0000384450 00000 n 0000375385 00000 n 0000196675 00000 n 0000206260 00000 n 0000384514 00000 n 0000384545 00000 n 0000375542 00000 n 0000206282 00000 n 0000213163 00000 n 0000384609 00000 n 0000384640 00000 n 0000375699 00000 n 0000213185 00000 n 0000218518 00000 n 0000384704 00000 n 0000384735 00000 n 0000375856 00000 n 0000218540 00000 n 0000222994 00000 n 0000384810 00000 n 0000384841 00000 n 0000376013 00000 n 0000223016 00000 n 0000228912 00000 n 0000384905 00000 n 0000384936 00000 n 0000376170 00000 n 0000228934 00000 n 0000237600 00000 n 0000385011 00000 n 0000385042 00000 n 0000376327 00000 n 0000237622 00000 n 0000242092 00000 n 0000385117 00000 n 0000385148 00000 n 0000376484 00000 n 0000242114 00000 n 0000249401 00000 n 0000385223 00000 n 0000385254 00000 n 0000376641 00000 n 0000249423 00000 n 0000256073 00000 n 0000385329 00000 n 0000385360 00000 n 0000376798 00000 n 0000256095 00000 n 0000257819 00000 n 0000385437 00000 n 0000385468 00000 n 0000376955 00000 n 0000257841 00000 n 0000261886 00000 n 0000385545 00000 n 0000385576 00000 n 0000377112 00000 n 0000261908 00000 n 0000269003 00000 n 0000385640 00000 n 0000385671 00000 n 0000377269 00000 n 0000269025 00000 n 0000276101 00000 n 0000385735 00000 n 0000385766 00000 n 0000377426 00000 n 0000276123 00000 n 0000283010 00000 n 0000385832 00000 n 0000385863 00000 n 0000377583 00000 n 0000283032 00000 n 0000291221 00000 n 0000385927 00000 n 0000385958 00000 n 0000377740 00000 n 0000291243 00000 n 0000297067 00000 n 0000386022 00000 n 0000386053 00000 n 0000377897 00000 n 0000297089 00000 n 0000302598 00000 n 0000386128 00000 n 0000386159 00000 n 0000378054 00000 n 0000302620 00000 n 0000312906 00000 n 0000386223 00000 n 0000386254 00000 n 0000378211 00000 n 0000312929 00000 n 0000329912 00000 n 0000391936 00000 n 0000479970 00000 n 0000386307 00000 n 0000386338 00000 n 0000378368 00000 n 0000329935 00000 n 0000342301 00000 n 0000386404 00000 n 0000386435 00000 n 0000378525 00000 n 0000342324 00000 n 0000346894 00000 n 0000386488 00000 n 0000386519 00000 n 0000378682 00000 n 0000346916 00000 n 0000349084 00000 n 0000389373 00000 n 0000434064 00000 n 0000386583 00000 n 0000386614 00000 n 0000378839 00000 n 0000349106 00000 n 0000350803 00000 n 0000386691 00000 n 0000386722 00000 n 0000378996 00000 n 0000350825 00000 n 0000353909 00000 n 0000386799 00000 n 0000386830 00000 n 0000379153 00000 n 0000353931 00000 n 0000358066 00000 n 0000386905 00000 n 0000386936 00000 n 0000379310 00000 n 0000358088 00000 n 0000361533 00000 n 0000387000 00000 n 0000387031 00000 n 0000379467 00000 n 0000361555 00000 n 0000363735 00000 n 0000387095 00000 n 0000387126 00000 n 0000379624 00000 n 0000363757 00000 n 0000365138 00000 n 0000387201 00000 n 0000387232 00000 n 0000379781 00000 n 0000365160 00000 n 0000365268 00000 n 0000387307 00000 n 0000379918 00000 n 0000365288 00000 n 0000365846 00000 n 0000387338 00000 n 0000387369 00000 n 0000380075 00000 n 0000365867 00000 n 0000365975 00000 n 0000387422 00000 n 0000380212 00000 n 0000365995 00000 n 0000369388 00000 n 0000387453 00000 n 0000387484 00000 n 0000395320 00000 n 0000399569 00000 n 0000434290 00000 n 0000435322 00000 n 0000437240 00000 n 0000478626 00000 n 0000480255 00000 n 0000483665 00000 n 0000521752 00000 n 0000388155 00000 n 0000388317 00000 n 0000389146 00000 n 0000389770 00000 n 0000390255 00000 n 0000391376 00000 n 0000392293 00000 n 0000393414 00000 n 0000393646 00000 n 0000394663 00000 n 0000557926 00000 n trailer << /Size 392 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 559559 %%EOF mmh-0.4/docs/README.hooks0000644000000000000000000001046313414435726013603 0ustar rootrootJon Steinhart's (jon@fourwinds.com) External Program Hooks ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This blurb describes a changes to nmh that implement an interface to external programs. This interface is different than the limited interface provided by things like the rmmproc context entry. Why Did I Do This? ~~~~~~~~~~~~~~~~~~ I'm working on a project (grokmail) that will get released via GPL sometime soon. This project keeps a database synchronized with the messages in the mail system. New functionality is built on top of this database. This functionality allows fast searching, and searching based on interest criteria. The latter can be used for spam filtering. The changes to nmh allow external programs to be run whenever a message is added to a folder, removed from a folder, or refiled. The changes are implemented in a general way so that it can be used for other purposes than mine. What Are The Changes? ~~~~~~~~~~~~~~~~~~~~~ The changes add four new profile components: add-hook: This is the full pathname of a program that is invoked whenever a message is added to a folder. The program is passed one argument which is the full pathname of the message file. The program is executed after the message is written so that it can act upon that message. del-hook: This is the full pathname of a program that is invoked whenever a message is deleted from a folder. The program is passed one argument which is the full pathname of the message file. The program is executed before the message is written so that it can act upon that message. ref-hook: This is the full pathname of a program that is invoked whenever a message is refiled. The program is passed two arguments: the first is the full pathname of the original message file, the second is the full pathname of the final message file. The program is executed after the message is written. message is moved from one place to another. So, for example, the command refile -link The definition of refiling is a bit tricky. The refile hook is executed if a causes the add hook to be executed, not the refile hook, because a new message is created, the old one isn't moved. These changes affect the following commands: burst: The add hook is executed for messages burst from a digest, and for the table of contents if -inplace is specified. The delete hook is executed for the original message if -inplace is specified. The refile hook is executed for messages that are moved. folder: The refile hook is executed for -pack. inc: The add hook is executed when messages are incorporated. refile: Either the add or refile hooks are executed. rmf: The delete hook is executed when messages are deleted. rmm: The delete hook is executed when messages are deleted. sortm: The refile hook is executed for each message moved. Note that a magic temporary message number of 2147483647 is used to hold messages as they are being shuffled. rcvstore: The add hook is executed when messages are stored. mhstore: The add hook is executed when messages are stored. Did I Do This Correctly? ~~~~~~~~~~~~~~~~~~~~~~~~ Well, sort of. This all works, but I'm not really happy with it. The issue is that an examination of the nmh code shows that message handling is scattered all over the place. Although there are library routines such as folder_addmsg and folder_delmsgs, they are not used consistently. Long term, I think that it would be better to make all message handling go through the same choke points. Also, I added a function to run the external programs. This sort of stuff is also scattered around the nmh code, for example in the code to run the rmmproc. Again, I'd like to make this more consistent in the long term. What Files Did I Change? ~~~~~~~~~~~~~~~~~~~~~~~~ uip/ burst.c inc.c refile.c rmf.c sortm.c sbr/ folder_addmsg.c folder_delmsgs.c folder_pack.c ext_hook.c (new file) Old config options: ~~~~~~~~~~~~~~~~~~~ In the original implementation availible config option, which are removed. msg-hook: This is a text message that is output if the execution of one of the external hook programs fails. There is a built-in default message if none is specified. This is removed, because I don't see this is necesarry and it's not a good idee to pass a user provided string direkt in an format string. mmh-0.4/docs/README.releasing0000644000000000000000000000473413414435726014435 0ustar rootroot# # README.releasing # ------------- releasing mmh ------------- To make a public release of mmh (we'll use version 1.0 as example here): 1. % echo 1.0 > VERSION % date +"%Y-%m-%d" > DATE % vi NEWS 2. % git commit VERSION DATE NEWS 3. % make mmhdist 4. Untar mmh-1.0.tar.gz and `diff -r' it vs. your workspace. Make sure no files got left out of the distribution that should be in it (due to someone forgetting to update the DIST variables in the Makefiles). 5. If you have root access on your machine, it's good at this point to do: % chown -R 0:0 mmh-1.0 % tar cvf - mmh-1.0 | gzip -c > mmh-1.0.tar.gz If you leave the files in the archive as being owned by yourself, your UID may coincide with one of a user on a machine where mmh is being installed, making it possible for that user to Trojan the mmh code before the system administrator finishes installing it. 6. Make sure your new tarball uncompresses and untars with no problem. Make sure you can configure, make, and install mmh from it. 7. If all is well and your tarball is final, go back to your workspace and tag the release: % git tag -a mmh-1.0 -m 'Releasing mmh-1.0' 8. Then bump the version number: % echo 1.0+dev > VERSION 9. % git commit VERSION 10. Generate an MD5 hash and a PGP signature of the tarball: % md5sum mmh-1.0.tar.gz > mmh-1.0.tar.gz.md5sum % gpg -ab mmh-1.0.tar.gz You can verify the hash and signature with: % md5sum -c mmh-1.0.tar.gz.md5sum % gpg --verify mmh-1.0.tar.gz.asc 11. Upload the files to the web space: % scp -p mmh-1.0.tar.gz* marmaro.de:.../prog/mmh/ 12. Update the homepage. 13. Add a news item to relevant websites. 14. Send the release announcement email to the following places: *or* (bidirectional gateway) If the release fixes significant security holes, also send an announcement to . Preferably, the announcement should contain: - the URL for the tarball - the MD5 hash - the URL of the website - a brief summary of visible changes - the URL of the git diff page that shows a detailed list of changes. The changes between 0.9 and 1.0 would be shown by: Further more, the message should be PGP-signed. mmh-0.4/docs/README.manpages0000644000000000000000000001040213414435726014244 0ustar rootrootNMH MANPAGE STYLE GUIDE nmh manpages should be in this general form: .\" .\" %nmhwarning% .\" .TH COMP %manext1% "%nmhdate%" MH.6.8 [%nmhversion%] .SH NAME comp \- compose a message .SH SYNOPSIS .HP 5 .B comp .RI [ +folder ] .RI [ msgs ] .RB [ \-form .IR formfile ] .RB [ \-use " | " \-nouse ] .RB [ \-Version ] .RB [ \-help ] .SH DESCRIPTION .B Comp is used to create a new message to be mailed. It copies something. .SH FILES .fc ^ ~ .nf .ta \w'/usr/local/nmh/etc/ExtraBigFileName 'u ^%etcdir%/components~^The standard message skeleton .SH "PROFILE COMPONENTS" .fc ^ ~ .nf .ta 2.4i .ta \w'ExtraBigProfileName 'u ^Path:~^To determine the user's nmh directory .SH "SEE ALSO" dist(1), forw(1), repl(1), send(1), whatnow(1), mh-profile(5) .SH DEFAULTS .nf .RB ` +folder "' defaults to the current folder" .SH CONTEXT None .SH BUGS None --------------------------------------- In the FILES section, use a spacer of "/usr/local/nmh/etc" for now, we'll parametrize that into %etcdir% later. Source files There should be no ".so" commands to source an external file, since these break on Linux, where the man program does not allow source files outside the man/ hierarchy. Instead, insert this fragment: .PP .RS 5 .nf %components% .fi .RE .PP Of course, replace "components" with a unique identifier that reflects the content being included, like "mhl_reply" for etc/mhl.reply. Then, add two lines to the man.sed target in Makefile.in like: echo '/%components%/r $(top_srcdir)/etc/components' >> $@ echo ' s,%components%,,g' >> $@ At compile time, the contents of the file will physically incorporated into the body of the man page. This is somewhat unfortunate, since later modifications won't be reflected in the manpage, but on the other hand, the manpage will show the default configuration and not local modifications. Program names All nmh program names should be bolded. If there is punctuation after the name, use a .BR construct to avoid the automatic space that's inserted with just a .B: .B comp .BR comp , If this is a manpage reference (outside of the SEE ALSO section, which just uses regular text), use: .BR mh-draft (5) SYNPOSIS section Literal text (such as flags) should be in bold. Parameters should be italicized. Mutually exclusive options (like "-foo" and "-nofoo") should be grouped together and separated by a "|": .RI [ +folder ] <---- parameter .RI [ msgs ] <---- parameter .RB [ \-Version ] <---- flag .RB [ \-editor <---- flag with .IR editor ] parameter .RB [ \-use " | " \-nouse ] <---- exclusive parameters References to these flags or parameters in the body text of the manpage should reflect these conventions: You may not supply both a .B \-form .I formfile and a .I +folder or .I msg argument. In particular, don't enclose them in single quotes (except in the DEFAULT section, which might be inconsistent, but seems a little clearer. For "-flag param" situations, try to use a .B/.I combination instead of a single .BI, since it allows more flexibility in case of punctuation, and we get an automatic space between flag and param for free, without having to manual force it. Subsections Use ".SS" to denote a subsection Tables The folder manpage has an example of a table. .PP .RS 5 .nf .ta \w'/rnd/phyl/Mail/EP 'u +\w'has ddd messages 'u +\w'(ddd\-ddd); 'u FOLDER \0\0\0\0\0\0# MESSAGES RANGE CUR (OTHERS) ff has \0no messages. inbox+ has \016 messages (\03\-\022); cur=\05. mh has \076 messages (15\-\076); cur=70. .fi .RE .PP Other italicized text Italicize file names, profile entries, and folder names: If a file named .RI ` components ' exists in the user's nmh directory, If the user's profile contains a .RI ` "Msg\-Protect: nnn" ' entry, it The `+' after .I inbox indicates that it is the current folder. Enclose the file names and profile entries in lq/rq quotes, too. Pointer manpages Certain manpages are shared between one or more programs (such as folder/folders). The secondary program should have a man page that only contains: .so man1/folder.1 Also, add this manpage to the appropriate section in Makefile.in mmh-0.4/docs/README.attachments0000644000000000000000000002464013414435726014775 0ustar rootrootJon Steinhart's (jon@fourwinds.com) Attachment Handling Mods ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A bunch of changes have been made to improve the nmh user interface for handling MIME attachments. Why Did I Do This? ~~~~~~~~~~~~~~~~~~ Although nmh contains the necessary functionality for MIME message handing, the interface to this functionality is pretty obtuse. There's no way that I'm ever going to convince my partner to write mhbuild composition files! And even though I know how to write them, I often screw up when sending a message that contains a shell script because I forget that I have to double any # at the start of a line, which shell scripts have galore. These changes simplify the task of managing attachments on draft files. They allow attachments to be added, listed, and deleted. MIME messages are automatically created when drafts with attachments are sent. The Simple Setup ~~~~~~~~~~~~~~~~ The gory details are all given below. Here's how to set things up simply. This only works if you're using the "standard" interface, i.e., whatnow. Life is more complicated if you run mh-e. Add the following to your .mh_profile: send: -attach X-MH-Attachment whatnow: -attach X-MH-Attachment You may already have send and whatnow lines in your .mh_profile; if you do, just add the new stuff to the end of the line. For example, mine looks like: send: -alias aliases -attach X-MH-Attachment whatnow: -attach X-MH-Attachment That's it. Next time you want to send an attachment, say "attach filename" at the whatnow prompt and you're done. You can check your attachments by saying "alist". Did I Do This Correctly? ~~~~~~~~~~~~~~~~~~~~~~~~ Hard to say. Despite lots of time looking at the nmh code, I can't say that I get the philosophy behind its structure. I am aware of two deviations from what I saw in the nmh code. 1. I commented my changes. 2. It's been years since I've used a VT-100, so I don't try to make code fit into 80 columns anymore. Seems silly to me. What Did I Do? ~~~~~~~~~~~~~~ I made changes to the following files: h/ prototypes.h man/ anno.man send.man whatnow.man uip/ Makefile.in anno.c annosbr.c send.c sendsbr.c viamail.c (needed change for new sendsbr argument) whatnowsbr.c Attachments are associated with messages using header fields. For example, a draft that looks like this To: jon Subject: test of attachments X-MH-Attachment: /export/home/jon/foo X-MH-Attachment: /export/home/jon/bar X-MH-Attachment: /export/home/jon/test/foo -------- has the files "foo", "bar", and foo as attachments. Although I use the header field name "X-MH-Attachment" to indicate attachments, the implementation allows any header field name. The advantage of using header fields is that the list of attachments travels with the draft so it remains valid across editing sessions. Note that the header fields for attachments are removed from the message before it is sent. Since I was adding header fields to messages, it seemed sensible to use the existing anno program to do this for me. This required several changes to generalize anno: o I added a -draft option that permits annotations (header fields) to be added to the draft instead of a message sequence. o I added a -delete option that allows annotations to be deleted. o I added a -list option that allows annotations to be listed. o I added a -number option that modifies the behavior of -delete and -list. o I added a -append option so that annotations are appended to the headers instead of the default prepend. Without this, attachments come out in reverse order. Using the modified anno, the example above could be created (assuming that the draft exists) by prompt% anno -draft -comp X-MH-Attachment -text /export/home/jon/foo -nodate -append prompt% anno -draft -comp X-MH-Attachment -text /export/home/jon/bar -nodate -append prompt% anno -draft -comp X-MH-Attachment -text /export/home/jon/test/foo -nodate -append One can quite easily make an "attach" command using shell scripts, aliases or functions. For example, here's a bash function that does the job: function attach() { for i in $*; do anno -append -nodate -draft -comp X-MH-Attachment -text "$i"; done; } The following examples show the different ways in which attachments can be listed. prompt% anno -list -draft -comp X-MH-Attachment foo bar foo prompt% anno -list -draft -comp X-MH-Attachment -text / /export/home/jon/foo /export/home/jon/bar /export/home/jon/test/foo prompt% anno -list -draft -comp X-MH-Attachment -number 1 foo 2 bar 3 foo prompt% anno -list -draft -comp X-MH-Attachment -text / -number 1 /export/home/jon/foo 2 /export/home/jon/bar 3 /export/home/jon/test/foo prompt% Why all these listing options? I feel that the listing as produced by the first example is what most people would want most of the time. The listing as produced by the second example seemed necessary for situations where there were several attachments with the same file name in different directories. I included the numbering option so that attachments could be deleted by number which might be easier in situations where there were several attachments with the same file name in different directories, as in the above example. Attachments are deleted using the -delete option. prompt% anno -delete -draft -comp X-MH-Attachment -text foo deletes the first attachment since the foo matches the basename of the attachment name. prompt% anno -delete -draft -comp X-MH-Attachment -text /export/home/jon/test/foo deletes the third attachment since the text is a full path name and matches. prompt% anno -delete -draft -comp X-MH-Attachment -number 2 deletes the second attachment. The attachment annotations are converted to a MIME message by send. I'm not completely sure that this is the right place to do it, as opposed to doing it in post, but both would work. It seemed to me to make more sense to do it in send so that all of the various post options would apply to the MIME message instead of the original draft file. I added an -attach option to send that specifies the header field name used for attachments. Send performs the following additional steps if this option is set: o It scans the header of the draft for attachments. Normal behavior applies if none exist. o A temporary mhbuild composition file is created if there are attachments. o All non-attachment headers are copied from the draft file to the composition file. o The body of the draft is copied to a temporary body file if it contains at least one non-whitespace character. A mhbuild directive for this file is appended to the composition file. Note that this eliminates the problem of lines beginning with the # character in the message body. o A mhbuild directive is appended to the composition file for each attachment header. o mhbuild is run on the composition file, converting it to a MIME message. o The converted composition file is substituted for the original draft file and run through the rest of send. o The original draft file is renamed instead of the converted composition file. This preserves the original message instead of the composition file which is really what a user would want. o The ,file.orig file created by mhbuild is removed as it's a nuisance. The mhbuild directives appended to the composition file are constructed as follows: o The content-type a file with a dot-suffix is obtained from the list of mhshow-suffix- entries in the profile. o A file with no dot-suffix or no entry in the profile is assigned a content-type of application/octet-stream if it contains any non-ASCII characters. o A file with no dot-suffix or no entry in the profile is assigned a content-type of text/plain if it contains only ASCII characters. o The directive is of the form: #content-type; name="basename"; x-unix-mode=mode [ description ] filename The content type is derived as discussed above. The basename is the last component of the pathname given in the body of the attachment header field. The mode is file permissions. The description is obtained by running the file command on the attachment file. The filename is the field body from the attachment header field. I added an -attach option to whatnow that specifies the header field name for attachments. I added to the commands available at the whatnow prompt to provide an interface to the attachment mechanism. I'm not completely happy with some of these additions because they duplicate shell functionality. I'm not sure that there's a good way around it other than to not use whatnow. The first three additions (the ones I'm not happy with) are cd, ls, and pwd. These do the same thing as their system counterparts. As a matter of fact, these are implemented by running the commands in a subshell. I did this because I wanted proper interpretation of shell-specific things like ~ and wildcard expansion. The next command is attach. This takes a list of files and adds them to the draft as attachments using the same code as the modified anno. The list of files is run through ls using the user's shell, so wildcard expansion and all that works. The alist command lists the attachments on the current draft using listing function that I added to anno. It takes two optional options, -l for a long listing meaning full path names, and -n for a numbered listing. The detach command removes attachments from the current draft, again using the modified anno. The arguments are interpreted as numbers if the -n option is used, otherwise they're interpreted as file names. File names are shoveled through ls using the user's shell in the directory containing the file for wildcard expansion and such. File names are matched against the last pathname component unless they begin with a / in which case they're matched against the entire name. What's Left To Do? ~~~~~~~~~~~~~~~~~~ Nothing on this stuff. When I get time I'd like to improve the interface for reading messages with attachments. It's my opinion that, because of the command line nature of nmh, it makes the most sense to treat attachments as separate messages. In other words one should be able to read the next attachment using next, and the previous one using prev. One should be able to show and scan attachments. This would probably involve a major change in the message numbering scheme to allow something like 123.4 to indicate attachment 4 on message 123. Jon Steinhart mmh-0.4/docs/ChangeLog_nmh0000644000000000000000000042754213414435726014227 0ustar rootroot2010-12-09 Ken Hornstein * h/nntp.h, configure.in, h/Makefile.in, h/mts.h, h/popsbr.h, man/inc.man, man/mh-chart.man, man/mh-tailor.man, man/msgchk.man, sbr/Makefile.in, sbr/mts.c, uip/Makefile.in, uip/inc.c, uip/msgchk.c, uip/msh.c, uip/mshcmds.c, uip/popsbr.c: Massive garbage collection. Remove functionality for APOP, RPOP, all NNTP support (including bboards), and MPOP. 2010-12-08 David Levine * uip/whatnowsbr.c: enforce requirement of at least one file argument to attach command. 2010-12-08 David Levine * man/send.man: added name= portion to Content-Type headers to reflect 2006-10-24 change to uip/sendsbr.c. That change allowed mhstore to use the (file)name when extracting attachments. 2010-12-03 Ken Hornstein * Everything: remove RCS keywords from files, since they no longer work after git migration. 2010-12-02 Ken Hornstein * .cvsignore, .gitignore, autogen.sh, */.cvsignore: Update files for git conversion. 2010-12-19 Ken Hornstein * aclocal.m4, config/Makefile.in, configure.in, man/mh-chart.man, man/post.man, man/send.man, mts/smtp/Makefile.in, mts/smtp/smtp.c, mts/smtp/smtp.h, sbr/Makefile.in, uip/Makefile.in, uip/post.c, uip/send.c, uip/whatnowsbr.c, uip/whom.c: Clean up autoconf code for handling of compiler flags for SASL, and add support for TLS to the SMTP MTA. 2010-11-12 Peter Maydell * man/slocal.man: fix formatting error that meant a subsection heading wasn't displayed as such. 2010-11-10 Peter Maydell * configure.in: add a level of expansion for mandir when printing the end-of-configure install path summary. 2010-11-09 Peter Maydell * man/rmm.man: fix error in synopsis: the option is [no]unlink, not [no]link. 2010-08-31 David Levine * uip/.cvsignore: added "new". 2010-02-03 Earl Hood * Bug #15213, #18635: The use of the insecure m_scratch() and m_tmpfil() functions have been replaced by m_mktemp() or m_mktemp2() functions (defined in sbr/m_mktemp.c). The new functions use mkstemp() to securely create temporary files to avoid the numerous race conditions that exist with the old functions. This does assume that mkstemp() is available. Unsure if we need to create an alternative implementation if mkstemp() is not available. More information about new temp file functions in m_mktemp.c, including the support for MHTMPDIR, TMPDIR, and TMP envvars. 2010-02-02 Earl Hood * mts/smtp/smtp.c: added SASL support if mts configuration setting is set to "sendmail". This is useful if sendmail conf option is to a custom script that creates a proxy connection to an smtp server. * sbr/mts.c: added support for MHMTSCONF and MHMTSUSERCONF envvars. The former specifies an alternative system mts.conf to use. The later specifies a user-specific mts.conf to use. This one will be read after the system conf, so the user's conf only needs to set options they want to override. The MHMTSUSERCONF allows a user to set personal alternative mail submission methods w/o affecting other users on the system. * uip/whom.c: added SASL-based options so address checking can work against a server that requires SASL. 2009-12-29 David Levine * uip/mhlistsbr.c, uip/mhlsbr.c, uip/picksbr.c: cast pointers to unsigned long before casting to unsigned int to avoid warnings on 64-bit about casting from pointer to int of different size. * uip/new.c: cast folder_len to int to avoid warning on 64-bit about passing a size_t to an int conversion specifier. 2009-12-25 David Levine * uip/inc.c: gcc 4.4.1 noticed that maildir could have been used before initialization. In fact, if that code was ever reached, maildir would never have been initialized. It's in an adios call, so replaced with NULL. 2009-12-21 David Levine * mts/smtp/smtp.c: In sm_auth_sasl (), removed zeroing of sasl_inbuffer because it could be used in sm_fget (). Also, removed allocation of sasl_inbuffer because that was done in either smtp_init () or sendmail_init (). 2009-01-17 Eric Gillespie * etc/mhn.defaults.sh: Never try to make mhshow start xterm. 2009-01-16 Eric Gillespie * test/runtest, test/tests/inc/test-deb359167, test/tests/inc/test-eom-align, test/tests/manpages/test-manpages: Load common.sh via absolute path, otherwise some /bin/sh (e.g. dash) can't load it. * uip/Makefile.in, uip/new.c, test/tests/new/test-basic: Add new program, and fn/fp/unseen symlinks. * test/{runtest,setup-test}: Move MH profile under Mail directory so each test script will have its own to muck with, if needed. * h/Makefile.in, h/crawl_folders.h, sbr/Makefile.in, sbr/crawl_folders.c, uip/folder.c: Extract the folder crawling code from folder.c into new crawl_folders function, using a callback to assemble the folder info in folder.c. Drop compare function and use strcmp instead. Rename addfold and addir to add_folder and add_children (add dir vs. add folder? confusing names). 2008-12-26 Peter Maydell * sbr/m_getfld.c: fix two bugs which could cause us to walk off the beginning of the stdio or prefix-string buffer when checking for presence of the end-of-message delimiter in some situations. This might cause inc to dump core if you were unlucky. (This was Debian bug 359167.) * test/tests/inc/{md5sums,msgheader.txt,test-deb359167, test-eom-align,fromline.txt,filler.txt,deb359167.mbox}: new tests both for the specific problem and to try to check various alignments of the eom string with the stdio buffer ending. * test/common.sh: new file for common utility functions for the test scripts. Moved findprog out of manpage test script into this new file. Added some functions for doing progress indicators. 2008-12-25 Peter Maydell * test/runtest: automatically run setup-test if it hasn't already been done. Improve error handling in test script with 'set -e'. 2008-10-23 David Levine * h/mh.h: raised NAMESZ from 128 to 999. RFC 2822 limits line lengths to 998 characters, so a header name can be at most that long. m_getfld limits header names to 2 less than NAMESZ, which is fine, because header names must be followed by a colon. Add one for terminating NULL. 2008-10-23 David Levine * sbr/m_getfld.c: in warning message, use NAMESZ-2 instead of NAMESZ-1 bytes because the message says "exceeds", not "is greater than or equal to". 2008-10-23 David Levine * docs/MAIL.FILTERING: added note on removing procmail -f or -r options to try to suppress generation of a "From " line on incoming messages. 2008-08-14 Eric Gillespie * test/setup-test: Don't run autogen.sh unless needed. Build in a blddir under the temporary directory so as not to interfere with whatever the developer may be doing in the source directory. If the temporary directory already exists, rebuild and install it. 2008-08-13 Eric Gillespie * sbr/ambigsw.c: Send print_sw output to stderr. This avoids strange problems with scan `pick -bogus`, not to mention being nicer anyway. * sbr/getans.c, sbr/print_help.c, uip/msh.c: Send print_sw output to stdout. * h/prototypes.h, sbr/print_sw.c (print_sw): Add FILE * argument and send output there rather than to stdout. * test/tests/pick/test-stderr: Add test that error messages don't end up going to stdout. 2008-08-13 Eric Gillespie * uip/pick.c: Print matching messages immediately, instead of waiting until the very end to print anything. Ensure valid sequence name as soon as we parse it from command, instead of searching the messages first. 2008-08-13 Eric Gillespie * uip/Makefile.in, uip/popi.c: Remove popi.c, which has been dead since PatchSet 257 (2000/06/12 11:07:34 UTC). 2008-08-13 Eric Gillespie * h/mhparse.h: Move interfaces also used by mhbuildsbr.c here from mhparse.c. * uip/Makefile.in (mhbuild): Build with mhparse.o. * uip/mhbuildsbr.c: Drop the duplication of mhparse.c. * uip/mhbuild.c, uip/mhlist.c, uip/mhn.c, uip/mhshow.c, uip/mhstore.c, uip/mhtest.c: Drop check swdeclaration, which is now in mhparse.h. * uip/mhparse.c: Move some declarations to mhparse.h, and remove 'static' from the definitions here. (get_ctinfo): Take magic mhbuild support from mhbuildsbr.c's copy, and adapt callers. (incl_name_value, extract_name_value): Move from mhbuildsbr.c to support get_ctinfo change). (get_content, open7Bit): Add Content-Disposition support, added to mhbuildsbr.c's copy in mhbuildsbr.c r1.12 (PatchSet 549). (InitText): Default to CHARSET_UNSPECIFIED instead of "US-ASCII", as mhbuildsbr.c's copy did. Explain termproc. (openBase64, openQuoted, open7Bit): Fix comment from r1.5: suffixes, not prefixes. (openMail): Explain showproc. * test/tests/mhshow/test-cte-binary: Add test for Content-Transfer-Encoding: binary (Debian #136976). * test/tests/mhbuild/test-forw: Add an mhbuild test, testing forw with and without RFC-934 mode. More mhbuild tests would be nice. 2008-08-13 Eric Gillespie * test/tests/bad-input/test-header: Add test for it. * sbr/m_getfld.c: If we reach the end of the line without finding a ':' when parsing a header field, treat that line as the beginning of the body rather than blowing up. These messages are usually spam, but it's nice to be able to at least scan them. 2008-08-12 Eric Gillespie * test/tests/mhshow/test-qp: Test various valid and invalid escape sequences. * uip/mhparse.c (openQuoted): Simplify the decode-or-show for loop by peeking ahead to the next byte(s) when encountering '=', and just let invalid escape sequences through as literals (fixes bug #15245). 2008-08-12 Peter Maydell * autogen.sh (new file): add script for running the GNU autotools in the right order * INSTALL: mention that you need to run autogen.sh if you got nmh from CVS * docs/README.developers: mention autogen.sh rather than suggesting running autoheader and autoconf by hand. * test/setup-test: run autotools via autogen.sh 2008-08-08 Eric Gillespie * sbr/discard.c, sbr/m_getfld.c, uip/scansbr.c: Add support for DragonFlyBSD stdio (from NetBSD pkgsrc). 2008-08-05 Eric Gillespie * uip/folder.c: chdir(nmhdir) in main rather than in dodir, which is called many times. Drop the chdir in get_folder_info, which served no purpose at all. If struct stat has d_type (BSD), use that to skip processing (strcmp, stat, and so on) of message files, mostly undoing the slow-down from the last change. * configure.in: Call CHECK_TYPE_STRUCT_DIRENT_D_TYPE. * aclocal.m4: Add CHECK_TYPE_STRUCT_DIRENT_D_TYPE from GNU coreutils. 2008-08-04 Eric Gillespie * uip/folder.c: Simplify dodir/addir/addfold. Dump hacky over-optimization in addir that tried to avoid readdir after all child directories had been read; this was also trying to support symlinks to directories, but would have been failing (because nlink may have gone to 0 with symlinks to directories remaining) had the lstat usage been correct (lstat doesn't fail for normal directories; should have used S_ISLNK). 2008-08-03 Peter Maydell * test/setup-test: use 'set -e' so we stop on compile failure. Configure --enable-debug for convenience in debugging. * uip/whatnowsbr.c: bug #23319: rework the way we handle the working directory when invoking the user's shell, so that we don't have issues when the cwd contains a space or shell special character. * test/tests/whatnow/test-attach-detach, test/tests/whatnow/test-cd, test/tests/whatnow/test-ls: test cases for this. * sbr/fmt_compile.c: add 'do { ... } while (0)' wrappers to various multi-statement macros to avoid nasty surprises if the macros are used in if() clauses. * bug #23436: man/scan.man, man/forw.man, man/inc.man, man/mh-chart.man, man/mhmail.man, man/mhshow.man, man/mhstore.man, man/msgchk.man, man/packf.man, man/scan.man: fix minor syntax errors groff warns about. * test/runtest, test/README: allow test cases to report that they have been SKIPped as well as PASS/FAIL * test/tests/manpages/test-manpages - new test which runs groff on the manpages and checks that there are no warnings. * test/runalltests: ignore editor backup files 2008-08-03 Eric Gillespie * etc/replcomps, etc/replgroupcomps: Trim trailing whitespace from Subject field. 2008-08-03 Peter Maydell * sbr/fmt_compile.c: when doing an if-test on the result of a function which returns a string result, check whether the string is non-empty (as the documentation says we do). Previously we were always testing the integer 'value'. Bug spotted by Eric Gillespie. * test/tests/repl/test-if-str: test case for this bug 2008-07-24 Eric Gillespie * test/setup-test: Run 'make clean' before building 2008-07-24 Eric Gillespie * test/runtest: cat test-temp-dir only once. Destroy and create test Mail hierarchy here, so each test has its own independent test data. * test/setup-test: Drop needless pushd/popd, which don't exist in sh anyway. Don't use aclocal, which is part of automake. Don't create Mail hierarchy here (see test/runtest). * test/tests/folder/test-create, tests/folder/test-total: Drop unused BINDIR. * tests/pick/test-pick: Remove failing no-op test. * test/tests/scan/test-scan: Write expected and actual output to files and diff them. This way, if the output differs, diff provides the FAILing exit code and shows the differences. 2008-06-12 Josh Bressers * man/repl.man, etc/mhl.reply: Add an attribution line when replying to messages. 2008-06-02 Peter Maydell * h/mh.h, h/prototypes.h, sbr/done.c, uip/inc.c, uip/mhbuild.c, uip/mhlist.c, uip/mhn.c, uip/mhshow.c, uip/mhstore.c, uip/mhtest.c, uip/packf.c, uip/pick.c, uip/rcvdist.c, uip/rcvstore.c, uip/sendsbr.c: when building on gcc, use the noreturn attribute on various functions (should improve code and avoid some spurious 'uninitialized variable' warnings). 2008-06-01 Peter Maydell * docs/README.developers: update the bits about doing a release announcement, now I've actually done one. 2008-05-22 Peter Maydell * uip/scansbr.c: don't use MB_CUR_MAX if we aren't compiled with multibyte support. * uip/whatnowsbr.c: factor out common code for writing ls shell command, and make it do more sensible buffer length checks. Also avoid relying on the return value of sprintf(), as some old systems don't return number of characters written. 2008-05-21 Peter Maydell * sbr/utils.c (mh_xrealloc): don't assume realloc() can handle NULL pointers; some non-POSIX realloc()s can't. * sbr/dtimep.lex: add some table size declarations for the benefit of elderly lexes with small defaults. 2008-05-18 David Levine * sbr/addrsbr.c: removed "err" from conditional, because gcc correctly warned that it would always evaluate as true. It's the address of a static array. 2008-05-16 Oliver Kiddle * sbr/Makefile.in, config/Makefile.in: Don't use $< in target rules in makefiles, as POSIX says it's only defined in inference rules. 2008-05-13 David Levine * configure.in, INSTALL: if --enable-masquerade is not specified to configure, enable all supported masquerade forms. This allows users to masquerade with the default configuration. That seems to be more worthwhile now than trying to prevent users from using it, especially with single-user installations or those where a user can edit etc/mts.conf. 2008-05-04 Peter Maydell * bug #23167: sbr/ruserpass.c (ruserpass): make bad permissions on .netrc be an instantly fatal error. Previously we returned an error value; however, no caller was checking it. So now ruserpass() has a void return type. * bug #23163: various minor fixes for the benefit of older Unixes (specifically SunOS 4): reintroduce strerror() substitute implementation provide memmove() substitute implementation * bug #23163: fix accidentally broken 'build outside source directory' feature * bug #23162: sbr/dtime.c: fix stray HAVE_TM_GMTOFF that wasn't updated to the new macro name. 2008-04-30 Peter Maydell * mts/smtp/smtp.c: provide a callback for SASL_CB_AUTHNAME (fixes issue with SASL sending the wrong username in some circumstances). Thanks to for the patch. 2008-04-29 Peter Maydell * Revert previous attempt at fix for SASL issue as it is the wrong approach. * Fix in correct manner, by making sm_rrecord() and thus sm_hear() set the length of the reply string correctly (the SASL libraries now care if you pass in the wrong length). * Correct various places in smtp.c where the reply string might not have been correctly NUL-terminated. Includes a fix for a particularly nasty and long standing screwup where the buffer length counting in smhear() was totally broken for continued lines from the server. 2008-04-29 Peter Maydell * Cope with sasl_decode64() returning SASL_CONTINUE, as happens with newer sasl libraries and LOGIN auth. 2008-04-27 Peter Maydell * Updated some of the 'how to do a release' documentation. * Upped the VERSION string to '1.3-dev', since 1.3-RC1 has been branched off. 2008-04-27 Peter Maydell * Released nmh-1.3 RC1. 2008-04-11 Oliver Kiddle * acconfig.h, configure.in, sbr/dtime.c, sbr/pidwait.c, uip/mhshowsbr.c, uip/rcvtty.c, uip/slocal.c, uip/termsbr.c: move most remaining macros out of acconfig.h which is an obsolete feature of autoconf 2008-04-05 Peter Maydell * bug #18655: fix use of admonish() for a fatal error (should be adios(); only actual effect would be wrong exit code). Thanks to Craig Leres for spotting this. 2008-04-05 Peter Maydell * bug #20028 (Debian bug 399271): fix code assuming that pointer differences were 32 bits -- thanks to Dean Gaudet for the patch. 2008-01-25 Josh Bressers * uip/mhshowsbr.c (show_all_messages): Be more generous when parsing multipart messages. 2007-11-04 Joel Reicher * Changed done() link overriding to function pointer. Return type is now void so that exit() can be used as done() callback. Dead code return from all done()s removed, with return 1 in main() following done() (should never be reached). 2007-08-21 Josh Bressers * Red Hat Bug #253342: inc.c, utils.c, utils.h: When inc is run with the -silent flag, don't exit(1) for no apparent reason. 2007-03-12 Peter Maydell * bug #18630, #18631, #18632, #18634: various patches from Craig Leres fixing error message argument problems. 2007-03-12 Peter Maydell * bug #15212: configure.in, acconfig.h: remove configure test for broken AT&T vi. This test was broken (it was always returning failure even for non-broken vi implementations) and unfixable. Nobody should be using AT&T vi any more so I have simply moved it back to being a setting you can put manually into acconfig.h if you must. 2006-10-24 David Levine * uip/sendsbr.c: with attachformat values of 1 or 2, add name= portion to Content-Type header. This makes them consistent with attachformat value 0. And it allows mhstore to use that (file)name when extracting attachments. 2006-08-26 Josh Bressers * configure.in: If we're not using dotlocking, there is no need to set inc sgid. 2006-03-30 David Levine * uip/sendsbr.c: with attachformat values of 1 or 2, only generate Content-Disposition headers for MIME attachments, not for the message contents themselves. Microsoft Outlook Build 10.0.6626, at least, doesn't show the message contents if they have Content-Disposition. 2006-03-09 Josh Bressers * sbr/fmt_rfc2047.c (decode_rfc2047): Don't close the iconv descriptor if it isn't valid. 2006-03-08 Josh Bressers * (mh_strcasecmp): Rename the private strcasecmp function to mh_strcasecmp. This keeps the newer gnu linker happy. 2006-03-05 Oliver Kiddle * sbr/fmt_rfc2047.c: don't try to malloc 0 bytes if an RFC2047 encoded block is empty 2006-03-04 Peter Maydell * etc/Makefile.in: use INSTALL_SCRIPT to install scripts; this allows INSTALL_PROGRAM to be set to 'install -s' so binaries are stripped on installation. Apparently the BSDs do this. 2006-02-25 David Levine * uip/sendsbr.c: replaced st_mtim with st_mtime, that's what it should have been. Added #include of h/tws.h to pick up dtime() prototype. 2006-02-20 David Levine * h/mh.h, h/prototypes.h, uip/mhbuildsbr.c, uip/send.c, uip/sendsbr.c, uip/viamail.c, uip/whatnowsbr.c, man/send.man: added -attachformat switch to send, to support alternate MIME header contents when using -attach. See send man page for description. * man/mhbuild.man: wrapped one appearance of "Content-Disposition" with quotes, to be consistent with others. 2006-02-20 Josh Bressers * h/utils.h, sbr/utils.c, uip/flist.c, uip/folder.c: Move duplicate function num_digits into utils.c 2006-02-19 Josh Bressers * sbr/m_draft.c, sbr/utils.c, uip/folder.c, uip/inc.c, uip/mhstoresbr.c, uip/popi.c, uip/refile.c: Add create_folder() function, replacing duplicate code during folder creation. 2006-02-18 David Levine * h/mime.h, h/mhparse.h, uip/mhbuildsbr.c, uip/mhfree.c, man/mhbuild.man, docs/TODO: added support for an optional Content-Disposition header in mhbuild (only). Its contents are supplied between {}, positioned after the optional [], in a mhbuild directive. If the contents do not contain a "filename=" parameter, and the directive has a filename, or something else that ends with "name=", then that will be used to add a "filename=" parameter to the header. 2006-02-12 David Levine * docs/TODO: added RFC2183 to reference of RFC1806 for Content-Disposition header. 2006-01-31 David Levine * uip/mhbuild.c, uip/mhbuildsbr.c, man/mhbuild.man: added -nocontentid switch, to disable generation of Content-ID: header in MIME messages. (Also added -contentid for symmetry.) The default configuration of Microsoft Outlook, Build 10.0.3416 in particular, doesn't see attachments in incoming messages if there are Content-ID headers, see http://home.cwru.edu/~wrv/eudoraoutlookfix.html. This allows users to easily accommodate that by adding mhbuild: -nocontentid to their .mh_profile. 2006-01-29 Oliver Kiddle * bug 4360: uip/replsbr.c: remove trailing newlines from components to fix bug with spaces at the end of Subject/References in replies 2006-01-18 Oliver Kiddle * configure.in: use AS_HELP_STRING for formatting help messages * configure.in, sbr/fmt_scan.c: add autoconf magic to support old systems that don't support multibyte character sets * sbr/fmt_scan.c: fix bug with insertion of newline being wrong if the num function was used at the end of the format buffer 2006-01-17 David Levine * uip/post.c, uip/spost.c: in make_bcc_file (), use same logic as in finish_headers () to detect whether there is an existing From: line in the draft. If draft_from masquerade flag is enabled, this allows the From: to be obeyed in the Bcc, instead of the old behavior of always replacing it with the signature. 2006-01-17 Oliver Kiddle * sbr/fmt_scan.c: more robust multi-byte/column support for field widths, restoring right justification feature 2006-01-16 Oliver Kiddle * h/aliasbr.h, h/rcvmail.h, man/Makefile.in, man/slocal.man, sbr/lock_file.c, uip/aliasbr.c, uip/dropsbr.c, uip/post.c, uip/slocal.c, man/mh-mts.man: remove remnants of code for MMDF * uip/scansbr.c: multiply buffer size by MB_CUR_MAX so multi-byte chars fit 2006-01-14 Josh Bressers * sbr/fmt_scan.c: Turn the PUTSF macro into a function capable of handling multi column characters. 2006-01-07 Josh Bressers * Remove sbr/strerror.c -- strerror(3) is defined in C89. 2006-01-06 Josh Bressers * patch #3968: Move the add() function from its own file (add.c) and into utils.c. There was also a duplicate add() function in mf.c which has been removed. 2006-01-02 Josh Bressers * Remove sbr/pwd.c file, moving the pwd() function into sbr/utils.c. 2006-01-01 Josh Bressers * patch #3967: Create a mh_xrealloc function to prevent mistakes when calling realloc. 2006-01-01 Josh Bressers * patch #3966: Create a mh_xmalloc function to prevent mistakes when calling malloc. 2005-12-24 Peter Maydell * Bug #15285: Don't use $< in target rules in makefiles, as POSIX says it's only defined in inference rules. (BSD make was expanding $< to the empty string in the rule for building sbr/dtimep.c, which causes lex to apparently hang because it's reading from stdin.) 2005-12-24 Peter Maydell * Completely redo db library checking -- we now check for working (include file, library) pairs rather than checking for headers and libraries separately. We also now provide --with-ndbm=lib and --with-ndbmheader=header options to configure to handle situations where configure's autodetection fails. 2005-12-21 Peter Maydell * Fix stupid accidental dependence on a bash quirk in previous configure script change. 2005-12-15 Peter Maydell * Improve checking for Berkeley db libraries: configure should now find a suitable library on systems with new gdbm where compatibility functions are in the gdbm_compat library, and on systems with libdb4. 2005-12-13 Michael Forrest * Fedora Bug #163760: sbr/context_read.c (context_read): Ensure that the context is only read once. 2005-12-12 Josh Bressers * uip/sendsbr.c (annoaux): Fix the call to annotate() fixing a bug which prevented repl from properly annotating messages. 2005-12-07 Jon Steinhart * Fixed a bug where anno -append put the headers in the wrong place if applied to a message that didn't contain any headers. * Added a special value of "all" to the -number option that causes anno -delete to delete all matching components instead of just the first one. * Added new -preserve and -nopreserve options. Using -preserve retains the original last accessed and last modified times on annotated messages. 2005-12-05 Josh Bressers * Fedora Bug #174983: configure.in: Fix the AC_PATH_PROG default when vi isn't found during build. 2005-11-19 Peter Maydell * bug #14977: sbr/context_read.c: special case an MHCONTEXT of "/dev/null" and don't try to lock it. * bug #9228, debian bug #146449: man/mh-profile.man: make it clearer that lower case environment variables (and in particular mheditor) are internal to nmh and not intended to be set by the user. 2005-11-09 Peter Maydell * sbr/mf.c: fix buffer overrun with absurdly long addresses (only causes crashes if scan is run with '-width 16536' or similar) * bug #7917: sbr/context_foil.c, sbr/context_read.c, sbr/context_save.c: mark 'no context' with NULL rather than "/dev/null" so we don't inadvertently try to lock /dev/null (which takes up to a minute in some locking configurations and makes post very slow). * patch #3913: uip/post.c: pass some globals into sm_init() so that it uses SASL if necessary. (This bug was preventing Bcc'd emails from being sent via SASL authenticated SMTP.) * bug #9813: uip/rmf.c: don't crash if there's no Current-Folder entry in the context file. 2005-11-13 Oliver Kiddle * bug #7833: uip/Makefile.in: remove link to install-mh that caused problems on some systems * bug #739: Makefile.in: install target now depends on all to avoid problem on case-insensitive file systems with the INSTALL file 2005-11-10 Josh Bressers * Fedora Bug #172838: configure.in: Fix the AC_PATH_PROG default when sendmail isn't found during build. 2005-11-09 Peter Maydell * h/aliasbr.h: fix a non-ANSI prototype. 2005-11-08 Oliver Kiddle * Simon Burge: acconfig.h, configure.in, uip/rcvtty.c, uip/slocal.c: fix to handle getutent() on NetBSD * INSTALL, README, docs/README.about, man/nmh.man: update most references to the web page and mailing list locations * bug #10230: etc/Makefile.in, man/Makefile.in, uip/Makefile.in: Michael De La Rue: prepend DESTDIR to install locations * configure.in, */Makefile.in, mts/smtp/smtp.c: replace obsolete autoconf macros 2005-11-06 Peter Maydell * sbr/fmt_rfc2047.c, sbr/fmt_scan.c, h/prototypes.h: fix various possible overruns of the buffers in fmt_scan() which would cause crashes if scan was run with '-width 16536' or similar. * uip/popsbr.c: fix compile error which only showed up if nmh was configured with --enable-apop. * Debian Bug# 245932, RedHat Bug# 172388: uip/mhparse.c: don't crash when handling a multipart MIME message with an invalid Content-Type header (file handle was being fclose()d twice). * sbr/Makefile.in: adjust lex command to work on both old and new versions of flex. * configure.in: add an AC_PREREQ() so autoconf 2.13 gives a helpful error message and the Debian autoconf-version-guessing wrapper doesn't guess wrongly. 2005-11-02 Oliver Kiddle * Debian Bug# 320069: Nick Rusnov: uip/popsbr.c: fail when kpop connection attempted without KPOP support compiled in * Debian Bug# 320090: Nick Rusnov: sbr/Makefile.in: fix for newer version of flex and remove autogenerated file from cvs * patch #1155: uip/flist.c: speed up flist by skipping stat on files with numbers as names * docs/Makefile.in: include new files in distribution 2005-10-11 Bill Wohler * docs/FAQ: fold questions into MH FAQ and distribute that instead 2005-10-05 Oliver Kiddle * Harald Geyer: h/mh.h, uip/replsbr.c: back out previous change (fork/vfork) and replace with code that handles the issue directly 2005-05-18 Oliver Kiddle * Debian Bug# 143485: Nick Rusnov: h/mh.h: use fork instead of vfork on Linux * Debian Bug# 261592: Harald Geyer: uip/mhlsbr.c, uip/replsbr.c: test/report error writing to stdout * mts/smtp/smtp.c, uip/popsbr.c: correct SASL include file locations * docs/COMPLETION-BASH: bash completion definitions from Debian * patch #2863: savannah@brisammon.fastmail.fm: sbr/folder_read.c: fix a bug affecting AFS where nmh was setting the READONLY flag for a folder even when you do have write access to the folder * Carl Mummert: h/fmt_compile.h, man/mh-format.man, sbr/fmt_compile.c, sbr/fmt_scan.c: add unquote() function for removing quotes from RFC-2822 encoded headers 2005-02-23 Oliver Kiddle * use iconv to convert RFC-2047 encoded headers to the character set used by the current locale * sbr/folder_read.c fix Debian bug #202667: crash when a message's filename overflows an int when converted * Updated config.guess and config.sub to the most recent versions (from automake 1.9.5) 2005-02-21 Oliver Kiddle * sbr/getpass.c fix bug where inc crashed on failing to reopen the terminal 2005-01-27 Oliver Kiddle * Added -proxy option to inc and msgchk. Based on old patch from Michael Richardson. * On systems where it is available, use nl_langinfo to get the character set if MM_CHARSET is unset 2005-01-21 Oliver Kiddle * sbr/check_charset.c US-ASCII is a subset of UTF-8 so can be handled directly when UTF-8 is being used 2004-12-17 Oliver Kiddle * uip/mhmisc.c Fix -part option to mhshow/mhlist/mhstore to find sub-parts of the specified part 2004-11-19 Jon Steinhart * h/prototypes.h, sbr/folder_addmsg.c, uip/mhstoresbr.c, uip/rcvstore.c, uip/refile.c: Added mail directory argument to folder_addmsg in order to make it possible to provide a path to the ext_hook call that is mailpath-based. A problem existed when a folder was a symbolic link and the pwd call would return the path relative to the filesystem, not to mailpath. A new argument was needed because there was otherwise no reasonable way to get that path. 2004-11-16 Jon Steinhart * sbr/folder_pack.c: Fixed problem where the refile hook was being called after a message was renamed so that it wasn't around for the hook. The hook is now called before the message file is renamed. * sbr/folder_addmsg.c: Fixed wrong directory for hook when refiling with -src option. 2004-10-15 Jon Steinhart * uip/sortm.c: Fixed calling of external hooks. 2004-10-12 Jon Steinhart * uip/inc.c: Fixed another weird bug caused by the static mailpath being overwritten. * uip/sendsbr.c: Fixed bug that caused anno to mangle headers. * sbr/lock_file.c: Fixed strange bug that prevented a lock from ever being obtained if getting it failed the first time. The problem was that the string of XXXXXX that is required by mkstemp() was overwritten the first time through, and so all subsequent times failed because mkstemp() failed. The fix reinitializes the tmp file string. * uip/inc.c: Fixed bug in which the static maildir was overwritted if a format string was read from the profile. * sbr/folder_delmsgs.c: Fixed bug that was producing an incorrect path for the external hook. 2003-10-06 Glenn Burkhardt * uip/slocal.c, configure.in: db configuration fix for Debian; yet another location for ndbm. 2003-09-30 Glenn Burkhardt * Fix 'pick' so handling of options "-list" and "-seq" are independent. * Fix 'inc' realloc error when bringing in more than 100 msgs to empty folder. * Patches submitted by Nick Rusnov from Debian archive applied: Debian Bug# 136976 - Handle binary content messages 143427 - mh-format.man typo 144098 - 'spost; should have same behavior as 'post' w.r.t. mts.conf masquerade line 149745 - slocal ignores 'N' result of previous command 152728 - increase SMTP timeouts to conform to RFC 1123 The timeouts suggested by the RFC seem long to me - but the RFC is still listed as active. 181867 - typo for nmh.man 2003-08-10 Jeffrey C Honig * Fix problem where parsing of address/date fields in fmt_compile is optimized to the first instance. The first instance may be in contitional code which will result in cached data to be used. Instead, convert c_flags to a flags field from a boolean and parse on the first use. * Remove some unused flag bits. Fri Jul 01 22:02:00 2003 Glenn Burkhardt * Applied fixes for configuration problems with Solaris and systems with gdbm instead of db1 (includes bug #2024) * Fixes for bugs #578 - repl leaks umask #1393 - sortm core dumps #1650 - msh leaks file descriptors #1730 - Double free() in mhfree.c:free_encoding() #3356 - In-Reply-To header in default replcomps should be RFC2822 compliant * Revised man page for mh-format (bug #2031) * New replcomps, etc, with Fcc: +outbox in default versions Sat Mar 17 03:18:15 2001 Dan Harkless * Ken Hornstein's configure.in Cyrus SASL checks were doing `x"$with_cyrus_sasl" != "no"' instead of `... != x"no"'. Tue Mar 06 21:04:27 2001 Dan Harkless * Found some historical information about MH in RFC 808. Supplemented it with info from Jerry Peek's MH book and added it to docs/README.about. Tue Feb 6 20:35:40 2001 Shantonu Sen * sbr/dtime.c Use the same Y2K correction code as dtimep.lex * sbr/dtimep.lex Restrict the parser to accept either a numerical timezone offset, or a symbolic one (e.g. EST), but not both (Since "2000 -400 EDT" might cause a double subtraction of 60 minutes if both are parsed. One should be enough). Mon Feb 05 20:22:54 2001 Dan Harkless * -L isn't sufficient for specifying the path of the Cyrus SASL shared library. That'll allow us to link successfully, but on many/most OSes that won't allow us to find libsasl at runtime. On Solaris, we need to specify the library path with -R as well (or else the user will have to use the $LD_LIBRARY_PATH kludge, which is considered harmful). This fix should be extended to other OSes as well. * Print whether we have SASL support in the "nmh configuration" summary configure prints out. * Say in README.developers to use `\date' in case anyone is like me and has `date' aliased in their shell to use a nonstandard (but subjectively more readable) format. Thu Jan 25 21:15:52 2001 Shantonu Sen * man/mh-chart.man has updated synposes of all nmh commands. Tue Jan 23 20:26:15 2001 Shantonu Sen * etc/digestcomps tried to force dates into a 19xx when it's not necessary. Fri Jan 19 21:22:08 2001 Shantonu Sen * First round of manpage updates finished. They are standardized on -man macros, with minimal roff mark-up. * man/tmac.h.in is no longer needed, since the manpages do not depend on them anymore. Note: strict "man" programs that didn't allow ".so" sourcing outside the man tree will now format the man pages correctly. * man/vmh.1 is no longer built, since uip/vmh isn't Tue Jan 9 6:01:22 2001 Shantonu Sen * Finished manpages ali-prev * Removed deprecated files from the repository. Specifically, those rooted in zotnet/ and mts/sendmail mts/mmdf. "cvs update -dP" will give a pruned directory structure. * Updated docs/Makefile.in to include README.manpages, and uip/Makefile.in to include popi.c (which isn't being built, though). This allows "make nmhdist" to create an archive that is file-for-file identical to the current cvs repository. Sun Dec 31 20:48:50 2000 Shantonu Sen * Create docs/README.manpages, which details the formatting rules I've been using. * Finished ali-inc. Sat Dec 30 9:50:13 2000 Shantonu Sen * Created a new file "DATE" to hold the date of the most recent nmh release. This date will be used in the manpages. * Updated docs/README.developers to add the step of updating DATE. Also, updated configure to read in the contents of the file as the variable $DATE. * Started work on updating man pages, with only ali finished so far. Changes: 1) no dependence on an external macro file, 2) uses only -man macros (although I may be mistaken in this), 3) syntax in the SYNOPSIS is a little more in line with standard UNIX documentation, such as bold flags and italicized parameters. Sun Dec 24 10:06:30 2000 Shantonu Sen * Updated INSTALL with information about the --with-locking option. * Fixed the Hesiod tests in configure.in. In systems where res_send was in -lresolv, this information was not being communicated to the HESIOD_LIBS var. Now, if res_send is not found in the default libraries, it's assumed to be in -lresolv, and thus -lresolv is appended to HESIOD_LIBS, which will need that to avoid undefined symbols problems. * Fixed the Kerberos tests in configure.in. New versions of Kerberos 5 have renamed -lcrypto to -lk5crypto (circa krb5 1.1 or thereabouts). The new test tries to determine if -lk5crypto exists. If so, this is a new krb5 system. If not, test for -lcrypto and the rest of old krb5. If that fails, look for a genuine krb4 installation. Fri Dec 22 22:08:51 2000 Dan Harkless * -apop and -noapop were not documented in msgchk.man. -snoop was documented but didn't appear in the usage SYNOPSIS. Fri Dec 22 23:42:16 2000 Shantonu Sen * Made a new ./configure option called "--with-locking" that allows the file locking mechanism to be chosen there instead of requiring a manual edit of config.h. * If the option is not explicitly set, or an invalid option is specified, "dot" locking is chosen. Valid options are "dot", "fcntl", "flock", and "lockf". We need a way to tell the user that these are the valid options, and change the flag "--with-locking" if it's not descriptive enough. Fri Dec 22 19:21:29 2000 Shantonu Sen * Remove the lex-specific memory hints at the beginning of sbr/dtimep.lex. We've already committed to supporting flex only, since lex does not easily allow us to parse a single string, as well as other problems documented below and on nmh-workers. * Added a switch statement to configure.in to test for Mac OS X. If this is the case, LDFLAGS should not contain "-s" since the linker rejects the flag. * Updated MACHINES to include Mac OS X Public Beta, as well as Linux 2.4 running glibc 2.2. Wed Dec 20 16:00:46 2000 Shantonu Sen * Marked deprecated directories in docs/README.developers as deprecated, with pointers to the new code location. Eventually these deprecated directories should go away. Tue Dec 19 19:16:37 2000 Dan Harkless * -apop and -noapop were not documented in inc.man. -snoop was documented but didn't appear in the usage SYNOPSIS. Thu Dec 14 14:32:09 2000 Shantonu Sen * Updated config.guess and config.sub to the most recent versions on ftp://ftp.gnu.org/pub/gnu/config, dated 12-07-00. This should prevent configure from failing on newer operating systems because config.{guess,sub} couldn't correctly identify them. Thu Dec 14 1:30:44 2000 Shantonu Sen * Fixed the circular dependency created when I moved zotnet/mts to mts/generic and merged them into libmts. mts/generic/client.c and mts/generic/mts.c are now in sbr/ (and thus in libmh), which makes libmh self-contained and not depending on an external archive. * All include statements now look for mts.h in h/. The Makefiles and configure script have been modified so that mts/generic is no longer built. Mon Dec 11 22:08:07 2000 Dan Harkless * When Shantonu made the new libmts.a, he swapped $(MTSLIB) and libmh.a in sbr/Makefile.in so that libmh.a comes first, but this causes the build to fail on Solaris, because libmts.a has to get ruserpass() out of libmh.a. Swapping them back to the way Ken Hornstein's patch (which I applied on Jul 20) put them, with libmh.a correctly coming second. If there are times when libmts.a needs to come second, then it would appear there's a circular dependency and someone (Shantonu?) did an mts merge incorrectly. Fri Sep 8 01:36:23 2000 Shantonu Sen * Took out bad time textual time zones like BST and JST. I found them online somewhere, but am not sure if they're correct. Fri Sep 8 00:36:48 2000 Shantonu Sen * Moved zotnet/mts to mts/generic. This code reorganization makes the entire zotnet tree deprecated -- bboards is unneeded, mf was was moved to sbr, tws was rewritten and moved to sbr, and now finally mts. * Created a new static library called libmts.a used during compilation which includes the generic mts code and the smtp/sendmail code. This supercedes the functionality of the old libsmtp.a and the remains of libzot.a. * Updated header includes to reference the new location of mts.h in mts/generic/mts.h. Also, update the configure and top-level Makefile not to descend into zotnet. Also, they don't descend into mts/mmdf and mts/sendmail (the sendmail code has been merged into the smtp code). * Added #include to h/md5.h, since my compile was complaining about implicitly-declared memcpy and memset, which appear to be in strings.h. In any event, nmh.h should take care of it for us. * When doing a "make nmhdist", notice that the generated snapshot does not include zotnet of the mts directories as noted above. Since they are no longer compiled, and I don't see any obvious code path to get to them, end-users should probably not need them. If you think otherwise, turn Makefile generation back on in configure.in and turn on recursion into those dirs in the appropriate Makefile.in Wed Sep 6 22:40:03 2000 Shantonu Sen * Tracked down the problem in the new dtimep where time zones were being radically misreported. It was because the parser knew about military time zones (such as M or E) but in some cases did not know about the textual representation of some zones (like MET). When it encountered one of these, the date parser misread MET as the military time zone T (well, first zone M, then E, and finally T). I took military zones out, and things seem much better. Also, the default behavior of parsing time zones appears to default to GMT in the absence of better info, which is less bogus than assuming the mail came from the current time zone, which was the behavior in 1.04. Thu Aug 10 13:22:13 2000 Dan Harkless * Decided that limiting the message number columns to 3 on my scan.MMDDYY and scan.YYYYMMDD (to try to regain space taken by extra date info) was ill-conceived. It's not that tough to get past 999 messages, though I imagine it's rather rare to exceed 9999. Changed these to 4. Also put the "replied / encrypted" column back in YYYYMMDD -- I've never seen it show anything but a space, but that space is useful if you use scan, grep, and awk (with the default field separator) to grab message numbers (I know -- pick should really be used for these purposes...). Mon Aug 7 20:11:09 CEST 2000 Ruud de Rooij * Modify umask set by mhshow to enable user execute bit, so that viewers that create temporary directories (e.g., lynx) will be able to access them. Thu Aug 03 17:14:08 2000 Dan Harkless * TODO: Allow multiple simultaneous differing contexts, probably each tied to a parent (terminal) process. Tue Aug 1 10:48:05 EDT 2000 Kimmo Suominen * Makefile install rules should not look for generated files in the source tree -- this will happen to work when configuring and building inside the source tree but will fail when using an external build tree. Fixed etc/Makefile.in. Mon Jul 24 16:20:45 2000 Dan Harkless * When Shantonu wrote the new, more portable dtimep.lex, he left out the #ifdef DSTXXX stuff for some reason. Not a good idea, as that code is required for proper printing of numeric-offset timezones that have daylight saving time. Without that code, -0700 during DST gets printed as MST instead of PDT. * Renamed DSTXXX as ADJUST_NUMERIC_ONLY_TZ_OFFSETS_WRT_DST and added an explanatory comment by its #definition. * Updated README.developers with the fact that zotnet/tws is going away. Thu Jul 20 20:30:52 2000 Dan Harkless * Moved Kimmo's new "--with-hash-backup" to be output with the rest of the --with options in the configure --help output. Also, people did not preserve my alphabetization of the --with options when they added new ones. Re-alphabetized. * One more pass at README.developers now that it's clear that my previously-suggested one-line autoconf-file commit can cause unnecessary local makes and an out-of-sync stamp-h.in file, but would not cause problems for other people using the CVS files. * Ken Hornstein's SASL patch was not integrated properly with Ruud's new merged mts/sendmail code. Kimmo has since fixed nmh so it compiles, but according to Ken, the SASL stuff still does not work. Integrating a patch from him for this. * Last pass at README.developers -- Kimmo's 5-step commit was overkill. You only need 3 steps, since configure.in is the only autoconf file with the RCS $Id keyword. * Applied Kurt J. Lidl 's $MAILHOST patch: I have a small patch that would be nice to be included -- basically, it allows the usage of the "MAILHOST" environment variable, without having to have HESIOD turned on. I need this functionality for my environment, where we have identical /usr/local on all my machines (so I cannot just hardcode into the mts.conf file), and I have multiple POP mail servers for my users. Modified inc.man to reflect that along with "pophost:" and -host, $MAILHOST can now activate POP mail inclusion as well. * Fixed warnings from diff on first-time install of nmh. Also added 'echo's clarifying the etc file installation activities. Tue Jul 18 19:36:59 EDT 2000 Kimmo Suominen * Added the answer to Dan's question in README.developers. Mon Jul 17 19:10:36 2000 Dan Harkless * Clarified and made some corrections to Kimmo's README.developers changes (BTW, if anyone can explain why the RCS Ids are able to cause problems with the dependencies, please fill in the explanation -- I never encountered a problem with the old single-commit method). Sat Jul 15 23:13:49 EDT 2000 Kimmo Suominen * Add configure option --with-hash-backup so the backup prefix can be easily changed from "," to "#". * Simplified sbr/Makefile.in so that it works with any make. * Use mkstemp in sbr/lock_file.c. * Commits of autoconf-related files apparently can't all be done in one shot due to RCS Ids changing when committing -- updated README.developers. Tue Jul 11 14:18:01 2000 Dan Harkless * Clarified post.man and send.man for those not completely up on SASL terminology. "SASL encryption layers are not supported for SMTP" means that encryption is supported for the authentication but not for the subsequent data stream. Sat Jul 8 01:36:19 EDT 2000 Kimmo Suominen * Applied Ken Hornstein 's patches implementing SASL support for POP3 and SMTP. If nmh is compiled with SASL support, using the -sasl switch on the inc, msgchk, post, and send commands will enable authentication encryption for SMTP, and both authentication and data stream encryption for POP3. Sat Jun 10 18:37:59 CEST 2000 Ruud de Rooij * Merged mts/sendmail functionality into mts/smtp; switching between smtp and sendmail delivery method is now controlled by mts.conf. * If tsort cannot deal with loops, in addition to defining tsort as cat, also define lorder as echo. * Removed uip/popi.c from list of sources. Thu Jun 08 19:36:57 2000 Dan Harkless * New dtimep.lex didn't parse day names properly. Fixed. Also clarified ambiguous comments preceding day_map[] array (from old dtimep.lex) that probably led to the erroneous cp++ being added. Wed Jun 7 20:52:33 CEST 2000 Ruud de Rooij * Added one more mkstemp invocation to uip/spost.c (which was in a #if 0 block). * Applied patch from Peter Maydell to clean up permissions handling and error handling in uip/inc.c. Mon Jun 5 22:10:07 CEST 2000 Ruud de Rooij * Use cat instead of tsort if tsort cannot deal with loops in its input (which is the case for tsort from GNU textutils). Mon Jun 5 21:14:36 CEST 2000 Ruud de Rooij * If lockfile is present, and its dotlockfile program is setgid, inc does not need to be setgid. Sun Jun 4 21:35:40 CEST 2000 Ruud de Rooij * Added autoconf test for Miquel van Smoorenburg's liblockfile library, as found on Debian systems. * Added liblockfile support to sbr/lock_file.c. Wed May 31 7:19:30 2000 Shantonu Sen * Fixed up dtimep.lex a bit. Added back memory options for AIX to increase available memory. Took out %option noyywrap, which wasn't understood by AT&T lex, as well as the -i case-insensitivity flag. Wed May 31 07:40:45 2000 Doug Morris * Added a lint target to the Makefiles and a check in autoconf to determine whether lint or lclint exists on the system. Fri May 30 19:21:48 2000 Dan Harkless * etc/Makefile.in was incorrectly installing mts.conf.in and sendfiles.in -- fixed. Generated sendfiles script was not a dependency of the `all' target, and was incorrectly included in the distribution. Changed the suffix for the backed-up previous versions of the etc files from the ambiguous .old to .prev. Added call to diff -- only keep the .prev files around if different from the newly-installed versions (intentionally didn't redirect output to /dev/null so you'll notice when your changed versions are getting moved aside). * INSTALL never documented the etc/*.old thing. Documented the new etc/*.prev thing (including a note to watch for diff output). * Applied Alec Wolman 's dropsbr.c patch: In the map_write routine, a call is made to map_open and this call is supposed to set the "clear" variable to 0 or 1, depending on whether the map file is empty or not. In mh6.8.3, this worked because map_open would set "clear" by calling the mbx_Xopen routine. In nmh, the code for mbx_Xopen was merged into mbx_open, but the interface for mbx_open doesn't support the clear variable, so that functionality was lost. The map_open interface still contains "int *clear" in the prototype, but never sets it. My patch eliminates "clear" from the map_open interface (I checked to make sure that map_write is the only client of map_open). Furthermore, my patch also sets the "clear" variable properly at the beginning of map_write by calling fstat(). This eliminates the bug in that the value of "clear" being used later in the routine was just stack garbage. Having a bad value of clear causes this next bug to be triggered: The fp file pointer was being opened with fdopen, but in two of the three switch cases it wasn't being closed. In certain cases, this was causing packf to run out of file descriptors if you attempted to pack a large folder. Mon May 29 7:48:15 2000 Shantonu Sen * Moved the date parsing routines from zotnet/tws to sbr/ (and tws.h to h/). Updated all source files to reflect to new location of tws.h. * Rewrote dparsetime (in dtimep.lex -> dtimep.c) to replace the old zotnet/tws/dtimep.c, dtimep.lex, lexstring.c, lexedit.c, and dtimep.c-lexed. It should now work with flex (although untested with lex), and requires no sed-ing. For now, I have the lexed version in the distribution, so that end-users don't need to worry about running it through flex/lex. I have not added back support for guessing the time zone when it's not specified. Sun May 28 17:44:15 CEST 2000 Ruud de Rooij * Added autoconf check for getutent(). * Changed uip/rcvtty.c and uip/slocal.c to use getutent() and friends. Since I can only check on Linux, please check if this works on other systems. Sun May 28 14:58:49 CEST 2000 Ruud de Rooij * Applied patch from Peter Maydell to uip/scansbr.c for more checks for write failures. * Unlink temporary file properly in uip/rcvtty.c. * Moved viamail from bindir to libdir. * Changed sendfiles into sendfiles.in, so that path to viamail is patched in. * Added gzip support to sendfiles. * Added References header to replcomps and replgroupcomps. Sun May 28 14:39:31 CEST 2000 Ruud de Rooij * Fixed m_getfld bug which caused segmentation faults when incorporating messages which ended in multiple linefeeds crossing a buffer boundary. Fri May 26 13:21:59 2000 Dan Harkless * msh has been unable to show MIME messages ever since 1.0. Alec Wolman tracked down the problem to the -show flag being passed to mhshow. mhshow is equivalent to the old mhn -show, so we don't need the -show anymore. Removed it. Fri May 12 02:51:21 2000 Shantonu Sen * zotnet/bboards is not longer built by default. Goal is to move the assorted functions in zotnet into sbr or some more logical place. * Moved zotnet/mf to sbr, and changed mf.h references accordingly, as well as Makefiles. Thu May 11 02:21:34 2000 Shantonu Sen * Simplified sbr/Makefile.in so that both SRCS and OBJS aren't separately and redundantly defined, but so that OBJS is a pattern-substituted version of SRCS with suffix .c -> .o. This should make maintainability easier. * Added section to MACHINES indicating what platforms nmh is known to compile and work on, just to give users peace of mind, or something. This is by no means complete or exhaustive, so add whatever you know works. Tue May 09 20:38:04 2000 Dan Harkless * Alphabetized Shantonu's $pop_kinds output on configure's "pop is enabled" line. If POP3 is the only kind of POP enabled, say so, rather than just saying "yes" (which is ambiguous). * Fixed four warnings in Shantonu's new getpass.c. Needed to #include for calloc(), for ttyname(), and "h/mh.h" for adios(). Also changed ch from char to int to get rid of "comparison is always 1 due to limited range of data type" on EOF. * Added steps to README.developers saying to change the version number to X.Y.Z+dev. Did a little rearranging and changed the FTP dir from /home/ftp to /var/ftp to reflect Doug's new machine. * Changed configure.in to use gcc -Wall even without --enable-debug, to prevent developers compiling optimized from introducing warnings, and to give end-users a warm, fuzzy feeling as they (hopefully) see no warnings come out (except perhaps on the lex output file) even with -Wall. * Renamed getpass() to nmh_getpass() since the prototype for getpass() varies from OS to OS, and we want to _always_ use our version of the function. Fixed all the callers to use nmh_getpass() and added it to prototypes.h. Semi-arbitrarily upped MAX_PASSWORD_LEN from 128 to 256. buf was being calloc()'d and the memory leaked -- should have just been declared as static char array. Prepended "Portions of this code are" to the copyright message, as this version has been changed significantly from the BSD version. * Added "nmh-local functions to use in preference to OS versions" section to README.developers (currently just says to use nmh_getpass() instead of system getpass()). * Prepended "Portions of this code are" to the copyright message in ruserpass.c also. * Added mts.conf.5 page per Neil W Rickert 's report: This happens on solaris: % man mts.conf windex entry incorrect: mts.conf(5) not found. No manual entry for mts.conf. It is fixed by % echo ".so man5/mh-tailor.5" > mts.conf.5 done in the man5 directory. We need to add 'mts.conf.5' as a reference sourcing mh-tailor.5. Mon May 08 23:51:55 2000 Dan Harkless * Doug informed me that the way I had restored the "lost" version histories was wrong, because `cvs checkout's of old versions of nmh wouldn't work properly. It occurs to me that this could be fixed by simply deleting those tags in the new-location *,v files, but oh well. I'm putting everything back to the way Doug originally had it. To get the old version history for a file that used to be in the top directory, you'll need to "blindly" do a `cvs log' there (even though you won't have a local copy of the file in that directory). `cvs diff' will no longer be able to diff pre-move versions vs. post-move versions -- you'll have to do a lot of manual gyrations with `cvs checkout' and then use `diff'. * I had alphabetized the --configure options in the --help output awhile back, but Shantonu added --enable-apop just under --enable-pop. Put it in alphabetical order and clarified what --enable-apop does vs. --enable-pop and --with-krb4. Also changed --with-mts help line from "mail transport agent" to "mail transport agent/service" so the 's' in "mts" doesn't seem to come out of nowhere. * Added two steps to "releasing nmh" in README.developers. After making the tarball, it's a good idea to diff the tree vs. the CVS tree to make sure no files got left out, and then to chown the files so that they're owned by root, preventing a Trojaning attack by a malicious remote user with a UID matching yours. * Changed DIFFERENCES to say that RPOP is not currently supported rather than implying it by saying that APOP, KPOP, and POP[3] are. Sun May 07 18:16:43 2000 Shantonu Sen * Imported NetBSD version of getpass() and made extensive revisions for compatibility with programs that pipe the password to stdin, such as exmh. * Removed tests for system ruserpass() which sometimes gave phantom positive results. Also, bext to use internal functions if we ever want to change .netrc format to something else, or access other files. Sat May 06 08:28:09 2000 Dan Harkless * Restored lost version histories for those moved files by doing a manual `mv' in the CVSROOT on mhost. CVS badly needs a `cvs mv' command so that you can move files (without having physical access to the CVSROOT) without losing versioning. Put MACHINES back at the top level as it needs to be read before building. Fixed DIST variable in {.,docs}/Makefile.in to reflect that and to add missing entry for "INSTALL" file. Sat May 06 13:13:07 2000 Doug Morris * Re-cleaned up nmh documentation (by moving things to docs subdir) and modified Makefile & configure.in to handle the change. Mon Apr 17 21:28:40 2000 Dan Harkless * Scott Blachowicz pointed out that the configure --help output for --enable-masquerade was misleading. Clarified. Mon Apr 17 19:01:00 2000 Shantonu Sen * APOP support can be compiled in to inc and msgchk using --enable-apop. * To access an APOP host, specify -apop on the command line along with any -host or -user option. Fri Apr 14 23:10:44 2000 Dan Harkless * Upped the version number to 1.0.4+dev until the next nmh release. * Added a "releasing nmh" section to README.developers, while the process was fresh in my mind. Fri Apr 14 18:21:34 2000 Dan Harkless * Added new files README.developers, ChangeLog_MH-3_to_MH-6.6, and ChangeLog_MH-6.7.0_to_MH-6.8.4.html to DIST target in Makefile.in. * Released nmh-1.0.4. Tue Apr 11 21:37:03 2000 Dan Harkless * Applied Brian Campbell 's mhn.defaults.sh patch: It appears that there shouldn't be quotes around the %s in the iso-8859-1 charset entry; xterm passes the remaining arguments to the program, quoting them means that xterm thinks they're part of the program's name. This %s isn't the same as the "Insert content subtype" one from mhshow-show-* -- it doesn't come from MIME headers and is safe not to quote. Sun Apr 09 13:03:59 2000 Doug Morris * added check in fmt_compile() to handle a single-character format string. fmt_compile() depends on having an array of format characters with an empty item at the end. A single-character format would cause programs using this function to segfault because the algorithm used to decide on the length of the array mistakenly created a single-item array when the format string was one character. This eventually caused problems when the program attempted to test item+1 in the array. Thu Apr 06 21:53:50 2000 Dan Harkless * Richard Coleman threw out a lot of old MH-specific files in nmh. Much of the stuff, indeed, is not worth saving, but there are nuggets that are very worthwhile, and should probably be added back in. Most important, IMHO, are the MH change logs, as they can help answer questions like "Why is this code like this?" or "How long has this been broken?" or "What was this ever used for?" I've added a new file to the nmh tree called ChangeLog_MH-3_to_MH-6.6. It's cobbled together from the mh-6.8.4/papers/mh*/MHCHANGES files. I've re-ordered the entries to go from newest at the top to oldest at the bottom to match the ChangeLog convention. Unfortunately there are no change logs for versions of MH prior to 3 in the MH tar files available at . Also, it appears to me that there are MH-6.6 changes that aren't documented in the logs. I've also added ChangeLog_MH-6.7.0_to_MH-6.8.4.html. This is based on mh-6.8.4/papers/changes/mh-changes.ms. The nroff format and its "catman"-type output are a pain to deal with, but I was loath to throw away the formatting, so I converted the file to HTML. The only actual markup in the body are the "" and "" tags, and "<" and ">" instead of '<' and '>', so it's quite doable to view the file in plain ASCII mode as well. Note that some of the changes this file documents as having been made in MH-6.8.4 may not be present in nmh -- Richard started with 6.8.3 and later put in certain 6.8.4 stuff. Wed Apr 05 21:09:28 2000 Dan Harkless * Applied Eric Schnoebelen 's mhshowsbr.c patch fixing apparent bugs in Dan Winship's new security quoting code: Since upgrading, I've been getting the following errors while attempting to process some MIME messages: (1) Syntax error: Unterminated quoted string exit 2 and: (2) line 1/10 (END)Segmentation fault (core dumped) (2) appears to be due to the testing of an unset pointer in mhshowsbr.c:show_multi_aux(). (1) appears to be caused by mis-quoting a filename being handed to the shell in mhshowsbr.c:show_content_aux(). Resolving the pointer reference issue in mhshowsbr.c:show_multi_aux() turned up a similar mis-quoting problem in the routine. Tue Mar 28 16:17:39 2000 Doug Morris * Applied Todd.Miller@courtesan.com's patch to dropsbr.c to prevent core dumping on packf. Here's the note from his message: Since sizeof(buffer) == sizeof(tmpbuffer) packf will dump core on a file w/o a From line with a line >= BUFSIZ. I noticed this because I had a junk file in my mail spool somehow. Fri Mar 17 11:59:33 2000 Dan Harkless * wesley.craig@umich.edu did not document his previous KPOP patch, so I did so, and asked him to check what I wrote. Unfortunately he didn't notice my misunderstanding of his patch. I wrote that if you #define POPSERVICE "kpop", inc and msgchk will use KPOP exclusively, but if you leave it as "pop3", you can use Wesley's new -kpop switch on a given invocation. Instead, however, -kpop turned out to be necessary on every invocation, and a KPOP user complained. Applied Wesley's new patch, which makes things work like I thought his original patch did. After that, did one more clarifying pass to the documentation in inc.man and msgchk.man. Wed Mar 15 18:45:45 2000 Dan Harkless * When I fixed the long-standing makedir() bugs in January, I had the code call strtoul(..., 0), which I believed to be safe as all modes specified as ASCII constants in the nmh code started with a leading zero (signifying octal), which I did as it would work if internal constants were ever changed to hex. Unfortunately I was unaware of the "Folder-Protect:" .mh_profile entry, which mh-profile.man documents as an octal-only constant, with no leading zero required. I've changed the strtoul() call to an atooi() call and removed the misleading leading zeroes on the ASCII octal constants in the code and man pages. Also changed the "Folder-Protect:" example in the man page to something more interesting than a duplication of the default. * When I added my --enable-masquerade option, you'll note that I didn't make it --enable-nmh-masquerade. I find the --enable-nmh-* options too wordy and I'm not sure why Richard went that route. I've renamed them to just --enable-*, but the old versions will still work as well (they just aren't advertised). * Added a line to the "nmh configuration" output saying whether POP is enabled. * Added a new README.developers file. From the file: This file is intended to provide a few tips for anyone doing development on nmh. Developers who learn things "the hard way" about the nmh codebase (as opposed to local info best encoded in a comment) are encouraged to share their wisdom here. Currently the topics are "autoconf files" and "directory structure". Tue Mar 14 12:41:48 2000 Dan Harkless * Applied, after some finessing, Simon Burge 's --with-smtpservers patch: Here's a patch that allows you to add --with-smtpservers= to the ./configure command line to set the "servers: " line in etc/mts.conf. Around here, we use "mailhost" so that all machines in the current domain just talk to a central machine and nothing else runs an MTA. Now, I can use --with-smtpservers=mailhost instead of having to remember to fix this by hand (and often forgetting to do so!). * Inspired by Simon's patch, added an --enable-masquerade option to configure. It will set the "masquerade:" line of mts.conf. You may specify a subset of the three types of masquerading, like --enable-masquerade="draft_from mmailid", or leave off explicit arguments to enable all three types. * Alphabetized the --enable and --with options in configure.in and INSTALL and added documentation of the two new options to the latter. * Added new dependency for mts.conf: Makefile. If this isn't done, then when you reconfigure nmh with new values for --enable-masquerade or --with-smtpservers, you'll fail to get an updated copy of mts.conf. * Applied Simon Burge 's dtimep.lex patch: It seems that some MUA's didn't handle y2k very well - ELM seems to be one of them, and Ultrix's DXmail (based on MH!). I've got a few emails this month that look like: 575 Jan 00 Xxxxxx Xxxx 3603 ... and 22+ Jan 00 Xxx Xxxxx 1771 ... The first has "15 Jan 100" as the date and the second has "19 Jan 00" as the date. The following works around this so that scan, show, sortm, etc work ok. I put Simon's patch under the control of a new #define called FIX_NON_Y2K_COMPLIANT_MUA_DATES. There's some commentary in acconfig.h about when you might not want to #define it. * Created new dtimep.c-lexed with Simon's change using dtimep.lex lexed on Solaris 2.6. Added missing dependency in zotnet/tws/Makefile.in for dtimep.c: dtimep.c-lexed. * Added scan.MMDDYY and scan.YYYYMMDD format files. Mon Mar 13 21:32:00 2000 Dan Harkless * Applied Sullivan N. Beck 's mhshow-suffix patch: With the patch below, you can add lines like: mhshow-suffix-application/msword: .doc mhshow-suffix-application/PostScript: .ps to the mhn.defaults file to append the given suffix to a scratch file. This allows applications which require a certain suffix to run properly. * Removed -force_html from lynx entry in mhn.defaults.sh (I believe older versions of lynx lack that option) and added "mhshow-suffix-text/html: .html". * Modified username_extension masquerading to only use the extended address on generated [Resent-]From: lines and SMTP envelope From:. With Neil's original implementation, nmh's global idea of the username was changed, which would result in inc lying and saying you had no new mail because it was looking for a mailbox called, for instance, "dan-nmh" (where username was "dan" and $USERNAME_EXTENSION was "-nmh"). * Applied Simon Burge 's dtime.c patch: There's a wrap-around problem that affects the implementation of Zeller's congruence in dtime.c. This causes the day-of-week calculations to fail for dates after Feb 29, 2000 (probably up until some year far in the future). Mon Mar 06 12:20:20 2000 Dan Harkless * Applied Neil W Rickert 's msh.c patch: I finally tracked down the problem in msh that was causing errors whenever I tried to examine a 'mmdf' style mailbox. It turns out that not enough memory was being allocated with calloc(), causing memory pointers to be overwritten and corrupted. Fri Mar 03 16:07:33 2000 Dan Harkless * Changed the new "plussed_user" option to mts.conf's "masquerade:" to "username_extension" after getting feedback from qmail users, who use '-' as a separator rather than '+'. Removed checking of $USERPLUS variable. Now check $USERNAME_EXTENSION, which needs to include the appropriate separator for your MTA ('-', '+', or whatever) as its first character. Thu Mar 02 23:04:30 2000 Dan Harkless * Added a new "boolean" type to mh.h and TRUE and FALSE constants. * Added a note to DIFFERENCES stating that it's out-of-date (Richard was the last one to update it) and that we should consider only documenting incompatibilities with MH there. * Implemented (and documented) a third kind of username masquerading: "plussed user" masquerading. This one was suggested by Neil Rickert . It's based on sendmail's "plussed user" feature, where mail sent to + will be delivered to . When it's enabled, it's controlled by the $USERPLUS environment variable. How is it enabled? Well, that leads me to: * Renamed the "mmailid:" setting in mts.conf to "masquerade:", and changed it so that rather than being a boolean, it can be set to any combination of the three values "draft_from", "mmailid", and "plussed_user". Thus it is now possible to enable the three types of masquerading individually. * Fixed a bug with "mmailid" masquerading (dating back to MH?) where if it was turned on, ','s would no longer be considered GECOS field delimiters. Wed Mar 01 23:30:50 2000 Dan Harkless * Changed the GECOS-field '&' translation behavior to be controlled by the BSD42 #define rather than GCOS_HACK, since it's apparently always appropriate on OSes where BSD42 is #defined, and never appropriate on any other OSes. Thanks to Kimmo Suominen for responding to my "What is this code here for?" comment in mts.c and explaining the feature. Mon Feb 28 21:50:29 2000 Dan Harkless * Upped the version number to 1.0.3+dev (ideally this should be done by whoever makes a release tar file, immediately after doing so). * Applied Paul Fox 's scansbr.c patch, posted to comp.mail.mh, which he says prevents loss of mail when inc'ing into a full filesystem. * Changed "echo > stamp-h.in" in Makefile.in to "date > stamp-h.in" so that stamp-h.in will be different each time configure.in and related files are changed, making it easier to check it in (which is necessary to prevent unnecessary autoconf calls). * My declaration of initgroups() in slocal.c to eliminate the "no prototype" warning wasn't portable (FreeBSD 3.[23] choked). Now use AC_EGREP_HEADER to see where initgroups() is declared, if anywhere. Sun Feb 20 12:17:15 2000 Ruud de Rooij * Fix security hole in mhshowsbr.c which allowed untrusted shell code to be executed. * Released nmh 1.0.3. Thu Feb 10 10:54:36 2000 Dan Harkless * Oops. %-escapes on mhstore lines in mhn.defaults.sh should not be surrounded by single quotes, as a shell is not spawned when just saving files, and the filenames will end up with literal quotes embedded in them. Fri Feb 04 12:29:12 2000 Dan Harkless * Whoever originally added the -help switch to all the commands got too cute and had the option itself print out as "-(help)" in the -help output. One theory is that they were making reference to the fact that clearly you know about the -help option since you're currently looking at its output. I think it's a bad idea to overload the meaning of the parentheses, however -- they're supposed to indicate what abbreviated prefix of the switch you're allowed to specify. The other theory is that because you can say something like "mhstore -" and get "mhstore: - ambiguous. It matches" followed by the same list of switches you get with -help, they were saying you can "sorta" abbreviate "-help" as "-". You don't get the "Usage:" string, though, so it's not really the same thing. Thu Feb 03 17:52:01 2000 Dan Harkless * Applied wesley.craig@umich.edu's KPOP patches. According to him: The following patch fixes a problem with requesting a service key for a machine that has multiple 'A' records. It also makes "-kpop" a command line option, for users who would like to use both "kpop" and "pop". Did no testing of the new features, as I don't have access to a KPOP server. * Modified inc.man and msgchk.man to document Wesley's new -kpop. * Modified INSTALL and config.h.in to reflect the new -kpop feature. Fri Jan 28 17:39:24 2000 Dan Harkless * All %-escapes in mhn.defaults that actually expand to something should be surrounded by single quotes. Added quotes to the ones in mhn.defaults.sh that were missing them. * Added check for lynx to write mhshow-show-text/html line in mhn.defaults.sh. Thu Jan 27 12:22:25 2000 Dan Harkless * makedir() had multiple bugs dating back to MH. An octal constant was apparently being interpreted as decimal, resulting in directories with no user read or execute permissions, making nested directory creation fail. And there wasn't even an _attempt_ to set desired permissions (e.g. from "Folder-Protect:" in .mh_profile) on the outer directories of a nested directory. * A second `make install' would always fail because the check for whether mh_profile.5 existed was written incorrectly. Wed Jan 26 02:22:00 2000 Dan Harkless * Added documentation on both types of masquerading to post's man page. Tue Jan 25 22:58:12 2000 Dan Harkless * Doug's portability fix of my setgid inc autodetection had a caching bug -- if you re-ran configure, uip/Makefile would be corrupted, and installation would bomb out on OSes where inc needs to be setgid. * Implemented a new kind of email address masquerading. Usually, when a user writes a custom "From:" header in a draft, nmh uses it rather than generating one. However, the user's true address is used in the SMTP envelope "From:" and is revealed in the "Sender:" header. Now, when mmailid is set to non-zero, the envelope "From:" uses the address specified in the draft "From:" header, and there is no "Sender:" header. This is useful when sending on behalf of a remote POP3 account or when remote mail robots incorrectly use the envelope "From:" in preference to the body "From:". This processing has only been implemented for post, not for the undocumented spost (which was already missing some "From:" processing that post has). Mon Jan 24 22:26:06 2000 Dan Harkless * Got rid of the rest of the gcc -Wall warnings that I didn't have time for on 1999-07-15 (and, it would seem, some new ones people introduced since then). The primary ones were the warnings that default prototypes were being used for [v]snprintf() and str[n]casecmp(). As of right now, there are _no_ compilation warnings except on dtimep.c-lexed (at least under AIX 4.1.5 and Solaris 2.6). Sun Jan 2 23:42:18 2000 Ruud de Rooij * Move mhtest from bindir to libdir. * Move sendfiles from libdir to bindir. * Updated sendfiles manpage to reflect this change. * Added documentation for -build and -file switches to repl and forw manpages (patch from Peter Maydell). * Fixed interaction between specifying -cc in profile and -group on command-line. Tue Nov 1 13:48:10 1999 Dan Harkless * Changed the version number from 1.0.3 to 1.0.2+dev. There was not unanimous support for my proposed even/odd release/developer version number dichotomy. 1.0.2+dev implies release 1.0.2 plus some development. Fri Oct 29 13:42:51 1999 Dan Harkless * Upped the version number to 1.0.3. If we don't do this, then when people report bugs against 1.0.2, we won't know "which" 1.0.2 they're talking about (since the development source is publicly available via CVS). I think the Linux kernel version numbers are a good model, so the next time we roll a tarball, it should be version 1.0.4 (or higher -- anyhow, an even-numbered version). Fri Oct 29 06:41:08 1999 Doug Morris * Released nmh-1.0.2. Tue Oct 26 22:57:00 1999 Doug Morris * Added check for whether "libtool" is in fact gnu libtool. If it is, it is not used. This is the wrong behavior. If vendor XYZ later on decides to create yet another libtool, we'll be caught again. This works for now. * Minor updates to MACHINES referring to Mac OS X. Thu Oct 21 20:45:37 1999 Doug Morris * Added check for "libtool" (a ranlib type tool for Mac OS X) and modified Makefiles so that nmh will build under Mac OS X. Sun Oct 17 08:28:56 1999 Ruud de Rooij * Changed repl defaults to partly revert to MH behaviour, "-cc all" is now only implied with -group. * The replcomps template includes cc: header again (as in MH). * Updated repl man page to reflect these changes. Sat Oct 16 02:57:47 1999 Doug Morris * Tweaked configure to handle Solaris and SunOS after the BIND changes. Both need more cleanup. Sat Oct 16 00:17:36 1999 Doug Morris * Removed BIND define and replaced it with a check for gethostbyname (to determine if the host is DNS aware) and a check for sethostent. This appears to be the right thing to do, but there is no explanation of the reasoning behind the BIND define in the code and it appears to have been used for multiple purposes. Wed Oct 13 15:53:53 1999 Doug Morris * Updated manpages Makefile to link mh-profile.5 to mh_profile.5 after installation. Suggestion from Richard Cohen . * Modified configure.in to check for _IO_write_ptr and libio.h to determine whether to define LINUX_STDIO instead of using config.guess. Mon Oct 4 15:22:46 1999 Dan Harkless * Added '-L' to the calls of 'ls' in configure.in -- I have seen multiple machines in the past where the mail spool was a symlink to a directory on another device with more free space. Fri Oct 1 22:36:56 1999 Dan Harkless * Fixed a portability problem in Doug's fix of a portability problem in my MAILGROUP autoconf support ('ls -l' vs. 'ls -lg'). Sat Sep 25 18:40:43 1999 Ruud de Rooij * Added config.sub and config.guess to the list of files to be distributed. * Fixed bug in sbr/fmt_scan.c where an extra newline would be added if a list of addresses was split over several header lines. * In mts/smtp/smtp.c, undefine strlen and strcpy if they are macros, regardless of platform. * Allow q to quit mhshow, and n to skip to next part. Patch from Kimmo Suominen . * Modified mhstore to recognize attachments created by sendfiles with x-conversions=gzip. Mon Sep 13 21:20:10 1999 Doug Morris * added explicit cast to long from time_t for tclock in post.c. * Commented out #ifdefs for in termsbr.c since it's needed for ioctl() anyway. This prevents a warning about implicit definition of ioctl(). * Moved guesses performed by AC_CANONICAL_SYSTEM back into the "User Configuration" section of config.h (moved @TOP@ in acconfig.h) so they're easier to find, should someone actually want to mess with them. Sun Sep 12 15:50:34 1999 Doug Morris * updated Makefile.in so it recognized COMPLETION-TCSH and COMPLETION-ZSH (only used in make nmhdist). * added prototype for ruserpas to . Fixes warnings in mhparse.c and mhbuildsbr.c. * added include checks for and to prevent warnings in fmt_compile.c, fmt_scan.c, lock_file.c, sendsbr.c, mhbuildsbr.c, mhcachesbr.c, picksbr.c, and post.c. * added include for to ali.c, scan.c, ap.c, rcvdist.c, rcvstore.c, rcvtty.c, and spost.c to remove warnings about implicit definition of mts_init(). * added to slocal.c to prevent warnings about function initgroups. * added to prevent warning about missing SIGNAL function. * added function prototypes to smtp.c, whatnowproc.c, mhbuildsbr.c, mhparse.c, mshcmds.c, show.c, whatnow.c, mhl.c to fix warnings. * explicitly declared mbx_style in mshcmds.c and lused in fmtdump.c as type static int instead of just static to prevent warnings. * various code cleanups to prevent ambiguous statements (brackets for if/thens and parens for complicated if statements). Sun Sep 12 09:19:27 1999 Doug Morris * commented out _cleanup() in mf.c because it's the only location in all of the source code where it exists. It was preventing compilation on at least linux. * Added check for which is the new location where linux systems appear to be stuffing this header file. Thu Sep 09 23:15:49 1999 Doug Morris * fixed varous mkstmep bugs introduced in 1.0.1 by me. Whups! * added mh_profile SEGV patch from Richard Cohen that prevents crashing when mh_profile doesn't end in a newline. A similar patch was previously sent in by Andrew Bettison . * fixed bug in associated with MAILGROUP #define (group "mail" is not universal) -- hard to believe, but true. Tue Sep 7 16:47:03 1999 Dan Harkless * Renamed ZSH.COMPLETION to COMPLETION-ZSH and added COMPLETION-TCSH. Tue Aug 17 16:06:29 1999 Dan Harkless * Automated #define of MAILGROUP and installation of inc as setgid mail when the mail spool directory isn't world-writable. Thu Jul 15 18:37:07 1999 Dan Harkless * slocal -debug used to leave a file in /tmp for each message processed. Very bad for folks with slocal -debug in their .forward! * Got rid of a ton of compilation warnings. Most were "junk" warnings due to the use of gcc -Wall (without -Wno-parentheses), but a few represented real bugs. There remain many warnings to be tackled that are due to missing function prototypes (e.g. snprintf()). * Default rcvdistcomps no longer puts a copy of all outgoing messages in outbox. Added an rcvdistcomps.outbox that does. Sat Jun 09 12:22:47 1999 Doug Morris * Updated configure to check for mkstemp (available on OpenBSD) and substitute it for mktemp if available. Thu May 13 16:40:19 1999 Doug Morris * Added config.sub and config.guess and updated acconfig.h and configure.in to automatically detect system type and set the proper #defines. Wed May 12 23:41:33 1999 Dan Winship * Released nmh-1.0.1. Fri May 7 17:18:28 1999 Dan Winship * Fixed flist to properly deal with relative folder names. Problem noted by Jerry Peek . * Fixed --with-krb4 to work with original Kerberos 4 libraries as well as the Kerberos 5 compat libraries. Based on a patch from Assar Westerlund . * Added a check in configure.in to test if modf is in libc and link with libm if not. This is needed by at least Digital UNIX. Problem pointed out by Kevin Oberman . * Fix a bug from the "mhn -show" to "mhshow" renaming that made the "list" command in whatnow not work for some users. From Ruud de Rooij . * Replaced "extern int errno" with "#include " in a number of files. Suggested by Stephen Wilson Bailey . * Fixed a problem in how "packf -mbox" translated "Return-Path:" lines. From Kimmo Suominen . * Fixed a segmentation fault in inc. Patch originally from Ruud de Rooij . * Allow display of 8bit encoded messages. From Kimmo Suominen . * Fixed repl to not add line breaks in the middle of long addresses when building a reply. From Ruud de Rooij . * Added -library switch to spost so it can parse user aliases like post does. From Ruud de Rooij . * Changed configure.in's check for sigsetjmp to properly deal with systems like Linux where it is a macro. From . * Fixed a bug in whatnow that could cause it to sometimes exit without prompting the user. Based on a patch by Richard Geiger . * Added code to deal with SIGPIPE in mhl so it doesn't print "Broken pipe" if you quit out of the moreproc. * Documentation: Added a note to MACHINES about Irix make. Added a pointer to the online copy of the MH book in INSTALL. Added some additional information to the whatnow and packf man pages, suggested by Jerry Peek . * Updated INSTALL, FAQ, etc to not refer to Richard as the maintainer or math.gatech.edu as the home any more. 1999-02-06 Richard Coleman * Released nmh-1.0. * Merged mbx_open and mbx_Xopen in dropsbr.c. Fixed mbx_open so that the mode of zero length maildrops would not be changed. * Replaced the substitute version of snprintf() with the one from the Apache web server. * Changed to default mode for creating new messages to 0600 (this should have been done a long time ago). * Changed "flist" to handle searching for multiple sequences for each folder. Also flist will now correctly split Unseen-Sequence if it consists of multiple sequences. * Added new switches `-unlink' and `-nounlink' to "refile". * Added new switches `-unlink' and `-nounlink' to "rmm". * More cleanups of slocal output. Changed adorn() to send to stdout, instead of stderr (to match rest of verbose printing). * Merged mbx_create() into mbx_open, so that creating and opening a nonexistent maildrop is done atomically. This removes a bad race condition. * Fixed bug that caused slocal to be unable to save to MMDF style drop file. * Added new wrapper function usr_folder() to slocal.c to handle adding message to folder (currently, it still uses usr_pipe() to call rcvstore). * seq_list() checks for empty folder before scanning for sequence information. * num_digits() in flist.c and folder.c now returns correct value for 0. Also added sanity check. * folder_delmsgs() now correctly decrements internal message count. * Don't attempt to read sequence information if folder is empty. * Split seq_read into seq_public and seq_private. * Small change to sigmsg.awk, since newer versions of gawk interpret 034 as octal. * In flist, don't scan for sequence information in empty folder. * Updated mhn.defaults.sh to output profile entries for mhshow, mhstore, and mhbuild. * Changed configuration parameter "mhn-access-ftp" to "nmh-access-ftp". Updated man pages * Moved the code in InitMultipart to reverse the order of the parts in a multipart, into its own function "reverse_parts()". * Changed code in mhbuildsbr.c to store unencoded content in the c_cefile structure when building. * Changed code in mhoutsbr.c to look for unencoded content in the c_cefile structure when outputing message. * Changed configuration parameter "mhn-cache" and "mhn-private-cache", to "nmh-cache" and "nmh-private-cache", since it is used in mhstore, mhlist, and mhshow. Updated man pages * Change configuration parameter "mhn-storage" to "nmh-storage", since it is now used in mhstore, mhlist, and mhshow. Updated man pages * Add autoconf support for KPOP (kerberized pop). * Add autoconf support for Hesiod. * Split routines to output a message given a Content structure (output_message, output_content, write7Bit, etc..) to a new file "mhoutsbr.c". * Split output_content(), into output_content() and build_headers(). * Changed copy_some_headers() in mhstoresbr.c, to use the linked list of header fields, rather than reopening the message. * Added free_header() to mhfree.c to free structures containing header field information. * Changed get_content() to use the linked list of header fields when parsing the various MIME headers (Content-XXX). * Changed get_content() to store linked list of header field values when parsing a content. * Changed mhbuild, mhn, mhlist, mhshow, mhstore, to use the routines in mhcachesbr.c to handle the content cache. * Split various funtions (find_cache, find_cache_aux, find_cache_aux2, cache_content) into new file mhcachesbr.c. * More calls to sprintf/strcpy (primarily in mhparse.c and mhbuildsbr.c) converted to snprintf/strncpy. * When a message is displayed with `mhshow', it is now removed from the "unseen" sequence. * Change the default "showmimeproc" to "mhshow". * Split "mhn -show" off into separate command "mhshow". * Split "mhn -store" off into separate command "mhstore". * Split "mhn -list" off into separate command "mhlist". * Add sanity checks to context_find(), context_replace(), and context_del(), to abort if context file hasn't been read. * Add calls to context_read(), to the beginning of all nmh commands (instead of being called indirectly by context_find). * Changes the "substitute" version of vsnprintf/snprintf for operating systems without native versions, to just call the native vsprintf(), and ignore the buffer length. This is faster, but less secure than the previous version that used temporary files. This should only be a problem for systems which do not have a native snprintf(), and require `inc' to be setuid/setgid. * Lots more calls to sprintf/strcpy converted to snprintf/strncpy. * Changes client() routine to take additional parameter, which is the buffer length of the parameter "response". Then added buffer length checks for this parameter. * Changed getws() to get_fields(), since that is apparently the name of a wide character version of gets() on some archetitures. * Lots of sprintf/strcpy calls converted to snprintf/strncpy. * Change the code in most of the commands that take multiple message names/sequences/ranges on the command, such that the msgs array is expanded dynamically. This removes most of the limits on the length of command lines. * Add additional parameter to copyip(), to specify the maximum number of strings that can be copied (security fix). * Create new function getarguments(), to massage the argument vector before parsing it (add any arguments from your profile to the beginning of the argument vector). This also removed the general limit on the number of command line arguments. 1998-07-04 Richard Coleman * Released nmh-0.27. * Added a new command "delete", that is available during a "whatnow" session. It is equivalent to "quit -delete". * Added another parameter to editfile (in whatnowsbr.c), that controls whether editfile should remember the last program that was exec'ed. This way the whatnow command "mime", will not be re-executed if "edit" is later given with no arguments. * Changed whatnowsbr.c, so that whatnow doesn't abort if mhbuild returns an error. * Added parameter to sendsbr(), so you may specify whether to rename the draft file. * Pass delay time to splitmsg() as a parameter, rather than use a global variable. * Moved code to rename draft file after sending message from splitmsg and sendaux, to sendsbr. * Removed all the code in viamail to split messages and then mail them. Replaced this with the standard sendsbr.c routines. * Changed sendsbr(), so that when splitting messages into messages of type "message/partial", the header fields that are copied are more compliant with RFC-2046. * Fixed mhbuild to track temporary files better. They are now correctly removed when mhbuild aborts. * Created a new man page for "sendfiles". The information about "mhn -viamail" in the "mhn" man page was moved to this new page. * Changed the name of the "viamail" shell script to "sendfiles". Modified "sendfiles" to use the new viamail program. * Moved the functionality for "mhn -viamail" out of mhn, and into a separate executable called "viamail". * When storing MIME contents to a folder using mhn -store, they are now accumulated in a temporary file, and then added to the folder using folder_addmsg(). * Moved code to save content to a folder from store_content to new function output_content_folder. * Moved code to save content to file from store_content to new function output_content_file. * Moved code to parse storage format string from store_content to new function parse_format_string. * Fix copy_some_headers() in mhstoresbr.c, so that the correct header fields in the first enclosing message/partial will be copied (according to RFC2046), when using mhn -store to reassemble messages of type message/partial. * Fixed bug to openFTP() in mhparse.c, that caused the tmp file to not be removed, when transferring a message/external file from ftp. * Moved the code in mhparse.c to process -auto switch (scan contents for the attribute "name"), to a new function "get_storeproc" in mhstoresbr.c. * Moved routines to free data structures related to MIME content from mhparse.c and mhbuildsbr.c, to new file mhfree.c. * Moved code to show/display MIME content into new file mhshowsbr.c. * Moved code to store MIME content from into new file mhstoresbr.c * Moved code to parse MIME content into new file mhparse.c. * Moved code to list information about MIME content into new file mhlistsbr.c. * Move part_ok(), type_ok(), content_error(), flush_errors(), and set_endian() to new file mhmisc.c. * Start to isolate the code to show, list, and store MIME messages. One side effect is that only one flag (-show, -list, or -store) can be used at a time now. * mhn -store -auto wasn't storing file in correct directory. * Removed a few dead variables from sbr/ruserpass.c * move code for creating tmp files, and renaming the the composition draft in mhbuild, from build_mime() to main(). * remove left-over code in mhbuild.c, mhbuildsbr.c, for the -[no]auto switch (which isn't used in mhbuild). * split mhn.c into mhn.c and mhnsbr.c (name later changed to mhparse.c). * split mhbuild.c into mhbuild.c and mhbuildsbr.c. 1998-05-25 Richard Coleman * Released nmh-0.26. * Added (unlisted) options [no]dashstuffing to send, post, and whatnow to determine whether to do RFC934 quoting (dashstuffing) for encapsulated BCC messages. The default is still the same (dashstuffing). * Changed the undocumented feature "nodashmunging" in forw and mhl, into the documented feature "nodashstuffing". The default for forw, is still "dashstuffing" for backward compatibility, although I don't believe that bursting RFC934 digests is very common anymore. * Added an option to define REALLYDUMB in the default config.h. But it is not on by default. * moved creation of config file mts.conf from zotnet/mts to etc. This simplified the Makefile in zotnet/mts. * simplified directory support/general to etc. * removed unneeded directory support/bboards. * split getusername() into getusername() and getuserinfo(). * Changed getusr() routine to getusername(). * Slight cleanup in folder_pack.c on code that records the new number of the "cur" message when packing. 1998-05-08 Richard Coleman * Released nmh-0.25. * Change install process, so that hard linking the correct mts library to libmts.a, is not necessary. The final link process uses the original name of the library. * Fixed bug in flist.c and folder.c, so that symbolic links which point to directories, will not decrement the number of directory links remaining. * Split the function list_content (in mhn.c and mhbuild.c) into list_content and list_debug. * Don't pack (folder -pack) an empty folder. * Exit gracefully in flist.c, if no sequence is specified, and no "Unseen-Sequence" is given in nmh profile. 1998-02-27 Richard Coleman * Released nmh-0.24. * Small clarification to the man page for `ali'. * Fix bug in inc.c so that if both flags `-file' and `-truncate' are given, that order doesn't matter. * Fix bug in seq_list.c when realloc'ing for large sequence line. 1998-02-23 Richard Coleman * Released nmh-0.23. * Add new section on "Transfer Encodings" to man page for mhbuild. * In mhbuild.c, split compose_content into compose_content (parse and execute composition string), and scan_content (scan content, decided transfer encoding, check for clash with boundary string). I did a good amount of rearranging of this code. * Moved definitions for data structures for parsing MIME messages from mhn.c and mhbuild.c to a new include file h/mhnsbr.h. * Small amount of rearranging in sendsbr.c * Small changes to MAIL.FILTERING file. * Add the file MAIL.FILTERING to nmh distribution. * Add line to packf so that if message begins with "X-Envelope-From:" field, it is converted to "From ". * Fix packf to add "From " line to beginning of message, even if Return-Path doesn't exist. * Add note to MACHINES file that on Linux, configure doesn't find the functions sigsetjmp/siglongjmp. * Fix configuration for machines that don't have (or find) sigsetjmp/siglongjmp. 1998-02-11 Richard Coleman * Released nmh-0.22. * Add a configure check for sigsetjmp. Add some conditional #define's in h/signals.h in case it's not found. * Added additional notes about -auto switch in mhn man page. * Added note about MM_CHARSET environment variable to mh-profile(5) man page. * Fix signal problem in mhn.c (change setjmp/longjmp to sigsetjmp/siglongjmp). 1998-02-09 Richard Coleman * Released nmh-0.22-pre1. * Changed the first line in mhl.format from " -- using template mhl.format -- " to a blank line. * Added note about automimeproc to mh-profile man page. * Reorganize the main entry point for parsing a MIME message or file in mhn. Add new function parse_file() as new main entry point for parsing MIME files. * Add note to mhn man page, that "mhn -file -" will accept the source message on the standard input. * Changed a sanity check in folder_realloc that was too strict. * -norfc934mode is now the default for mhbuild, rather than -rfc934mode. * Fix mhbuild, so that Content-Description and RFC-822 comments from #forw directive will be correctly included if there is only one message. * Change mhn to correctly default parts of multipart/digest to message/rfc822 (leftover code from rfc934mode was removed). * Restore HP specific code to zotnet/tws/lexstring.c. Apparently it is still needed. 1998-02-06 Richard Coleman * Released nmh-0.21. * If the file given to mhbuild is "-", then accept the draft on standard input, and output the MIME message to standard output. * Cleaned up code in mhbuild.c that decides what transfer encoding to use. * Cleaned up code in mhbuild.c that decides what character set to use for text contents. * Removed old hpux specific code from zotnet/tws/lexstring.c 1998-02-02 Richard Coleman * Released nmh-0.21-pre2. * Added the "decode" variable to mhl.format and mhl.header. * Added new variable "decode" to mhlsbr.c to decode text in header fields as per RFC-2047. * Make sure that when decoding RFC-2047 header fields, that any spaces at the ends of the encoded text are not ignored, but the spaces between encoded word are. * Removed #ifdef's for MIME. MIME support is always compiled in. * scan/inc will now decode both Subject and From lines as RFC-2047 encoded header fields. * Added new function write_charset_8bit() to sbr. It returns the character set to use for 8bit text in composition draft. Changed mhbuild to use this function. * Split mhn man page into man pages for mhn and mhbuild. * mhn -show will only now only use default method for content of type plain, if it is NOT a part of a multipart/alternative. * Split mhn -build into mhbuild. Did some code cleanup. * Added support for %(decode) to fmtdump.c. * check_charset() now accepts US-ASCII as a subset of any ISO-8859-X character set. * Changed the default "showproc" to mhl, instead of the pager more. * When reading file into mhn composition file, only need read permissions, not write permissions. * Added own version of strcasecmp to distribution, since nmh calls it frequently with NULL pointers (ughh). * Replaced uleq.c with strcasecmp. Removed uleq.c from distribution. 1998-01-22 Richard Coleman * Released nmh-0.21-pre1. * If a message is missing charset parameter to text/plain, show will assume US-ASCII, rather than just calling showmimeproc. * Change show.c and mshcmds.c to use check_charset to see if text message contains valid character set. * Added new scan format file "scan.nomime" to support/general that doesn't do any RFC-2047 decoding. * Modified all the scan format files in support/general to do RFC-2047 decoding of Subject field. * Did more work on sbr/fmt_rfc2047.c, so that it will correctly ignore whitespace between two valid encoded words, but not between an encoded word and normal text. * Created new file sbr/check_charset.c. Moved code from fmt_rfc2047.c to check for valid character set to this file. * Added format escape %(decode) to decode contents of "str" register as a RFC-2047 header field. * The command install-mh now recognizes the switches -version and -help. * Added a new argument to print_help.c to decide whether to print profile entries (needed for install-mh to prevent weird loops). * Changed folder_read.c and folder_realloc.c so that mp->lowoff is initialize to max (mp->lowmsg, 1) rather than always 1. * Changed macros for sequence/attribute manipulation so that message status array doesn't need to always start at 1. * Small cleanups in folder_realloc(). 1998-01-09 Richard Coleman * Released nmh-0.20. * Added configure option --with-pager=PAGER. * Added configure option --with-editor=EDITOR. * Changed the default format file for mhl (mhl.format) to also ignore (not display) the header fields Content-Type, Content-Transfer-Encoding, and Content-ID * Fixed core dump in addrsbr.c when using %(proper) format function and the To: line was missing. * Added the file ZSH.COMPLETION to the distribution. 1998-01-04 Richard Coleman * Released nmh-0.20-pre2. * Added new switch -snoop to both `msgchk' and `inc', so you can watch the POP transaction. * Changed "replgroupcomps" to check for Mail-Followup-To header first, and use it if available. * Changed "replcomps" to check for Mail-Reply-To header first, and use it if available. 1998-01-03 Richard Coleman * Released nmh-0.20-pre1. * Changed seq_list.c to dynamically enlarge the buffer for collecting the message ranges in a long sequence line. This should remove the last hard limit on the size of a sequence line. * Changed seq_read.c so that can read long sequence lines. It will use multiple calls to m_getfld() when m_getfld() returns the state FLDPLUS. * Changed brkstring.c to dynamically add more space for pointers if necessary. This is needed when splitting up large sequence lines. * Did some small cleanups in seq_save.c. * Added new switches `-[no]unseen' to rcvstore, to control whether new messages are added to Unseen-Sequence. * Moved locking routines (zotnet/mts/lock.c) to sbr/lock_file.c * Changed the internal UNSEEN flag to SELECT_UNSEEN which is more appropriate. Changed the MHPATH flag to ALLOW_NEW. * Changed "replcomps" to not include CC and TO lines so that that reply message is only directed at the author of the message to which you are replying. * Added new switch `-group' to command repl, which causes repl to use new forms file "replgroupcomps". This is intended for making group replies. * Removed #ifdef for ATHENA. 1997-12-28 Richard Coleman * Released nmh-0.19. * Fix repl,forw so that switch `-form file' will not abort as ambiguious (silly mistake on my part). * Cleaned up the mhn man page. Added info about a few escapes for the formatting/display strings that were not documented (%%, %t). Moved the BNF grammar for the mime composition file, to the end of the man page. * Added the options -[no]format to the command repl. The switch `-format' will filter the message to which you are replying with the standard message filter "mhl.reply", which is now included in the distribution. The `-noformat' option will negate the use of -format or -filter and not include the message to which you are replying in the draft. * Did some cleaning and reorganization on many of the man pages. * Added debugging switch `-debug' to mhparam, which displays the values of all `procs' (and some other misc configuration info) that nmh keeps in global variables. * When using `refile -preserve', if a conflict occurs, then use the next available number above the message number you wish to preserve. * In forw.c, split the code for creating MIME style forwarding out of copy_draft, and into copy_mime_draft. * Move routines in mark.c to print sequences, into new file sbr/seq_print.c * flist will now update the current folder. * Added the switches -[no]fast to flist, to replace -[no]total. The previous switches are still accepted but now undocumented. * More reorganization in flist of the code for traversing folders. * The command "flist +foo -all" will now scan the folder "foo" and all its 1st level children. * Add missing include file to sbr/snprintf.c * Fix alarm bug in rcvtty, so that when it calls external process, the alarm is never longer than 30 minutes. 1997-12-17 Richard Coleman * Released nmh-0.18. * Fixed bug in mark, so that "mark -list -seq foo" will correctly indicate if "foo" is a private sequence. I found this bug mentioned in Jerry Peek's book. * Simplified the code in seq_setcur(), since seq_addmsg() now retains the public/private status of sequences. * Changed sequence handling so that if the switches -public or -nopublic, are not specified for the commands mark, pick, or rcvstore, then existing sequences will retain their previous public/private status. * mhparam now handles the mh-sequences profile entry correctly. * flist -all will now also check readonly folders (for private sequences). * Improve the leaf optimization for folder command. It will now track the number of directories in a folder, and stop stat'ing files once it has hit all the subfolders. * Renamed m_getfolder to getfolder. Changed getfolder to take option to determine whether it should get current folder, or just default folder (Inbox). Changed rcvstore, inc, and rmf to use the new getfolder. * flist now indicates if a sequence is private. * Change WUNTRACED to 0, in pidwait.c, so that commands will wait for stopped processes. * conflict will dynamically allocate space for group names, so it can now handle system with more than 100 groups. 1997-12-09 Richard Coleman * Released nmh-0.18-pre4. * Check if we have enough message status space, before we call folder_realloc() in burst, mhpath, and m_draft(). * mhn will now correctly identify a formatting string of "-" for the option -store, and send content to stdout. * Change the way that memory for message status is allocated. It is dynamcially allocated separately from the folder/message structure. This required changing folder_read.c, folder_realloc.c, folder_free.c. * Removed all the MTR code (experimental code for message status allocation). * Renamed m_readfolder.c to folder_read.c and simplified the code. * Renamed m_freefolder.c to folder_free.c. * Add function trim() to slocal.c to pretty print the debugging output. * Changed the name of m_packfolder() to folder_pack(). Changed the name of m_remsg() to folder_realloc(). Wed Dec 3 23:33:38 1997 Richard Coleman * Released nmh-0.18-pre3. * Changed installation to add `flists' which is hard linked to `flist'. This is a equivalent to `flist -all'. * For flist, -showzero is on by default. * Major changes to flist. Default is now for flist to search current folder. The switch `-all' is now used to specify searching all top level folders. The new switch `-showzero' is used to print out folders that don't contain any messages in the given sequence. * Split BuildFolderList in flist.c into 2 functions (BuildFolderList, BuildFolderListR). Changed these functions so that flist now does better leaf optimization, and will stop stat'ing directory entries when it knows it has hit all the subdirectories of a given directory. * Reorganized code in folder.c, so that all relevant folders are scanned first and information recorded. Then all the folder summaries at printed out at one time. * Made the options of folder(s) more orthogonal. Now "folder -all -noheader -nototal" will do the right thing. * Added `-noall' switch to folder, for completeness. * Changed the default mode for creation of new folders to 0700 (was 0711). * Slightly changed the format for flist. It now indicates if a folder is current. Also the width of the various fields are now calculated at runtime. * Changed the format for folder(s). Folder names are now left justified. The width of the various fields are calculated at runtime. Sun Nov 30 19:14:53 1997 Richard Coleman * Released nmh-0.18-pre2. * Add paragraph to man page for install-mh and to INSTALL file about checking for global mh.profile. * Renamed m_find() to context_find(). Renamed m_replace() to context_replace(). Renamed m_delete() to context_del(). Renamed m_update() to context_save(). Renamed m_getdefs() to context_read(). Renamed m_foil() to context_foil(). * Change rcvstore to use routine folder_addmsg(), instead of adding message to folder itself. * Changed refile, so that if the switch -preserve is used, and a conflict occurs for a particular folder, then folder_addmsg() will just use next highest available number for that folder, instead of exiting. * Make folder_addmsg() more robust. It will make repeated attempts to link file into folder if link returns with the error EEXIST. * Fix bug, so that that if forking sendmail, HELO will be sent unless clientname: option is defined but empty (so now it is the same as the direct smtp code). * Changed sprintb to snprintb (now we pass the buffer length to new routine). Changed code to use new function. * Added snprintf to sbr. Added configure check to build it if you don't have a native version (but haven't changed much code to use it yet). Thu Nov 13 18:42:18 1997 Richard Coleman * Released nmh-0.18-pre1. * Fixed alarm bug in slocal, so that alarm is never called with a value larger than 30 mintues. * Fixed race condition in rmm and refile, so that context is updated before external rmmproc is called. * Removed all the OVERHEAD code. * Move code to add message to folder from refile.c to folder_addmsg.c Fri Jul 25 19:39:29 1997 Richard Coleman * Did some rearranging of the internals of inc.c. * Make -inplace the default for anno, forw, dist, and repl. * Changed --enable-smtp to --with-mts={smtp,sendmail} * Created new directory mts/sendmail for direct sendmail interface (although it currently still uses SMTP). * Removed all the TMA (trusted mail agent) code * Removed all the TTYD (terminal access daemon) code * Removed all the MF (uucp filtering) code. * Removed all the code for BERK. * Removed all the code for stand-alone delivery (MHMTS). * Split the file mts/sendmail/smail.c into sendmail.c and smtp.c. Changed the name of the directory to mts/smtp. * Changed autoconf to use @sysconfdir@ for location of configuration files. * Changed #define in mhn.c from FTP to BUILTIN_FTP. Mon Jul 21 03:22:34 1997 Richard Coleman * Released nmh-0.17. * MAKEDEFS weren't passed down to recursive makes correctly. * slocal.c now checks for UTMP_FILE and _PATH_UTMP instead of hard-coding "/etc/utmp". * rcvtty.c check for _PATH_UTMP if UTMP_FILE is not defined. * Remove configure checks for ulong and ushort. Changed code to just use unsigned {short, long}. * Change addmsg function in refile.c to return new number of refiled message. * Added check in get_returnpath for empty unixbuf. * Cleanup of sbr/pidstatus to use more POSIX macros for return value of wait(). * Change configure to also check /bin for "more". Sat Jul 12 00:02:23 1997 Richard Coleman * Released nmh-0.16. Mon Jun 23 20:13:24 1997 Richard Coleman * Added automimeproc, which should replace automhnproc. * multipart messages will no longer abort for messages of type 8bit or binary (although we still can't really deal with binary messages, yet). * Fix double free of c_storage. From John MacMillan. * mhn now treats unknown subtypes of "text" as text/plain. * mhn changed so that specifying mhn-show-multipart, or mhn-show-multipart/{mixed, alternate, etc...) will override the use of the internal method for displaying these types. Previously mhn would always use the internal method for subtypes mixed, alternate, digest, and parallel (even if an alternate method was specified in mhn.defaults). * mhn show treats unknown subtypes of multipart, as type multipart/mixed (as specified RFC2046). * mhn checks for the parameter "name" rather than "x-name". From MH-6.8.4 patch. * Fix double free of ctinfo in user_content when using #forw with single message. From John MacMillan (and MH-6.8.4 patch). * Changed -mhnproc switch for show, to -showmimeproc. * Changed profile entry "mhnproc" to "showmimeproc". * Added "mime" option to "whatnow", which calls the program "buildmimeproc" (default is mhn -build) to process MIME composition files. * Added -build switch to mhn, to process MIME composition files. * Did some reorganizing of mhn.c. * Changed casting in mts/sendmail/smail.c from (char) to (signed char) so SMTP reply codes work correctly for machines which used unsigned chars by default. Sat Jun 21 01:21:47 1997 Richard Coleman * Released nmh-0.15. * Added new form "scan.unseen" to distribution. It marks messages which are in any sequence in Unseen-Sequence. * Do some rearranging of date/time code in zotnet/tws/dtime.c * Fix sign extension bugs in fmt_scan.c. * Fix m_atoi.c so that strings ending in non-digit characters return 0. * Split code in burst.c so that finding delimiters of digested messages and bursting a message into multiple messages are two separate functions (find_delim and burst). * Add workaround fo AC_PATH_PROG in configure.in, so that BSD4.4 machines can find sendmail, vi, more. * Added "-width" option to rcvtty. * Change a few variable names in zotnet/mts/client.c since they conflict with defines on AIX. * Makefile in zotnet/tws assumes lexing of dtimep.lex was unsuccessful if resulting file is less than 500 lines long (rather than 10, which was previous value), since AIX sed gives mangled file of about 200 lines. * Extract code in rcvstore.c to link message into folder, and put in own subroutine. * Extract code in refile.c to link message into folder, and put in own subroutine. * Moved code to remove messages from folder into own routine "folder_delmsgs" in sbr. Changed rmm.c and refile.c to use new routine. Fri May 16 06:09:31 1997 Richard Coleman * Renamed m_seqok to seq_nameok. * Changed m_setunseen, msh, mshcmds, flist, and scan to use seq_getnum. * Changed m_seqflag to return the number of a sequence rather than its bit flag. Changed its name to seq_getnum and renamed file to sbr/seq_getnum.c. * Removed function m_seqnew and file sbr/m_seqnew.c since it is no longer used. * Added zero switch to m_seqadd function to zero out bits before adding message to sequence. * Renamed function m_setvis to m_setunseen, and renamed corresponding file in sbr. * Renamed function m_setseq to m_setprev, and renamed corresponding file in sbr. * Changed mark.c and pick.c to use m_seqaddsel and m_seqdelsel. * Added new function m_seqdelsel to m_seqdel.c, which deletes all selected messages from a sequence. * Added new function m_seqaddsel to m_seqadd.c, which adds all selected messages to a sequence. * Split sbr/m_seqnew.c into m_seqadd.c, m_seqdel.c, m_seqnew.c, and m_seqok.c. Thu May 15 00:53:17 1997 Richard Coleman * Renamed function pack_folder to m_packfolder, and moved it from uip/folder.c into its own file sbr/m_packfolder.c Wed May 14 23:38:00 1997 Richard Coleman * Changed function m_gmsg to m_readfolder. Renamed file sbr/m_gmsg.c to sbr/m_readfolder.c. Mon May 5 19:57:11 1997 Richard Coleman * Expanded rcvtty man page, and added small patch from MH-6.8.4 distribution. Fri May 2 15:24:34 1997 Richard Coleman * Released nmh-0.14. * Comment out configure test and code for tgetent to allocate its own termcap buffer when passed a NULL argument. Sat Apr 26 03:46:38 1997 Richard Coleman * Added new options `-checkmime', `-nocheckmime', and `-mhnproc' to show. Restructured code to handle options to various `procs' better. Deprecated `-noshowproc' option and NOMHNPROC environment variable. * Added new man page `mh-draft' which documents the draft folder facility in nmh. * Renamed fmtsbr.h to fmt_scan.h. Renamed fmtcompile.h to fmt_compile.h. * split fmtsbr.c into fmt_scan.c and fmt_new.c. Renamed fmtcompile.c to fmt_compile.c, and formataddr.c to fmt_addr.c. * `send -help' wasn't showing the -(no)mime and -split options. Fri Apr 25 02:50:36 1997 Richard Coleman * Released nmh-0.13. * Changed mhpath so it doesn't abort if a message sequence such as "mhpath all" expands to more than 1000 messages. Also mhpath now dynamically reallocated space for message names (The number of command line arguments is still limited to MAXARGS). * Did some general restructuring of the code in folder.c that checks for folder information, and prints it. Thu Apr 24 01:04:37 1997 Richard Coleman * Changed `folder' to reallocate space for folder names if necessary. So `folders' can now handle more than 300 folders. Tue Apr 22 14:01:26 1997 Richard Coleman * Change configure to use a compile check to see if the tm struct has tm_gmtoff, rather than using egrep. Mon Apr 21 02:19:17 1997 Richard Coleman * Released nmh-0.12. * Had set_exists and unset_exists macros backwards. * Released nmh-0.11. Thu Apr 10 02:39:53 1997 Richard Coleman * Added documentation to mh-profile.man about the various `procs' (mhlproc, showproc, lproc, etc...). * Replace the bit twiddling for SELECTED, UNSEEN, and mp->attrstats with macros. * If system doesn't have SIGEMT (like Linux), then use SIGTERM in msh.c instead. * Change fstat to stat in m_gmsg.c since Linux wants to hide dd->dd_fd. * Merge Linux patch sent in by Michel Oosterhof (original patch from bsa@kf8nh.wariat.org). * Document an undocumented MH feature. mhn -form mhl.null will suppress the display of the message header. * mhparam will now return "mhparam etcdir". * Add catproc to /config/config.c and use that in show.c and mshcmds.c, rather than hard coding in /bin/cat. * Add mhnproc to the list of `procs' in mh-profile.man. * Add configure test for lorder and tsort commands. * Commented out the padding in the `msgs` struct in h/mh.h * Change m_gmsg.c to allocate elements to the `info' array by 500 elements at a time (rather than MAXFOLDERS / 5). * Add note to man page for mhmail that zero length messages are not sent. Need to use -body "" to send empty messages. * zotnet/mts/mts.c : compare character with '\0', not NULL. * sbr/getcpy.c : assign '\0' to character, not NULL. * add m_fmsg to most programs in uip so that they explicitly free folder/message structure when done with folder. * uip/slocal.c : cleanup processing of sender. Make sure it is defined even if message is missing "From " line. Mon Mar 31 03:37:35 1997 Richard Coleman * Released nmh-0.10. Sun Mar 30 21:46:17 1997 Richard Coleman * Add configure check for . Turn on LOCALE support by default. Thu Mar 20 03:21:24 1997 Richard Coleman * Reversed previous decision to retain "From " lines in slocal. The "From " line is now removed from all messages. * inc now saves the date from the "From " envelope in the Delivery-Date header for all messages. * sbr/m_getfld.c: Clean up processing of Return-Path and Delivery-Date from the "From " envelope. Mon Mar 17 19:03:36 1997 Richard Coleman * client.c: cast iaddr to int before comparing return value of inet_addr with NOTOK. Tue Mar 11 04:38:10 1997 Richard Coleman * Grep test for signal names was failing on some OS'es because of missing tabs in regex. Sat Mar 8 01:58:22 1997 Richard Coleman * Released nmh-0.09. * Move config files and format files to *.old before installing. * Add configure check for killpg. * msh.c: include instead of and . * prompter.c: don't include anymore. Thu Mar 6 04:03:24 1997 Richard Coleman * Added `-mime' and `-nomime' options to `repl'. From MH-6.8.4 diff. Tue Mar 4 03:10:37 1997 Richard Coleman * ruserpass.c : removed conflicting prototypes. * rcvtty.c : Fixed rcvtty to obey terminal permissions granted by `mesg' command. Previously only worked on BSD machines. Mon Mar 3 00:18:59 1997 Richard Coleman * rcvtty.c : Changed to use #define UTMP_FILE (if exists) rather than hard coded "/etc/utmp". * Released nmh-0.08. * Changed slocal to lock .maildelivery (or file given by -maildelivery) when accessing ndbm/db file for duplicate suppression, instead of locking database itself. Thu Feb 27 05:28:09 1997 Richard Coleman * Added slocal action `mmdf' to deliver to a file in mmdf format. * Changed the slocal actions `file' and `>' to always deliver in mbox (uucp) format rather than be determined by RPATHS config option. * Changed the slocal action `mbox' to deliver in mbox (uucp) format rather than mmdf format. * slocal now adds Delivery-Date field to all messages (previously it only added it to messages when delivering them to a file). The "From " line is now retained on all messages if compiling with RPATHS, rather than being discarded. * rcvpack no longer adds the Delivery-Date field to messages. Sun Feb 23 22:03:54 1997 Richard Coleman * Removed the script packmbox, since it's functionality has been added to packf. * Changed packf so that it uses mbox (uucp) format by default rather than mmdf format. Added options -mbox and -mmdf to packf so you can choose the preferred format. * Changed rcvpack so that it uses mbox (uucp) format by default rather than mmdf format. Added options -mbox and -mmdf to rcvpack so you can choose the preferred format. Tue Feb 18 00:01:05 1997 Richard Coleman * Changed nmh to use dot locking by default (although you can still easily change this in config.h). * Simplified locking code. Removed code allowing setting of locking type in mts.conf. Now the locking type and locking directory (if any) can only be set at compile time. Fri Feb 14 02:49:18 1997 Richard Coleman * Prefer getting timezone information from tm->gmtoff rather than tzset and external timezone variable. Thu Feb 13 00:35:45 1997 Richard Coleman * Fixed typo in ruserpass.c in the variable toktabs. * When ruserpass was added to LIBOBJS, it was missing the suffix. * Released nmh-0.07. Tue Feb 11 01:29:47 1997 Richard Coleman * Add check to configure, so that if ruserpass, or _ruserpass is not found, build version of ruserpass in sbr. * Added define's to discard.c, m_getfld.c, and scansbr.c so the code that manipulates internals of stdio, will build on SCO 5.x. * Added #define to control whether to compile the simple built-in FTP client in mhn. * Added configure check for ushort and ulong. Change code to use ushort/ulong rather than u_short/u_long. * A couple of small cleanups in locking code. * Added configure check for gmtoff element in struct tm. * Added configure check for tzset. Fri Feb 7 03:01:57 1997 Richard Coleman * Released nmh-0.06. * Removed code for machines that don't have socket interface (how could they get mail anyway?). * Removed code for BSD41 machines. I don't think there are many such machines around anymore. * Add configure check for function uname, and prefer it over gethostname. General cleanup of zotnet/mts/mts.c. * Change all `lseek' calls to use POSIX symbolic constants SEEK_SET, SEEK_CUR, SEEK_END. Thu Feb 6 01:16:30 1997 Richard Coleman * Check lex generated file in zotnet/tws and use pre-generated version if necessary. * Released nmh-0.05. * Change to use reliable signals on all platforms that have sigaction. Change so that interrupted system calls are restarted for all signals except SIGALRM. This fixes alarm handling code in smail.c for BSD based systems. * Added lorder and tsort commands so that created libs can be linked in one pass. Tue Feb 4 01:33:00 1997 Richard Coleman * Changed pidwait so that while it is waiting for a child, it should block signals rather than ignore them. Mon Feb 3 21:05:30 1997 Richard Coleman * Add checks to configure for dbm_open and -lndbm. Thu Jan 30 05:15:42 1997 Richard Coleman * folder -pop and folder -push were freeing some memory too quickly, which caused the entry popped from the stack to not become the current folder. Wed Jan 29 01:28:02 1997 Richard Coleman * Released nmh-0.04. * Define ospeed and PC in termsbr.c is OS doesn't have it. Sun Jan 26 20:25:10 1997 Richard Coleman * editfile will create a symbolic link to the altmsg if it can't make a link, on any machine supporting lstat. Formerly this would happen only on BSD42 based machines. Sat Jan 25 22:54:26 1997 Richard Coleman * traverse (in popsbr.c) wasn't calling va_start before using variable argument list. Fixes core dump in inc when using POP. Fri Jan 24 03:27:59 1997 Richard Coleman * The variable pass in remotemail needed to be set to NULL. (From MH-6.8.4 diff). Fixes core dump of msgchk when using POP. * inc and msgchk were using -rpop by default when configured with POP support. Default is now -norpop. Thu Jan 23 02:01:17 1997 Richard Coleman * By default, post will now give the SMTP HELO command with the local hostname. If you specify a hostname with the clientname: option in mts.conf file, post will give the HELO command with that name instead. If the argument to the clientname: option is empty, no HELO command is given. (From the MH-6.8.4 diff) Wed Jan 22 01:55:45 1997 Richard Coleman * When using `-help' for a command, it will also print its profile compents from .mh_profile. (From MH-6.8.4 diff) * "slocal -file" will now correctly takes its input from a file (currently need to specify full path). Sun Jan 19 20:37:21 1997 Richard Coleman * "slocal -debug" will now issue a warning if a non-blank line in the .maildelivery file has less than 5 fields. Sat Jan 18 02:26:41 1997 Richard Coleman * Changed slocal so that code for duplicate suppression (MH config was MSGID) is always built. Added the options -[no]suppressdup to slocal to turn this on/off. Thu Jan 16 00:26:34 1997 Richard Coleman * Released nmh-0.03. * Fixed problem where mark would core dump if no .mh_sequence file existed. * Fixed problem where slocal would core dump if -debug option was given, and certain headers were missing. * Added patch to slocal to add `folder' (+) action, which is shorthand for piping message to rcvstore. Updated man page. Wed Jan 15 21:30:17 1997 Richard Coleman * Changed flist option -unseen to -[no]all. Cleaned up flist man page. Fri Jan 10 20:36:33 1997 Richard Coleman * Fixed flist. Changed the profile component `Folder-Order' to `Flist-Order. Added option `-sequence' to flist, so you can specify the name of the sequence to search for. Thu Jan 9 00:20:48 1997 Richard Coleman * A few minor portability cleanups. Changed to use PATH_MAX rather than MAXPATHLEN. Don't assume ospeed variable exists in termsbr.c. Removed some conflicting prototypes. Wed Jan 8 11:05:02 1997 Richard Coleman * Add configure test to check if tgetent will accept NULL and allocate its own buffer. Borrowed from zsh. * Changed libpath to etcpath. Mon Jan 6 04:15:35 1997 Richard Coleman * Cleaned up source code and Makefiles, so that if your `make' supports the VPATH option, you can build nmh in a different directory from where the source code is located. Fri Jan 3 05:05:18 1997 Richard Coleman * Released nmh-0.02. Wed Jan 1 17:41:52 1997 Richard Coleman * Split mhook man page into man pages for rcvdist, rcvpack, and rcvtty. Tue Dec 31 03:07:48 1996 Richard Coleman * Changed code to use strerror, rather than using sys_errlist and sys_nerr directly. Mon Dec 30 02:15:25 1996 Richard Coleman * -compat switch from install-mh removed. * Changed the default POP port from "pop" to "pop3". Sat Dec 28 13:25:05 1996 Richard Coleman * Changed mhn_defaults to mhn.defaults. Changed create_mhn_defaults (again) to mhn.defaults.sh. Changed find_program (again) to mhn.find.sh. mhn.defaults.sh now takes the search path as an argument. Default search path is now specified in Makefile rather than in script. Fri Dec 27 16:34:01 1996 Richard Coleman * Changed mtstailor file to mts.conf. Updated man pages. * Changed si_value to si_val in mhn.c, since it conflicts with macro defined on Solaris. Thu Dec 26 02:50:15 1996 Richard Coleman * Added --enable-nmh-mhe (and --disable-nmh-mhe) to enable/disable support for Emacs front-end mhe. It is on by default. * Added the following configure options: --enable-nmh-pop to enable client side pop support, --enable-nmh-smtp to enable SMTP support. Client-side pop support now compiles. Man pages for inc, msgchk, mh-chart now correctly added pop options if enabled. Tue Dec 24 14:33:20 1996 Richard Coleman * Added configure test for bug in C libraries where linker can't find ruserpass, but can find _ruserpass. * Fixed configure test so that termcap variable ospeed is correctly found. Mon Dec 23 19:40:17 1996 Richard Coleman * Source files converted to ANSI C. * md5 now compiled separately rather than being included in mhn.c. Changed md5 to use memset and memcpy. Fri Dec 20 02:29:37 1996 Richard Coleman * Collected the error routines adios, advise, admonish, and advertise into one file (error.c), and did some rearranging of the code. Thu Dec 19 19:05:29 1996 Richard Coleman * Added awk script sigmsg.awk (originally written by Geoff Wing for zsh) to automatically generate signal messages for pidstatus.c. Added files sbr/signals.c, h/signals.h. Code now uses sigprocmask to block signals (if available). Code now uses signal blocking on non-BSD machines. Wed Dec 18 01:55:17 1996 Richard Coleman * Add configure check for ATTVIBUG. From Soren's mh autoconf work. * Released nmh-0.01. * Added configure code to check for type of signals functions you have (POSIX or BSD style signals). Added function SIGPROCMASK to simulate sigprocmask on machines that don't have POSIX signals. Fri Dec 13 19:40:48 1996 Richard Coleman * Added -version switch to all commands. Also added to their man pages. Mon Dec 9 16:36:54 1996 Richard Coleman * Renamed uip/trmsbr.c to termsbr.c and changed it to use POSIX termios.h style functions if present. Tue Dec 3 16:18:39 1996 Richard Coleman * Changed support/general/bootmhn.sh to output new mhn_defaults file to standard output by default (makes it easier for testing). Changed name of script to create_mhn_defaults. Changed bootmhn.findit script to find_program. Sun Dec 1 10:00:00 1996 Richard Coleman * Added patch to uip/folder.c from exmh distribution to speed up -recurse option. * Added flist command from exmh distribution. It doesn't work yet, but it compiles :-) * Changed default location for install to /usr/local/nmh/{bin,etc,lib,man}. Split files so that format and configuration files go in nmh/etc, and support binaries go in nmh/lib. Of course, all this can now be changed in the top level Makefile. * Started with mh-6.8.3 as based and converted to autoconf. Rewrote all the Makefiles. Currently only works with sendmail/smtp. Pop support and plenty of other things, are now broken. mmh-0.4/docs/ChangeLog_MH-3_to_MH-6.60000644000000000000000000045627413414435726015512 0ustar rootroot MHCHANGES from MH 6.1 to MH 6.6 [It appears that there may be some undocumented changes to MH 6.6 that should appear here. --Dan Harkless] Sun Jan 4 11:16:54 1987 /mtr uip/mhlsbr.c: "extras" hack for Elz Sat Jan 3 15:03:00 1987 /mtr h/formatsbr.h: parenthesize better, use case-sensitive in bucket search since hashing is case-sensitive uip/{rcvdist,replsbr}.c: CT_ADDR hacks Sat Jan 3 13:11:22 1987 /mtr conf/config/mts.c, mts/sendmail/hosts.c: BIND fix-up Fri Jan 2 23:41:19 1987 /mtr uip/rcvdist.c: touch-ups to sync with replsbr.c uip/scansbr.c: trash trailing whitespace in header components for formating Fri Jan 2 18:43:09 1987 /mtr zotnet/tws/dtimep.lex: ctime w/o TZ hack Fri Jan 2 18:42:55 1987 /mtr uip/dropsbr.c: fixes uip/msh.c, support/pop/popser.c: ditto Mon Dec 22 12:32:45 1986 /mtr (agent: Marshall Rose) -- From Stanford -- h/dropsbr.h, uip/dropsbr.c, support/pop/popser.c: support LAST command in POP service uip/{inc,mshcmds}.c: ditto Mon Dec 15 11:11:32 1986 /mtr (agent: Marshall Rose) uip/post.c: patch for MMDF-IIb submit Wed Dec 3 22:03:58 1986 /mtr support/pop/popd.c: minor fix Tue Dec 2 13:57:41 1986 /mtr (agent: Marshall Rose) support/bboards/bbtar.c: fix for sequent machines Sat Nov 22 20:36:31 1986 /mtr uip/bbc.c: set up time-bomb after HUP Fri Nov 21 14:33:28 1986 /mtr (agent: Marshall Rose) sbr/smatch.c: deref null bug Fri Nov 14 17:25:23 1986 /mtr conf/doc/mhook: typo found by Phyl Mon Nov 10 16:57:41 1986 /mtr (agent: Marshall Rose) -- More stuff from Jef -- zotnet/tws/dtimep.lex: default timezone to localone one Mon Nov 10 08:12:16 1986 /mtr -- Stuff from Jef Poskanzer -- uip/forw.c: add -[no]dashmunging, a hidden option uip/mhlsbr.c: add -[no]dashmunging, a hidden option {conf/doc/mhl.rf,uip/mhlsbr.c}: add [no]split variable Mon Nov 3 15:21:38 1986 /mtr (agent: Marshall Rose) sbr/m_sync.c: fix for sequent machines Mon Nov 3 14:11:48 1986 /mtr (agent: Marshall Rose) uip/msgchk.c: another SUN fix Thu Oct 30 13:03:02 1986 /mtr (agent: Marshall Rose) uip/{rcvtty,ttyw}.c: if no BSD42, turn off TTYD Thu Oct 30 12:57:52 1986 /mtr (agent: Marshall Rose) sbr/formataddr.c, uip/replsbr.c: another realloc() bug found by Terry West Thu Oct 9 12:52:41 1986 /mtr (agent: Marshall Rose) h/mh.h: make ruserpass nonsense based on NFS not SUN Wed Oct 8 15:59:05 1986 /mtr (agent: Marshall Rose) uip/vmh.c: more SYS5 mods from Bob Desinger Mon Oct 6 12:07:02 1986 /mtr (agent: Marshall Rose) conf/examples/encore: config file for Encore Multimax, from Mike Iglesias of UCI Thu Oct 2 12:37:57 1986 /mtr support/pop/popd.c: fixes for 4.3BSD set setsockopt Mon Sep 8 12:47:58 1986 /mtr (agent: Marshall Rose) conf/config/MakeBBoards: smarter Fri Sep 5 14:02:36 1986 /mtr (agent: Marshall Rose) zotnet/bboards/bboards.h: add BB_SEEN to fix list-handling bug in bbc uip/bbc.c: use it Fri Sep 5 09:40:35 1986 /mtr (agent: Marshall Rose) uip/msh.c: add hidden "advance" command uip/wmh.c: use it Fri Sep 5 09:08:17 1986 /mtr (agent: Marshall Rose) mts/sendmail/smail.c: define discard() as void Tue Sep 2 15:27:34 1986 /mtr uip/{bbc,burst,popsbr}.c: ULTRIX loses on ferror() vs. feof() sbr/vfgets.c: ditto Fri Aug 29 09:08:15 1986 /mtr (agent: Marshall Rose) uip/wmh.c: for pTTY() make original window the top one Thu Aug 28 19:39:47 1986 /mtr (agent: Marshall Rose) uip/send.c: handle dist in a read-only folder support/pop/popser.c: anonymous fix for DPOP/BPOP Wed Aug 20 17:23:39 1986 /mtr (agent: Marshall Rose) uip/mhlsbr.c: a bit less demanding on errors when processing the face Wed Aug 20 14:16:12 1986 /mtr (agent: Marshall Rose) conf/config/MakeBBoards: smarter rule Mon Aug 18 10:38:34 1986 /mtr (agent: Marshall Rose) uip/wmh.c: new program--Windowing MH for Integrated Solutions Graphics Workstations; not standardly installed for now since requires special load libraries conf/doc/wmh.rf: man page conf/makefiles/uip: support wmh Fri Aug 15 23:01:06 1986 /mtr sbr/advertise.c: slight touch-up Fri Aug 15 13:58:25 1986 /mtr (agent: Marshall Rose) uip/vmh.c: slight clean-up Thu Aug 14 22:25:23 1986 /mtr support/general/replcomps: add return-path to To: list Tue Aug 12 10:54:47 1986 /mtr (agent: Marshall Rose) support/pop/popser.c: small fix from Dave Cohrs Tue Aug 12 10:53:47 1986 /mtr (agent: Marshall Rose) uip/mhlsbr.c: finally stabilize it Mon Aug 11 10:10:33 1986 /mtr (agent: Marshall Rose) uip/mhlsbr.c: choose default face from from: line Fri Aug 8 12:57:35 1986 /mtr (agent: Marshall Rose) conf/config/config.c, h/mh.h, sbr/m_readefs.c, uip/mhlsbr.c: add support for "faceproc" Sun Jul 27 11:52:37 1986 /mtr conf/doc/show.rf: typos Tue Jul 15 20:26:05 1986 /mtr papers/{bboards/bboards,tutorial/tutorial}.tex: botched MTR's address Fri Jul 11 10:50:31 1986 /mtr MH 6.5 official, out of beta, released for UCI distribution Tue Jul 8 10:50:39 1986 /mtr uip/scansbr.c: split-up a statement for the RT compiler conf/mh-gen.8: add some stuff on POP conf/doc/{ADMIN,popaka}.rf: ditto Sun Jun 29 21:11:30 1986 /mtr sbr/addrsbr.c: yet another fix for the SUN (yaffts) conf/mhconfig.c: if both mts/smtp and options BERK, turn off SMTP Mon Jun 23 20:45:35 1986 /mtr uip/vmh.c: Bob gives us another sys5 fix Thu Jun 19 19:51:43 1986 /mtr zotnet/tws/dtimep.lex: fix spelling for august Wed Jun 18 19:57:09 1986 /mtr uip/vmh.c: sanitize for 8-bit whacko characters Wed Jun 18 11:05:40 1986 /mtr support/bboards/bbexp.c: create archives in BBMODE format, private bboards should have archives created by the BBoards user (just like the standard file) Tue Jun 17 15:23:27 1986 /mtr h/mh.h: add vfork for hpux Tue Jun 17 14:21:08 1986 /mtr uip/scan.c: forgot to make -header always force ATZ behavior Tue Jun 17 10:44:06 1986 /mtr uip/trmsbr.c: no TIOCGWINSZ working on 4.2BSD ULTRIX! Mon Jun 16 19:56:09 1986 /mtr sbr/{m_gmsg,pwd}.c, uip/{bbl,conflict,folder,rmf}.c: add NDIR compile-time option if -lndir include file is called instead of (non BSD systems) h/local.h: new file to make this easier Sun Jun 15 14:20:10 1986 /mtr h/scansbr.h, support/general/scan.{timely,time,size}: remove JLR's fix since it doesn't work right Fri Jun 13 20:08:36 1986 /mtr uip/aliasbr.c: not testing for relative names correctly Fri Jun 13 15:28:10 1986 /mtr sbr/addrsbr.c: another #ifdef BERK fix for the SUN Fri 13 Jun 86 10:29 John Romine h/scansbr.h, support/general/scan.{timely,time,size}: add ">>" at end of body in format string Tue 10 Jun 86 15:34 John Romine h/scansbr.h: eliminate superfluous space from default format string Fri Jun 6 10:56:40 1986 /mtr miscellany/less/screen.c: handle HP terminals better Sun Jun 1 23:07:24 1986 /mtr uip/trmsbr.c: add sc_hardcopy() uip/mhlsbr.c: use it so we don't fork a more on hardcopy ttys conf/doc/mhl.rf: document it Thu May 29 23:42:54 1986 /mtr support/general/scan.mailx: mailx scan format from Bob Simpson of plus5 support/general/mhl.body: format from mtrenv Wed May 28 16:56:40 1986 /mtr conf/examples/nrtc-gremlin: add -125 switch for GHS compiler sbr/getans.c,uip/{mhlsbr,prompter,rcvtty,sendsbr}.c: a bit more careful with the setjmp() Wed May 28 12:44:21 1986 /mtr sbr/fmtcompile.c: allow literal '%'s in format files Tue May 27 19:35:38 1986 /mtr support/pop/popd.c: support for 4.3BSD syslog Thu May 22 15:08:06 1986 /mtr support/general/replcomps: typo Thu May 22 08:13:17 1986 /mtr conf/mh-gen.rf: update Thu May 22 08:05:03 1986 /mtr -- Two New Documents from UCI -- conf/makefiles/{papers,dist}: update dist/READ-ME: remove conf/doc/MH.rf: update papers/beginners: new paper "MH for Beginners" papers/mh4mm: new paper "MH for MM Users" Wed May 21 20:51:47 1986 /mtr conf/{mh-gen.8,doc/{ADMIN,MH}.rf, papers/*/*, COVER-LETTER: update mail addresses Wed May 21 10:10:21 1986 /mtr uip/{rcvdist,replsbr}.c: malloc/free fixes from Steve Smith Tue May 20 22:51:13 1986 /mtr -- From Steve Smith -- conf/examples/ridge: config file sbr/{m_gmsg,pwd}.c: although SYS5, uses uip/show.c: not null-terminating argvector uip/{bbc,vmh}.c: although SYS5, has SIGTSTP uip/sbboards.c: pre-emptive reference of discard to help SYS5 loader conf/{mh-gen.8,mhconfig.c}: add "oldload none" Tue May 20 19:09:15 1986 /mtr uip/scan.c: free'ing a static, tsk Thu May 15 17:09:34 1986 /mtr uip/msgchk.c, conf/doc/{mh-chart,msgchk}.rf: add -[no]date, and -[no]notify type switches Thu May 15 16:36:19 1986 /mtr uip/{inc,msgchk,post,send}.c: improve #define-dependent switches declarations Tue May 13 17:44:47 1986 /mtr sbr/{fmtcompile,formatsbr}.c, support/pop/popwrd.c, uip/{ap,inc,rcvtty,post,spost,whatnowsbr}.c: add some lint stuff conf/makefiles/uip: better lint support for TMA Tue May 13 15:14:07 1986 /mtr -- Some Fixes from Hokey -- uip/vmh.c: a few more SYS5 dependencies zotnet/tws/dtimep.lex: added #include strings.h conf/makefiles/zotnet/tws: added dependency for above uip/post.c: pre-emptive reference of discard to help SYS5 loader conf/examples/plus5: update miscellany/less/Makefile: add SHELL=/bin/sh sbr/m_getfld.c: slight redeclaration for SYS5 Tue May 13 07:59:36 1986 /mtr uip/replsbr.c: some fixes from Van Mon May 12 09:12:39 1986 /mtr sbr/m_getfld.c: new version of matchc() from Van that doesn't give the SUN indigestion Sun May 11 12:40:34 1986 /mtr miscellany/scripts/READ-ME: add amhmail description miscellany/scripts/amhmail.sh: new script Thu May 8 17:50:22 1986 /mtr support/bboards/bbexp.c: set the mode on the archive file if creating it, since m_gmprot() isn't a good default for this application Wed May 7 13:16:45 1986 /mtr uip/post.c: modification for fcc:s broke stand-alone behavior for daemons, etc.; use old method as a fall-back sbr/m_foil.c: also improve modification a bit support/pop/smtpd.c: dead weight Mon May 5 16:07:12 1986 /mtr support/bboards/mmdfII/bboards/bb_wtmail.c: patch for IDIOTIC change in qu_rtxt() Mon May 5 13:32:37 1986 /mtr uip/trmsbr.c: try Van's version for a while miscellany/patch: updates from Van Sun May 4 18:08:47 1986 /mtr MH 6.5 #1[UCI] (nrtc-gremlin) made available to Van Jacobson for inclusion in 4.3BSD UNIX Sun May 4 17:49:43 1986 /mtr sbr/pidwait.c, uip/{bbc,sendsbr,vmh}.c: back off signal handling modifications Sun May 4 16:10:36 1986 /mtr conf/doc/mh.rf: forgot about TMA stuff conf/makefiles/doc: forgot rcvstore Sun May 4 14:18:15 1986 /mtr support/general/replcomps: use %tws instead of %pretty support/general/mhl.*: streamline slight Sun May 4 13:28:23 1986 /mtr uip/msgchk.c: change the "last read" message to use alpha-timezones Sat May 3 02:49:29 1986 /mtr zotnet/tws/{tws.h,dtime.c,dtimep.lex}: fixes for DST conf/makefiles/zotnet/tws: add -n to lex's invocation Sat May 3 01:37:15 1986 /mtr sbr/{m_{sync,update},pidwait}.c, uip/{bbc,sendsbr,vmh}: inspired by Van's 4.2BSD signal optimizations Fri May 2 17:02:01 1986 /mtr uip/show.c: WHATNOW botch fixed by Jim Valerio Fri May 2 16:35:11 1986 /mtr -- More Bug Fixes from Van -- uip/scansbr.c: check return from fclose() uip/inc.c: avoid locking/stat race condition sbr/m_sync.c: lock signals out during update of sequences Thu May 1 15:30:07 1986 /mtr -- From Craig Partridge -- support/pop/mmdfII/pop/READ-ME: fixes Tue Apr 29 20:17:11 1986 /mtr conf/doc/mhook.rf: extra tip with SendMail and slocal Mon Apr 28 21:00:21 1986 /mtr -- Yet Another Fix from Terry -- uip/dropsbr.c: another typo Sun Apr 27 17:23:56 1986 /mtr uip/scansbr.c: recognition of 822 Encrypted: header a bit botched h/scansbr.h, support/general/scan.*: support encrypted Fri Apr 25 13:39:55 1986 /mtr -- From Craig Partridge -- support/bboards/mmdfII/bboards/getbbent.c: bad field in BBoards file causes hang, note it and skip! Fri Apr 25 10:47:19 1986 /mtr uip/trmsbr.c: use stdout (not stderr) for termcap checking Fri Apr 25 00:01:50 1986 /mtr conf/ADMIN.rf: slight touch-up Thu Apr 24 23:53:57 1986 /mtr -- From Craig Partridge -- support/bboards/mmdfII/bboards/*: bug fixes for MMDF-IIb conf/mh-gen.8: mention that MMDF-IIb has the BBoards distribution Thu Apr 24 20:13:28 1986 /mtr uip/msgchk.c: print out last read date conf/makefiles/uip: add tws dependency Thu Apr 24 19:37:09 1986 /mtr conf/doc/ADMIN.rf: typos Thu Apr 24 10:34:06 1986 /mtr zotnet/mts/lock.c: lint touch-up support/pop/popd.c: ditto Thu Apr 24 00:19:35 1986 /mtr conf/doc/mh-chart.rf: slight mods for TMA mods Mon Apr 21 17:31:43 1986 /mtr uip/{inc,post}.c: slight mods for TMA mods conf/doc/mh-chart.rf: ditto Mon Apr 21 10:22:09 1986 /mtr zotnet/mf/mf.c: sanity check in getadrx() on string to parse Thu Apr 17 20:51:53 1986 /mtr zotnet/mts/lock.c: add some more #ifdefs to support stand-alone locking library conf/examples/udel*: update papers/myths/: remove conf/makefile/papers: update Thu Apr 17 13:25:20 1986 /mtr sbr/addrsbr.c: fix from Terry West, more alternate-mailbox misery Mon Apr 14 23:52:03 1986 /mtr sbr/m_getfld.c: locc() not range checking on cnt Mon Apr 14 22:56:46 1986 /mtr support/bboards/bbexp.c: not ending msh correctly, msh tried to update the maildrop even though it was already locked by bbexp Sat Apr 12 16:32:21 1986 /mtr uip/post.c: try to keep fcc:s under MH-directory so links are maintained Thu Apr 10 15:06:59 1986 /mtr conf/config/bboards.*: mail reports to PostMaster Thu Apr 10 10:42:25 1986 /mtr uip/scansbr.c: recognize the 822 "Encrypted:" header instead of doing a uprf() on the body uip/{scan,mshcmds}.c: recognize SCNENC return from scan () Thu Apr 10 03:47:48 1986 /mtr sbr/m_getfld.c: Van fixes Marshall's fix Thu Apr 10 02:26:52 1986 /mtr Makefile: touch-up "make distribution" conf/examples/nrtc-*-mtr: remove conf/makefiles/uip: touch-up conf/doc/MH.rf: add TMA stuff, conditionally Wed Apr 9 22:08:37 1986 /mtr uip/vmh.c: output non-standard control characters in carat format Wed Apr 9 12:36:58 1986 /mtr -- MTR actually gets to fix something! -- sbr/m_getfld.c: messages with an empty body caused inc to prematurely think the maildrop had reached EOF. Believe it or not, the mhmail fix last month exercised this! Wed Apr 9 12:04:56 1986 /mtr -- Van fixes some more bugs -- sbr/m_getfld.c: not handling buffer boundary cases right uip/replsbr.c: not adding "," correctly when concatenating an address string during message scan sbr/formatsbr.c: mymbox test dumped core if address parse failed h/{fmtcompile,formatsbr}.h, sbr/{fmtcompile,formatsbr}.c: more enhancements Mon Apr 7 09:55:23 1986 /mtr mts/sendmail/smail.c: slight "client" check Sun Apr 6 19:22:52 1986 /mtr uip/inc.c: forgot to initialize some FILE*'s; dumps core on celerity Wed Apr 2 17:17:32 1986 /mtr sbr/addrsbr.c: slight typo in comment Mon Mar 31 15:07:26 1986 /mtr uip/replsbr.c: handle bad addresses with better diagnostics Sat Mar 22 18:24:35 1986 /mtr uip/mhmail.c: handle -body better Sat Mar 22 11:51:45 1986 /mtr -- Fixes from Phyllis Kantar -- uip/dropsbr.c: typo conf/doc/{send,pick}.rf: typos conf/makefiles/doc: forgot $(OPTIONSn) in $(MAN1) definition Fri Mar 21 21:12:39 1986 /mtr conf/doc/{MH,mh-format}.rf: typos Thu Mar 20 23:05:10 1986 /mtr uip/mhlsbr.c: mhl enhancement from JLR permitting a prefix string for each line of the body (e.g, "component=" > ") Wed Mar 19 23:12:54 1986 /mtr -- Changes for MMDF-IIb -- uip/post.c, support/bboards/mmdfII/bboards/bb_wtmail.c: know about new mm_winit protocol and RP_NS/RP_DOK responses Wed Mar 19 23:00:53 1986 /mtr support/pop/popser.c: one last fix for ENOENT mailboxes Sun Mar 16 15:20:27 1986 /mtr miscellany/mem: appointment diary support from Ken Yap Tue Mar 11 19:43:27 1986 /mtr h/dropsbr.h, uip/dropsbr.c: new routines mbx_read() and mbx_write() uip/{msh,mshcmds}.c, support/pop/popser.c: use it h/{addr,format,scan}sbr.h, sbr/addrsbr.c: slight touch-up uip/inc.c: slight touch-up Mon Mar 10 18:08:37 1986 /mtr uip/post.c: fix handling of (in)visible addresses uip/rcvdist.c: re-do to use format facility uip/{replsbr,forw}.c: touch-ups conf/config/config.c, h/mh.h: new variable rcvdistcomps conf/{makefiles/{uip,support/general},doc/mhook.rf}: update sbr/m_getfld.c: bstring() support for non BSD42, SYS5 systems conf/doc/ADMIN.rf: update Mon Mar 10 10:17:29 1986 /mtr {sbr/formatsbr,uip/scansbr}.c: more optimizations from Van! sbr/m_getfld.c: Van fixes problems due to losing vanilla-4.2 C optimizer! sbr/m_getfld.c: slight touch-up by MTR uip/bbc.c: remove #ifdef MTR bracketing, code works fine uip/refile.c: slight touch-ups sbr/m_getfld.c: on xxxERR returns, forgetting to zero value buffer Mon Mar 10 00:43:19 1986 /mtr uip/{msh,mshcmds}.c: packf hack, ala refile hack uip/{post,rcvdist}.c, support/bboards/mmdfII/bboards/bb_wtmail.c: MMDF-II nameserver support from Steve Kille Sun Mar 9 20:09:35 1986 /mtr zotnet/bboards/bboards.h: add BB_REMOTE flag for bbc uip/bbc.c: support BB_REMOTE, under #ifdef MTR for the moment uip/bbc.c: allow bb_aka (again?!?) Sun Mar 9 18:52:37 1986 /mtr h/scansbr.h, support/general/{digestcomps,mhl.forward,scan.*}: update Sun Mar 9 14:06:54 1986 /mtr h/scansbr.h, sbr/fmtcompile.c: better versions from Van support/general/{replcomps,scan.timely}: better versions from Van (snuck the %pretty instead of %tws in, eh Van?) support/general/{digestcomps,mhl.forward,scan.{size,time}}: update Sun Mar 9 14:04:26 1986 /mtr conf/mh-gen.8: add a line about chown and sys5 sbr/m_convert.c: better BADRNG diagnostic uip/mshcmds.c: oops, typo Thu Mar 6 13:36:26 1986 /mtr uip/addrsbr.c: yet another fix for ismymbox() uip/replsbr.c: #ifdef ISI code to avoid duplicate replies (due to Jim Koda) Wed Mar 5 12:48:58 1986 /mtr dist/READ-ME: oops, forgot usenix name change conf/makefiles/uip: hmm, interesting loader problem Tue Mar 4 09:53:31 1986 /mtr papers/usenix/: change to realwork/ Tue Mar 4 08:15:17 1986 /mtr -- Van sends fixes to my updates -- uip/mhlsbr.c: not resetting mhlsbr for formatting zotnet/tws/dtimep.lex: not getting MIL-TZ's right Mon Mar 3 16:53:19 1986 /mtr uip/sendsbr.c: oops, close() on an uninitialized variable! (thanks to Jim Koda) Mon Mar 3 10:18:40 1986 /mtr -- Van sends fixes to my updates -- uip/mshcmds.c: not resetting scansbr for formatting uip/scansbr.c: oops, typo! Thu Feb 27 22:16:43 1986 /mtr sbr/formataddr.c: remove sbr/addrsbr.c: Van doesn't like "user*" instead of "user" as the default is-my-mailbox for BERK. Since he's the BERK-author, I'll assume he knows what he's doing... support/general/replcomps: Use "tws", instead of "pretty" for in-reply-to: uip/whatnowsbr.c: If -draft{folder,message} and -nodraftfolder are added as no-ops, make them "hidden" from -help output uip/{{a,d}p,forw,mhlsbr}.c: update Thu Feb 27 22:12:53 1986 /mtr -- Van sends updates -- conf/makefiles/uip, h/fmtcompile.h, sbr/{format{addr,sbr},fmtcompile,addrsbr}.c, support/general/replcomps, uip/{repl,mhl,scan,whatnow}sbr.c Wed Feb 26 21:05:46 1986 /mtr uip/sendsbr.c: better diagnostics when post fails Tue Feb 25 17:45:28 1986 /mtr h/mshsbr.h, uip/msh*.c: add direct folder support for symmetry's sake, ugh! Tue Feb 25 09:47:09 1986 /mtr uip/{scan,mshcmds}.c: slight touch-ups uip/mhlsbr.c: fix up SIGPIPE handling, again support/general/scan.time: fix up for numeric timezone uip/scansbr.c: re-support "encrypted" uip/msh.c: add "exit" command for Dave Farber miscellany/convert: new directory Tue Feb 25 08:08:43 1986 /mtr uip/burst.c: another realloc() fix from Terry West sbr/vfgets.c: ditto support/pop/popser.c: enhancmenets from Dave Cohrs conf/doc/pop5.rf: document it conf/mhconfig.c: support "debug" directive makefiles/*: use it Mon Feb 24 17:14:39 1986 /mtr uip/inc.c: have -host/-file ask if file doesn't exist uip/{packf,mshcmds}.c: ditto Sun Feb 23 13:59:46 1986 /mtr sbr/m_gmsg.c: big bug fix from Terry West. Thanks, Terry! h/strings.h: System5 bcopy-equivalents from Doug Gwyn zotnet/tws/tws.h: support #ifdef ATZ conf/makefiles/uip: slight lint botch Thu Feb 20 22:57:33 1986 /mtr MH 6.4 #1[UCI] (nrtc-gremlin) made available to Van Jacobson for inclusion in 4.3BSD UNIX Thu Feb 20 19:55:20 1986 /mtr uip/mhlsbr.c: add formatsbr support sbr/addrsbr.c: use better default matching in ismymbox miscellany/mtrenv: update support/general/mhl.*: update Thu Feb 20 08:07:49 1986 /mtr uip/{a,d}p.c: start working on it h/formatsbr.h: new variable fmt_norm sbr/formatsbr.c: use it h/fmtcompile.c, sbr/{fmtcompile,formatsbr}.c: define "pretty" sbr/formataddr.c: sight touch-up uip/formatsbr.c: oops, bug in PUTD() uip/{fmtcompile,formatsbr}.c: init mn structures in case of error. This is still buggy since: 1) the structure still doesn't get reset on errors, and 2) you can still dereference nulls zotnet/tws/dtimep.lex: slight touch-up Wed Feb 19 10:50:04 1986 /mtr papers/mh6.4: new interim documentation directory, for 4.3BSD conf/doc/{MH,ap,dp,mh,mh-chart,mhl,repl,scan}.rf: update conf/doc/mh-format.rf: new file support/general/replcomps: oops, should call formataddr on all addrs Wed Feb 19 03:11:42 1986 /mtr sbr/{formataddr,fmtcompile,m_{draft,getfld,maildir},printsw,pwd}.c: lint it uip/{formatsbr,forw,msh,replsbr,scan,scansbr,spost}.c: lint it support/pop/popser.c: lint it sbr/formatsbr.c: remove MHFMTDEBUG code */Makefile: depend 'em Wed Feb 19 01:55:40 1986 /mtr h/mh.h: add msg_* vars in m_getfld() as externs uip/{msh,{repl,scan}sbr}.c: remove msg_* declarations sbr/m_getfld.c: add a bit of BODYEOF support (without slowing it down, wouldn't want to upset Van!) Wed Feb 19 00:56:30 1986 /mtr sbr/m_getfld.c: different fix for packf'd files from Van Wed Feb 19 00:16:55 1986 /mtr uip/dist.c, support/general/distcomps, sbr/fmtcompile.c: updates from Van sbr/formatsbr.c: remove ismymbox prime sbr/fmtcompile.c: use adios(), not exit()! Tue Feb 18 22:14:51 1986 /mtr sbr/m_getfld.c: eom_action() lacking argument sbr/m_getfld.c: not working right on packf'd files uip/{msh,mshcmds}.c: under BPOP, need to fix things so m_getfld() doesn't dump core! Tue Feb 18 02:15:00 1986 /mtr uip/bbc.c: upgrade for new m_getfld() support/general/scan.*, h/scansbr.h: still more changes support/general/replcomps: still more changes Tue Feb 18 01:13:51 1986 /mtr h/formatsbr.h: updates from Van Mon Feb 17 20:14:35 1986 /mtr support/general/scan.{time,size}: mday/month inverted sbr/{formatsbr,fmtcompile}.c: bring up to date with MH 6.3+ sbr/formatsbr.c: missing tzone/sday/dst handling! h/scansbr.h: slight update uip/scansbr.c: try using formataddr() routine to do "correct" formatting of scan'd addresses, didn't work! use friendly zotnet/tws/dtimep.lex: tsk, use lint! also, fix numeric timezones sbr/addrsbr.c: some ismymbox fixes for non-BERK code (from 6.3) sbr/formatsbr.c: not priming the pump! h/fmtcompile.h, sbr/{formatsbr,fmtcompile}.c: add "friendly" support/general/scan.time2: call it scan.timely conf/makefiles/support/general: support scan.timely Sun Feb 16 23:04:34 1986 /mtr zotnet/fmt/: move into sbr/ to avoid loading problems sbr/{addrsbr,formatsbr,fmtcompile,formataddr}.c: new files h/fmtcompile.h: new file conf/makefiles/{sbr,zotnetM}: update sbr/llib-lmh: update Sun Feb 16 19:11:33 1986 /mtr -- Incorporate Berkeley enhancements, courtesy of Van Jacobson -- h/{format,scan}sbr.h: updated for new formatsbr stuff h/mh.h: updated for new m_getfld conf/MH: new default file conf/config/config.c: support spost under BERK and SENDMTS conf/mhconfig.c: support new zotnet/fmt/ directory conf/makefiles/uip: support spost conf/makefiles/zotnetM: support new zotnet/fmt/ directory conf/makefiles/zotnet/fmt: new Makefile conf/makefiles/zotnet/tws: support for new lex-based date parser sbr/m_gmsg.c,uip/msh.c: change init of READONLY sbr/m_getfld.c: re-written, super optimized! support/general/{digestcomps,mhl.digest,mhl.forward,scan.*}: use new fmt stuff zotnet/fmt/: new directory zotnet/tws/{dtimep.lex,lexedit.sed,lexstring.c}: new files zotnet/tws/dtime.c: update uip/{forw,scan,scansbr}.c: use new format stuff uip/{inc,mhlsbr,mshcmds,replsbr}.c: use new format stuff uip/trmsbr.c: use stderr for ioctl()s uip/spost.c: new file uip/{addr,format}sbr.c: remove, they're in zotnet/fmt/ Sun Feb 16 15:40:20 1986 /mtr sbr/m_setvis.c: oops, fix-up unseen sequence stuff uip/whatnowsbr.c: oops, a couple of typos Sun Feb 9 22:14:10 1986 /mtr support/pop/syslog.c: #ifdef BSD43 means use standard syslog Wed Feb 5 14:42:55 1986 /mtr zotnet/tws/{tws.h,dtime.c}: new argument to dasctime() uip/{format,pick}sbr.c: make use of it Wed Feb 5 11:25:05 1986 /mtr MH 6.3 #1[UCI] (nrtc-gremlin) is official, still awaiting Berkeley enhancements Wed Feb 5 09:32:08 1986 /mtr support/bboards/mmdfII/READ-ME: update Mon Feb 3 11:21:49 1986 /mtr uip/whatnowsbr.c: oops, slight dist botch support/general/mhl.format: make date display user-friendly conf/mh-gen.8: clean-up descriptions of options uip/sbboards.c: normalize code wrt to MMDF-II BBoards channel uip/msh.c: when running under vmh and not in control of TTY, ignore TSTP so BPOP can spool ahead! papers/{usenix/usenix,multifarious/multifarios,trusted/trusted}.tex: fix up banners a bit Sun Feb 2 20:47:36 1986 /mtr miscellany/replies/: new directory Sun Feb 2 14:01:28 1986 /mtr zotnet/tws/dtime.c: twsort() fix from John Romine for ALTOS uip/addrsbr.c: smarter ismymbox for default case conf/{mh-gen.8,doc/repl.rf}, uip/repl.c: add #ifdef ATHENA code Fri Jan 31 13:25:17 1986 /mtr COVER-LETTER: update support/general/mhl.format: Remove length/width constraints Mon Jan 27 17:51:07 1986 /mtr uip/whatnowsbr.c: forgot to put -[no]push for built-in send h/addrsbr.h, uip/{addrsbr,post}.c: introduce auxformat(), the back-end to adrformat(); post calls auxformat directly in certain cases uip/{dp,forw}.c: was cheating on adrformat, now on auxformat Sun Jan 26 16:57:18 1986 /mtr {conf/makefiles/uip,uip/post.c}: lint touch-up conf/doc/{inc,mh-chart,send,post}.rf: add the #ifdef TMA stuff sbr/m_remsg.c: tuning uip/mark.c: re-arrange debug output slightly h/mh.h: add some padding to fix some m_remsg bugs uip/{inc,rcvstore}.c: oops, mp -> hghmsg not keeping pace with m_remsg! Wed Jan 22 11:13:08 1986 /mtr support/pop/popwrd.c: squash bug h/mh.h: remove sigmask definition uip/{bbc,vmh}.c: add sigmask if not defined in (4.3BSD finally wised up!) Fri Jan 17 13:19:23 1986 /mtr uip/ali.c: add -noalias for RaJ Wed Jan 15 23:15:54 1986 /mtr support/pop/popsbr.c: pophack on PASS command Wed Jan 15 19:03:54 1986 /mtr COVER-LETTER: update Wed Jan 15 18:44:32 1986 /mtr uip/addrsbr.c: ismymbox() losing under #ifdef DUMB, oops! Wed Jan 15 04:43:33 1986 /mtr miscellany/netnews/: more stuff Sun Jan 12 22:58:34 1986 /mtr uip/bbc.c: getbbvis a bit too aggressive, use popd algorithm Sun Jan 12 14:01:25 1986 /mtr miscellany/mh-e: new version from James Larus Fri Jan 10 10:17:57 1986 /mtr uip/sbboards.c: botch multiple bboard handling (forgot to rewind input, thanks to Larry Henry) support/bboards/mmdfII/bboards/bb_wtmail.c: not handling errors right sbr/cpydgst.c: stay symmetric with change to bb_wtmail.c, the code worked fine, adding matching braces for clarity (!!) Thu Jan 9 22:37:29 1986 /mtr MH 6.2 is official, awaiting enhancements Berkeley! Thu Jan 9 16:31:28 1986 /mtr uip/mshcmds.c: don't rmm() messages which don't get refiled uip/vmh.c: truncate stuff on Scan window (finally) uip/scansbr.c: work on diagnostics a bit Thu Jan 9 15:29:09 1986 /mtr -- Fixes Suggested by Craig Partridge -- support/bboards/mmdfII/bboards/mmdfonly.h: if V4_2BSD on, set BSD42 conf/doc/{mhl,show}.rf: talk more about moreproc uip/mhlsbr.c: have INTR work as advertised uip/{send,whatnowsbr}.c: link on dist botched, oops! Wed Jan 8 23:16:10 1986 /mtr uip/trmsbr.c: better defaults for "li" and "co" Tue Jan 7 15:06:05 1986 /mtr uip/bbc.c: got the SIGTSTP problem, now wait on child to stop prior to stopping ourselves... Mon Jan 6 15:25:20 1986 /mtr uip/{msh,mshcmds}.c: work on refile uip/{vmh,msh}.c: support FAST quit (no final refresh on updated mailbox) Sun Jan 5 20:06:03 1986 /mtr (agent: Marshall Rose) -- Interface TTI TMA to MH #6.2 -- [ N.B.: The TTI TMA is NOT in the public domain; the MH support for the TTI TMA IS in the public domain! ] conf/{mh-gen.8,mhconfig.c,doc/ADMIN.rf}: support "tma on" conf/makefiles/{doc,uip}: ditto Makefile: for the moment Fri Jan 3 13:11:03 1986 /mtr uip/bbc.c: SIGTSTP race condition, #undef for now Tue Dec 31 23:21:21 1985 /mtr uip/mhlsbr.c: a bit more pipe trickyness (this gets old real fast) conf/doc/ADMIN.rf: talk about popd and /etc/rc.local papers/{myths,mznet}/Makefile: update uip/bbc.c: augment XTND2 botch diagnostic uip/msh.c: if popd says BBoard-ID: for a message is 0, read it ourselves Tue Dec 31 22:23:43 1985 /mtr conf/doc/mhook.rf: minor typos miscellany/rcvtrip/*: update Tue Dec 31 19:16:23 1985 /mtr zotnet/tws/{dtime,dtimep}.c: dst fix-ups conf/doc/send.rf: append, not prepend uip/rmail.c: slight touch-up uip/ap.c: oops, not printing all info zotnet/mf/mf.c: botching trailing comment handling! uip/scansbr.c: have cpy() omit trailing >>blank<< sbr/m_gmsg.c: not zero'ing msgstats[] under non-MTR code Tue Dec 31 13:53:14 1985 /mtr conf/doc/whatnow.rf, uip/whatnowsbr.c: remove "headers" option conf/doc/ADMIN.rf: clear-up post -debug documentation conf/doc/{mh-chart,send,post}.rf, uip/{post,send,whatnowsbr}.c: remove -[no]remove switches uip/{repl,post}.c: some touch-ups Tue Dec 31 10:13:44 1985 /mtr conf/doc/vmh.rf: back-down last update conf/mh-gen.8: forgot an \& conf/examples/nrtc-{gw,mtr}, h/rcvmail.h: tsk, NRTC running an old MMDF-II Mon Dec 30 20:03:25 1985 /mtr conf/Makefile: options mangled(!?!) uip/msh.c: if update of mailbox fails, it gets zero'd(!!) (oops, not checking error condition) support/pop/popser.c: if update of mailbox fails, clean-up correctly (no zero problem here!) uip/inc.c: on truncate of maildrop, remove mailbox map (XXX) conf/makefiles/uip, uip/{send,whatnowsbr}.c: move send into the WhatNow shell uip/sendsbr.c: new file conf/doc/whatnow.rf: update Sun Dec 29 19:58:43 1985 /mtr zotnet/mts/client.c: fix #ifdef BIND stuff a bit h/mshsbr.h, uip/{mhlsbr,msh,mshcmds}.c: try to fix lost peer problems... conf/doc/vmh.rf: update zotnet/drop/lock.c: not returning right errno uip/dropsbr.c: ditto, plus not trying enough conf/makefiles/doc: "make tar" forgetting tmac.h uip/addrsbr.c: strcpy de-referencing NULL uip/refile.c: got rid of a spurious \n (!!) conf/examples/{udel,nrtc-mtr}: new files h/mh.h, sbr/m_{convert,gmsg}.c, uip/{msh,rcvstore,refile}.c: fix LOWSEL logic uip/vmh.c: fix slight bug in sideground handling (misspelled #ifdef, oops!) conf/{mh-gen.8,config/mts.c},mts/*/hosts.c: remove the NETWORK option Thu Dec 19 23:58:44 1985 /mtr Release MH 6.2 to selected sites, including Berkeley for 4.3BSD testing Thu Dec 19 22:34:23 1985 /mtr zotnet/mts/client.c: #ifdef BIND code when no gethostent() conf/{mh-gen.8,doc/mh-tailor.rf}: document it Thu Dec 19 08:16:54 1985 /mtr uip/refile.c: better diagnostic from Fred Blonder Wed Dec 18 22:51:58 1985 /mtr uip/bbc.c: optimize on calling mshproc, check size of maildrop first; if empty, don't invoke it! Wed Dec 18 20:27:38 1985 /mtr uip/slocal.c: minor touch up uip/umhook.c: moved from zotnet/mf Wed Dec 18 13:37:09 1985 /mtr uip/bbc.c: make second, optimized pass to catch private bboards that the user knows about uip/popsbr.c: ditto uip/popser.c: slight tune-up Tue Dec 17 21:42:44 1985 /mtr conf/makefiles/sbr, h/mh.h, sbr/llib-lmh: cndfree() removed sbr/{add,m_{delete,replace}}.c, uip/{mhl,vmh}sbr.c: replace cndfree sbr/m_foil.c, uip/install-mh.c: compensate Tue Dec 17 18:26:34 1985 /mtr sbr/m_getfld.c, uip/{format,mhl,pick}sbr.c: clean-up indirection code for less tolerant compilers uip/bbc.c: add -[no]rcfile switch uip/msh.c: clean up a diagnostic Tue Dec 17 08:53:52 1985 /mtr conf/makefiles/sbr, sbr/cndfree.c: clean-up a bit Tue Dec 17 08:36:59 1985 /mtr uip/send.c: different alert announcement based on -forward Wed Dec 11 19:08:20 1985 /mtr miscellany/libndir: -lndir for non-BSD sites, graciously supplied by Kirk McKusick Tue Dec 10 23:28:20 1985 /mtr uip/sbboards.c: oops, typo found by lint Tue Dec 10 22:38:23 1985 /mtr uip/addrsbr.c: normalize a bit (finally) uip/addrsbr.c: new routine adrsprintf() to remove #ifdef BANG dependencies uip/{post,rcvdist,replsbr,sbboards}.c: use adrsprintf() uip/post.c: remove #ifdef MF dependency for stand-alone MH, remove #ifdef DUMB dependency by making addrsbr.c smarter about being dumber mts/mmdf/hosts.c: remove #ifdef DUMB dependency (right now, addrsbr:getm() is the only one that calls it and it doesn't call it under #ifdef DUMB... Tue Dec 10 21:11:45 1985 /mtr conf/mh-gen.8: clear up some sys5 stuff zotnet/mf/umhook.c: sys5-ize uip/addrsbr.c: alternate-mailboxes: defaulted wrong under #ifdef BERK, it's now "*" conf/doc/mh-profile.rf: fix documentation to reflect reality Tue Dec 10 18:39:37 1985 /mtr zotnet/mts/client.c: moved from mts/sendmail/client.c conf/makefiles/{mts/sendmail,zotnet/mts}: changed mts/support/llib-lsendmail, zotnet/mts/llib-lmts: changed mts/sendmail/client.c: 4.2BSD specific only! conf/config/mts.c, zotnet/mts/mts.h: update conf/mhconfig.c: update conf/Makefile: simplify Sun Dec 8 18:39:01 1985 /mtr uip/send.c: always remove dist file uip/vmh.c: work on erase-word handling, a bit uip/folder.c: -fast -vs- -pack fixup uip/mhlsbr.c: %text defined for date fields Fri Dec 6 11:08:20 1985 /mtr support/bboards/mmdfII/gen: wrong filename Thu Dec 5 19:55:11 1985 /mtr uip/scansbr.c: fix machine dependency pointed out by Chuck Collins dist/READ-ME: new file talking about make bug COVER-LETTER, conf/{mh-gen.8,doc/MH.rf}: change UCI -> UCI.EDU Wed Dec 4 23:38:06 1985 /mtr zotnet/mts/mts.h: oops for MMDFONLY conf/{mh-gen.8,makefiles/zotnet/mts}: talk about -Dlocname Sun Dec 1 16:11:03 1985 /mtr uip/inc.c: more idiotic de-referncing of NULL, found on SUNs uip/replsbr.c: ditto uip/show.c: recognize more of mhl's switches Sun Dec 1 07:58:50 1985 /mtr uip/vmh.c: remove double-scroll uip/annosbr.c: oops, closing fd: without unlocking! sbr/makedir.c: plug an obscure security hole in inc uip/mhlsbr.c: read_termcap being called prematurely zotnet/tws/dtime.c: load tw_sday appropriately zotnet/tws/*.c: try using numeric timezone for official renditions, under #ifdef MTR for now Sat Nov 30 22:36:49 1985 /mtr zotnet/tws/dtime.c: add #ifdef INETONLY uip/post.c: for #ifdef BERK don't say {Local,UUCP,Network} Recipients conf/doc/sortm.rf: note problem with errors uip/bbc.c: for getbbvis() insist on readability support/bboards/bbexp.c: oops, calling pick wrong conf/doc/pick.rf: document -datefield anomaly conf/makefiles/support/bboards: oops, left context owned by root h/mh.h: ruserpass -> _ruserpass for SUN. why? Tue Nov 26 00:22:17 1985 /mtr uip/refile.c: oops, forgot copy-back on optimzied m_remsg Sun Nov 24 18:58:41 1985 /mtr uip/slocal.c: some tuning, also fix a bug in usr_pipe() uip/dropsbr.c: have mbx_copy support noisy uip/{packf,post,rcvpack,sbboards,slocal}.c: use this change Wed Nov 20 10:58:40 1985 /mtr MH 6.1 covert update for sbr/m_convert.c, uip/send.c Tue Nov 19 23:06:16 1985 /mtr uip/send.c: de-referencing NULL due to bad precedence, tsk Sun Nov 17 16:28:23 1985 /mtr conf/doc/{ap,mhl,repl,scan}.rf: note that #ifdef BERK kills address parsing conf/makefiles/{doc,uip,support/*,zotnet/*}: make tar command visible sbr/m_convert.c: oops, new message numbering resulted in bad diagnostic papers/*/Makefile: fix LaTeX rule for v2.08 Fri Nov 15 19:14:44 1985 /mtr uip/{rcvtty,slocal}.c: touch-ups Tue Nov 12 11:24:46 1985 /mtr MH 6.1 is official. MHCHANGES from mh.5 to mh.6 Mon Nov 11 07:47:05 1985 /mtr uip/slocal.c: implemenet MailDelivery, ala MMDF-II uip/rcv*.c: take advantage of it uip/rcvs{br,elect}.c: no longer needed uip/{folder,inc,refile}.c: done(1) if user doesn't want to create folders Sun Nov 10 16:30:46 1985 /mtr uip/refile.c: set previous sequence on destination folders uip/rcvsbr.c: new file uip/rcvpack.c: change Cron-Date: to Delivery-Date: Sun Nov 10 11:52:50 1985 /mtr uip/send.c: oops, annotations botched for forw! Thu Nov 7 00:31:45 1985 /mtr sbr/m_tmpfil.c: new routine uip/*.c: use it if necessary Wed Nov 6 23:05:00 1985 /mtr uip/inc.c: add -[pa]ck file switches to packf(1) with the POP uip/bbc.c: add $MHBBRC support Wed Nov 6 20:47:55 1985 /mtr uip/msh.c: more msh-using-POP-to-read-BBoards speed improvements Wed Nov 6 14:08:08 1985 /mtr uip/mshcmds.c: burst wasn't resetting scan listing cache mts/sendmail/client.c: don't use servers defaulting if name of service host is explicitly given Wed Nov 6 01:55:16 1985 /mtr support/bboards/mmdfII/bb_wtmail.c, uip/sbboards.c: use encapsulation format when returning failed mail Tue Nov 5 22:43:50 1985 /mtr zotnet/bboards/{bboards.h,getbbent.c}: new routine getbbtime() support/pop/{popd,popser}.c: use getbbtime() to speed start-up time, a major win! conf/makefiles/uip: oops, sbboards installed in wrong area! Tue Nov 5 22:29:29 1985 /mtr sbr/m_replace.c: fix logic glitch: not using getcpy() on update! Tue Nov 5 16:15:52 1985 /mtr zotnet/bboards/getbbent.c: optimize a bit zotnet/bboards/{bboards.h,getbbent.c}: new routine setpwinfo() support/{bboards/mmdfII/bboards/bb_wtmail,pop/pop{ser,wrd}}.c, uip/sbboards.c: use setpwinfo () uip/mshcmds.c: slight typo in msh$pick Mon Nov 4 16:00:56 1985 /mtr uip/vmh.c: Wgetstr() now minibuffer-exit's right Mon Nov 4 09:16:56 1985 /mtr uip/send.c: oops, bug in dist handling conf/{mhconfig.c,mh-gen.8}: warn about mhconfig requiring make clean later Sun Nov 3 22:06:58 1985 /mtr uip/vmh.c: work-around standout bug in curses, under #ifdef XYZ uip/vmh.c: try slight work-around for double-scroll'ing effect Sun Nov 3 13:12:51 1985 /mtr uip/version.sh: smarter wrt finding hostname uip/msh.c: finally got re-direction under vmh right! uip/mhlsbr.c: for moreproc, get signal handling right Thu Oct 31 21:40:50 1985 /mtr Makefile, conf/makefiles/*: rm core in unclean sbr/m_atoi.c: renamed from mu_atoi() uip/bbc.c: minor add_bb() logic fix uip/new.c, support/news/: de-supported! uip/msh.c: re-direction under vmh was losing Wed Oct 30 18:20:11 1985 /mtr -- Suggested by James M. Galvin -- uip/bbl.c: invoke inc with -file not -ms Wed Oct 30 18:19:49 1985 /mtr -- Suggested by Douglas P. Kingston -- mts/mmdf/hosts.c: remove bogus gethostname() logic, let the mtstailor file handle it. Wed Oct 30 16:39:56 1985 /mtr Makefile: add "make checkout" for MH maintainers only! uip/version.sh: extend Tue Oct 29 22:33:45 1985 /mtr h/dropsbr.h: new routine map_read() uip/dropsbr.c: performance improvement in map_read() uip/msh.c: -[no]topcur for vmh usage Tue Oct 29 01:25:36 1985 /mtr uip/addrsbr.c: freeing a couple of things twice! uip/msh.c: a malloc() bug! Mon Oct 28 19:31:13 1985 /mtr uip/vmh.c: don't read tty modes unless in foreground Sun Oct 27 22:13:23 1985 /mtr h/dropsbr.h, uip/dropsbr.c: add new field, m_size, to maildrop structure (and bump version number). This keeps track of the number of ARPA Internet octets in the message support/bboards/mmdf*/bboards/bb_wtmail.c, support/pop/popser.c, uip/dropsbr.c, uip/mshcmds.c, uip/rcvpack.c, uip/sbboards.c: all affected... Sun Oct 27 17:40:20 1985 /mtr zotnet/bboards/{bboards.h,getbbent.c}: make make_lower() integral uip/vmh.c: avoid ~'s when possible (actually forever owing to pWIN logic!) uip/vmh.c: make STATUS window be reverse-video, make prompt not be reverse-video uip/vmh.c: have EOT work as expected under bbc uip/vmh.c: if CE set, then don't scroll on exit uip/msh.c: make readids() logic smarter in the degenerate case h/mshsbr.h, uip/{msh,mshcmds}.c: keep scan line cached uip/{msh,mshcmds}.c: clean-up handling under vmh a bit uip/{bbc,inc,msgchk}.c: improve defaulting for nullifying host conf/config/mts.c: with flock() retry 5 times at 5 second intervals Fri Oct 25 08:38:35 1985 /mtr support/pop/popser.c, uip/bbc.c: don't recognize bb_aka's in name lookups Thu Oct 24 21:07:37 1985 /mtr conf/config/mts.c: new variable popbblist which, if present, lists only thoses hosts that can use BBoards over POP Wed Oct 23 20:46:17 1985 /mtr uip/prompter.c: -prepend is the default now uip/burst.c: -noinplace is the default now Wed Oct 23 12:34:04 1985 /mtr conf/config/mts.c: two new variables: popbbhost and popbbuser, under #ifdef BPOP uip/bbc.c: use same support/pop/pop.txt: revise remove HEAD in favor of more general TOP Wed Oct 23 01:34:54 1985 /mtr conf/mhconfig.c: change default bbhome to /usr/spool/bboards support/pop/popser.c: support maildrop mapping uip/dropsbr.c: some optimizations support/pop/popsbr.c: link into uip/ directory to simplify top-level Makefile Tue Oct 22 21:47:01 1985 /mtr uip/bbc.c: don't have -help imply -topics Mon Oct 21 18:45:29 1985 /mtr conf/mh-gen.8: mention gould stuff conf/doc/*.rf: talk about quoting of arguments Mon Oct 21 12:26:56 1985 /mtr uip/{msh,vmh}.c: some tuning uip/bbc.c: know about SIGTSTP Sun Oct 20 22:11:58 1985 /mtr -- Suggested by Hokey for SYS5 -- conf/mh-gen.8: mention -lndir for SYS5 sbr/m_gmsg.c: fix stand-alone continue makefiles: add SHELL=/bin/sh Sun Oct 20 13:03:13 1985 /mtr conf/config/bboards.*: fix to work under sh or csh Sun Oct 20 13:02:59 1985 /mtr uip/rmf.c: add -[no]interactive switch Thu Oct 17 19:41:18 1985 /mtr -- Suggested by Dave Yost -- uip/install-mh.c: new variable, mh_defaults, to default user's profile Thu Oct 17 16:02:25 1985 /mtr uip/msh.c: move pgmwait out of msh and into it's own sbr/ file h/mh.h, {sbr,uip}/*.c: normalize pidwait stuff sbr/m_foil.c, uip/{post,send,whom}.c: fix bug in alias mechanism when following included files uip/{inc,post,send,whom}.c: normalize switch handling a bit Tue Oct 15 18:52:49 1985 /mtr uip/prompter.c: add hidden -[no]body switch sbr/vfgets.c: slight logic botch Tue Oct 15 17:14:11 1985 /mtr h/mh.h, sbr/m_{convert,gmsg,remsg}.c, uip/{burst,inc,rcvstore,refile}.c: final XYZ check-out, remove #ifdefs Mon Oct 14 12:03:39 1985 /mtr uip/send.c: still more work on annotation logic... Sun Oct 13 18:17:10 1985 /mtr sbr/vfgets.c: oops, minor typo sbr/m_gmsg.c: re-think alloc strategy a bit sbr/m_gmsg.c: use #ifdef XYZ experimental code for no limits to #-messages in a folder! sbr/m_file.c: move into uip/refile.c h/folder.h: remove Sun Oct 13 14:17:10 1985 /mtr h/mshsbr.h, uip/{msh,mshcmds,vmh}.c: fix signal handling for forks under vmh support/bboards/mmdf*/bboards/ch_bboards.c: remove some logging info Wed Oct 9 19:49:04 1985 /mtr uip/send.c: fix bogus annotation handling, e.g., send -push; rmm; folder -pack uip/{forw,mhlsbr}.c: add extra blank line after final EB so user can add suffix text with an editor (e.g., prompter) and not screw-up conf/doc/burst.rf: warn about text after final EB being lost with -inplace Sun Oct 6 20:38:29 1985 /mtr uip/msh.c: fseek() too tricky for our own good... uip/{burst,mshcmds}.c: try to recover from errors more gracefully (ha!) Sun Oct 6 11:46:11 1985 /mtr uip/{folder,scan}.c: context changes ASAP sbr/remdir.c: clean-up h/mh.h, uip/{mhlsbr,mhmail,msh,post,prompter}.c: fix up signal handling when in background Sat Oct 5 23:17:39 1985 /mtr Makefile, conf/makefiles/*: fix "make tar" uip/mshcmds.c: finally track down that mhl pipe problem Makefile, conf/makefiles/*: clean->unclean,squeaky->clean Sat Oct 5 17:22:56 1985 /mtr -- Suggested by Dave Yost -- h/mh.h, conf/config/config.c: define globals in config.c, extern 'em in mh.h conf/mhconfig.c: rm files prior to creating 'em for CTM uip/version.sh: ditto Sat Oct 5 14:20:02 1985 /mtr uip/{post,rcvdist}.c: add call to mmdf_init() under #ifdef MMDFII h/mh.h, *: XYZ becomes the "real thing" Fri Oct 4 21:08:26 1985 /mtr uip/{comp,dist,forw,repl}.c: -[no]whatnow changed to -[no]whatnowproc uip/{next,prev,show}.c: -[no]show changed to -[no]showproc uip/vmh.c: -[no]visual changed to -[no]vmhproc uip/rmm.c: Delete-Prog: changed to rmmproc Fri Oct 4 19:36:56 1985 /mtr h/mh.h, conf/config/config.c, sbr/m_getdefs.c: make vmhproc a built-in uip/vmh.c: ditto, also better help message Thu Oct 3 23:43:35 1985 /mtr uip/inc.c: change "-ms ms-file" to "-file name" to be more consistent uip/inc.c: also, if -notruncate, don't zero POP maildrop! Wed Oct 2 21:34:44 1985 /mtr uip/vmh.c: a bit more tuning Wed Oct 2 11:31:49 1985 /mtr -- Suggested by Dave Yost -- sbr/m_getdefs.c: avoid a cast (and structure dependencies) by using a popular C idiom (taught to Dave by Bakul Shah). [This also makes MH work on the Gould...] h/mh.h,sbr/m_delete.c: take the opportunity to clean things up a bit Wed Oct 2 11:12:52 1985 /mtr uip/{burst,mshcmds}.c: oops, another "slight" typo Wed Oct 2 10:03:12 1985 /mtr -- Pointed out by Bob Designer -- uip/slocal.c: oops, typo! Wed Oct 2 02:48:02 1985 /mtr uip/vmh.c: add less-like interface to command handling Tue Oct 1 22:08:32 1985 /mtr h/mh.h, sbr/m_gmsg.c: slight XYZ tuning Tue Oct 1 14:31:54 1985 /mtr conf/makefiles/doc: oops, version.me -> version.rf uip/msh.c: oops, zero'd name of BBoard prior to putenv of mhfolder conf/mhconfig.c: support ldflags for options to ld at beginning of command Tue Oct 1 10:15:24 1985 /mtr sbr/m_getdefs.c: set[ug]id() to real [ug]ids prior to exec of install-mh uip/install-mh.c: don't need set[ug]ids, also if -auto, don't ask questions, say what you're going to do and do it! zotnet/mts/mts.h: remove reference to "../h/strings.h" conf/config/mts.c,support/bboards/bbaka.c: ask for "../h/strings.h" mts/{mh/{hosts,netmail},sendmail/{client,hosts,smail},mmdf/hosts}.c: ditto zotnet/mf/mf.h: ditto Thu Sep 26 11:42:18 1985 /mtr uip/addrsbr.c: change Alternate-Mailboxes: defaulting Tue Sep 24 19:18:49 1985 /mtr uip/burst.c: make static structure an alloc'd structure uip/{burst,mshcmd}.c: trim extra trailing newline if present Mon Sep 23 10:42:18 1985 /mtr support/bboards/mmdf*/bboards/bb_wtmail.c: remove bogus ch_host hackery; use the BBoard file instead! uip/bbc.c: add -[no]protocol to tell bbc if mshproc knows about bbc protocol Mon Sep 23 04:25:33 1985 /mtr uip/show.c: normalize showproc handling; remove -[no]format and -[no]pr, add -show program and -noshow Sun Sep 22 21:06:21 1985 /mtr uip/{msh,mshcmds}.c: interface to vmh Sat Sep 21 00:12:47 1985 /mtr h/vmhsbr.h, uip/{vmh,vmhsbr,vmhtest}.c: experimental new visual front-end to msh sbr/*.c: break many aggregate files into smaller ones Fri Sep 20 22:35:56 1985 /mtr uip/msh.c: have "quit" command update msgbox after confirmation if changed uip/{mhlsbr,repl}.c: on forwardings/replies force -noclear (HACK) uip/prompter.c: fold in SYS5 terminal handling better Fri Sep 20 21:22:55 1985 /mtr conf/mhconfig.c: add mandir entry to overrid /usr/man zotnet/mf/uumm.c: simplify a conditional for the ALTOS Fri Sep 20 20:59:19 1985 /mtr uip/msh.c: split into h/mshsbr.h, uip/{msh,mshcmds}.c uip/mshcmds.c: on refile, without -link, mark messages as deleted Fri Sep 20 09:48:06 1985 /mtr miscellany/mh-e: GNU Emacs front-end to MH from James Larus Wed Sep 18 23:23:28 1985 /mtr conf/mhconfig.c: oops, toss (void)'s Wed Sep 18 07:49:27 1985 /mtr sbr/discard.c: oops, logic was botched for all versions of UNIX! Tue Sep 17 09:47:55 1985 /mtr uip/addrsbr.c: slight tuning to #ifdef BERK Mon Sep 16 21:50:01 1985 /mtr -- Suggestion from John Shepherd -- uip/slocal.c: handle idiotic multiple "From " lines Mon Sep 16 20:53:18 1985 /mtr -- Fixes from Hokey (mostly SYS5) -- uip/version.sh: generate version.rf not version.me so it stays around conf/doc/{ADMIN,MH}.rf: use same conf/mhconfig.c: new option "ranlib" for BSD or SYS5 conf/makefiles/*: use same Mon Sep 16 20:50:32 1985 /mtr miscellany/less: sources to Mark Nudelman's "less" program included Thanks, Mark! zotnet/tws/dtime.c: support illegal GreyBook timezone strings Wed Sep 11 22:02:17 1985 /mtr -- Suggested by John A. Dilly -- mts/sendmail/smail.c: fix bug with intermittant dot being added during sm_wtxt(); thanks, John! conf/config/config.c: support ~/.mhrc by allowing libpath() recognize the CShell ~-construct. This is under #ifdef MHRC Wed Sep 11 11:03:29 1985 /mtr conf/makefiles/*, conf/makefiles/*/*: unifdef stuff wasn't working out, remove it Wed Sep 11 10:10:33 1985 /mtr -- More doc fixes from Phyllis Kantar -- conf/doc/{comp,dist,mh,mhl,repl,whatnow}.rf: doc fixes Tue Sep 10 17:47:35 1985 /mtr conf/{mhconfig.c,mh-gen.8}: change "uucp" option to "mf" option conf/{examples,tailor}/READ-ME: remove since mh-gen.8 contains this information now Tue Sep 10 16:23:23 1985 /mtr Makefile, conf/Makefile, conf/makefiles/*: implement "make squeaky" and "make tar" Mon Sep 9 22:12:59 1985 /mtr zotnet/bboards/{bboards.h,getbbent.c}: flags for setbbent() uip/bbc.c, support/{bboards/*,pop/*}.c: use 'em Mon Sep 9 19:42:13 1985 /mtr conf/doc/{MH,comp,dist,forw,mh-mail,mhl,repl}.rf: better verbatim mode in roff zotnet/tws/dtime*.c: more SYS5 cleanup conf/doc/{ADMIN,MH,mh-mts,popd}.rf: more doc hackery uip/post.c: remove tmpfil/bccfil when dying() Sat Sep 7 17:43:53 1985 /mtr -- Major Directory Tree Re-Organization -- papers/: new directory, move TeX stuff from othersupport/ there conf/{mhconfig.c,makefiles/{othersupport,papers}}: support this config/*.h, */*.c: move .h files to new directory h/, update .c files accordingly h/strings.h: new .h file to define all those string functions once and for all! {bboards,mts,mf,tws}/: move under zotnet/ mts/: new directory {mhmts,sendmts,mmdf}/: move under mts/ {support,popsupport,newsupport,bbsupport}: move under support/ Sat Sep 7 17:43:24 1985 /mtr uip/msh.c: advise of gap when BBoard reading Sat Sep 7 16:42:06 1985 /mtr conf/config/mts.c, config/mh.h, mf/mf.h: remove dup2() define for SYS5 and add it as a real routine conf/doc/{MH,bbleader,burst,forw,mf,mh-profile,scan}.rf: doc fixes Sun Sep 1 17:12:54 1985 /mtr conf/doc/MH.rf: minor typo and change the names of a few chapters Thu Aug 29 20:13:47 1985 /mtr bboards/getbbent.c, tws/dtimep.c: normalize Thu Aug 29 15:09:25 1985 /mtr uip/{ali,post}.c: load system aliases file last instead of first. This lets users override system aliases AND rely on host-specific alias for final resolution! Thu Aug 29 10:52:41 1985 /mtr -- Merge in changes for SYS5 -- conf/examples/READ-ME: all non-sprintf changes under #ifdef SYS5 conf/{mhconfig.c,config/{config,mts}.c}, sbr/*.c, tws/dtime*.c, uip/*.c: sprintf() returns an int, so always (void) it tws/dtime*.c: no ftime() conf/mhdoc: echo works differently, ridiculous! config/mh.h: dup2() doesn't exist, so define it conf/mhconfig.c, uip/post.c: enums might not exist sbr/discard.c, uip/{prompter,trmsbr}.c: ioctl()'s different Thu Aug 22 20:12:05 1985 /mtr uip/{forw,mhlsbr}.c: let mhl know about digest handling so forw becomes less complicated (mhl already knows about forwarding)! Wed Aug 21 11:12:33 1985 /mtr conf/{config/config.c,makefiles/{support,uip}}, config/mh.h, conf/doc/{MH,forw,mh-profile}.rf,uip/forw.c: use formatsbr to do digestifying uip/formatsbr.c: fix minor typo tws/{tws.h,dtime.c}: new routine, twsnow() mf/uumm.c, tws/dtime.c, uip/{msh,picksbr,scansbr,sortm}.c: use twsnow() Tue Aug 20 22:19:18 1985 /mtr Makefile,conf/makefiles/{sbr,zotnet}: clean-up make clean a bit Tue Aug 20 15:59:46 1985 /mtr conf/doc/{ADMIN,pop8,rcvstore}.rf: minor clean-up Tue Aug 20 11:27:22 1985 /mtr othersupport/Mail: new directory, unsupported Mon Aug 19 20:07:50 1985 /mtr conf/{mhconfig.c,mh-gen.8}: new config option "bbhome" conf/config/bboards.{daily,weekly}: moved from bbsupport/ conf/{config/crontab,doc/{ADMIN,bbc}.rf,makefiles/{bbsupport,uip}}: support bbhome conf/examples/nrtc-isc: renamed to nrtc-gremlin conf/MAKE: modified accordingly Sun Aug 18 20:22:17 1985 /mtr uip/{burst,msh,picksbr}.c: augment botch message a bit Fri Aug 16 05:48:51 1985 /mtr mf/{mf.h,{mf,mmuu,umhook,uumm}.c}: change vfgets() to mfgets(), and slight bug fix in the process conf/makefiles/sbr, config/mh.h, sbr/llib-lmh: new vfgets() sbr/vfgets.c: new routine to support virtual-fgets uip/{alias,format,mhl}sbr.c: call vfgets to handle continuation lines conf/doc/{ap,dp,mh-alias,mhl,repl,scan}.rf: continuation lines now supported support/replcomps conf/config/mts.c, sbr/m_{draft,getdefs,whatnow}.c, sendmts/smail.c, tws/dtime.c, uip/{comp,inc,mark,mhpath,msh,post,rcvstore,refile,send}.c: notdef cleanup sendmts/hosts.c, uip/{aliasbr,dropsbr,rcvdist,send}.c: minor cleanup sbr/{add,m_replace}.c: ditto uip/mhlsbr.c: minor parenthization for ALTOS Fri Aug 16 04:48:13 1985 /mtr conf/{mhconfig.c,mh-gen.8,makefiles/uip}: fix long standing bug about sbboards, slocal, and spop being installed even for MMDF configurations Fri Aug 16 03:55:21 1985 /mtr sbr/m_getfld.c, uip/msh.c: fix trailing newline bug with mhl+no moreproc uip/addrsbr.c: slight touch-up Thu Aug 15 16:58:13 1985 /mtr conf/doc/{bbleader,bboards,mh-profile,prompter,show}.rf: minor touch-up Thu Aug 15 16:42:26 1985 /mtr CMP: shell script to aid Bug-MH in figuring out what's changed Thu Aug 15 11:19:26 1985 /mtr uip/inc.c: forgot an #ifdef for POP Wed Aug 14 21:54:20 1985 /mtr conf/config/mts.c, config/aliasbr.h, sbr/{m_getdefs,path}.c, popsupport/popd.c, uip/{ali,aliasbr,msh,picksbr,post}.c: a couple more touch-ups Wed Aug 14 17:27:41 1985 /mtr config/aliasbr.h: optimize structures for ALTOS uip/aliasbr.c: optimize for ALTOS and UNIX in general Mon Aug 12 19:42:28 1985 /mtr uip/mhlsbr.c: slight clarification for ontty == NOTTY and -clear at termination; also, try to get signals right again Thu Aug 8 00:00:00 1985 /mtr MH #6.59 enters beta Wed Aug 7 21:14:19 1985 /mtr uip/mhlsbr.c: m_popen_pid -> m_pid for 7limit Tue Aug 6 17:22:59 1985 /mtr -- From John Romine -- conf/makefiles/mmdf: slight typo mmdf/LN: better version conf/{mh-gen.8,mhconfig.c,makefiles/doc}: support two new options for manual pages: "none" and "gen" Mon Aug 5 20:57:47 1985 /mtr sbr/m_gmsg.c, uip/{bbl,mhlsbr,post,refile}.c: minor notdef touch-up conf/doc/inc.rf: slight touch-up conf/mhconfig.c: support some invocation arguments uip/sortm.c: alloc structure dynamically Mon Aug 5 20:27:12 1985 /mtr uip/rcvstore.c, conf/doc/rcvstore.rf: new program from Julian Onions conf/{makefiles/uip,doc/{MH,mh,mh-chart,mhook}.rf}: upgrade Mon Aug 5 12:29:56 1985 /mtr -- From John Romine -- conf/config/mts.c: do lock structure allocation dynamically and free up 25K of static data space (which may never even be referenced!) Sun Aug 4 14:23:35 1985 /mtr -- Suggested by Phyllis Kanter -- conf/doc/*.rf: doc fixes Sun Aug 4 14:23:58 1985 /mtr conf/doc/{ADMIN,mh-mts,bboards8}.rf: doc fixes Thu Aug 1 21:30:36 1985 /mtr uip/inc.c: fix conflict between -ms and POP Wed Jul 31 10:44:22 1985 /mtr conf/doc/{tmac.h,{ADMIN,MH,bbl,folder,mh-profile,msh,scan,whatnow}.rf}: documentation fixes conf/doc/{mhpath,show}.rf: ditto uip/msh.c: slight typo Tue Jul 30 21:44:00 1985 /mtr -- Suggested by Phyllis Kanter -- uip/folder.c: fix -fast and -recurse mis-interaction uip/burst.c: fix non-existant message handling when expanding the folder conf/config/config.c: fix comment re: whatnowproc config/mh.h, sendmts/smail.c: declare a couple of things that should be in sbr/m_getdefs.c: don't complain if "context: file" isn't there. sbr/m_{convert,file,gmsg,name}.c: fix boundary handling of MAXFOLDER conf/mh-gen.8: say a few words about chown, remove in MH config file conf/{config/config.c,examples/READ-ME}: two new options, FOLDPROT, MSGPROT conf/{config/config.c,doc/mh-profile.rf}, config/mh.h: add the "unseen-sequence" sbr/{m_setcur.c,llib-lmh}, uip/{inc,show}.c: do the UNSEEN business Sat Jul 27 12:55:27 1985 /mtr sbr/m_sync: slight adjustment uip/{addr,format,pick}sbr.c: a bit more debug info Sat Jul 27 12:46:12 1985 /mtr -- Documentation Fixes from Bob Designer -- conf/doc/{post,mh-profile,show,send,repl,next,folder}.rf: typos uip/whatnowsbr.c: back to the old prompt Sat Jul 27 00:33:39 1985 /mtr conf/doc/{mhl,show}.rf: upgrade a bit conf/makefiles/uip, uip/{mhl,mhlsbr,show}.c: add address/date parsing on demand conf/doc/{dp,scan}.rf, uip/formatsbr.c: slight upgrade support/mhl.{format,forward}: update a bit Fri Jul 26 11:09:35 1985 /mtr sendmts/smail.c: slight fix for major bug with #ifdef BERK Thu Jul 25 21:31:00 1985 /mtr conf/doc/pick.rf: finally get documentation right conf/makefiles/dist: a few more things Thu Jul 25 17:00:17 1985 /mtr conf/doc/ADMIN.rf, uip/{inc,msgchk}.c: minor re-work POP debug features Thu Jul 25 00:00:00 1985 /mtr MH #6.24 enters beta Wed Jul 24 23:42:41 1985 /mtr uip/addrsbr.c: bug with #ifdef BERK, mp -> m_nohost not getting set so no aliasing done! conf/config/mts.c: lockfile name building botched! Wed Jul 24 21:01:15 1985 /mtr uip/forw.c: -build logic botched Wed Jul 24 14:07:31 1985 /mtr conf/mh.h, sbr/m_getfld.c, uip/{msh,{mhl,scan}sbr}.c: fix broken msh message delimiting behavior and broken mhl behavior under msh Tue Jul 23 20:30:39 1985 /mtr uip/whom.c: pass more switches to post. Since they're ALL secret, no documentation needed! Mon Jul 22 16:50:54 1985 /mtr uip/picksbr.c: logic for handling "--header value" botched Sun Jul 21 15:36:24 1985 /mtr conf/doc/{send,whom,mh-alias}.rf: aliasing hints conf/doc/{{MH,tmac}.h,template}: support hints section conf/doc/mh-mts.rf: minor fix Thu Jul 18 15:59:19 1985 /mtr conf/mh-gen.8: typo Wed Jul 17 09:47:19 1985 /mtr bboards/mmdf/mmdf.2/bboards/bb_wtmail: change dist_address to ds_address, dist_log to ds_log Tue Jul 16 12:41:54 1985 /mtr uip/ali.c: forgot to call mts_init() to get "everyone", and "noshell" Sun Jul 14 18:51:22 1985 /mtr uip/formatsbr.c: handle the blank line bug by hacking it (see the "echo controversy" discussed above). The solution is to insert a space in truly blank lines... Sun Jul 14 13:44:13 1985 /mtr othersupport/bboards: version #2.1 as suggested by Jerry Sweet conf/doc/{ADMIN,mf,mh-{mts,tailor},bb{exp,oards5,tar},pop8}.rf: fixes suggested by Jerry Sweet Sun Jul 14 13:23:49 1985 /mtr tws/dtimep.c: have "BST" mean British Summer Time not Bering Standard Time Sun Jul 14 12:54:55 1985 /mtr -- Enhancements from John L. Romine -- uip/mhlsbr.c: minor cleanup Fri Jul 12 10:32:40 1985 /mtr config/mh.h,sbr/uleq.c: change strindex() -> stringdex () to avoid MMDF name conflict uip/{addrsbr,dropsbr,msh,rcvpack,sbboards}.c: ditto Thu Jul 11 12:34:15 1985 /mtr conf/makefiles/uip: oops, forgot a @END: SENDMTS inside an @BEGIN: POP Wed Jul 10 20:40:53 1985 /mtr conf/config/config.c,config/mh.h,sbr/m_getdefs.c,uip/mhlsbr.c: mhl's choice of mhlproc was confusing to forw. Add new variable moreproc to fix the problem. Note as a result, the old BERK behavior is the default, you have to turn off moreproc in your .mh_profile if you don't want mhl to use it Wed Jul 10 14:48:05 1985 /mtr uip/mhlsbr.c: don't SIG_DFL signals on start-up; if run from msh, this loses big, if not run from msh, then signals are SIG_DFL anyway... Wed Jul 10 14:08:39 1985 /mtr conf/makefiles/popsupport,popsupport/popd.{c,8c}: a bit of clean-up Wed Jul 10 12:07:42 1985 /mtr uip/addrsbr.c: another de-reference of NULL fixed Wed Jul 10 09:04:04 1985 /mtr uip/send.c: typo defining LISTDSW Tue Jul 9 18:59:21 1985 /mtr -- Suggested by Thomas Scott Christiansen -- uip/msh.c: move big Msgs[] structure from auto to static othersupport/netnews/{.,mhbox}/: new directories othersupport/netnews/{mh_profile,mhbox/flupcomps} new files Sun Jul 7 13:31:01 1985 /mtr othersupport/scripts/: new directory for scripts. First is Bob Designer's modifications to JLR's append script. othersupport/mtrenv/bin/append: remove Sun Jul 7 13:26:28 1985 /mtr uip/{addsbr,post,rcvdist,replsbr,sbboards}.c: support #ifdef BANG conf/examples/READ-ME: ditto Thu Jul 4 17:36:34 1985 /mtr uip/msh.c: "pack" should be called "packf". Thu Jul 4 16:00:38 1985 /mtr othersupport/mtrenv/mhbox/dp.debug: new file Thu Jul 4 08:38:01 1985 /mtr tws/{dtime,dtimep}.c: know about J{D,S}T, also under #ifdef HUJI generate it if appropriate. (from Danny Braniss) Thu Jul 4 08:29:11 1985 /mtr conf/doc/ADMIN.rf: put in a word or two about running conflict conf/makefiles/dist: add rules for .imp files Mon Jul 1 22:22:49 1985 /mtr conf/doc/mhl.rf, uip/mhlsbr.c: remove the #ifdef BERK stuff and generalize it. If the MH profile entry mhlproc is defined, then you get the BERK behavior using the mhlproc as the output filter. Otherwise, you get the old behavior. If this works nice, I'll make "more" the default mhlproc and set-up config.c, mh.h, and m_getdefs.c as appropriate (with the documentation mh-profile.rf) For the moment, I'm using "less" as my mhlproc and it works fine. Mon Jul 1 09:18:42 1985 /mtr sbr/m_{file,gmsg}.c, uip/{msh,refile,rmm,send}.c: #ifdef notdef the stuff marking messages as DELETED, since it's not used Mon Jul 1 06:26:38 1985 /mtr -- Suggestions from Bob Desinger -- config/mh.h, sbr/m_backup.c: locate SBACKUP definition in mh.h sbr/m_gmsg.c, uip/rmf.c: handle SBACKUP prefix files appropriately, also, slight optimizations Wed Jun 26 12:36:38 1985 /mtr MH #5.457 becomes MH #6.1 in beta Mon Jun 24 23:31:42 1985 /mtr uip/send.c: try to prevent confused annotations. The algorithm works for dist and repl, but not forw Mon Jun 24 14:58:25 1985 /mtr conf/doc/*.rf: Numerous documentation fixes suggested by Jerry Sweet. conf/doc/ADMIN.rf: New document: Administrator's Guide Fri Jun 21 13:09:29 1985 /mtr uip/addrsbr.c: liked the wild-carding, so even for #ifndef BERK you get it. Of course in this case, you can wildcard on both the mbox and the host. It turns out that this is really useful for people who have many mailboxes and get a lot of munged mail. Thu Jun 20 19:55:23 1985 /mtr -- Performance Enhancements from the 4.3BSD folks (by Van Jacobson) -- config/mh.h: define vfork for systems without it sbr/{refile,showfile}.c,uip/{replsbr,send,whatnowsbr}.c: replace fork() with vfork() config/mh.h: move Van's getfld.h definitions into here sbr/m_getfld.c: major performance tuning! (use -DRPATHS to get Return-Path: info from UNIX from: line) uip/{inc,msh}.c: m_unknown parameter added uip/trmsbr.c: support for TIOCGWINSZ in 4.3BSD(!!) uip/scan.c: -[no]reverse under #ifdef BERK (I really HATE this) also, update context prior to scan, again under #ifdef BERK uip/scansbr.c: performance enhancements plus inline copy of message body to output file for inc uip/mhlsbr.c: under #ifdef BERK pipe output to /usr/ucb/more if stdoutput is a terminal. uip/post.c: #ifdef DUMB a bit dumber for Berkeley addrsbr (actually these changes were made earlier for other reasons) uip/addrsbr.c: use prescan-like routine in SendMail under #ifdef BERK, also enable wild-carding. The former probably breaks the stuff in ap, et. al. Sun Jun 16 10:21:33 1985 /mtr uip/{ap,dp,{repl,scan}sbr}.c: the old echo controversy raises it's ugly head: suppose we have a line in a replcomps file which is entirely in a %<...%> conditional and the conditional is false. In that case, we still get a blank line. This is very BAD if it occurs in the headers. Two solutions possible: 1. If a call to FSprintf() returns a empty string, don't put out a \n. 2. In new_fs, put the \n's in and just return one big string instead of an array of strings. Option [2] was implemented initially because it lets conditionals span multiple lines in the file. In order to keep the format files from looking too complicated, EOL was ignored in format files, \n's should be embedded where appropriate. A single format string argument is considered to have an implicit \n. This is inconsistent, but it keeps the format files readable. Option [2] was discarded though since it required a \n at the end of each line in the format file if there was no conditional stuff there. So, option [1] got implemented even though it doesn't allow conditionals to be multi-line (which is okay, since you can use \n in a line). Sun Jun 9 16:37:40 1985 /mtr uip/dropsbr.c, uip/sbboards.c: .cnt mechanism broken, introduce new routine mbx_openX() in dropsbr.c and use that instead of mbx_open when opening an .cnt file Sun Jun 9 14:44:36 1985 /mtr conf/makefiles/uip,uip/show.c: make show/next/prev one program uip/{show,next,prev}hdr.c: remove as a result of above conf/doc/{next,prev}.rf: update Thu Jun 6 23:03:09 1985 /mtr uip/{format,mhl}sbr.c: add some definitions for sprintb() bboards/bboards.h: define BBITS there instead of uip/bbc.c Tue Jun 4 20:00:32 1985 /mtr -- Suggested by Dave Yost -- conf/doc/tmac.h: use ".nf" after ".SH" inside various macros (since ".SH" tends to set ".fi") sbr/m_{gmsg,sync}.c: some .mh_sequences optimizations for hm conf/config/config.c: support #ifdef NOMHSEQ Tue Jun 4 13:30:27 1985 /mtr uip/trmsbr.c: optimize a bit, the ontty test in clear_screen () isn't needed Mon Jun 3 22:15:18 1985 /mtr conf/doc/packd.rf, uip/packd.c: de-implement, essentially useless under 4.2BSD Mon Jun 3 14:54:30 1985 /mtr othersupport/usenix: new directory containing the MH paper presented at the 1985 Summer Usenix Conference Mon Jun 3 11:28:46 1985 /mtr TODO: remove since there's nothing worth left doing in it! Sun Jun 2 18:36:19 1985 /mtr conf/doc/*.rf: more clean-up uip/ali.c: change help messages a bit, and add -[no]normalize switches conf/doc/mh-tailor.rf: new file config/mh.h,uip/{post,repl}.c: move definition of OUTPUTLINELEN to mh.h so sbr/help.c can use it sbr/help.c: smarter output routine for options Sun Jun 2 14:07:46 1985 /mtr uip/whatnowsbr.c: don't say the draft's left around if it isn't (suggested by Mike O'Brien) uip/whatnowsbr.c: return value from non-initial calls to m_edit() not handled right (pointed out by Richard Johnson) sbr/m_getfld.c: be a bit smarter when recognizing that idiotic "From " line from silly UNIX-style maildrops Sat Jun 1 14:45:25 1985 /mtr uip/{pick,picksbr,msh}.c: bite the bullet and have pick allow complex booleans conf/doc/{mh-chart,pick}.rf: ditto Sat Jun 1 11:18:06 1985 /mtr mf/mf.c, uip/*sbr.c: more register declarations Sat Jun 1 01:35:06 1985 /mtr conf/doc/mhook.rf, uip/rcv*.c: account for MMDF-II change regarding rcvmail hooks and maildelivery(5) Fri May 31 23:33:59 1985 /mtr conf/doc/*.rf: more doc fixes; document WHATNOW, OVERHEAD sbr/m_getdefs.c: more OVERHEAD code to optimize MH subforks Fri May 31 22:19:15 1985 /mtr uip/replsbr.c: bite the bullet and have repl use the format string routines as well Wed May 29 16:38:49 1985 /mtr Makefile, conf/makefiles/*: support depend. N.B.: This is for DEVELOPMENT WORK ONLY. "make depend" runs unifdef because some #include files are configuration specific. Sadly, unifdef isn't on all systems (it originated at Rand and migrated to 4.2BSD). As a result, unless you have unifdef, don't run make depend. The dependencies listed in the conf/makefiles/* files are "generic". Wed May 29 14:53:33 1985 /mtr othersupport/mtrenv/*: update Tue May 28 19:45:36 1985 /mtr config/scansbr.h,uip/{inc,msh,rcvtty,scan,scansbr}.c: bite the bullet and have scansbr use a format string uip/{inc,scan}.c: no more -[no]numdate, -[no]size, -[no]time and use -format string and -width columns instead Mon May 27 21:45:23 1985 /mtr uip/{ap,addrsbr}.c: upgrade ap to use formatsbr; required a new param to getm(), so modules which call getm() got changed as well othersupport/rcvtrip/rcvtrip: upgrade Mon May 27 17:05:18 1985 /mtr tws/dp.c: move to uip/ uip/formatsbr.c: new module config/scansbr.h: define stuff for formatsbr Mon May 27 11:33:32 1985 /mtr config/mh.h, sbr/{closefds,m_getdefs}.c: #ifdef OVERHEAD experimental code Thu May 23 22:06:25 1985 /mtr conf/makfiles/uip,uip/*.c: next step in the lint process config/mh.h, sbr/llib-lmh, uip/rmf.c: move remdir() to sbr/makedir.c Thu May 23 09:06:32 1985 /mtr conf/makefiles/{mts,uip}, uip/msgchk.c: moved from mts/ Wed May 22 19:49:43 1985 /mtr Makefile, config/mh.h, conf/makefiles/*, bboards/getbbent.c, */llib-l*, tws/{dtime,dtimep}.c: start the linting process, lint everything except the uip/ directory sendmts/smail.c, uip/trmsbr.c: move discard to sbr/ library mf/mf.c: lint fixes sbr/{getans,m_{gmsg,setcur},refile,showfile}.c: lint fixes sbr/{putenv,sprintb}.c: #include mh.h sbr/*: VOID -> (void) bbsupport/bb{aka,exp,tar}.c: lint fixes Wed May 22 15:29:25 1985 /mtr popsupport/popser.c: if maildrop doesn't exist, note it and continue conf/doc/bbc.rf, uip/bbc.c: add -user switch to help POP debugging bboards/getbbent.c: have getbberr() return useful info for setbbfile (), setbbinfo (), and setbbent () popsupport/{popaka,popser,popwrd}.c, uip/{bbc,spop}.c: take advantage of getbberr() Wed May 22 10:16:17 1985 /mtr sbr/m_getfld.c: Eom() was botching gathering the UNIX from line (fix from Matt Crawford ) sendmts/smail.c: sm_end(NOTOK) was clobbering sm_reply Tue May 21 22:33:58 1985 /mtr uip/scansbr.c: when copying characters to the scan listing, know about underlining conventions Tue May 21 21:29:18 1985 /mtr Begin work on research-version of MH (#5.380[NRTC]). This version won't be sent out to the MH-Workers list, so I can do some power coding for a change. -- WHATNOW changes -- uip/{refile,send,show,whom}.c: #ifdef WHATNOW experimental code sbr/m_whatnow.c, uip/{whatnow,whatnowsbr}.c: default whatnow is a built-in for comp, et. al. sbr/{m_{edit,send},showhom}.c: removed since whatnowsbr has 'em sbr/showfile.c: likewise, showhead function removed -- POP changes -- conf/doc/inc.rf, uip/inc.c: pop now lives in inc uip/spop.c: link to sbboards.c, the POP mailer for SendMail popsupport/: new directory from the ashes of othersupport/popsupport/, containing many new programs, files, and documentation bboards/{bboards.h,getbbent.c}: new functions to support popsupport/mmdfII/: the POP channel for MMDF-II, linked to the BBoards channel, as appropriate conf/doc/msgchk.rf, mts/msgchk.c: support POP -- Bug Fixes -- uip/post.c: for path code, fixed a couple of dumb typos. uip/replsbr.c: if -noformat, don't worry about no addresses uip/bbc.c: another couple of nasty bugs fixed sendmts/smail.c: don't send HELO if talking to SendMail on the local host conf/doc/{MH,repl,forw,comp,dist,show,mh,mh-chart,whom}.rf: bug fixes -- Configuration and Clean-up -- conf/mhconfig.c: support new options: pop, chown, remove conf/makefiles/*: more chmods where appropriate config/config.c, sbr/help.c: include compile-time options in help listing. sbr/m_backup.c,uip/forw.c: remove makename in favor of mktemp sbr/pr_array.c: removed, since no one was using it config/mh.h, sbr/llib-lmh: update for all this othersupport/patch/: the latest version Thu May 2 21:14:56 1985 /mtr (agent: Marshall Rose) MH #5.360[UCI] (uci-750a) released to MH-Workers Thu May 2 21:13:32 1985 /mtr (agent: Marshall Rose) conf/makefiles/uip: make whatnow chmod +t'd Thu May 2 21:13:32 1985 /mtr (agent: Marshall Rose) uip/post.c: a few more back-offs with #ifdef DUMB... Thu May 2 21:13:03 1985 /mtr (agent: Marshall Rose) uip/sbboards.c: fdopen() called with wrong arg! Wed Apr 24 22:45:39 1985 /mtr (agent: Marshall Rose) conf/doc/MH.rf: just a few more fixes... Wed Apr 24 22:44:30 1985 /mtr (agent: Marshall Rose) sbr/m_whatnow.c, uip/{dist,forw,repl}.c: fix obscure "@" bug. Sat Apr 20 14:46:10 1985 /mtr (agent: Marshall Rose) sbr/m_send.c, uip/whatnow.c: on "push", let send do push() instead of whatnow Fri Apr 19 19:44:25 1985 /mtr (agent: Marshall Rose) uip/send.c: on annotations, if push'd avoid getting upset if message to annotate isn't there uip/send.c: fix "typo" for r1bindex () uip/send.c: put ~/.signature support back in under #ifdef UCI uip/send.c: use mktemp() instead of bogus makename! uip/send.c: fix screwy interaction between msh, dist, whatnow, and send (oh no!) Fri Apr 19 19:23:39 1985 /mtr (agent: Marshall Rose) uip/whatnow.c: if edit fails, it's time to go away sbr/m_edit.c: minor cosmetic change Fri Apr 19 19:13:44 1985 /mtr (agent: Marshall Rose) uip/post.c: more #ifdef DUMB madness, for local addresses, if no host portion given, then don't give it to sm_wadr() uip/post.c: back #ifdef DUMB off a bit in From: for MMDFMTS Fri Apr 19 18:32:13 1985 /mtr (agent: Marshall Rose) conf/doc/MH.rf, sbr/m_send.c: de-implement "push" in whatnow having send look for profile-entry of "push" rather than "send" to confusing to the user "community" Fri Apr 19 18:28:44 1985 /mtr (agent: Marshall Rose) bboards/bboards.h, uip/bbc.c: support BB_INVIS for "hidden" BBoards in -topic uip/bbc.c: catch a long name that got past us uip/bbc.c: fix -topics logic when BBoards given Fri Apr 19 18:27:16 1985 /mtr (agent: Marshall Rose) conf/{config/mts.c,tailor/READ-ME}, mts/mts.h, uip/inc.c: support the new MTS variable "pophost" Sat Apr 6 16:17:23 1985 /mtr (agent: Marshall Rose) MH #5.348[UCI] (uci-750a) released to MH-Workers Wed Apr 3 23:53:12 1985 /mtr (agent: Marshall Rose) ohtersupport/mtrenv/bin/whatnow: new file Wed Apr 3 23:52:13 1985 /mtr (agent: Marshall Rose) sendmts/smail.c: comment out an extra RSET for UCI's losing MMDF-I SMTP server Tue Mar 26 18:32:49 1985 /mtr (agent: Marshall Rose) conf/{config/mts.c,tailor/READ-ME}, config/aliasbr.h, mts/mts.h, uip/aliasbr.c: make "*" logic mts-tailorable (ugh), you get to choose highest non-user uid and non-user shell Tue Mar 26 18:02:52 1985 /mtr (agent: Marshall Rose) conf/doc/repl.rf: document bug in replcomps Mon Mar 25 18:06:48 1985 /mtr (agent: Marshall Rose) mf/mf.c: avoid (incorrectly) recognizing " at " for "@" by using a heuristic suggested by JSol. Sun Mar 24 18:32:47 1985 /mtr (agent: Marshall Rose) sbr/m_draft.c, uip/{comp,dist,forw,refile,repl,send,show,whatnow,whom}.c: have -nodraftfolder override "Draft-Folder:" profile entry Sat Mar 23 12:48:30 1985 /mtr (agent: Marshall Rose) -- Support the WhatNow shell -- conf/makefiles/{sbr,uip}: updates for all of this uip/{comp,dist,forw,repl}.c: remove What now? code, add -whatnow program, -nowhatnow sbr/m_whatnow.c: new module conf/config/config.c,config/mh.h,sbr/m_getdefs.c: new variable whatnowproc sbr/llib-lmh: update uip/whatnow.c: new program, the first WhatNow shell conf/doc/{mh-chart,whom}.rf, uip/whom.c: upgrade to take draftfolder arguments sbr/putenv.c: update for above sbr/m_send.c: undo previous edits, m_whatnow() takes care of it uip/distsbr.c: new module for dist-style support uip/{send,whom}.c: call distout() in distsbr.c conf/doc/whatnow.rf: new file conf/doc/{MH,comp,dist,forw,mh,mh-{chart,profile},repl}.rf: updates conf/doc/template: fix Thu Mar 21 08:45:11 1985 /mtr (agent: Marshall Rose) sendmts/smail.c: fix logic error in sm_end(); MMDF-I has this problem, MMDF-II might! Tue Mar 19 18:16:33 1985 /mtr (agent: Marshall Rose) conf/doc/msgchk.rf: new file conf/{doc/{mh,mh-chart,MH}.rf,makefiles/doc}: update for msgchk Tue Mar 19 17:31:14 1985 /mtr (agent: Marshall Rose) conf/doc/{ap,mh-chart}.rf, uip/ap.c: accept -help switch Tue Mar 19 14:17:30 1985 /mtr (agent: Marshall Rose) othersupport/mtrenv/bin/{distf,mpick,packit}: updates Sat Mar 16 12:49:48 1985 /mtr (agent: Marshall Rose) Makefile: simply Makefile using sh, also make DESTDIR work conf/makefiles/othersupport: simplify Makefile Sat Mar 16 12:23:37 1985 /mtr (agent: Marshall Rose) uip/{mark,msh}.c: don't set previous-sequence to make debugging easier Sat Mar 16 01:38:06 1985 /mtr (agent: Marshall Rose) conf/config/mts.c: add a few calls to mts_init ("mts") at strategic places Sat Mar 16 00:28:01 1985 /mtr (agent: Marshall Rose) uip/{inc,msh,rcvtty,scan,scansbr}.c: clean up handling of inc -silent sbr/{llib-lmh,m_send.c}, uip/{annosbr,comp,dist,forw,repl}.c: move annotations into send conf/makefiles/uip, uip/{send,post}.c: ditto conf/doc/{dist,forw,repl}.rf: ditto uip/anno.c: forgot to check (mp -> msgstats[msgnum] & SELECTED) Fri Mar 15 23:21:29 1985 /mtr (agent: Marshall Rose) sbr/printsw.c: compress output of printed switches sbr/m_getdefs.c: let $MHCONTEXT override context variable sbr/m_{getdefs,gmsg,sync}.c, conf/doc/mh-profile.rf: let the profile entry "mh-sequences" override .mh_sequences sbr/m_seq.c: optimization Fri Mar 15 23:05:43 1985 /mtr (agent: Marshall Rose) bbsupport/bbexp.c: fix string botch for command to popen. also allow extra arguments to indicate aging period. Fri Mar 15 11:45:00 1985 /mtr (agent: Marshall Rose) othersupport/emh/READ-ME: new file Thu Mar 14 22:41:37 1985 /mtr (agent: Marshall Rose) -- Fixes suggested by John Dilley -- conf/{config/mts.c,tailor/READ-ME}: add new mtstailor variables localname, systemname, and uucpchan mts/mts.h, conf/{mh-gen.8,config/{mts.c,mtstailor},tailor/READ-ME}: add new mtstailor variable lockstyle to control style of locking sbr/m_getfld.c: catch the UNIX "from user" line uip/scansbr.c: make use of the UNIX "from user" line uip/addrsbr.c: more #ifdef DUMB support uip/inc.c: minor bug in inc w.r.t. closing locked file uip/post.c: more #ifdef DUMB support uip/replsbr.c: support Return-Path: for defaulting host names as a last resort Wed Mar 13 22:24:07 1985 /mtr (agent: Marshall Rose) uip/send.c: fix "use xxx logic" uip/msh.c: a NULL vs. "" typo Wed Mar 13 22:01:37 1985 /mtr (agent: Marshall Rose) -- Fixes suggested by Phyllis Kantar -- uip/{comp,dist,forw,repl}.c: fix quit -delete logic conf/doc/{comp,mh-chart}.rf: document "-file file" switch uip/send.c: "send -help" should done (1) for comp, et. al. uip/send.c: typo "tempoary" conf/doc/{send,whom}.rf: Profile Components forgot Draft-Folder uip/ali.c: always load system aliases conf/doc/{MH,comp,dist,forw,mhook,repl,send,show,mh-alias,mh-mail, mh-profile,mhl,post}.rf: typo fixes conf/doc/send.rf, uip/send.c: -forward now the default, also don't gripe about "show -draft file" Tue Mar 12 18:07:44 1985 /mtr (agent: Marshall Rose) othersupport/pop/pop.txt: a few minor corrections to typos. Sat Mar 9 15:54:40 1985 /mtr (agent: Marshall Rose) uip/dropsbr.c: fix bug when fixing stomped maildrop. Sat Mar 9 15:36:13 1985 /mtr (agent: Marshall Rose) bboards/mmdf/mmdf.{1,2}/bboards/bb_wtmail.c, uip/sbboards.c: fix minor bug requiring nearly major re-write!!! Wed Mar 6 18:59:22 1985 /mtr (agent: Marshall Rose) -- Fixes from Robert Elz -- sbr/makedir.c: use mkdir() under #ifdef BSD42 uip/rmf.c: use rmdir() under #ifdef BSD42 Wed Mar 6 18:19:46 1985 /mtr (agent: Marshall Rose) TODO, config/addrsbr.h, sendmts/smail.c, mf/mf.{c,h}, uip/{addrsbr,ap,post,rcvdist,sbboards}.c: handle 822-style routing Wed Mar 6 18:08:11 1985 /mtr (agent: Marshall Rose) uip/{dropsbr,packf,post,slocal}.c: fix to maildrop mapping bug with MHMTS and local delivery in post, and SENDMTS and local delivery in slocal Sat Mar 1 20:21:17 1985 /mtr (agent: Marshall Rose) MH #5.321[UCI] (uci-750a) released to MH-Workers Fri Mar 1 19:59:32 1985 /mtr (agent: Marshall Rose) uip/trmsbr.c: forgot to make a termcap buffer TXTSIZ'd instead of BUFSIZ'd. Fri Mar 1 19:56:43 1985 /mtr (agent: Marshall Rose) conf/config/mts.c: for the DUAL, you can't link to a file that you can't read, unbelievable, eh?, so change the creat (foo, 0000) to creat (foo, 0400). Also, fix up some botched args to a sprintf() call. Fri Mar 1 19:48:53 1985 /mtr (agent: Marshall Rose) conf/config/config.c: if MORE is defined, used that instead of /usr/ucb/more. The #ifdef ALTOS dependency is removed. ALTOS users should use options MORE='"/usr/bin/more"', just like users of the Dual. conf/examples/READ-ME: document same Wed Feb 20 20:48:12 1985 /mtr (agent: Marshall Rose) sbr/adios.c: save errno prior to doing fancy perror stuff Wed Feb 20 20:40:14 1985 /mtr (agent: Marshall Rose) uip/inc.c: fix suggested by John Dilley at Purdue, inc now ignore signals if it's going to zero the maildrop. Mon Feb 18 12:53:50 1985 /mtr (agent: Marshall Rose) conf/doc/send.rf, uip/send.c: de-implement ~/.signature support Tue Feb 12 19:33:14 1985 /mtr (agent: Marshall Rose) uip/mhlsbr.c: clear_screen() logic between messages botched Sun Jan 27 18:42:49 1985 /mtr (agent: Marshall Rose) conf/makefiles/mts: dependency screw-up on mts.o Sun Jan 27 17:41:03 1985 /mtr (agent: Marshall Rose) sendmts/smail.c, uip/post.c: with -DSMTP, keep one SMTP connection open, instead of starting a new one for each transaction othersupport/pop/{Makefile,{popd,popser,inc,popsbr}.c}: support "rpop" under #ifdef RPOP othersupport/pop/client.c: remove conf/{config/mts.c,tailor/READ-ME,makefiles/sendmts}, mts/mts.h, sendmts/{smail,client}.c: support new server search list facility used by both -DSMTP and -DPOP Sat Jan 26 09:12:27 1985 /mtr (agent: Marshall Rose) MH #5.310[UCI] (uci-750a) released to MH-Workers Sat Jan 26 09:38:08 1985 /mtr (agent: Marshall Rose) tws/dtime.c: #define dysize(), since could be a macro in ctime.c (thanks, Fred) Sat Jan 26 09:08:43 1985 /mtr (agent: Marshall Rose) uip/{inc,post}.c: changes for #ifdef TMA; this stuff is still under non-disclosure (not the MH code, just the -ltma library which doesn't come with MH) Sat Jan 26 09:05:52 1985 /mtr (agent: Marshall Rose) -- Fixes for MHMTS configuration -- conf/makefiles/uip: shouldn't build rcvdist on an MHMTS system conf/doc/mhook.rf: ditto conf/config/mts.c, mhmts/netmail.c, mts/mts.h, uip/rmail.c: some typos in the declarations of global MTS variables that are MHMTS specific mf/mmuu.c: addr_convert() conflicted with routine of same name in uumm.c uip/news.c: looking in the wrong place for on 4.2BSD systems Tue Jan 8 13:54:13 1985 /mtr (agent: Marshall Rose) MH.5 is finished, finally. MHCHANGES from mh.4 to mh.5 Thu May 2 21:14:56 1985 /mtr (agent: Marshall Rose) MH #5.360[UCI] (uci-750a) released to MH-Workers Thu May 2 21:13:32 1985 /mtr (agent: Marshall Rose) conf/makefiles/uip: make whatnow chmod +t'd Thu May 2 21:13:32 1985 /mtr (agent: Marshall Rose) uip/post.c: a few more back-offs with #ifdef DUMB... Thu May 2 21:13:03 1985 /mtr (agent: Marshall Rose) uip/sbboards.c: fdopen() called with wrong arg! Wed Apr 24 22:45:39 1985 /mtr (agent: Marshall Rose) conf/doc/MH.rf: just a few more fixes... Wed Apr 24 22:44:30 1985 /mtr (agent: Marshall Rose) sbr/m_whatnow.c, uip/{dist,forw,repl}.c: fix obscure "@" bug. Sat Apr 20 14:46:10 1985 /mtr (agent: Marshall Rose) sbr/m_send.c, uip/whatnow.c: on "push", let send do push() instead of whatnow Fri Apr 19 19:44:25 1985 /mtr (agent: Marshall Rose) uip/send.c: on annotations, if push'd avoid getting upset if message to annotate isn't there uip/send.c: fix "typo" for r1bindex () uip/send.c: put ~/.signature support back in under #ifdef UCI uip/send.c: use mktemp() instead of bogus makename! uip/send.c: fix screwy interaction between msh, dist, whatnow, and send (oh no!) Fri Apr 19 19:23:39 1985 /mtr (agent: Marshall Rose) uip/whatnow.c: if edit fails, it's time to go away sbr/m_edit.c: minor cosmetic change Fri Apr 19 19:13:44 1985 /mtr (agent: Marshall Rose) uip/post.c: more #ifdef DUMB madness, for local addresses, if no host portion given, then don't give it to sm_wadr() uip/post.c: back #ifdef DUMB off a bit in From: for MMDFMTS Fri Apr 19 18:32:13 1985 /mtr (agent: Marshall Rose) conf/doc/MH.rf, sbr/m_send.c: de-implement "push" in whatnow having send look for profile-entry of "push" rather than "send" to confusing to the user "community" Fri Apr 19 18:28:44 1985 /mtr (agent: Marshall Rose) bboards/bboards.h, uip/bbc.c: support BB_INVIS for "hidden" BBoards in -topic uip/bbc.c: catch a long name that got past us uip/bbc.c: fix -topics logic when BBoards given Fri Apr 19 18:27:16 1985 /mtr (agent: Marshall Rose) conf/{config/mts.c,tailor/READ-ME}, mts/mts.h, uip/inc.c: support the new MTS variable "pophost" Sat Apr 6 16:17:23 1985 /mtr (agent: Marshall Rose) MH #5.348[UCI] (uci-750a) released to MH-Workers Wed Apr 3 23:53:12 1985 /mtr (agent: Marshall Rose) ohtersupport/mtrenv/bin/whatnow: new file Wed Apr 3 23:52:13 1985 /mtr (agent: Marshall Rose) sendmts/smail.c: comment out an extra RSET for UCI's losing MMDF-I SMTP server Tue Mar 26 18:32:49 1985 /mtr (agent: Marshall Rose) conf/{config/mts.c,tailor/READ-ME}, config/aliasbr.h, mts/mts.h, uip/aliasbr.c: make "*" logic mts-tailorable (ugh), you get to choose highest non-user uid and non-user shell Tue Mar 26 18:02:52 1985 /mtr (agent: Marshall Rose) conf/doc/repl.rf: document bug in replcomps Mon Mar 25 18:06:48 1985 /mtr (agent: Marshall Rose) mf/mf.c: avoid (incorrectly) recognizing " at " for "@" by using a heuristic suggested by JSol. Sun Mar 24 18:32:47 1985 /mtr (agent: Marshall Rose) sbr/m_draft.c, uip/{comp,dist,forw,refile,repl,send,show,whatnow,whom}.c: have -nodraftfolder override "Draft-Folder:" profile entry Sat Mar 23 12:48:30 1985 /mtr (agent: Marshall Rose) -- Support the WhatNow shell -- conf/makefiles/{sbr,uip}: updates for all of this uip/{comp,dist,forw,repl}.c: remove What now? code, add -whatnow program, -nowhatnow sbr/m_whatnow.c: new module conf/config/config.c,config/mh.h,sbr/m_getdefs.c: new variable whatnowproc sbr/llib-lmh: update uip/whatnow.c: new program, the first WhatNow shell conf/doc/{mh-chart,whom}.rf, uip/whom.c: upgrade to take draftfolder arguments sbr/putenv.c: update for above sbr/m_send.c: undo previous edits, m_whatnow() takes care of it uip/distsbr.c: new module for dist-style support uip/{send,whom}.c: call distout() in distsbr.c conf/doc/whatnow.rf: new file conf/doc/{MH,comp,dist,forw,mh,mh-{chart,profile},repl}.rf: updates conf/doc/template: fix Thu Mar 21 08:45:11 1985 /mtr (agent: Marshall Rose) sendmts/smail.c: fix logic error in sm_end(); MMDF-I has this problem, MMDF-II might! Tue Mar 19 18:16:33 1985 /mtr (agent: Marshall Rose) conf/doc/msgchk.rf: new file conf/{doc/{mh,mh-chart,MH}.rf,makefiles/doc}: update for msgchk Tue Mar 19 17:31:14 1985 /mtr (agent: Marshall Rose) conf/doc/{ap,mh-chart}.rf, uip/ap.c: accept -help switch Tue Mar 19 14:17:30 1985 /mtr (agent: Marshall Rose) othersupport/mtrenv/bin/{distf,mpick,packit}: updates Sat Mar 16 12:49:48 1985 /mtr (agent: Marshall Rose) Makefile: simply Makefile using sh, also make DESTDIR work conf/makefiles/othersupport: simplify Makefile Sat Mar 16 12:23:37 1985 /mtr (agent: Marshall Rose) uip/{mark,msh}.c: don't set previous-sequence to make debugging easier Sat Mar 16 01:38:06 1985 /mtr (agent: Marshall Rose) conf/config/mts.c: add a few calls to mts_init ("mts") at strategic places Sat Mar 16 00:28:01 1985 /mtr (agent: Marshall Rose) uip/{inc,msh,rcvtty,scan,scansbr}.c: clean up handling of inc -silent sbr/{llib-lmh,m_send.c}, uip/{annosbr,comp,dist,forw,repl}.c: move annotations into send conf/makefiles/uip, uip/{send,post}.c: ditto conf/doc/{dist,forw,repl}.rf: ditto uip/anno.c: forgot to check (mp -> msgstats[msgnum] & SELECTED) Fri Mar 15 23:21:29 1985 /mtr (agent: Marshall Rose) sbr/printsw.c: compress output of printed switches sbr/m_getdefs.c: let $MHCONTEXT override context variable sbr/m_{getdefs,gmsg,sync}.c, conf/doc/mh-profile.rf: let the profile entry "mh-sequences" override .mh_sequences sbr/m_seq.c: optimization Fri Mar 15 23:05:43 1985 /mtr (agent: Marshall Rose) bbsupport/bbexp.c: fix string botch for command to popen. also allow extra arguments to indicate aging period. Fri Mar 15 11:45:00 1985 /mtr (agent: Marshall Rose) othersupport/emh/READ-ME: new file Thu Mar 14 22:41:37 1985 /mtr (agent: Marshall Rose) -- Fixes suggested by John Dilley -- conf/{config/mts.c,tailor/READ-ME}: add new mtstailor variables localname, systemname, and uucpchan mts/mts.h, conf/{mh-gen.8,config/{mts.c,mtstailor},tailor/READ-ME}: add new mtstailor variable lockstyle to control style of locking sbr/m_getfld.c: catch the UNIX "from user" line uip/scansbr.c: make use of the UNIX "from user" line uip/addrsbr.c: more #ifdef DUMB support uip/inc.c: minor bug in inc w.r.t. closing locked file uip/post.c: more #ifdef DUMB support uip/replsbr.c: support Return-Path: for defaulting host names as a last resort Wed Mar 13 22:24:07 1985 /mtr (agent: Marshall Rose) uip/send.c: fix "use xxx logic" uip/msh.c: a NULL vs. "" typo Wed Mar 13 22:01:37 1985 /mtr (agent: Marshall Rose) -- Fixes suggested by Phyllis Kantar -- uip/{comp,dist,forw,repl}.c: fix quit -delete logic conf/doc/{comp,mh-chart}.rf: document "-file file" switch uip/send.c: "send -help" should done (1) for comp, et. al. uip/send.c: typo "tempoary" conf/doc/{send,whom}.rf: Profile Components forgot Draft-Folder uip/ali.c: always load system aliases conf/doc/{MH,comp,dist,forw,mhook,repl,send,show,mh-alias,mh-mail, mh-profile,mhl,post}.rf: typo fixes conf/doc/send.rf, uip/send.c: -forward now the default, also don't gripe about "show -draft file" Tue Mar 12 18:07:44 1985 /mtr (agent: Marshall Rose) othersupport/pop/pop.txt: a few minor corrections to typos. Sat Mar 9 15:54:40 1985 /mtr (agent: Marshall Rose) uip/dropsbr.c: fix bug when fixing stomped maildrop. Sat Mar 9 15:36:13 1985 /mtr (agent: Marshall Rose) bboards/mmdf/mmdf.{1,2}/bboards/bb_wtmail.c, uip/sbboards.c: fix minor bug requiring nearly major re-write!!! Wed Mar 6 18:59:22 1985 /mtr (agent: Marshall Rose) -- Fixes from Robert Elz -- sbr/makedir.c: use mkdir() under #ifdef BSD42 uip/rmf.c: use rmdir() under #ifdef BSD42 Wed Mar 6 18:19:46 1985 /mtr (agent: Marshall Rose) TODO, config/addrsbr.h, sendmts/smail.c, mf/mf.{c,h}, uip/{addrsbr,ap,post,rcvdist,sbboards}.c: handle 822-style routing Wed Mar 6 18:08:11 1985 /mtr (agent: Marshall Rose) uip/{dropsbr,packf,post,slocal}.c: fix to maildrop mapping bug with MHMTS and local delivery in post, and SENDMTS and local delivery in slocal Sat Mar 1 20:21:17 1985 /mtr (agent: Marshall Rose) MH #5.321[UCI] (uci-750a) released to MH-Workers Fri Mar 1 19:59:32 1985 /mtr (agent: Marshall Rose) uip/trmsbr.c: forgot to make a termcap buffer TXTSIZ'd instead of BUFSIZ'd. Fri Mar 1 19:56:43 1985 /mtr (agent: Marshall Rose) conf/config/mts.c: for the DUAL, you can't link to a file that you can't read, unbelievable, eh?, so change the creat (foo, 0000) to creat (foo, 0400). Also, fix up some botched args to a sprintf() call. Fri Mar 1 19:48:53 1985 /mtr (agent: Marshall Rose) conf/config/config.c: if MORE is defined, used that instead of /usr/ucb/more. The #ifdef ALTOS dependency is removed. ALTOS users should use options MORE='"/usr/bin/more"', just like users of the Dual. conf/examples/READ-ME: document same Wed Feb 20 20:48:12 1985 /mtr (agent: Marshall Rose) sbr/adios.c: save errno prior to doing fancy perror stuff Wed Feb 20 20:40:14 1985 /mtr (agent: Marshall Rose) uip/inc.c: fix suggested by John Dilley at Purdue, inc now ignore signals if it's going to zero the maildrop. Mon Feb 18 12:53:50 1985 /mtr (agent: Marshall Rose) conf/doc/send.rf, uip/send.c: de-implement ~/.signature support Tue Feb 12 19:33:14 1985 /mtr (agent: Marshall Rose) uip/mhlsbr.c: clear_screen() logic between messages botched Sun Jan 27 18:42:49 1985 /mtr (agent: Marshall Rose) conf/makefiles/mts: dependency screw-up on mts.o Sun Jan 27 17:41:03 1985 /mtr (agent: Marshall Rose) sendmts/smail.c, uip/post.c: with -DSMTP, keep one SMTP connection open, instead of starting a new one for each transaction othersupport/pop/{Makefile,{popd,popser,inc,popsbr}.c}: support "rpop" under #ifdef RPOP othersupport/pop/client.c: remove conf/{config/mts.c,tailor/READ-ME,makefiles/sendmts}, mts/mts.h, sendmts/{smail,client}.c: support new server search list facility used by both -DSMTP and -DPOP Sat Jan 26 09:12:27 1985 /mtr (agent: Marshall Rose) MH #5.310[UCI] (uci-750a) released to MH-Workers Sat Jan 26 09:38:08 1985 /mtr (agent: Marshall Rose) tws/dtime.c: #define dysize(), since could be a macro in ctime.c (thanks, Fred) Sat Jan 26 09:08:43 1985 /mtr (agent: Marshall Rose) uip/{inc,post}.c: changes for #ifdef TMA; this stuff is still under non-disclosure (not the MH code, just the -ltma library which doesn't come with MH) Sat Jan 26 09:05:52 1985 /mtr (agent: Marshall Rose) -- Fixes for MHMTS configuration -- conf/makefiles/uip: shouldn't build rcvdist on an MHMTS system conf/doc/mhook.rf: ditto conf/config/mts.c, mhmts/netmail.c, mts/mts.h, uip/rmail.c: some typos in the declarations of global MTS variables that are MHMTS specific mf/mmuu.c: addr_convert() conflicted with routine of same name in uumm.c uip/news.c: looking in the wrong place for on 4.2BSD systems Tue Jan 8 13:54:13 1985 /mtr (agent: Marshall Rose) MH.5 is finished, finally. Tue Jan 8 09:45:25 1985 /mtr (agent: Marshall Rose) sbr/m_edit.c: from Mike O'Brien on 4.2BSD use symlinks if "@" is across file systems uip/inc.c: slight botch in -[no]truncate Tue Jan 8 09:12:42 1985 /mtr (agent: Marshall Rose) conf/{mh-gen,doc/MH}.rf: last change, fix public domain notice config/notice.h: remove uip/version.sh: don't include ../config/notice.h Mon Jan 7 19:05:22 1985 /mtr (agent: Marshall Rose) uip/inc.c: add -[no]truncate conf/doc/*: change up documentation a bit Fri Jan 4 16:28:49 1985 /mtr (agent: Marshall Rose) uip/addrsbr.c: SENDMTS was botching UUCP addrs Wed Jan 2 13:20:42 1985 /mtr (agent: Marshall Rose) uip/addrsbr.c: #ifdef DUMB inserted Mon Dec 31 21:28:07 1984 /mtr (agent: Marshall Rose) uip/packf.c, conf/doc/packf.c, conf/{config/config.c,makefiles/uip}, change pack to packf config/mh.h: make MAXFOLDERS smaller for the ALTOS Mon Dec 31 17:43:49 1984 /mtr (agent: Marshall Rose) tws/{tws.h,dtime.c}: add dgmtime() Sun Dec 30 19:52:27 1984 /mtr (agent: Marshall Rose) conf/config/{config,mts}.c, mmdf/hosts.c, uip/trmsbr.c, bboards/getbbent.c, config/mh.h: minor cleanup. Sun Dec 30 12:11:45 1984 /mtr (agent: Marshall Rose) uip/post.c: have non-recipient addresses honor aliases Sun Dec 30 12:01:08 1984 /mtr (agent: Marshall Rose) uip/sortm.c: fix for holes in "msgs" from Mike O'Brien Sun Dec 30 11:50:57 1984 /mtr (agent: Marshall Rose) uip/post.c: one more -noverbose fix Sat Dec 29 16:56:59 1984 /mtr (agent: Marshall Rose) conf/makefiles/sbr, config/mh.h, sbr/llib-lmh, sbr/closefds.c, uip/{msh,post,rcvtty,replsbr,send,slocal,whom}.c: implement closefds () Sat Dec 29 12:17:50 1984 /mtr (agent: Marshall Rose) conf/{config/config.c,doc/{folder,mh-profile}.rf}, sbr/m_getdefs.c, uip/folder.c: fix folder -fast -recurse Sat Dec 29 10:45:08 1984 /mtr (agent: Marshall Rose) sbr/m_sync.c: handle public and read-only sequences correctly uip/rmf.c: fix botch for handling read-only folders Sat Dec 29 10:43:12 1984 /mtr (agent: Marshall Rose) uip/msh.c: improved $mhfolder handling for -prompt. Wed Dec 19 12:49:42 1984 /mtr (agent: Marshall Rose) sbr/m_getfld.c: advise() with inverted arguments Tue Dec 18 16:48:17 1984 /mtr (agent: Marshall Rose) bboards/*.c, conf/config/mts.c, mhmts/*.c, mmdf/*.c, sendmts/*.c, tws/*.c: register madness Tue Dec 18 16:00:48 1984 /mtr (agent: Marshall Rose) uip/{bbc,msh}.c: for Farber, say name of BBoard not name of file Tue Dec 18 16:00:07 1984 /mtr (agent: Marshall Rose) bboards/getbbent.c, conf/config/mts.c, sbr/m_backup.c, uip/dropsbr.c: for ALTOS "%.*s" doesn't work if * evals to 0, so kludge around it Tue Dec 18 15:59:34 1984 /mtr (agent: Marshall Rose) sbr/m_getfld.c, uip/scansbr.c: some speed improvements from Jim Larus at UCB Thu Dec 13 00:05:42 1984 /mtr (agent: Marshall Rose) sbr/m_getfld.c: big fields were having their headers zero'd Wed Dec 12 11:51:52 1984 /mtr (agent: Marshall Rose) tws/{tws.h,dtime.c}: use modified version of gtime() to add new structure element to (struct tws *). This makes time comparisons insensitive to timezones, etc. Tue Dec 11 22:35:58 1984 /mtr (agent: Marshall Rose) -- Fixes from Julian Onions at Nottingham -- conf/makfiles/*: "ld -x -r" terminates with status 1 even if all goes well, so tell make not to worry about it config/mh.h,conf/examples/READ-ME: talk about void=int uip/{msh,post,rcv{dist,pack,tty},slocal}.c: include if not V7 Tue Dec 11 17:05:36 1984 /mtr (agent: Marshall Rose) uip/trmsbr.c: minor fix in discard() for #ifdef ALTOS Mon Dec 10 23:38:05 1984 /mtr (agent: Marshall Rose) config/scansbr.h, uip/{inc,scansbr,send,post}.c: add support for TTI's prototype TMA under #ifdef TMA uip/tmasbr.c: new module for support Sat Dec 8 18:16:41 1984 /mtr (agent: Marshall Rose) config/mh.h, tws/tws.h, conf/config/mts.c: remove the void definitions conf/Makefile, config/makefiles/*: remove -ns from LDFLAGS conf/makefiles/uip: don't use the -g option for ls for s{bboards,local} conf/makefiles/*: use -l to ls not -ls Sat Dec 8 18:16:20 1984 /mtr (agent: Marshall Rose) uip/rcvtty.c: minor-cleanup Fri Dec 7 00:25:24 1984 /mtr (agent: Marshall Rose) uip/{inc,show}.c: implement "unseen" for TGC. This feature is currently undocumented pending field-testing. Wed Dec 5 22:58:11 1984 /mtr (agent: Marshall Rose) uip/sbboards.c: on distribution, if a particular address loses, keep on going and report the error later on. bboards/mmdf/mmdf.{1,2}/bboards/bb_wtmail.c: in addition to above fix to sbboards, post failure notices to the local-XXX-request address. Wed Dec 5 14:28:18 1984 /mtr (agent: Marshall Rose) mts/msgchk.c, Makefile, conf/makefiles/mts: honor MF conventions in msgchk, required MH sbr library uip/inc.c: better check of umincproc uip/{dist,forw,repl}.c: typo prevented annotation with the pyramid cc conf/makefiles/{bbsupport,uip}: give path to chown uip/dropsbr.c: no diagnostic if map is empty conf/config/mts.c, bboards/getbbent.c: more ALTOS stuff for v7 cc sbr/m_getfld.c, uip/mhlsbr.c: botched pointer to function notation, visible on v7 cc bbsupport/bbexp.c: forgot to foil m_getdefs() sbr/m_{setcur,seq}.c: handle "cur" correctly sbr/m_getfld.c: in msh$mhl with a message with no body, big loss uip/post.c: don't ask sbr/m_getfld.c, conf/makefiles/sbr: use the mts stuff to initialize the delimiter. The programs that need this will call mts_init() themselvess prior to calling m_getfld() Fri Nov 30 08:47:52 1984 /mtr (agent: Marshall Rose) uip/news.c: forgot to include mh.h; no one must be using it, love to trash it from the distribution. -- Enter BETA Testing -- Thu Nov 29 01:55:12 1984 /mtr (agent: Marshall Rose) uip/pick.c: don't output that "0" on error exits if stdout is a tty... (yep, pick acts differently for ttys, just like ls) Wed Nov 28 22:59:34 1984 /mtr (agent: Marshall Rose) uip/msh.c: add -draft argument to msh$refile; clean-up -draft argument in msh$show sbr/m_draft.c: call path() on value of Draft-Folder: so relative folders work (!!) uip/repl.c: expand fcc: @folder arguments Wed Nov 28 20:42:21 1984 /mtr (agent: Marshall Rose) conf/makefiles/*: for installations, use mv -f to save backup Wed Nov 28 20:37:16 1984 /mtr (agent: Marshall Rose) uip/comp.c: restore old context-sensitive behavior Wed Nov 28 19:57:44 1984 /mtr (agent: Marshall Rose) uip/rcv{pack,tty}.c: move inclusion of and to the not MMDFMTS part, since "util.h" includes 'em Wed Nov 28 11:28:56 1984 /mtr (agent: Marshall Rose) uip/mhlsbr.c: ignores wasn't being handled properly (logic bug) Wed Nov 28 08:24:04 1984 /mtr (agent: Marshall Rose) uip/refile.c: if +folder arg is forgotten, don't print usage string. Also add -draft switch. Wed Nov 28 00:15:25 1984 /mtr (agent: Marshall Rose) uip/trmsbr.c: always read termcap and do what we can. When called from in a non-interactive environment, do the right thing at the right time... uip/msh.c: call sc_width() at start-up to read good values from trmsbr Tue Nov 27 21:02:41 1984 /mtr (agent: Marshall Rose) uip/send.c: re-implement the -[no]unique switches for JLR. Tue Nov 27 20:44:45 1984 /mtr (agent: Marshall Rose) -- More Changes for the ALTOS -- conf/makefiles/{mts,tws}: @(LDOPTIONS) was being left out of LDFLAGS config/aliasbr.h,uip/{ali,aliasbr}.c: prefix members of the aka structure with ak_, prefix members of the adr structure with ad_ tws/tws.h: type "void" undefined uip/rcv{dist,pack,tty}.c: include only if not on ALTOS uip/ttyw.c: put everything under #ifdef TTYD Tue Nov 27 19:22:51 1984 /mtr (agent: Marshall Rose) sbr/m_getfld.c: add m_eomsbr() for msh$mhl for bursting (sigh) Tue Nov 27 19:08:46 1984 /mtr (agent: Marshall Rose) uip/addrsbr.c: in addition to griping about bogus addresses in the "alternate-mailboxes:" entry, add a line saying to fix it (and where) uip/scansbr.c: very minor cosmetic change in cpyfrm() for group handling Tue Nov 27 16:54:51 1984 /mtr (agent: Marshall Rose) sbr/m_draft.c: add new result parameter which tells if a draft-folder is being used uip/{comp,dist,forw,repl,show,send,whom}.c: modified appropriately for extra parameter; this info is needed to decide which prompt and options to offer the user if the draft chosen exists Tue Nov 27 14:19:18 1984 /mtr (agent: Marshall Rose) uip/post.c: ignore Fcc:s when disting Mon Nov 26 20:34:18 1984 /mtr (agent: Marshall Rose) sbr/refile.c: new module; implements the "refile" option at "What now?" level uip/{comp,dist,forw,repl}.c: new switch -noedit, says to skip the initial edit and proceed directly to "What now?" level. Also make use of the new "refile" option at "What now?" level uip/comp.c: support for JLR's comp from a folder/msg notion Mon Nov 26 12:26:28 1984 /mtr (agent: Marshall Rose) uip/mhlsbr.c: add -[no]bell Mon Nov 26 10:20:07 1984 /mtr (agent: Marshall Rose) uip/send.c: add -[no]forward Sun Nov 25 23:36:59 1984 /mtr (agent: Marshall Rose) uip/{mhl,trm}sbr.c: move discard() from mhlsbr to trmsbr Sun Nov 25 19:30:46 1984 /mtr (agent: Marshall Rose) bbsupport/bboards.{dai,week}ly: if the bboards login shell is csh, can't use /bin/sh format... Sun Nov 25 13:28:47 1984 /mtr (agent: Marshall Rose) uip/{{mhl,trm}sbr,msh}.c: use and support SOprintf() for output to terminal uip/mhlsbr.c: add support for built-in mhl in msh, mhlsbr() uip/msh.c: use new support for built-in mhl sbr/m_getfld.c: some mis-logic in Eom(); if style is UNKNOWN, ALWAYS figure out what it is prior to going on Sat Nov 24 22:29:09 1984 /mtr (agent: Marshall Rose) uip/mhlsbr.c: into the fold Sat Nov 24 19:09:14 1984 /mtr (agent: Marshall Rose) sbr/showfile.c: if lproc is "mhl", use mhlproc for consistency (Actually, user should use "lproc: show", "showproc: mhl".) Sat Nov 24 09:59:31 1984 /mtr (agent: Marshall Rose) -- Fixes from John Romine at TGC -- conf/mh-gen.8: include "dm.h" in list of include files for MMDF2 conf/mh-gen.8: typo "ggenerate" conf/examples/READ-ME: BSD41a => BSD41A conf/mhconfig.c: V7 compiler tosses its cookies on reasonably formed structure members. Fix conf/config/config.c: remove comment about "pick -show" conf/{config/config.c,doc/mh-profile.rf}, config/mh.h sbr/m_getdefs.c: remove scanproc, since that's used only by "pick -scan" which does not exist conf/mhdoc: make into a Bourne shell script. Fri Nov 23 21:08:04 1984 /mtr (agent: Marshall Rose) -- More Changes for the ALTOS -- config/altos.h: didn't work, idiotic V7 compiler (cpp) didn't do "the right thing", so get rid of it and change the variable names in-line conf/config/mts.c: make isdlm{1,2} into macros instead of routines in mf/mf.c; also move getusr() there. conf/config/mts.c: make getfullname () standard and add new mtstailor option, mailid, to do the BRL/NRTC stuff with pw_gecos Fri Nov 23 19:26:35 1984 /mtr (agent: Marshall Rose) uip/{bbc,post,prompter,rcvdist,rmail,{repl,scan}sbr,s{bboards,local}}.c: minor clean-up Wed Nov 21 13:35:33 1984 /mtr (agent: Marshall Rose) config/dropsbr.h: new include file uip/dropsbr.c: add support for maildrop mapping uip/dropsbr.c: add new parameter to mbx_open() for default mode on creation uip/{msh,pack,post,rcvpack,s{bboards,local}}.c: modify to use new support for maildrop mapping Tue Nov 20 16:56:14 1984 /mtr (agent: Marshall Rose) bboards/{bboards.h,getbbent.c}: change bboard structure to make life easier for bbc. Also add new structure for use with msh. Mon Nov 19 23:36:57 1984 /mtr (agent: Marshall Rose) uip/bbc.c: neaten handling of distribution addresses on `-topics' output. Sun Nov 18 15:00:07 1984 /mtr (agent: Marshall Rose) uip/pick.c: if -help, set -nozero so done() doesn't print "0". Moby hack. Sat Nov 17 22:43:11 1984 /mtr (agent: Marshall Rose) uip/msh.c: add msh$pack command. uip/pack.c: simplify a bit. Sat Nov 17 21:22:35 1984 /mtr (agent: Marshall Rose) conf/makefiles/{mts,uip}: change PGMPROT to 755 for dpk. Sat Nov 17 15:33:14 1984 /mtr (agent: Marshall Rose) uip/{mhl,trm}sbr.c: add sc_length() to return li#. Have mhl assume co# and li# based on termcap entry if not given on command line. If entries aren't present in termcap, use values in template. Sat Nov 17 13:49:12 1984 /mtr (agent: Marshall Rose) config/mh.h,uip/{folder,refile}.c: add NFOLDERS to denote max number of folders/files on command line. Fri Nov 16 19:01:32 1984 /mtr (agent: Marshall Rose) uip/msh.c: remove -[no]burst switches. Add "rmm" command, but don't document it yet. Still have to resolve a few problems. Fri Nov 16 08:21:08 1984 /mtr (agent: Marshall Rose) -- More fixes from Fred Blonder at UMCP-CS -- conf/mhconfig.c: #define SVAL(s) to handle those pesky de-references to NULL. Fri Nov 16 08:20:50 1984 /mtr (agent: Marshall Rose) sbr/m_getdefs.c: close up COMPAT code slightly. conf/makefiles/*: change "-cp $(BINDIR)/cmd zcmd" to use "-mv". (On a trial basis.) Thu Nov 15 21:15:41 1984 /mtr (agent: Marshall Rose) -- Fixes from John Romine at TGC -- sbr/m_getdefs.c: use (FILE *)NULL instead of NULL when testing fopen()'s return value. Thu Nov 15 12:11:58 1984 /mtr (agent: Marshall Rose) mmdf/hosts.c: at the suggestion of Doug Kingston, use dm_v2route() to map host references to official domain strings. Thu Nov 15 09:29:43 1984 /mtr (agent: Marshall Rose) -- Fixes from John Romine at TGC -- uip/{forw,mhlsbr}.c: using NULL instead of "" in a couple of places. Thu Nov 15 09:24:32 1984 /mtr (agent: Marshall Rose) -- More fixes from Fred Blonder at UMCP-CS -- sbr/concat.c: botched installation for the pyramid. use Fred's code. Wed Nov 14 23:24:56 1984 /mtr (agent: Marshall Rose) -- All suggestions from Phyllis Kantar at Rand -- sbr/{ssequal,uleq}.c: default arguments to "" if NULL. uip/addrsbr.c: have ismymbox() recognize localhost!user. uip/folder.c: have "folder -fast msg" set "msg" as cur. sbr/m_getdefs.c: if using $MH, and it isn't relative, after expanding it, setenv it to an absolute pathname for subshells. Wed Nov 14 22:19:10 1984 /mtr (agent: Marshall Rose) sbr/m_gmsg.c: undo curmsg "fix" above, it broke MH mightily! sbr/m_convert.c: check curmsg here, so explicit references to "cur", when it doesn't exist, fails. Wed Nov 14 20:16:04 1984 /mtr (agent: Marshall Rose) sbr/adios.c: for 4.2BSD use writev() on the adios() family of routines, gives much smoother output. uip/mhlsbr.c: call the adios() family of routines instead of explicitly using stderr. Wed Nov 14 19:06:24 1984 /mtr (agent: Marshall Rose) sbr/m_{gmsg,seq}.c: fix various logic bugs that prevented private sequences from being recognized as such. Wed Nov 14 13:30:00 1984 /mtr (agent: Marshall Rose) sbr/m_convert.c: if "0" is given as a message number, print special error message (for use with backquoted pick). sbr/m_gmsg.c: be more careful about saying when "cur" exists. (don't set "curmsg" unless "mp -> msgstats[curmsg] & EXISTS"). Wed Nov 14 10:23:19 1984 /mtr (agent: Marshall Rose) -- All suggestions from Phyllis Kantar at Rand -- mf/mf.{h,c}: add new field entry "note" for 822-style comments. config/addrsbr.h: add corresponding field entry m_note. also change m_hnum to m_type. uip/addrsbr.c: add a new argument to getm() to say what type the default host is. Tue Nov 13 21:05:53 1984 /mtr (agent: Marshall Rose) uip/msh.c: add "sortm" command. uip/sortm.c: clean it up a bit. Tue Nov 13 18:58:43 1984 /mtr (agent: Marshall Rose) tws/{tws.h,dtime.c}: move tws_compare() from uip/picksbr.c to dtime.c, call it twsort(). Tue Nov 13 13:08:41 1984 /mtr (agent: Marshall Rose) newsupport/mh_receive: make it generated during MH configuration. conf/mhconfig.c: support above change. Tue Nov 13 00:58:41 1984 /mtr (agent: Marshall Rose) uip/msh.c: add "inc" and "mhmail" commands (big deal). Tue Nov 13 00:08:01 1984 /mtr (agent: Marshall Rose) uip/{burst,msh}.c: fix bursting algorithm to support forwardings/bcc:s. uip/{forw,mhlsbr,post}.c: strip one extra \n from last encapsulation boundary. Mon Nov 12 22:15:53 1984 /mtr (agent: Marshall Rose) -- All fixes from Fred Blonder at UMCP-CS -- conf/doc/mh.rf: add more details (mini tutorial). sbr/{concat.c,llib-lmh}: use sbr/m_name.c: use simpler method, sprintf(). Also fix size of name[] buffer. Mon Nov 12 11:01:51 1984 /mtr (agent: Marshall Rose) uip/post.c: re-arrange the code a bit for better organization. Mon Nov 12 08:29:19 1984 /mtr (agent: Marshall Rose) conf/makefiles/bbsupport: when MH profile was installed for the BBoards login, the context file wasn't. sbr/m_getdefs.c: if "context:" isn't set in the MH profile, then don't complain if it's not there. Mon Nov 12 08:15:59 1984 /mtr (agent: Marshall Rose) uip/msh.c: msh$show didn't know about the `-form formfile' switch. Sat Nov 10 16:10:33 1984 /mtr (agent: Marshall Rose) sbr/trimcpy.c: remove all trailing [lt]wsp. Thu Nov 8 16:59:37 1984 /mtr (agent: Marshall Rose) uip/bbc.c: trap sigTERM just like sigEMT so user can kill bbc and "have the right thing happen". Wed Nov 7 21:51:56 1984 /mtr (agent: Marshall Rose) uip/post.c: make Bcc:s look more line a forwarded message. uip/mhl.c: add -forwall flag to help forw for batching. the -forward flag now just uses the encapsulation algorithm. Wed Nov 7 20:45:44 1984 /mtr (agent: Marshall Rose) uip/{clr,scan}sbr.c: read termcap to ascertain the length of the scan line. uip/trmsbr.c: used to be called uip/clrsbr.c Wed Nov 7 20:12:04 1984 /mtr (agent: Marshall Rose) sbr/m_draft.c: "Draft-Folder: +drafts" loses. Strip the '+' if need-be. Tue Nov 6 21:33:39 1984 /mtr (agent: Marshall Rose) uip/dist.c: on "push" call ready_draft() prior to actual push() since if dist is invoked from bbr the file being distributed will get zapped prior to ready_draft() getting called. Moby hack. Tue Nov 6 21:16:42 1984 /mtr (agent: Marshall Rose) uip/msh.c: call m_unknown() since advanced m_getfld() algorithm loses otherwise (a long story). Tue Nov 6 09:56:55 1984 /mtr (agent: Marshall Rose) sbr/{m_edit.c,llib-lmh}: add extra argument for $cwd for edit. uip/{comp,dist,forw,repl}.c: call pwd() and invoke m_edit with the extra argument. Tue Nov 6 09:56:21 1984 /mtr (agent: Marshall Rose) conf/mhconfig.c: add "oldload" option for ALTOS. Mon Nov 5 18:15:01 1984 /mtr (agent: Marshall Rose) -- ALTOS port of MH.5 (under #ifdef ALTOS) -- conf/config/config.c: "more" resides in /usr/bin/. "ls" resides in /bin/. conf/config/mts.c: read /etc/mhid for {Local,System}Name(). Also add routine gethostname () which reads /etc/systemid. config/mh.h: #include "../config/altos.h" on #ifdef ALTOS. Also, new #define LINK which is "@" unless ALTOS else "#". config/altos.h: to get past V7 compiler... mf/msgchk.c: was using NULL instead of "" mf/mf.h: #include "../config/altos.h" on #ifdef ALTOS. sbr/m_edit.c: use LINK instead of "@" sbr/m_gmsg.c: use LINK instead of "@" sbr/m_seq.c: was using NULL instead of "" uip/clrsbr.c: use minimum of 2048 size for termcap buffer uip/dist.c: use LINK instead of "@" uip/install-mh.c: use (FILE *)NULL instead of NULL uip/msh.c: don't #include if ALTOS uip/repl.c: use link instead of "@" uip/rmf.c: use link instead of "@" Mon Nov 5 13:14:36 1984 /mtr (agent: Marshall Rose) uip/replsbr.c: don't adios() when can't understand "From:" or "Sender:" field. Continue on, gracefully (ha!) Sun Nov 4 17:40:04 1984 /mtr (agent: Marshall Rose) uip/folder.c: forgot the m_sync() after m_setcur(). This prevented "folder +folder msg" from setting msg as cur. Sun Nov 4 15:00:20 1984 /mtr (agent: Marshall Rose) sbr/m_getfld.c: in the interests of speed-up, change eom() to a macro that calls the auxiliary function Eom() if need be. This, along with the addition of a new mbx_style, DEFAULT, should give a significant speed-up in parsing individual files and the MH profile. Finally, make Getc() a macro as well, which calls the routine GETC() only on special occasions. config/mh.h,sbr/{llib-lmh,m_getfld.c}: change mbx_unknown() to m_unknown(). Sat Nov 3 19:56:51 1984 /mtr (agent: Marshall Rose) uip/bbc.c: get this: "bbc -quiet" with no other arguments and a bogus "bboards:" entry in the profile would yield a core dump. Marvelous. Fri Nov 2 17:08:18 1984 /mtr (agent: Marshall Rose) uip/forwsbr.c: remove, put cpydgst() into sbr/cpydata.c config/mh.h, sbr/llib-lmh: declare cpydgst(). Fri Nov 2 13:44:50 1984 /mtr (agent: Marshall Rose) uip/{forw,forwsbr}.c: change encapsulation algorithm to use different bit-stuffing scheme. uip/mhlsbr.c: with -forward (interface from forw), support change in encapsulation algorithm. Fri Nov 2 13:17:27 1984 /mtr (agent: Marshall Rose) uip/replsbr.c: don't bomb if returnee's host is unknown (use AD_HOST instead of AD_NAME). mmdf/hosts.c: when calling mmdf_init() use invo_name and not "mh". Fri Nov 2 07:56:36 1984 /mtr (agent: Marshall Rose) uip/pick.c: if no matches and -list output a "0" so backquoting fails. Thu Nov 1 18:42:44 1984 /mtr (agent: Marshall Rose) sbr/brkstring.c: brkany() wasn't checking for a null string. It does now. Thu Nov 1 15:14:43 1984 /mtr (agent: Marshall Rose) support/mhl.format: change terminal length from 40 to 23. Thu Nov 1 00:33:24 1984 /mtr (agent: Marshall Rose) bbsupport/{bboards.{daily,weekly},bb{save,remove}} - use /bin/sh not /bin/csh bbsupport/bb{aka,exp,tar}.c - call setbbent() with the right argument. Where applicable use /bin/sh not /bin/csh conf/config/MakeBBoards - remove dependencies conf/mhconfig.c - support for empty mmdfldir and non-empty mmdflfil. Wed Oct 31 22:27:33 1984 /mtr (agent: Marshall Rose) uip/repl.c: since post can handle multiple folders in an fcc: line, take advantage of it. Wed Oct 31 20:23:13 1984 /mtr (agent: Marshall Rose) -- All fixes from Phyllis Kantar at Rand -- uip/repl.c: should use done(1) if the initial m_edit fails instead of done(0). sendmts/smail.c: comment out passing of "-ov" to SendMail if compiled at Rand. Wed Oct 31 19:12:58 1984 /mtr (agent: Marshall Rose) uip/rcv{cron,tty}.c: include "../mmdf/util.h" when MMDFMTS. Wed Oct 31 14:41:06 1984 /mtr (agent: Marshall Rose) uip/scansbr.c: change SLINE to 78 (instead of 79). We really should read termcap or an MH profile entry though. Wed Oct 31 08:13:36 1984 /mtr (agent: Marshall Rose) uip/prompter.c: if the skeleton lacked a body sometimes prompter would ask for a body and sometimes it wouldn't. Now it ALWAYS does. uip/show.c: "show -pr -f n" exec'd "pr inbox/-f inbox/n". Now it exec's "pr -f inbox/n" like it should. Wed Oct 31 07:54:41 1984 /mtr (agent: Marshall Rose) mmdf/hosts.c: somehow "mmdf.h" and "util.h" weren't included. Tue Oct 30 22:14:19 1984 /mtr (agent: Marshall Rose) uip/post.c: if we get an address-bearing field without any address, just ignore it instead of complaining about it. Tue Oct 30 21:30:38 1984 /mtr (agent: Marshall Rose) tws/dtimep.c: parse ctime(3) strings, since some fool hosts actually permit that to get into the Internet. Tue Oct 30 18:59:45 1984 /mtr (agent: Marshall Rose) mf/mf.c: very minor clean-up of isfrom(). mhmts/{hosts.c,netmail.c},{mmdf,sendmts}/hosts.c: include mts.h Tue Oct 30 16:35:37 1984 /mtr (agent: Marshall Rose) uip/prompter.c: if the skeleton lacked a body sometimes prompter would ask for a body and sometimes it wouldn't. Now it doesn't. uip/dist.c: call ready_msg() each time ready_draft() is called so user can edit message being dist'd. (sigh) Tue Oct 30 08:12:50 1984 /mtr (agent: Marshall Rose) uip/{comp,dist,forw,repl}.c: make the "push" option at "What now?" level visible. Document the draftfolder switches in the manual page uip/bbc.c: document `-file BBoardsfile' in manual page uip/bbl.c: remove -debug switch uip/repl.c: remove -debug switch uip/send.c: document -[no]remove in manual page, make -push visible and add -nopush. Document the draftfolder switches in the manual pages Mon Oct 29 19:23:10 1984 /mtr (agent: Marshall Rose) uip/bbc.c: remove a couple of calls to setbbent(). They were defeating setbbfile(). They weren't even needed since the first thing that bbc does (even before parsing arguments) is to call setbbent(). uip/show.c: force -noformat, -noheader, and -nopr to be at least three characters for recognition. uip/post.c: when invoking fileproc, add a '+' only if it doesn't start with '+' or '@'. Sun Oct 28 22:12:22 1984 /mtr (agent: Marshall Rose) uip/bbr$repl: forgot to support -[no]query. conf/doc/tmac.h: add .nf and .fi at the right spots for "FILES", etc. Sun Oct 28 20:36:45 1984 /mtr (agent: Marshall Rose) uip/folder.c: On "folder +foo", if +foo doesn't exist, ask if it should be. Sun Oct 28 10:32:06 1984 /mtr (agent: Marshall Rose) uip/*.c: remove calls to m_news(), also add m_foil() to foil implicit calls to m_getdefs (). {sbr/m_getdefs,uip/rmf}.c: make mp->others checking a bit smarter for #ifdef UCI. Sat Oct 27 23:08:23 1984 /mtr (agent: Marshall Rose) sbr/m_getdefs.c: create the MH-directory if it's not there. uip/rmf.c: when rmf'ing a folder make sure parent's folder is writable as well as the folder. Wed Oct 24 21:46:22 1984 /mtr (agent: Marshall Rose) conf/config/config.c, config/mh.h: add libpath() which looks first in m_maildir and then etcpath for the file. Get rid of the std* variables since libpath() now does the same thing. With libpath, we now search m_maildir and then etcpath for alias files for send and whom, form files for comp, dist, forw, and repl, and filter files for forw and mhl. Wed Oct 24 11:00:55 1984 /mtr (agent: Marshall Rose) -- All fixes from Terry Domae at NRTC -- conf/mhconfig.c: invoke mhdoc with csh explicitly since V7 doesn't. conf/config/config.c, config/mh.h: add new global variable libpath. uip/mhlsbr.c: support libpath for system-wide forms. config/mh.h,mf/mf.c,sbr/getusr.c,uip/post.c: add -DNRTC for MAILID support uip/replsbr.c: don't panic if the host for the sender/from field is unknown. uip/{send,whom}.c: forgot to use m_draft() instead of m_maildir(draft). sbr/m_draft.c: fix things up for show -draft. uip/show.c: add a "-form formfile" switch. Also, support for -draft to reflect draftfolders. Tue Oct 23 12:35:58 1984 /mtr (agent: Marshall Rose) conf/config/mts.c, mts/mts.h: remove the mbx_lock() and mbx_unlk() routines and replace them with the lock-and-open routines lkopen(), lkclose(), lkfopen(), and lkfclose(). lkopen() acquires an exclusive lock on the named file (which *must* exist) and then the appropriate open. lkclose() releases the lock and closes the file. lkfopen() is to lkopen() as fopen() is to open(). lkfclose() is to lkclose() as fclose() is to close(). I had to do all this so with 4.2BSD we can use flock to do the locking instead of the link/unlink business. Mon Oct 22 11:37:30 1984 /mtr (agent: Marshall Rose) sendmts/smail.c: forgot to declare parameter watch for -DSENDMAIL. conf/makefiles/*: make "make install" a synonym for "make inst-all". conf/makefiles/*: support $(DESTDIR) convention. Sat Oct 20 11:47:26 1984 /mtr (agent: Marshall Rose) uip/post.c: let fcc: fields have more than one folder entry. Fri Oct 19 08:57:23 1984 /mtr (agent: Marshall Rose) uip/dist.c: instead of introducing Prev-Resent-Header: just prepend Prev- to previous resent-XXX: fields. uip/{post,dist}.c: append resent-XXX: fields instead of prepending them. Also some minor clean-up. tws/dtime.c: use a better structure to permit "fool-proof" generation of time with dst. tws/dtimep.c: minor clean-up. Thu Oct 18 11:14:15 1984 /mtr (agent: Marshall Rose) uip/annosbr.c: if file doesn't exist, don't spit out error diagnostic (comp/dist/forw/send -anno followed by push). Wed Oct 17 10:02:27 1984 /mtr (agent: Marshall Rose) uip/inc.c: more mtstailor fixes, always read MAILDIR. uip/prompter.c: add the -[no]rapid switch. Mon Oct 15 08:27:13 1984 /mtr (agent: Marshall Rose) conf/{mhconfig.c,config/config.c}: make the default editor configurable. conf/mhconfig.c: add support for othersupport/Makefile. Makefile,conf/{config/mts.c,makefiles/mts}: add support for the mtstailor file. othersupport/tutorial/: include the MH tutorial uip/{ap,bbr,conflict,inc,post,rcvcron,rcvlink,rmail,sbboards,slocal}.c, mts/msgchk.c: add support for the mtstailor file. uip/{rmail,sbboards,slocal}.c: foil m_getdefs() (just in case). Fri Oct 12 09:53:56 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/ap.c: be sure to foil m_getdefs() for consistency. Fri Oct 12 09:52:19 1984 Rand MH Mail Handler (agent: Marshall Rose) sbr/m_edit.c: change rindex() to r1bindex(). Silly typo. Wed Oct 10 14:41:30 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/rcv{cron,link,tty}.c: foil m_getdefs() for JLR. Wed Oct 10 09:15:23 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/install-mh.c: fix minor typo in display of help message. Mon Oct 1 20:49:32 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/repl{,sbr}.c: add the -[no]query switch which interactively prompts the user for info on who should be replied-to. Mon Oct 1 20:48:25 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/{scan,inc,scansbr}.c: change scansbr.h to #define the return codes from scansbr$scan(). Modify scan.c to say if a null message is empty. Sat Sep 22 20:19:40 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/rcvlink.c: new rcvmail hook, just like the old rcvlink hook used in the ZOTnet. Sat Sep 22 19:03:02 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/sbboards.c: forgot a few arguments in a couple of printf-like strings. Fri Sep 21 19:25:25 1984 Rand MH Mail Handler (agent: Marshall Rose) sendmts/hosts.c: change ALLHOSTS logic: if we're running with an exception file, then turn ALLHOSTS on (let mail system be final arbitrator). Also, if using an exception file, play along if the file can't be opened. Wed Sep 19 16:02:18 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/scan..c: if message is unreadable (errno==EACCES), just say "unreadble", don't bother to call admonish(). Tue Sep 18 14:30:57 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/inc.c: Check $MAILDROP prior to checking the Maildrop: profile entry. Tue Sep 18 14:16:53 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/folder.c: if folder is unreadable (errno==EACCES), just say "unreadable", don't bother to call admonish(). Sun Sep 16 16:08:39 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/folder.c: change capitalization of "%d Folder%s" to "%d folder%s". Wed Sep 12 20:02:22 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/rcv{cron,tty}.c: if not reading mmdf.h, then read smail.h to get proper definitions of RP_M{ECH,OK}. Tue Sep 11 19:59:24 1984 Rand MH Mail Handler (agent: Marshall Rose) tws/dtime.c: have it know about EDT. Really, dtimezone needs to get fixed up and use two tables instead of one... Mon Aug 27 05:07:37 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/inc.c: examine the profile entry "maildrop" to override the default maildrop if necessary. "maildrop" is interpreted with m_mailpath(), so if not an absolute path, it's interpreted relative to the user's MH directory. Mon Aug 27 05:00:44 1984 Rand MH Mail Handler (agent: Marshall Rose) Decide that mh.4 is finished. This file keeps track of the changes made between the mh.4 and mh.5 versions. As usual, it's being kept in add-source-change format. [Actually, mh.4 was finished on July 1, 1984. For obscure reasons, this ChangeLog didn't start until August 27th though.] MHCHANGES from mh.3 to mh.4 Fri Oct 26 22:19:42 1984 Rand MH Mail Handler (agent: John Romine) conf/Makefile: make CFLAGS=-O, LDFLAGS=-ns sendmts/smail.c: line 99: formal parameter 'watch' was missing. Thu Aug 2 15:05:29 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/rcv{cron,tty}.c: move the ``#include '' above the ``#include "mmdf.h"'' mf/*.{h,c}: change lexequ() to lequal() to avoid conflict with MMDF-II routine name. Wed Jul 25 08:49:44 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/bbr.c: bring up to date with dist/forw/repl's -nodraftfolder. sbr/trimcpy.c: fold tabs into spaces in addition to newlines. Mon Jul 23 19:07:00 1984 Rand MH Mail Handler (agent: Marshall Rose) sbr/m_getdefs.c: allow long lines in MH profile. uip/ptt.c: rename ptt.c to ap.c and install in MH etc directory. Mon Jul 23 16:09:04 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/{scan,replsbr}.c: use ismymbox to determine if address is my mailbox. uip/addrsbr.c: add ismymbox() to say just that. Mon Jul 23 14:27:51 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/{comp,dist,forw,repl,send}.c: add -nodraftfolder switch to turn off draft folder. uip/send.c: add -[no]unique switch to enable/disable message renaming on pushes. Mon Jul 23 09:11:27 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/scansbr.c: If the message has no date, flag it and use the date on the file, if appropriate (e.g., from 'scan' not 'inc'). Mon Jul 23 09:08:12 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/{dist,forw,repl}.c: fix busted logic when m_draft() is called after we've built the msgs structure for the folder we're working on. Call m_draft() first. Other solution was to have m_draft() do a pwd(), save the result, do its work, and then chdir() back. Sigh. Sat Jul 21 14:15:43 1984 Rand MH Mail Handler (agent: Marshall Rose) sbr/{m_gmsg,m_seq}.c: allow "compressed" sequence descriptors (e.g., x-y instead of x x+1 ... y-1 y). Makes things run faster and avoids problems if a sequence is really *big*. Fri Jul 20 21:27:03 1984 Rand MH Mail Handler (agent: Marshall Rose) uip/{comp,dist,forw,repl}.c: new logic if draft exists. uip/{comp,dist,forw,refile,repl,send}.c: fix miscalculation in path of draft/source folder. Thu Jul 19 19:56:16 1984 Rand MH Mail Handler (agent: Marshall Rose) sbr/m_edit.c: put back in the draft preserve/delete logic from mh.2 sbr/m_draft.c: add the "use" parameter saying whether "new" or "cur" should be the default. Wed Jul 18 20:39:29 1984 Rand MH mail system (agent: Marshall Rose) sbr/path.c: add compath() logic to compress things like @.. and so on. Wed Jul 18 05:35:14 1984 Rand MH mail system (agent: Marshall Rose) uip/{comp,dist,forw,repl}.c: Add -draft{folder,message} switches, remove -[no]unique switches sbr/m_draft.c: New module to interpret -draft switches uip/send.c: Handle multiple messages, add -draft{folder,message} switches, add -push switch uip/bbr.c: bring dist, forw, and repl up to date with all these changes conf/config/config.c: change mh_deliver to postproc Wed Jul 18 03:01:11 1984 Rand MH mail system (agent: Marshall Rose) Install the code necessary for the @folder notation, meaning +cwf/folder (TSUBCWF). Tue Jul 17 19:20:10 1984 Rand MH mail system (agent: Marshall Rose) uip/anno.c: don't require -text. Also fix bug in prompting. Tue Jul 17 16:19:14 1984 Rand MH mail system (agent: Marshall Rose) uip/folder.c: handle +folder and msg argument with -all. Tue Jul 17 16:02:02 1984 Rand MH mail system (agent: Marshall Rose) uip/bbr.c: bring dist, forw, and repl up to date with -[no]unique. Tue Jul 17 00:08:52 1984 Rand MH mail system (agent: Marshall Rose) Install the Sequence-Negation mechanism. Mon Jul 16 22:07:40 1984 Rand MH mail system (agent: Marshall Rose) uip/*.c: Change arguments[50] to arguments[MAXARGS]; change msgs[100] to msgs[MAXARGS] to avoid argument overflow with new pick. Mon Jul 16 15:51:28 1984 Rand MH mail system (agent: Marshall Rose) Gather up the ZOTnet libraries into zotnet/libzot.a, makes things less complicated. Mon Jul 16 00:21:52 1984 Rand MH mail system (agent: Marshall Rose) Install the new Previous-Sequence mechanism. Introduce the SEQMOD flag to the msgs structure. Just about every MH program now calls m_setseq () upon parsing the messages and calls m_sync() prior to exiting. Mon Jul 16 00:18:49 1984 Rand MH mail system (agent: Marshall Rose) uip/{comp,dist,forw,repl}.c: If "quit" with no "delete, tell the user the name of the draft file. uip/send.c: if invoked as "push", act accordingly sbr/m_send.c: know about "push". uip/mhpath.c: -help wasn't any. uip/rcv{cron,tty}.c: set-up for an MMDF system. Sun Jul 15 17:10:38 1984 Rand MH mail system (agent: Marshall Rose) uip/{comp,dist,forw,repl}.c: Add -[no]unique switch. uip/send.c: Remove -[no]unique switch, also read ~/.signature file and define $SIGNATURE if need be. uip/post.c: Don't read ~/.signature file, use $SIGNATURE only. uip/{bbr$scan,inc,scan,scansbr}.c: Only do the ftell() business with -size on an inc. The others can do an fstat or pointer arithmentic to calculate the size. Sun Jul 15 03:01:12 1984 Rand MH mail system (agent: Marshall Rose) uip/{comp,dist,forw,repl}.c: If send of draft loses, come back to "What now?" level. Also fix bug with invocation of editor. Fri Jul 13 13:37:21 1984 Rand MH mail system (agent: Marshall Rose) uip/scansbr.c: Compress the fields a bit. Right-justify some parts of the header. Fri Jul 13 13:17:48 1984 Rand MH mail system (agent: Marshall Rose) uip/folder.c: Set up things so DMAXFOLDER is used when formatting the output strings. Wed Jul 11 18:41:07 1984 Rand MH mail system (agent: Marshall Rose) uip/folder.c: remove -up, -down, and -short uip/pick.c: toss all the file-op:s, -scan, and -show. Just define sequences, or spit 'em to stdout. The select sub-folder is dead! Long live user-defined sequences! Pick got rid of 11 (!!) switches this way, and we've taken our first step into a new age of functionality. Wed Jul 11 02:25:25 1984 Rand MH mail system (agent: Marshall Rose) uip/repl.c: toss the hidden -[no]ccme switches. Tue Jul 10 01:15:22 1984 Rand MH mail system (agent: Marshall Rose) config/mh.h, conf/config/config.c, sbr/m_{getdefs,update}.c: add "context" file in addition to the MH-profile. The former is dynamic, it contains pfolder and private sequences. The latter is static, it contains switches, etc. The ctx file defaults to Mail/context. But in the MH-profile, you can define the entry for "context" to be whatever you want... Mon Jul 9 23:15:20 1984 Rand MH mail system (agent: Marshall Rose) uip/{scan,inc,bbr}.c: new switches -[no]size to show the size of the message. uip/scansbr.c: implement -size for scan, inc, and bbr$scan. uip/folder.c: new switches to implement the folder stack. uip/clrsbr.c: consolidate clear_screen() into one file. Mon Jul 9 17:05:09 1984 Rand MH mail system (agent: Marshall Rose) sbr/showfile.c: take arg vector from caller. uip/show.c: new "-file file" switch for showfile. sbr/m_edit.c: take arg vector from caller. If present, give to editor in exec. Mon Jul 9 14:48:51 1984 Rand MH mail system (agent: Marshall Rose) config/mh.h: add extern char *version. sbr/help.c: have help() print out program name and version info. conf/makefiles/uip: use version.sh to create version.c for loading with uip:s. Mon Jul 9 00:01:01 1984 Rand MH mail system (agent: Marshall Rose) uip/prompter.c: with BSD42, do a clearerr() on stdin when we get an EOF. Otherwise, with an EOF in the headers, we lose big... Sun Jul 8 23:58:56 1984 Rand MH mail system (agent: Marshall Rose) uip/bbr.c: add the hidden "-prompt string" switch for JLR. Sat Jul 7 18:51:02 1984 Rand MH mail system (agent: Marshall Rose) mhmts/hosts.c: add '#include ' for #ifdef BSD42. sbr/m_gmsg.c: fix initializatino of flags[]. uip/whom.c: close down fd:s, just like send does, to avoid the infamous "too many open" files error with the MMDFMTS version of post. uip/pick.c: fix-up "[Folder xyz being re-used]" message. It was using the wrong string for the folder name. Sat Jul 7 01:03:02 1984 Rand MH mail system (agent: Marshall Rose) sbr/m_edit.c: #undef the $EDITOR stuff, maybe it's not such a good idea... Mon Jul 2 02:07:37 1984 Rand MH mail system (agent: Marshall Rose) uip/post, uip/send: rework BCC handling to allow the use of a filter file. Sat Jun 30 23:27:27 1984 Rand MH mail system (agent: Marshall Rose) uip/send: if $SIGNATURE is empty, and there's a "signature" entry in the profile, set $SIGNATURE to that for post. Sat Jun 30 16:40:22 1984 Rand MH mail system (agent: Marshall Rose) sbr/m_edit.c: On first edit, if "-editor pgm" not specified, try to use $EDITOR prior to using the profile entry for editor. Sat Jun 30 16:23:20 1984 Rand MH mail system (agent: Marshall Rose) Add the -[no]public switches to bbr$mark, bbr$pick, mark, and pick. Sat Jun 30 16:23:01 1984 Rand MH mail system (agent: Marshall Rose) Add the SMTP option to the SendMail configuration. Extend post/send to accept -mail, -soml, -saml, and -send. Also add -client host and -server host. Sat Jun 30 12:29:53 1984 Rand MH mail system (agent: Marshall Rose) config/mh.h: Raise MAXFOLDER to 2K-1 and modify DMAXFOLDER as appropriate. Also, make LOWSEL dependent on MAXFOLDER. Sat Jun 30 12:28:48 1984 Rand MH mail system (agent: Marshall Rose) config/mh.h: compact msgs structure a bit. Also add new entry, mp -> attrstats, which tells if the corresponding attribute named in mp -> msgattrs is public or private. Sat Jun 30 12:28:21 1984 Rand MH mail system (agent: Marshall Rose) sbr/m_getdefs.c: make sure $MH is non-empty before using it. Fri Apr 6 10:52:26 1984 PostMaster (agent: uip/show.c: mhl wasn't seeing its name so it wasn't checking its profile entry. (fix from spencer thomas at utah-gr). Mon Apr 2 07:34:35 1984 PostMaster (agent: John Romine) uip/refile.c: remove(): bug fix. call delete-prog if (filep > 0) instead of if (filep > 1). Sat Mar 31 08:26:29 1984 PostMaster (agent: John Romine) uip/mhmail.c: unlink temp file when exiting due to null input. Fri Feb 17 09:10:55 1984 Rand MH System (agent: John Romine) uip/bbc.c: output last update date with -topics in short form instead of local leaders. local leaders are listed with the other fields with -topics -verbose. Thu Feb 16 10:19:12 1984 PostMaster (agent: Marshall Rose) uip/bbr.c - Have bbr use a different prompt based on the name it was invoked with. This is useful, since it used to use the same prompt as "ex". This got confusing since sometimes you'd be editing a file in ex while composing a message from bbr. Wed Feb 15 14:47:18 1984 PostMaster (agent: Marshall Rose) Decide that mh.3 is finished. This file keeps track of the changes made between the mh.3 and mh.4 versions. Note that it's being kept in add-source-change format instead of the usual add-change-log-entry format. [Unfortunately, changes up through MH 3 are apparently lost, unless people at Rand and/or UCI have them stashed away somewhere... --Dan Harkless] mmh-0.4/docs/COMPLETION-ZSH0000644000000000000000000001211013414435726013626 0ustar rootroot# # The following several shell functions and `compctl' commands # that will configure the programmable command completion of # the Z Shell (zsh) for the nmh mail system. # # You may need to edit where it says EDIT ME. # These were originally written for MH by Peter Stephenson # The following three functions are best autoloaded. # # mhcomp completes folders (including subfolders). # mhfseq completes sequence names and message numbers. # mhfile completes files in standard nmh locations. # # Completion function for nmh folders. Works with # both + (relative to top) and @ (relative to current). # function mhcomp { local nword args pref char mhpath read -nc nword read -cA args pref=$args[$nword] char=$pref[1] pref=$pref[2,-1] # The $(...) here accounts for most of the time spent in this function. if [[ $char = + ]]; then # mhpath=$(mhpath +) # EDIT ME: use a hard wired value here: it's faster. mhpath=~/Mail elif [[ $char = @ ]]; then mhpath=$(mhpath) fi eval "reply=($mhpath/$pref*(N-/))" # I'm frankly amazed that this next step works, but it does. reply=(${reply#$mhpath/}) } # # Extract nmh message names and numbers for completion. Use of the # correct folder, if it is not the current one, requires that it # should be the previous command line argument. # mhfseq() { local folder foldpath words pos nums read -cA words read -cn pos # Look for a folder name. # First try the previous word. if [[ $words[$pos-1] = [@+]* ]]; then folder=$words[$pos-1] fi # Else use the current folder ($folder empty) if [[ $folder = +* ]]; then # EDIT ME: use hard-wired path with + for speed. foldpath=~/Mail/$folder[2,-1] else foldpath=$(mhpath $folder) fi # Extract all existing message numbers from the folder. nums=($foldpath/<->(N:t)) # If that worked, look for marked sequences. # EDIT ME # if you never use non-standard sequences, comment out # or delete the next three lines. if (( $#nums )); then nums=($nums $(mark $folder | awk -F: '{print $1}')) fi # EDIT ME: `unseen' is the value of Unseen-Sequence, if it exists; set -A reply next cur prev first last all unseen $nums } # # Find an nmh file; for use with -form arguments and the like. # Use with compctl -K mhfile. # mhfile () { local mhfpath file # EDIT ME # Array containing all the places nmh will look for templates etc. mhfpath=(~/Mail /usr/local/nmh/lib) # Emulate completeinword behaviour as appropriate local wordstr if [[ -o completeinword ]]; then wordstr='$1*$2' else wordstr='$1$2*' fi if [[ $1$2 = */* ]]; then # path given: don't search nmh locations eval "reply=($wordstr(.N))" else # no path: only search nmh locations. eval "reply=(\$mhfpath/$wordstr(.N:t))" fi } # Note: you must type the initial + or @ of a folder name to get # completion, even in places where only folder names are allowed. # Abbreviations for options are not recognised. Hit tab to complete # the option name first. compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ 's[-]' -k "(all noall fast nofast header noheader help list nolist \ pack nopack pop push recurse norecurse total nototal)" -- folder folders compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ 's[-]' -k "(sequence all noall recurse norecurse showzero noshowzero \ alpha noalpha fast nofast help)" -- flist flists compctl -K mhfseq -x 's[+][@],c[-1] s[+][@]' \ -K mhcomp -S / -q - 'c[-1]' -K mhfseq - \ 'C[-1,-(editor|whatnowproc)]' -c - \ 's[-]' -k "(editor noedit \ form use nouse whatnowproc help)" - \ 'c[-1,-form]' -K mhfile -- comp compctl -K mhfseq -x 's[+][@]' \ -K mhcomp -S / -q - 'c[-1]' -K mhfseq -\ 's[-]' -k "(annotate noannotate cc nocc \ editor noedit filter nofilter form group nogroup \ query noquery width whatnowproc help)" - 'c[-1,(cc|nocc)]' \ -k "(all to cc me)" - 'C[-1,-(filter|form)]' -K mhfile - \ 'C[-1,-(editor|whatnowproc)]' -c -- repl compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ 's[-]' -k "(audit noaudit changecur nochangecur form \ file silent nosilent truncate notruncate width help)" - \ 'C[-1,-(audit|form)]' -K mhfile - 'c[-1,-file]' -f + -- inc compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ 's[-]' -k "(sequence add delete list public nopublic zero nozero help)" -- \ mark compctl -K mhfseq -x 's[+][@]' \ -K mhcomp -S / -q - 'c[-1,-file]' -f - \ 's[-]' -k "(link nolink src file help)" -- refile compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ 's[-]' -k "(form \ file help width)" - 'c[-1,-file]' -f - 'c[-1,-form]' -K mhfile -- scan compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ 's[-]' -k "(file form part type help)" - \ 'c[-1,-file]' -f - 'c[-1,-form]' -K mhfile - -- show next prev compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - 's[-]' \ -k "(help)" -- rmm compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ 's[-]' -k "(after before cc date datefield from help list nolist \ public nopublic search sequence subject to zero nozero not or and \ lbrace rbrace)" -- pick compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - 's[-]' -k '(help)' -- mhpath mmh-0.4/docs/TODO0000644000000000000000000000724213414435726012272 0ustar rootrootTODO ==== * Write different function to read configuration files, instead of using m_getfld.c * convert calls from sprintf/vsprintf to snprintf/vsnprintf * modularize access to context/profile list. * add command printm to print messages * finish changing to macros for msgstats and msgflags * Add support for Mail-Followup-To and Mail-Reply-To * Add support for profile entry "Mailing-Lists" * let mhl accept files on standard in, and output to standard out, when filtering files. * Add new command "show" at WhatNow? prompt. * Allow user customization of which kinds of text parts in multipart/alternative messages are preferred. It would be nice if one selectable behavior would be to be prompted at runtime for which version to show. * Add a new %-escape that makes temp files more permanent than %f, so that you can use gnuclient -q or netscape -remote on message parts. Put netscape -remote in mhn.defaults for text/html once this is done. * Change all man pages to group all the commandline options together in one section with each as a separate mini-heading. Having to dig through prose to find what a particular option does is a pain in the nads. * Add some way to configure whether you prefer to see text/plain or text/html parts of multipart/alternative messages. MAN PAGES --------- * Transition of the mh-tailor man page * update default mode in man pages with sed SEQUENCES --------- * Change so you can have more than 26 sequences. Unfortunately, given the way that the bit flags for sequences work, this is not easy. * Maybe add option gracefully handle empty sequences (-force). OPTIONS ------- * can we move option checking to its own function? Currently each command is doing that itself. * make the option parsing code dynamic, so that there is no limit to the number of command line arguments (this has been done for most all the commands). * Add switch descriptions to -help output. FLIST ----- * add -format option so you can specify the look of the output of flist. * add Flist-Exclude profile component FOLDER ------ * add Folder-Order profile component (same as flist) * add Folder-Exclude profile component FORMATS ------- * add escape %(sequence{foobar}) to detect arbitrary sequences. INC --- * Add ability to do filtering (call filterproc) when incorporating mail * Change inc to use library function folder_addmsg(). MHBUILD ------- * add ability to specify Content-Transfer-Encoding in composition drafts. * remove the code for caching from mhbuild. MHL --- * add ability to filter parts of the message by calling an external filtering program. MHSHOW/MHLIST/MHSTORE ------------------------- * add support for Content-Disposition header (rfc1806, rfc2183). * merge the two places in which mhshowsbr.c reads display strings. * when storing to a folder, should we save the folder context first, so that storage string of "+" stores to the new folder? PICK ---- * split regex code out into library. * replace regex code with Henry Spencer's regex library. RCVSTORE -------- * Change rcvstore so that it can store into multiple folders. * Add folder locking. REPL ---- * Decode RFC-2047 headers in messages included when replying or forwarding. SLOCAL ----- * Change slocal to use .slocalrc file, instead of .maildelivery? * Add ability to use regular expressions in header matching. * Clean up output from -debug option. * Add -debuglevel to control the amount of debug info that is output. * Add -debuglog to specify file to save debugging output. * Add -logfile (or -audit) to specify where to record info about successful deliveries. GENERAL ------- * change time functions to use POSIX functions by default. * replace use of ftell with fgetpos. mmh-0.4/docs/MACHINES0000644000000000000000000000027713414435726012715 0ustar rootroot# # MACHINE -- operating system specific information # Mmh can currently not be built with musl-libc. The reason is that m_getfld() makes use of stdio internals. This is going to be fixed. mmh-0.4/install-sh0000755000000000000000000001124513414435726012654 0ustar rootroot#! /bin/sh # # install -- install a program, script, or datafile # This comes from X11R5. # # 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. # # 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=: 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 mmh-0.4/uip/0000755000000000000000000000000013414435726011442 5ustar rootrootmmh-0.4/uip/mhpgp.sh0000755000000000000000000000671013414435726013120 0ustar rootroot#!/bin/sh # Based on mhpgp 1.1.0.7 2005/11/29 06:25:05 by Neil Rickert # Adjusted to mmh by markus schnalke , 2012-07 # mhpgp: # -write: Save the decrypted message to the current folder usage="Usage: mhpgp [-write] [-Version] [-help] [+folder] [msg]" # prepend the default options from the profile set -- `mhparam -nocomp ${0##*/}` "$@" while : ; do case "$1" in -w*) wflag=1 ;; -V*) echo "${0##*/} has no own version number, thus this instead:" folder -Version exit 0 ;; -h*|-*) echo "$usage" >&2 exit 1 ;; *) break ;; esac shift done TEMP=/tmp/${0##*/}.$$ umask 077 mkdir $TEMP || exit 1 trap "rm -rf $TEMP" 0 1 2 15 ### verify a mime message mimeverify() { bdry=`echo "$CH" | sed -n \ -e 's/[Bb][Oo][Uu][Nn][Dd][Aa][Rr][Yy]=/;boundary=/' \ -e 's/.*;boundary=/boundary=/' \ -e 's/^boundary=\([^;]*\);.*/boundary=\1/' \ -e 's/^boundary="\([^"]*\)".*/boundary=\1/' \ -e 's/[ ][ ]*$//' \ -e 's/^boundary=//p'` xbdry=`echo "$bdry" | sed -e 's"/"\\\\/"g' -e 's"\."\\\\."g'` sed -e '1,/^--'"$xbdry"'[ ]*$/d' $FILE > $TEMP/body sed -e '/^--'"$xbdry"'[ ]*$/,$d' \ -e 's/[ ][ ]*$//' $TEMP/body | sed -e '$d' -e 's/$/ /' > $TEMP/msg if grep "[ ^M ]$" $TEMP/body >/dev/null 2>&1 ; then echo 'Warning: trailing blanks removed from message body' >&2 fi sed -e '1,/^--'"$xbdry"'[ ]*$/d' $TEMP/body | sed -n -e '/BEGIN PGP /,/END PGP /p' > $TEMP/msg.asc gpg --verify $TEMP/msg.asc } ### decrypt MIME and non-MIME messages (type is in $1) ###; invoke the pager as needed decrypt() { sed -n -e ' /^-----BEGIN PGP MESSAGE/b x d :x p /^-----END PGP MESSAGE/b y n b x :y n b y' $FILE | gpg --decrypt >$TEMP/msg X=`tail -1c $TEMP/msg` if [ "$X" != "" ] ; then # ensure trailing newline echo >> $TEMP/msg fi if [ "$1" = "plain" ] ; then sedcmd="/^[Mm][Ii][Mm][Ee]-.*:/b r" else sedcmd='/^-*$/q' fi sed -n ':a /^-*$/q '"$sedcmd"' /^[Cc][Oo][Nn][Tt][Ee][Nn][Tt]-/b r p n b a :r n /^[ ]/b r b a' "$FILE" > "$TEMP/outfile" if [ "$1" = "plain" ] ; then echo "" >> "$TEMP/outfile" ; fi # Replace original header fields by secure copies that some # mail clients (e.g. Enigmail) store within the encrypted and # signed MIME part. for i in `sed -n '/^$/q; /^[ ]/d; s,:.*,,p' "$TEMP/msg"` ; do anno -delete -comp "$i" "$TEMP/outfile" done sed -e 's/ $//' $TEMP/msg >> "$TEMP/outfile" || exit 1 if [ "$wflag" = "1" ] ; then refile -file "$TEMP/outfile" @ else show -file "$TEMP/outfile" fi } ### Mainline processing case "$#" in 0) FILE=`mhpath c` || exit 1 ;; *) case "$*" in /*) FILE=`echo "$@"` ;; *) FILE=`mhpath "$@"` || exit 1 ;; esac ;; esac set X $FILE if [ $# != 2 ] ; then echo "One message at a time, please!" >&2 exit 1 fi # get mime-version and content-type headers. CH=`sed -n -e '\ :a /^-*$/q /^[Mm][Ii][Mm][Ee]-[Vv][Ee][Rr][Ss][Ii][Oo][Nn]:/b x /^[Cc][Oo][Nn][Tt][Ee][Nn][Tt]-[Tt][Yy][Pp][Ee]:/b x d :x p n /^[ ]/b x b a' $FILE` if echo "$CH" | grep -i mime-version >/dev/null 2>&1; then : ## nothing, this is good else CH= fi # Handle MIME variants case "$CH" in *application/pgp-signature*) mimeverify exit ;; *application/pgp-encrypted*) decrypt mime exit ;; esac # Handle plain variants case "`grep '^-----BEGIN PGP' $FILE 2>/dev/null`" in *"PGP SIGNED MESSAGE"*) gpg --verify "$FILE" exit ;; *"BEGIN PGP MESSAGE"*) decrypt plain exit ;; esac echo "I can't find a PGP message there" >&2 exit 1 mmh-0.4/uip/new.c0000644000000000000000000002741013414435726012403 0ustar rootroot/* ** new.c -- as new, list all folders with unseen messages ** -- as fnext, move to next folder with unseen messages ** -- as fprev, move to previous folder with unseen messages ** -- as unseen, scan all unseen messages ** This code is Copyright (c) 2008, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. ** ** Inspired by Luke Mewburn's new: http://www.mewburn.net/luke/src/new */ #include #include #include #include #include #include #include #include #include #include static struct swit switches[] = { #define MODESW 0 { "mode", 0 }, #define FOLDERSSW 1 { "folders", 0 }, #define VERSIONSW 2 { "Version", 0 }, #define HELPSW 3 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; static enum { NEW, FNEXT, FPREV, UNSEEN } run_mode = NEW; /* ** check_folders uses this to maintain state with both .folders list of ** folders and with crawl_folders. */ struct list_state { struct node **first, **cur_node; size_t *maxlen; char *cur; char **sequences; struct node *node; }; /* Return the number of messages in a string list of message numbers. */ static int count_messages(char *field) { int total = 0; int j, k; char *cp, **ap; field = mh_xstrdup(field); /* copied from seq_read.c:seq_init */ for (ap = brkstring(field, " ", "\n"); *ap; ap++) { if ((cp = strchr(*ap, '-'))) *cp++ = '\0'; if ((j = m_atoi(*ap)) > 0) { k = cp ? m_atoi(cp) : j; total += k - j + 1; } } mh_free0(&field); return total; } /* Return TRUE if the sequence 'name' is in 'sequences'. */ static boolean seq_in_list(char *name, char *sequences[]) { int i; for (i = 0; sequences[i] != NULL; i++) { if (strcmp(name, sequences[i]) == 0) { return TRUE; } } return FALSE; } /* ** Return the string list of message numbers from the sequences file, ** or NULL if none. */ static char * get_msgnums(char *folder, char *sequences[]) { enum state state; struct field f = {{0}}; char *seqfile = concat(toabsdir(folder), "/", mh_seq, (void *)NULL); FILE *fp = fopen(seqfile, "r"); char *msgnums = NULL, *this_msgnums, *old_msgnums; /* no sequences file -> no messages */ if (fp == NULL) { return NULL; } for (state = FLD2;;) { switch (state = m_getfld2(state, &f, fp)) { case LENERR2: state = FLD2; /* FALL */ case FLD2: /* ** if it's in a sequence we want, ** save the list of messages. */ if (seq_in_list(f.name, sequences)) { this_msgnums = trimcpy(f.value); if (strlen(this_msgnums) == 0) { free(this_msgnums); continue; } else if (msgnums == NULL) { msgnums = this_msgnums; } else { old_msgnums = msgnums; msgnums = concat(old_msgnums, " ", this_msgnums, NULL); mh_free0(&old_msgnums); mh_free0(&this_msgnums); } } continue; case BODY2: adios(EX_DATAERR, NULL, "no blank lines are permitted in %s", seqfile); /* FALL */ case FILEEOF2: break; default: adios(EX_SOFTWARE, NULL, "%s is poorly formatted", seqfile); } break; } fclose(fp); return msgnums; } /* ** Check `folder' (of length `len') for interesting messages, ** filling in the list in `b'. */ static void check_folder(char *folder, size_t len, struct list_state *b) { char *msgnums = get_msgnums(folder, b->sequences); int is_cur = strcmp(folder, b->cur) == 0; if (is_cur || msgnums != NULL) { if (*b->first == NULL) { *b->first = b->node = mh_xcalloc(1, sizeof(*b->node)); } else { b->node->n_next = mh_xcalloc(1, sizeof(*b->node)); b->node = b->node->n_next; } b->node->n_name = folder; b->node->n_field = msgnums; if (*b->maxlen < len) { *b->maxlen = len; } } /* Save the node for the current folder, so we can fall back to it. */ if (is_cur) { *b->cur_node = b->node; } } static boolean crawl_callback(char *folder, void *baton) { check_folder(folder, strlen(folder), baton); return TRUE; } /* ** Scan folders, returning: ** first -- list of nodes for all folders which have desired messages; ** if the current folder is listed in .folders, it is also in ** the list regardless of whether it has any desired messages ** last -- last node in list ** cur_node -- node of current folder, if listed in .folders ** maxlen -- length of longest folder name ** ** `cur' points to the name of the current folder, `folders' points to the ** name of a .folder (if NULL, crawl all folders), and `sequences' points to ** the array of sequences for which to look. ** ** An empty list is returned as first=last=NULL. */ static void check_folders(struct node **first, struct node **last, struct node **cur_node, size_t *maxlen, char *cur, char *folders, char *sequences[]) { struct list_state b; FILE *fp; char *line; size_t len; *first = *last = *cur_node = NULL; *maxlen = 0; b.first = first; b.cur_node = cur_node; b.maxlen = maxlen; b.cur = cur; b.sequences = sequences; if (folders == NULL) { chdir(toabsdir("+")); crawl_folders(".", crawl_callback, &b); } else { fp = fopen(folders, "r"); if (fp == NULL) { adios(EX_IOERR, NULL, "failed to read %s", folders); } while (vfgets(fp, &line) == OK) { len = strlen(line) - 1; line[len] = '\0'; check_folder(mh_xstrdup(line), len, &b); } fclose(fp); } if (*first != NULL) { b.node->n_next = NULL; *last = b.node; } } /* Return a single string of the `sequences' joined by a space (' '). */ static char * join_sequences(char *sequences[]) { int i; size_t len = 0; char *result, *cp; for (i = 0; sequences[i] != NULL; i++) { len += strlen(sequences[i]) + 1; } result = mh_xcalloc(len + 1, sizeof(char)); for (i = 0, cp = result; sequences[i] != NULL; i++, cp += len + 1) { len = strlen(sequences[i]); memcpy(cp, sequences[i], len); cp[len] = ' '; } /* -1 to overwrite the last delimiter */ *--cp = '\0'; return result; } /* ** Return a struct node for the folder to change to. This is the next ** (previous, if FPREV mode) folder with desired messages, or the current ** folder if no folders have desired. If NEW or UNSEEN mode, print the ** output but don't change folders. ** ** n_name is the folder to change to, and n_field is the string list of ** desired message numbers. */ static struct node * doit(char *cur, char *folders, char *sequences[]) { struct node *first, *cur_node, *node, *last = NULL, *prev; size_t folder_len; int count, total = 0; char *sequences_s = NULL; int argc = 0; char *argv[MAXARGS]; char **seqp; char buf[BUFSIZ]; if (cur == NULL || cur[0] == '\0') { cur = "inbox"; } check_folders(&first, &last, &cur_node, &folder_len, cur, folders, sequences); if (run_mode == FNEXT || run_mode == FPREV) { if (first == NULL) { /* No folders at all... */ return NULL; } else if (first->n_next == NULL) { /* ** We have only one node; any desired messages in it? */ if (first->n_field == NULL) { return NULL; } else { return first; } } else if (cur_node == NULL) { /* ** Current folder is not listed in .folders, ** return first. */ return first; } } else if (run_mode == UNSEEN) { sequences_s = join_sequences(sequences); } for (node = first, prev = NULL; node != NULL; prev = node, node = node->n_next) { if (run_mode == FNEXT) { /* ** If we have a previous node and it is the current ** folder, return this node. */ if (prev != NULL && strcmp(prev->n_name, cur) == 0) { return node; } } else if (run_mode == FPREV) { if (strcmp(node->n_name, cur) == 0) { /* ** Found current folder in fprev mode; ** if we have a previous node in the list, ** return it; else return the last node. */ if (prev == NULL) { return last; } return prev; } } else if (run_mode == UNSEEN) { if (node->n_field == NULL) { continue; } printf("\n%d %s messages in %s", count_messages(node->n_field), sequences_s, node->n_name); if (strcmp(node->n_name, cur) == 0) { puts(" (*: current folder)"); } else { puts(""); } fflush(stdout); argc = 0; argv[argc++] = "scan"; snprintf(buf, sizeof buf, "+%s", node->n_name); argv[argc++] = buf; for (seqp=sequences; *seqp; seqp++) { argv[argc++] = *seqp; } argv[argc] = (char *)NULL; execprog(*argv, argv); } else { if (node->n_field == NULL) { continue; } count = count_messages(node->n_field); total += count; printf("%-*s %6d.%c %s\n", (int) folder_len, node->n_name, count, (strcmp(node->n_name, cur) == 0 ? '*' : ' '), node->n_field); } } /* ** If we're fnext, we haven't checked the last node yet. If it's the ** current folder, return the first node. */ if (run_mode == FNEXT && strcmp(last->n_name, cur) == 0) { return first; } if (run_mode == NEW) { printf("%-*s %6d.\n", (int) folder_len, " total", total); } return cur_node; } int main(int argc, char **argv) { char **ap, *cp, **argp, **arguments; char help[BUFSIZ]; char *folders = NULL; char *sequences[NUMATTRS + 1]; int i = 0; char *unseen; struct node *folder; sequences[0] = NULL; sequences[1] = NULL; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; /* ** Parse arguments */ while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(help, sizeof(help), "%s [switches] [sequences]", invo_name); print_help(help, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case FOLDERSSW: if (!(folders = *argp++) || *folders == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case MODESW: if (!(invo_name = *argp++) || *invo_name == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); invo_name = mhbasename(invo_name); continue; } } /* have a sequence argument */ if (!seq_in_list(cp, sequences)) { sequences[i++] = cp; sequences[i] = NULL; } } if (strcmp(invo_name, "fnext") == 0) { run_mode = FNEXT; } else if (strcmp(invo_name, "fprev") == 0) { run_mode = FPREV; } else if (strcmp(invo_name, "unseen") == 0) { run_mode = UNSEEN; } if (folders == NULL) { /* will flists */ } else { if (folders[0] != '/') { folders = toabsdir(folders); } } if (i == 0) { char *dp; /* no sequence arguments; use unseen */ if ((unseen = context_find(usequence))) { if (!*unseen) { adios(EX_CONFIG, NULL, "profile entry %s set, but empty, and no sequences given", usequence); } } else { unseen = seq_unseen; /* use default */ } dp = mh_xstrdup(unseen); for (ap = brkstring(dp, " ", "\n"); *ap; ap++) { sequences[i++] = *ap; } } sequences[i] = NULL; folder = doit(context_find(curfolder), folders, sequences); if (folder == NULL) { exit(EX_OK); return 1; } if (run_mode == UNSEEN) { /* ** All the scan(1)s it runs change the current folder, so we ** need to put it back. Unfortunately, context_replace lamely ** ignores the new value you give it if it is the same one it ** has in memory. So, we'll be lame, too. I'm not sure if i ** should just change context_replace... */ context_replace(curfolder, "defeat_context_replace_optimization"); } /* update current folder */ context_replace(curfolder, folder->n_name); if (run_mode == FNEXT || run_mode == FPREV) { printf("%s %s\n", folder->n_name, folder->n_field); } context_save(); return 0; } mmh-0.4/uip/send.c0000644000000000000000000004054313414435726012545 0ustar rootroot/* ** send.c -- send a composed message ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_TIME_H # include #endif #include #ifdef HAVE_SYS_PARAM_H # include #endif int debugsw = 0; /* global */ char *altmsg = NULL; char *annotext = NULL; char *distfile = NULL; /* name of temp file for body content */ static char body_file_name[MAXPATHLEN + 1]; /* name of mhbuild composition temporary file */ static char composition_file_name[MAXPATHLEN + 1]; static int field_size; /* size of header field buffer */ static char *field; /* header field buffer */ static FILE *draft_file; /* draft file pointer */ static FILE *body_file; /* body file pointer */ static FILE *composition_file; /* composition file pointer */ /* ** static prototypes */ static int sendsbr(char **, int, char *, struct stat *); static void anno(struct stat *); static int sendaux(char **, int, char *, struct stat *); static int attach(char *); static int signandenc(char *); static void clean_up_temporary_files(void); static int get_line(void); static void make_mime_composition_file_entry(char *); static char* strexit(int status); static struct swit switches[] = { #define DEBUGSW 0 { "debug", -5 }, #define VERBSW 1 { "verbose", 0 }, #define NVERBSW 2 { "noverbose", 2 }, #define VERSIONSW 3 { "Version", 0 }, #define HELPSW 4 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; int main(int argc, char **argv) { int nmsgs = 0, nfiles = 0, distsw = 0, vecp = 1; int msgnum, status; int in, out; int n; char *cp, *maildir = NULL, *folder = NULL; char buf[BUFSIZ], **argp, **arguments; char *msgs[MAXARGS], *vec[MAXARGS]; char *files[MAXARGS]; struct msgs *mp; struct stat st; struct stat st2; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown\n", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [file] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case DEBUGSW: debugsw++; /* fall */ case VERBSW: case NVERBSW: vec[vecp++] = --cp; continue; } } else if (*cp == '+' || *cp == '@') { if (folder) { adios(EX_USAGE, NULL, "only one folder at a time!"); } else { folder = mh_xstrdup(expandfol(cp)); } } else { if (*cp == '/') { files[nfiles++] = cp; } else { msgs[nmsgs++] = cp; } } } if (!nmsgs && !nfiles) { msgs[nmsgs++] = seq_cur; } if (nmsgs) { folder = folder ? folder : draftfolder; maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) { adios(EX_OSERR, maildir, "unable to change directory to"); } if (!(mp = folder_read(folder))) { adios(EX_IOERR, NULL, "unable to read folder %s", folder); } if (mp->nummsg == 0) { adios(EX_DATAERR, NULL, "no messages in folder %s", folder); } /* parse all the msgranges/sequences and set SELECTED */ for (msgnum = 0; msgnum < nmsgs; msgnum++) { if (!m_convert(mp, msgs[msgnum])) { exit(EX_USAGE); } } seq_setprev(mp); for (nmsgs = 0, msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (is_selected(mp, msgnum)) { files[nfiles++] = mh_xstrdup(m_name(msgnum)); unset_exists(mp, msgnum); } } mp->msgflags |= SEQMOD; seq_save(mp); } if (!(cp = getenv("SIGNATURE")) || !*cp) { if ((cp = context_find("signature")) && *cp) { m_putenv("SIGNATURE", cp); } } for (n = 0; n < nfiles; n++) { if (stat(files[n], &st) == NOTOK) { adios(EX_IOERR, files[n], "unable to stat draft file"); } } if (!(annotext = getenv("mhannotate")) || !*annotext) { annotext = NULL; } if (!(altmsg = getenv("mhaltmsg")) || !*altmsg) { altmsg = NULL; /* used by dist interface - see below */ } if ((cp = getenv("mhdist")) && *cp && (distsw = atoi(cp)) && altmsg) { vec[vecp++] = "-dist"; if ((in = open(altmsg, O_RDONLY)) == NOTOK) { adios(EX_IOERR, altmsg, "unable to open for reading"); } fstat(in, &st2); distfile = mh_xstrdup(m_mktemp2(NULL, invo_name, NULL, NULL)); if ((out = creat(distfile, (int)st2.st_mode & 0777))==NOTOK) { adios(EX_IOERR, distfile, "unable to open for writing"); } cpydata(in, out, altmsg, distfile); close(in); close(out); } else { distfile = NULL; } if (!altmsg || stat(altmsg, &st) == NOTOK) { st.st_mtime = 0; st.st_dev = 0; st.st_ino = 0; } status = 0; vec[0] = "spost"; for (n=3; n= field_size - 1) { field = mh_xrealloc(field, field_size += 256); p = field + n - 1; } } *p = '\0'; return (c); } static void make_mime_composition_file_entry(char *file_name) { FILE *fp; struct node *np; char *cp; char content_type[BUFSIZ]; char cmdbuf[BUFSIZ]; char *cmd = mimetypequeryproc; int semicolon = 0; for (np = m_defs; np; np = np->n_next) { if (strcasecmp(np->n_name, mimetypequery)==0) { cmd = np->n_field; break; } } snprintf(cmdbuf, sizeof cmdbuf, "%s %s", cmd, file_name); if (!(fp = popen(cmdbuf, "r"))) { clean_up_temporary_files(); adios(EX_IOERR, NULL, "unable to determine content type with `%s'", cmdbuf); } if (fgets(content_type, sizeof content_type, fp) && (cp = strrchr(content_type, '\n'))) { *cp = '\0'; } else { strcpy(content_type, "application/octet-stream"); admonish(NULL, "problems with `%s', using fall back type `%s'", cmdbuf, content_type); } pclose(fp); /* TODO: don't use access(2) because it checks for ruid, not euid */ if (access(file_name, R_OK) != 0) { clean_up_temporary_files(); adios(EX_IOERR, NULL, "unable to access file `%s'", file_name); } /* Check for broken file(1). See man page mh-profile(5). */ for (cp=content_type; *cp; cp++) { if (isspace(*cp)) { if (!semicolon) { adios(EX_SOFTWARE, NULL, "Sorry, your Mime-Type-Query command (%s) is broken.\n\tThe output misses a semicolon before the whitespace.\n\tOutput was: %s", cmd, content_type); } } else if (*cp == ';') { semicolon = 1; } else { semicolon = 0; } } cp = (!(cp = strrchr(file_name, '/'))) ? file_name : cp + 1; fprintf(composition_file, "#%s; name=\"%s\" <> [%s] {attachment} %s\n", content_type, cp, cp, file_name); return; } /* ** The back-end of the message sending back-end. ** Annotate original message, and call `spost' to send message. */ static int sendaux(char **vec, int vecp, char *drft, struct stat *st) { pid_t child_id; int status; char backup[BUFSIZ]; vec[vecp++] = drft; if (distfile && distout(drft, distfile, backup) == NOTOK) { return DONE; } vec[vecp] = NULL; switch (child_id = fork()) { case -1: /* oops -- fork error */ advise("fork", "unable to"); return DONE; case 0: /* child process -- send it */ execvp(*vec, vec); fprintf(stderr, "unable to exec "); perror(*vec); _exit(EX_OSERR); break; /* NOT REACHED */ default: /* parent process -- wait for it */ status = pidwait(child_id, NOTOK); if (WIFEXITED(status) && WEXITSTATUS(status) == EX_OK) { if (annotext) { anno(st); } } else { /* spost failed */ advise(NULL, "%s", strexit(status)); if (distfile) { unlink(drft); if (rename(backup, drft) == NOTOK) { advise(drft, "unable to rename %s to", backup); } } } } return status ? NOTOK : status; } static void anno(struct stat *st) { struct stat st2; char *msgs, *folder; char buf[BUFSIZ]; char *vec[MAXARGS]; int vecp = 0; char *cp, *dp; if (altmsg && (stat(altmsg, &st2) == NOTOK || st->st_mtime != st2.st_mtime || st->st_dev != st2.st_dev || st->st_ino != st2.st_ino)) { if (debugsw) { admonish(NULL, "$mhaltmsg mismatch"); } return; } if (!(folder = getenv("mhfolder")) || !*folder) { if (debugsw) { admonish(NULL, "$mhfolder not set"); } return; } if (!(msgs = getenv("mhmessages")) || !*msgs) { if (debugsw) { admonish(NULL, "$mhmessages not set"); } return; } if (debugsw) { advise(NULL, "annotate as `%s': %s %s", annotext, folder, msgs); } vec[vecp++] = "anno"; vec[vecp++] = "-comp"; vec[vecp++] = annotext; snprintf(buf, sizeof buf, "+%s", folder); vec[vecp++] = buf; while (isspace(*msgs)) { msgs++; } for (cp=dp=msgs; *cp; cp++) { if (isspace(*cp)) { while (isspace(*cp)) { *cp++ = '\0'; } vec[vecp++] = dp; dp = cp; } } vec[vecp++] = dp; vec[vecp] = NULL; if (execprog(*vec, vec) != 0) { advise(NULL, "unable to annotate"); } } char* strexit(int status) { if (WIFSIGNALED(status)) { return "spost or sendmail killed by signal"; } if (!WIFEXITED(status)) { return "message not delivered to anyone"; } switch (WEXITSTATUS(status)) { case EX_TEMPFAIL: return "Temporary error, maybe the MTA has queued the message"; default: return "message not delivered to anyone"; } } mmh-0.4/uip/flist.c0000644000000000000000000003723213414435726012736 0ustar rootroot/* ** flist.c -- list nmh folders containing messages ** -- in a given sequence ** ** originally by ** David Nichols, Xerox-PARC, November, 1992 ** ** Copyright (c) 1994 Xerox Corporation. ** Use and copying of this software and preparation of derivative works based ** upon this software are permitted. Any distribution of this software or ** derivative works must comply with all applicable United States export ** control laws. This software is made available AS IS, and Xerox Corporation ** makes no warranty about the software, its performance or its conformity to ** any specification. */ #include #include #include #include #include #include #include #include /* ** We allocate space to record the names of folders ** (foldersToDo array), this number of elements at a time. */ #define MAXFOLDERS 100 static struct swit switches[] = { #define SEQSW 0 { "sequence name", 0 }, #define ALLSW 1 { "all", 0 }, #define NOALLSW 2 { "noall", 2 }, #define RECURSE 3 { "recurse", 0 }, #define NORECURSE 4 { "norecurse", 2 }, #define SHOWZERO 5 { "showzero", 0 }, #define NOSHOWZERO 6 { "noshowzero", 2 }, #define ALPHASW 7 { "alpha", 0 }, #define NOALPHASW 8 { "noalpha", 2 }, #define FASTSW 9 { "fast", 0 }, #define NOFASTSW 10 { "nofast", 2 }, #define VERSIONSW 11 { "Version", 0 }, #define HELPSW 12 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; struct Folder { char *name; /* name of folder */ int priority; int error; /* error == 1 for unreadable folder */ int nMsgs; /* number of messages in folder */ int nSeq[NUMATTRS]; /* number of messages in each sequence */ int private[NUMATTRS]; /* is given sequence, public or private */ }; static struct Folder *orders = NULL; static int nOrders = 0; static int nOrdersAlloced = 0; static struct Folder *folders = NULL; static unsigned int nFolders = 0; static int nFoldersAlloced = 0; /* info on folders to search */ static char **foldersToDo; static int numfolders; static int maxfolders; /* info on sequences to search for */ static char *sequencesToDo[NUMATTRS]; static unsigned int numsequences; static int all = FALSE; /* scan all folders in top level? */ static int alphaOrder = FALSE; /* want alphabetical order only */ static int recurse = FALSE; /* show nested folders? */ static int showzero = TRUE; /* show folders even if no messages in seq? */ static int fastsw = FALSE; /* display info on number of messages in * sequence found, and total num messages */ static char curfol[BUFSIZ]; /* name of the current folder */ static char *nmhdir; /* base nmh mail directory */ /* ** Type for a compare function for qsort. This keeps ** the compiler happy. */ typedef int (*qsort_comp) (const void *, const void *); /* ** prototypes */ int CompareFolders(struct Folder *, struct Folder *); void GetFolderOrder(void); void ScanFolders(void); int AddFolder(char *, int); void BuildFolderList(char *, int); void BuildFolderListRecurse(char *, struct stat *, int); void PrintFolders(void); void AllocFolders(struct Folder **, int *, int); int AssignPriority(char *); static void do_readonly_folders(void); int main(int argc, char **argv) { char *cp, **argp; char **arguments; char buf[BUFSIZ]; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); /* ** If program was invoked with name ending ** in `s', then add switch `-all'. */ if (argv[0][strlen(argv[0]) - 1] == 's') all = TRUE; arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; /* allocate the initial space to record the folder names */ numfolders = 0; maxfolders = MAXFOLDERS; foldersToDo = mh_xcalloc(maxfolders, sizeof(*foldersToDo)); /* no sequences yet */ numsequences = 0; /* parse arguments */ while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder1 [+folder2 ...]][switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case SEQSW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); /* check if too many sequences specified */ if (numsequences >= NUMATTRS) adios(EX_USAGE, NULL, "too many sequences (more than %d) specified", NUMATTRS); sequencesToDo[numsequences++] = cp; break; case ALLSW: all = TRUE; break; case NOALLSW: all = FALSE; break; case SHOWZERO: showzero = TRUE; break; case NOSHOWZERO: showzero = FALSE; break; case ALPHASW: alphaOrder = TRUE; break; case NOALPHASW: alphaOrder = FALSE; break; case FASTSW: fastsw = TRUE; break; case NOFASTSW: fastsw = FALSE; break; case RECURSE: recurse = TRUE; break; case NORECURSE: recurse = FALSE; break; } } else { /* ** Check if we need to allocate more space ** for folder names. */ if (numfolders >= maxfolders) { maxfolders += MAXFOLDERS; foldersToDo = mh_xrealloc(foldersToDo, maxfolders * sizeof(*foldersToDo)); } if (*cp == '+' || *cp == '@') { foldersToDo[numfolders++] = mh_xstrdup(expandfol(cp)); } else foldersToDo[numfolders++] = cp; } } /* get current folder */ strncpy(curfol, getcurfol(), sizeof(curfol)); /* get nmh base directory */ nmhdir = toabsdir("+"); /* ** If no sequences specified, we use the `unseen' sequence(s) ** We check to make sure that the Unseen-Sequence entry doesn't ** contain too many sequences. */ if (numsequences == 0) { char **ap, *dp; if ((cp = context_find(usequence))) { if (!*cp) { adios(EX_CONFIG, NULL, "profile entry %s set, but empty, and no sequence given", usequence); } } else { cp = seq_unseen; /* use default */ } dp = mh_xstrdup(cp); ap = brkstring(dp, " ", "\n"); for (; ap && *ap; ap++) { if (numsequences >= NUMATTRS) { adios(EX_USAGE, NULL, "too many sequences (more than %d) in %s profile entry", NUMATTRS, usequence); } else { sequencesToDo[numsequences++] = *ap; } } } GetFolderOrder(); ScanFolders(); qsort(folders, nFolders, sizeof(struct Folder), (qsort_comp) CompareFolders); PrintFolders(); return EX_OK; } /* ** Read the Flist-Order profile entry to determine ** how to sort folders for output. */ void GetFolderOrder(void) { unsigned char *p, *s; int priority = 1; struct Folder *o; if (!(p = context_find("Flist-Order"))) return; for (;;) { while (isspace(*p)) ++p; s = p; while (*p && !isspace(*p)) ++p; if (p != s) { /* Found one. */ AllocFolders(&orders, &nOrdersAlloced, nOrders + 1); o = &orders[nOrders++]; o->priority = priority++; o->name = mh_xcalloc(p - s + 1, sizeof(char)); strncpy(o->name, s, p - s); o->name[p - s] = 0; } else break; } } /* ** Scan all the necessary folders */ void ScanFolders(void) { int i; /* * change directory to base of nmh directory */ if (chdir(nmhdir) == NOTOK) adios(EX_OSERR, nmhdir, "unable to change directory to"); if (numfolders > 0) { /* Update context */ strncpy(curfol, foldersToDo[numfolders - 1], sizeof(curfol)); context_replace(curfolder, curfol); /* update current folder */ context_save(); /* save the context file */ /* ** Scan each given folder. If -all is given, ** then also scan the 1st level subfolders under ** each given folder. */ for (i = 0; i < numfolders; ++i) BuildFolderList(foldersToDo[i], all ? 1 : 0); } else { if (all) { /* Do the readonly folders */ do_readonly_folders(); /* Now scan the entire nmh directory for folders */ BuildFolderList(".", 0); } else { /* Else scan current folder */ BuildFolderList(curfol, 0); } } } /* ** Initial building of folder list for ** the top of our search tree. */ void BuildFolderList(char *dirName, int searchdepth) { struct stat st; /* Make sure we have a directory */ if ((stat(dirName, &st) == -1) || !S_ISDIR(st.st_mode)) return; /* ** If base directory, don't add it to the ** folder list. We just recurse into it. */ if (strcmp(dirName, ".")==0) { BuildFolderListRecurse(".", &st, 0); return; } /* ** Add this folder to the list. ** If recursing and directory has subfolders, ** then build folder list for subfolders. */ if (AddFolder(dirName, showzero) && (recurse || searchdepth) && st.st_nlink > 2) BuildFolderListRecurse(dirName, &st, searchdepth - 1); } /* ** Recursive building of folder list */ void BuildFolderListRecurse(char *dirName, struct stat *s, int searchdepth) { char *base, name[PATH_MAX]; unsigned char *n; int nlinks; DIR *dir; struct dirent *dp; struct stat st; /* ** Keep track of number of directories we've seen so we can ** stop stat'ing entries in this directory once we've seen ** them all. This optimization will fail if you have extra ** directories beginning with ".", since we don't bother to ** stat them. But that shouldn't generally be a problem. */ nlinks = s->st_nlink; if (!(dir = opendir(dirName))) adios(EX_IOERR, dirName, "can't open directory"); /* ** A hack so that we don't see a ** leading "./" in folder names. */ base = (strcmp(dirName, ".")==0) ? dirName + 1 : dirName; while (nlinks && (dp = readdir(dir))) { if (strcmp(dp->d_name, ".")==0 || strcmp(dp->d_name, "..")==0) { nlinks--; continue; } if (dp->d_name[0] == '.') continue; /* Check to see if the name of the file is a number ** if it is, we assume it's a mail file and skip it */ for (n = dp->d_name; *n && isdigit(*n); n++); if (!*n) continue; strncpy(name, base, sizeof(name) - 2); if (*base) strcat(name, "/"); strncat(name, dp->d_name, sizeof(name) - strlen(name) - 1); if ((stat(name, &st) != -1) && S_ISDIR(st.st_mode)) { /* ** Check if this was really a symbolic link pointing ** to a directory. If not, then decrement link count. */ if (lstat(name, &st) == -1) nlinks--; /* Add this folder to the list */ if (AddFolder(name, showzero) && (recurse || searchdepth) && st.st_nlink > 2) BuildFolderListRecurse(name, &st, searchdepth - 1); } } closedir(dir); } /* ** Add this folder to our list, counting the total number of ** messages and the number of messages in each sequence. */ int AddFolder(char *name, int force) { unsigned int i; int msgnum, nonzero; int seqnum[NUMATTRS], nSeq[NUMATTRS]; struct Folder *f; struct msgs *mp; /* Read folder and create message structure */ if (!(mp = folder_read(name))) { /* Oops, error occurred. Record it and continue. */ AllocFolders(&folders, &nFoldersAlloced, nFolders + 1); f = &folders[nFolders++]; f->name = mh_xstrdup(name); f->error = 1; f->priority = AssignPriority(f->name); return 0; } for (i = 0; i < numsequences; i++) { /* Convert sequences to their sequence numbers */ if (sequencesToDo[i]) seqnum[i] = seq_getnum(mp, sequencesToDo[i]); else seqnum[i] = -1; /* Now count messages in this sequence */ nSeq[i] = 0; if (mp->nummsg > 0 && seqnum[i] != -1) { for (msgnum = mp->lowmsg; msgnum <= mp->hghmsg; msgnum++) { if (in_sequence(mp, seqnum[i], msgnum)) nSeq[i]++; } } } /* Check if any of the sequence checks were nonzero */ nonzero = 0; for (i = 0; i < numsequences; i++) { if (nSeq[i] > 0) { nonzero = 1; break; } } if (nonzero || force) { /* save general folder information */ AllocFolders(&folders, &nFoldersAlloced, nFolders + 1); f = &folders[nFolders++]; f->name = mh_xstrdup(name); f->nMsgs = mp->nummsg; f->error = 0; f->priority = AssignPriority(f->name); /* record the sequence information */ for (i = 0; i < numsequences; i++) { f->nSeq[i] = nSeq[i]; f->private[i] = (seqnum[i] != -1) ? is_seq_private(mp, seqnum[i]) : 0; } } folder_free(mp); /* free folder/message structure */ return 1; } /* ** Print the folder/sequence information */ void PrintFolders(void) { char tmpname[BUFSIZ]; unsigned int i, j, len, has_private = 0; unsigned int maxfolderlen = 0, maxseqlen = 0; int maxnum = 0, maxseq = 0; if (fastsw) { for (i = 0; i < nFolders; i++) printf("%s\n", folders[i].name); return; } /* ** Find the width we need for various fields */ for (i = 0; i < nFolders; ++i) { /* find the length of longest folder name */ len = strlen(folders[i].name); if (len > maxfolderlen) maxfolderlen = len; /* If folder had error, skip the rest */ if (folders[i].error) continue; /* find the maximum total messages */ if (folders[i].nMsgs > maxnum) maxnum = folders[i].nMsgs; for (j = 0; j < numsequences; j++) { /* find maximum width of sequence name */ len = strlen(sequencesToDo[j]); if ((folders[i].nSeq[j] > 0 || showzero) && (len > maxseqlen)) maxseqlen = len; /* find the maximum number of messages in sequence */ if (folders[i].nSeq[j] > maxseq) maxseq = folders[i].nSeq[j]; /* ** check if this sequence is private in any of ** the folders */ if (folders[i].private[j]) has_private = 1; } } /* Now print all the folder/sequence information */ for (i = 0; i < nFolders; i++) { for (j = 0; j < numsequences; j++) { if (folders[i].nSeq[j] > 0 || showzero) { /* Add `+' to end of name of current folder */ if (strcmp(curfol, folders[i].name)!=0) snprintf(tmpname, sizeof(tmpname), "%s", folders[i].name); else snprintf(tmpname, sizeof(tmpname), "%s+", folders[i].name); if (folders[i].error) { printf("%-*s is unreadable\n", maxfolderlen+1, tmpname); continue; } printf("%-*s has %*d in sequence %-*s%s; out of %*d\n", maxfolderlen+1, tmpname, num_digits(maxseq), folders[i].nSeq[j], maxseqlen, sequencesToDo[j], !has_private ? "" : folders[i].private[j] ? " (private)" : " ", num_digits(maxnum), folders[i].nMsgs); } } } } /* ** Put them in priority order. */ int CompareFolders(struct Folder *f1, struct Folder *f2) { if (!alphaOrder && f1->priority != f2->priority) return f1->priority - f2->priority; else return strcmp(f1->name, f2->name); } /* ** Make sure we have at least n folders allocated. */ void AllocFolders(struct Folder **f, int *nfa, int n) { if (n <= *nfa) return; if (*f == NULL) { *nfa = 10; *f = mh_xcalloc(*nfa, sizeof(struct Folder)); } else { *nfa *= 2; *f = mh_xrealloc(*f, *nfa * sizeof(struct Folder)); } } /* ** Return the priority for a name. The highest comes from an exact match. ** After that, the longest match (then first) assigns the priority. */ int AssignPriority(char *name) { int i, ol, nl; int best = nOrders; int bestLen = 0; struct Folder *o; nl = strlen(name); for (i = 0; i < nOrders; ++i) { o = &orders[i]; if (strcmp(name, o->name)==0) return o->priority; ol = strlen(o->name); if (nl < ol - 1) continue; if (ol < bestLen) continue; if (o->name[0] == '*' && strcmp(o->name + 1, name + (nl - ol + 1))==0) { best = o->priority; bestLen = ol; } else if (o->name[ol - 1] == '*' && strncmp(o->name, name, ol - 1) == 0) { best = o->priority; bestLen = ol; } } return best; } /* ** Do the read only folders */ static void do_readonly_folders(void) { int atrlen; char atrcur[BUFSIZ]; struct node *np; snprintf(atrcur, sizeof(atrcur), "atr-%s-", seq_cur); atrlen = strlen(atrcur); for (np = m_defs; np; np = np->n_next) if (strncmp(np->n_name, atrcur, atrlen)==0 && strncmp(np->n_name+atrlen, nmhdir, strlen(nmhdir))!=0) /* Why do we exclude absolute path names? --meillo */ BuildFolderList(np->n_name + atrlen, 0); } mmh-0.4/uip/mmhwrap.sh0000644000000000000000000000034013414435726013446 0ustar rootroot#!/bin/sh # # Wrapper for mmh commands # # For parallel installations of nmh and mmh. # Removes the need to add /usr/local/mmh/bin to $PATH. # # Copy only this script into a $PATH directory. PATH="%bindir%:$PATH" exec "$@" mmh-0.4/uip/mhtest.c0000644000000000000000000001551013414435726013114 0ustar rootroot/* ** mhtest.c -- test harness for MIME routines ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include #include #include #include #include static struct swit switches[] = { #define VERBSW 0 { "verbose", 0 }, #define NVERBSW 1 { "noverbose", 2 }, #define FILESW 2 { "file file", 0 }, #define OUTFILESW 3 { "outfile file", 0 }, #define PARTSW 4 { "part number", 0 }, #define TYPESW 5 { "type content", 0 }, #define VERSIONSW 6 { "Version", 0 }, #define HELPSW 7 { "help", 0 }, #define DEBUGSW 8 { "debug", -5 }, { NULL, 0 } }; char *version=VERSION; /* mhparse.c */ extern char *tmp; /* directory to place temp files */ /* mhmisc.c */ extern int npart; extern int ntype; extern char *parts[NPARTS + 1]; extern char *types[NTYPES + 1]; extern int userrs; /* ** This is currently needed to keep mhparse happy. ** This needs to be changed. */ pid_t xpid = 0; int debugsw = 0; int verbosw = 0; #define quitser pipeser /* mhparse.c */ CT parse_mime(char *); /* mhoutsbr.c */ int output_message(CT, char *); /* mhmisc.c */ int part_ok(CT, int); int type_ok(CT, int); void set_endian(void); void flush_errors(void); /* mhfree.c */ void free_content(CT); extern CT *cts; void freects_done(); /* ** static prototypes */ static int write_content(CT *, char *); static void pipeser(int); int main(int argc, char **argv) { int msgnum; char *cp, *file = NULL, *folder = NULL; char *maildir, buf[100], *outfile = NULL; char **argp, **arguments; struct msgs_array msgs = { 0, 0, NULL }; struct msgs *mp = NULL; CT ct, *ctp; if (atexit(freects_done) != 0) { adios(EX_OSERR, NULL, "atexit failed"); } setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; /* ** Parse arguments */ while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case PARTSW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); if (npart >= NPARTS) adios(EX_USAGE, NULL, "too many parts (starting with %s), %d max", cp, NPARTS); parts[npart++] = cp; continue; case TYPESW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); if (ntype >= NTYPES) adios(EX_USAGE, NULL, "too many types (starting with %s), %d max", cp, NTYPES); types[ntype++] = cp; continue; case FILESW: if (!(cp = *argp++) || (*cp == '-' && cp[1])) adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); file = *cp == '-' ? cp : mh_xstrdup(expanddir(cp)); continue; case OUTFILESW: if (!(cp = *argp++) || (*cp == '-' && cp[1])) adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); outfile = *cp == '-' ? cp : mh_xstrdup(expanddir(cp)); continue; case VERBSW: verbosw = 1; continue; case NVERBSW: verbosw = 0; continue; case DEBUGSW: debugsw = 1; continue; } } if (*cp == '+' || *cp == '@') { if (folder) adios(EX_USAGE, NULL, "only one folder at a time!"); else folder = mh_xstrdup(expandfol(cp)); } else app_msgarg(&msgs, cp); } /* null terminate the list of acceptable parts/types */ parts[npart] = NULL; types[ntype] = NULL; set_endian(); if (outfile == NULL) adios(EX_USAGE, NULL, "must specify output file"); /* ** Check for storage directory. If specified, ** then store temporary files there. Else we ** store them in standard nmh directory. */ if ((cp = context_find(nmhstorage)) && *cp) tmp = concat(cp, "/", invo_name, NULL); else tmp = mh_xstrdup(toabsdir(invo_name)); if (file && msgs.size) adios(EX_USAGE, NULL, "cannot specify msg and file at same time!"); /* ** check if message is coming from file */ if (file) { cts = mh_xcalloc(2, sizeof(*cts)); ctp = cts; if ((ct = parse_mime(file))) *ctp++ = ct; } else { /* ** message(s) are coming from a folder */ if (!msgs.size) app_msgarg(&msgs, seq_cur); if (!folder) folder = getcurfol(); maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) adios(EX_OSERR, maildir, "unable to change directory to"); /* read folder and create message structure */ if (!(mp = folder_read(folder))) adios(EX_IOERR, NULL, "unable to read folder %s", folder); /* check for empty folder */ if (mp->nummsg == 0) adios(EX_DATAERR, NULL, "no messages in %s", folder); /* parse all the message ranges/sequences and set SELECTED */ for (msgnum = 0; msgnum < msgs.size; msgnum++) if (!m_convert(mp, msgs.msgs[msgnum])) exit(EX_USAGE); seq_setprev(mp); /* set the previous-sequence */ cts = mh_xcalloc(mp->numsel + 1, sizeof(*cts)); ctp = cts; for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (is_selected(mp, msgnum)) { char *msgnam; msgnam = m_name(msgnum); if ((ct = parse_mime(msgnam))) *ctp++ = ct; } } } if (!*cts) exit(EX_SOFTWARE); userrs = 1; SIGNAL(SIGQUIT, quitser); SIGNAL(SIGPIPE, pipeser); /* ** Get the associated umask for the relevant contents. */ for (ctp = cts; *ctp; ctp++) { struct stat st; ct = *ctp; if (type_ok(ct, 1) && !ct->c_umask) { if (stat(ct->c_file, &st) != NOTOK) ct->c_umask = ~(st.st_mode & 0777); else ct->c_umask = ~m_gmprot(); } } /* ** Write the content to a file */ write_content(cts, outfile); /* Now free all the structures for the content */ for (ctp = cts; *ctp; ctp++) free_content(*ctp); mh_free0(&cts); /* If reading from a folder, do some updating */ if (mp) { context_replace(curfolder, folder); /* update current folder */ seq_setcur(mp, mp->hghsel); /* update current message */ seq_save(mp); /* synchronize sequences */ context_save(); /* save the context file */ } return EX_OK; } static int write_content(CT *cts, char *outfile) { CT ct, *ctp; for (ctp = cts; *ctp; ctp++) { ct = *ctp; output_message(ct, outfile); } flush_errors(); return OK; } static void pipeser(int i) { if (i == SIGQUIT) { unlink("core"); fflush(stdout); fprintf(stderr, "\n"); fflush(stderr); } exit(EX_IOERR); /* NOTREACHED */ } mmh-0.4/uip/termsbr.c0000644000000000000000000000266113414435726013271 0ustar rootroot/* ** termsbr.c -- termcap support ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #ifdef HAVE_TERMCAP_H # include #endif /* is need anyway for ioctl() #ifdef GWINSZ_IN_SYS_IOCTL */ # include /* #endif */ #ifdef WINSIZE_IN_PTEM # include # include #endif #if BUFSIZ<2048 # define TXTSIZ 2048 #else # define TXTSIZ BUFSIZ #endif static long speedcode; static int initCO = 0; static int CO = 80; /* number of colums */ static void read_termcap(void) { char *term; #ifndef TGETENT_ACCEPTS_NULL char termbuf[TXTSIZ]; #endif struct termios tio; static int inited = 0; if (inited++) return; if (!(term = getenv("TERM"))) return; /* ** If possible, we let tgetent allocate its own termcap buffer */ #ifdef TGETENT_ACCEPTS_NULL if (tgetent(NULL, term) != TGETENT_SUCCESS) return; #else if (tgetent(termbuf, term) != TGETENT_SUCCESS) return; #endif speedcode = cfgetospeed(&tio); if (!initCO && (CO = tgetnum("co")) <= 0) CO = 80; } int sc_width(void) { #ifdef TIOCGWINSZ struct winsize win; int width; if (ioctl(fileno(stderr), TIOCGWINSZ, &win) != NOTOK && (width = win.ws_col) > 0) { CO = width; initCO++; } else #endif /* TIOCGWINSZ */ read_termcap(); return CO; } mmh-0.4/uip/prompter.c0000644000000000000000000001357413414435726013470 0ustar rootroot/* ** prompter.c -- simple prompting editor front-end ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include #include #include static struct swit switches[] = { #define PREPSW 0 { "prepend", 0 }, #define NPREPSW 1 { "noprepend", 2 }, #define RAPDSW 2 { "rapid", 0 }, #define NRAPDSW 3 { "norapid", 2 }, #define BODYSW 4 { "body", 0 }, #define NBODYSW 5 { "nobody", 2 }, #define VERSIONSW 6 { "Version", 0 }, #define HELPSW 7 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; volatile sig_atomic_t wtuser = 0; volatile sig_atomic_t sigint = 0; static jmp_buf sigenv; /* ** prototypes */ int getln(char *, int); static void intrser(int); int main(int argc, char **argv) { int qbody = 1, prepend = 1, rapid = 0; int fdi, fdo, i; char *cp, *drft = NULL; enum state state; struct field f = {{0}}; char buffer[BUFSIZ], tmpfil[BUFSIZ]; char **arguments, **argp; FILE *in, *out; char *tfile = NULL; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buffer, sizeof(buffer), "%s [switches] file", invo_name); print_help(buffer, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case PREPSW: prepend++; continue; case NPREPSW: prepend = 0; continue; case RAPDSW: rapid++; continue; case NRAPDSW: rapid = 0; continue; case BODYSW: qbody++; continue; case NBODYSW: qbody = 0; continue; } } else if (!drft) { drft = cp; } } if (!drft) { adios(EX_USAGE, NULL, "usage: %s [switches] file", invo_name); } if ((in = fopen(drft, "r")) == NULL) { adios(EX_IOERR, drft, "unable to open"); } tfile = m_mktemp2(NULL, invo_name, NULL, &out); if (tfile == NULL) { adios(EX_CANTCREAT, "prompter", "unable to create temporary file"); } chmod(tmpfil, 0600); strncpy(tmpfil, tfile, sizeof(tmpfil)); sigint = 0; SIGNAL2(SIGINT, intrser); /* ** Loop through the lines of the draft skeleton. */ for (state = FLD2;;) { switch (state = m_getfld2(state, &f, in)) { case LENERR2: state = FLD2; /* FALL */ case FLD2: /* ** Check if the value of field contains ** anything other than space or tab. */ for (cp = f.value; *cp; cp++) { if (*cp != ' ' && *cp != '\t') { break; } } /* If so, just add header line to draft */ if (*cp++ != '\n' || *cp) { printf("%s:%s", f.name, f.value); fprintf(out, "%s:%s", f.name, f.value); } else { /* Else, get value of header field */ printf("%s: ", f.name); fflush(stdout); i = getln(buffer, sizeof(buffer)); if (i == -1) { abort: unlink(tmpfil); exit(EX_DATAERR); } if (i || (buffer[0]!='\n' && buffer[0]!='\0')) { fprintf(out, "%s:", f.name); do { if (buffer[0] != ' ' && buffer[0] != '\t') { putc(' ', out); } fprintf(out, "%s", buffer); } while (i == 1 && (i = getln(buffer, sizeof(buffer))) >= 0); if (i == -1) { goto abort; } } } continue; case BODY2: case FILEEOF2: fprintf(out, "--------\n"); if (qbody) { if (f.value == NULL) { printf("--------\n"); goto has_no_body; } if (prepend) { printf("--------Enter initial text\n"); fflush(stdout); for (;;) { getln(buffer, sizeof(buffer)); if (!*buffer) { break; } fprintf(out, "%s", buffer); } } else { printf("--------\n"); } } if (state == BODY2) { do { fprintf(out, "%s", f.value); if (!rapid && !sigint) { printf("%s", f.value); } } while ((state = m_getfld2(state, &f, in)) ==BODY2); if (state != FILEEOF2) { adios(EX_IOERR, "m_getfld2", "io error"); } } if (prepend || !qbody) { break; } printf("--------Enter additional text\n"); has_no_body: fflush(stdout); for (;;) { getln(buffer, sizeof(buffer)); if (!*buffer) { break; } fprintf(out, "%s", buffer); } break; case FMTERR2: advise(NULL, "skeleton is poorly formatted"); continue; default: adios(EX_IOERR, "m_getfld2", "io error"); } break; } if (qbody) { printf("--------\n"); } fflush(stdout); fclose(in); fclose(out); SIGNAL(SIGINT, SIG_IGN); if ((fdi = open(tmpfil, O_RDONLY)) == NOTOK) { adios(EX_IOERR, tmpfil, "unable to re-open"); } if ((fdo = creat(drft, m_gmprot())) == NOTOK) { adios(EX_IOERR, drft, "unable to write"); } cpydata(fdi, fdo, tmpfil, drft); close(fdi); close(fdo); unlink(tmpfil); context_save(); return EX_OK; } int getln(char *buffer, int n) { int c; sig_atomic_t psigint = sigint; char *cp; cp = buffer; *cp = '\0'; switch (setjmp(sigenv)) { case 0: wtuser = 1; break; default: wtuser = 0; if (sigint == psigint) { return 0; } else { sigint = psigint; return NOTOK; } } for (;;) { switch (c = getchar()) { case EOF: clearerr(stdin); longjmp(sigenv, DONE); case '\n': if (cp[-1] == '\\') { cp[-1] = c; wtuser = 0; return 1; } *cp++ = c; *cp = '\0'; wtuser = 0; return 0; default: if (cp < buffer + n) *cp++ = c; *cp = '\0'; } } } static void intrser(int i) { if (wtuser) { close(STDIN_FILENO); } sigint++; } mmh-0.4/uip/spost.c0000644000000000000000000003650513414435726012767 0ustar rootroot/* ** spost.c -- feed messages to sendmail ** ** This is a simpler, faster, replacement for "post" for use ** when "sendmail" is the transport system. ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include #include #include #define MAX_SM_FIELD 1476 /* < largest hdr field sendmail will accept */ static struct swit switches[] = { #define VERBSW 0 { "verbose", 0 }, #define NVERBSW 1 { "noverbose", 2 }, #define VERSIONSW 2 { "Version", 0 }, #define HELPSW 3 { "help", 0 }, #define DEBUGSW 4 { "debug", -5 }, #define DISTSW 5 { "dist", -4 }, /* interface from dist */ { NULL, 0 } }; char *version=VERSION; /* flags for headers->flags */ #define HNOP 0x0000 /* just used to keep .set around */ #define HBAD 0x0001 /* bad header - don't let it through */ #define HADR 0x0002 /* header has an address field */ #define HSUB 0x0004 /* Subject: header */ #define HTRY 0x0008 /* try to send to addrs on header */ #define HBCC 0x0010 /* don't output this header */ #define HFCC 0x0020 /* FCC: type header */ #define HIGN 0x0040 /* ignore this header */ #define HDCC 0x0080 /* DCC: type header */ /* flags for headers->set */ #define MFRM 0x0001 /* we've seen a From: */ #define MDAT 0x0002 /* we've seen a Date: */ #define MRFM 0x0004 /* we've seen a Resent-From: */ #define MVIS 0x0008 /* we've seen sighted addrs */ #define MINV 0x0010 /* we've seen blind addrs */ #define MRDT 0x0020 /* we've seen a Resent-Date: */ #define MFMM 0x0040 /* The Mail is From a Alternative-Mailbox Addresse */ struct headers { char *value; unsigned int flags; unsigned int set; }; static struct headers NHeaders[] = { { "Return-Path", HBAD, 0 }, { "Received", HBAD, 0 }, { "Reply-To", HADR, 0 }, { "From", HADR, MFRM }, { "Sender", HADR|HBAD, 0 }, { "Date", HNOP, MDAT }, { "Subject", HSUB, 0 }, { "To", HADR|HTRY, MVIS }, { "Cc", HADR|HTRY, MVIS }, { "Dcc", HADR|HTRY|HDCC, MINV }, { "Bcc", HADR|HTRY|HBCC, MINV }, { "Message-Id", HBAD, 0 }, { "Fcc", HFCC, 0 }, { "Envelope-From", HIGN, 0 }, { NULL, 0, 0 } }; static struct headers RHeaders[] = { { "Resent-Reply-To", HADR, 0 }, { "Resent-From", HADR, MRFM }, { "Resent-Sender", HADR|HBAD, 0 }, { "Resent-Date", HNOP, MRDT }, { "Resent-Subject", HSUB, 0 }, { "Resent-To", HADR|HTRY, MVIS }, { "Resent-Cc", HADR|HTRY, MVIS }, { "Resent-Dcc", HADR|HTRY|HDCC, MINV }, { "Resent-Bcc", HADR|HTRY|HBCC, MINV }, { "Resent-Message-Id", HBAD, 0 }, { "Resent-Fcc", HFCC, 0 }, { "Reply-To", HADR, 0 }, { "Fcc", HIGN, 0 }, { "Envelope-From", HIGN, 0 }, { NULL, 0, 0 } }; static int badmsg = 0; static int verbose = 0; static int debug = 0; static int aliasflg = 0; /* if going to process aliases */ static unsigned msgflags = 0; /* what we've seen */ static enum { normal, resent } msgstate = normal; static char *tmpfil; static char *subject = NULL; /* the subject field for BCC'ing */ static struct mailname *from = NULL; /* the from field for BCC'ing */ static char fccs[BUFSIZ] = ""; struct mailname *bccs = NULL; /* list of the bcc recipients */ struct mailname *recipients = NULL; /* list of the recipients */ size_t recipientsc = 0; struct mailname *sender = NULL; static struct headers *hdrtab; /* table for the message we're doing */ static FILE *out; /* output (temp) file */ /* ** static prototypes */ static void putfmt(char *, char *, FILE *); static void finish_headers(FILE *); static int get_header(char *, struct headers *); static void putadr(char *, struct mailname *); static int putone(char *, int, int); static void process_fcc(char *); static void fcc(char *, char *); static void process_bccs(char *); static size_t do_aliasing(struct mailname *, struct mailname **); int main(int argc, char **argv) { enum state state; struct field f = {{0}}; int compnum; char *cp, *msg = NULL, **argp, **arguments; char **sargv, buf[BUFSIZ]; FILE *in; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); context_read(); arguments = getarguments(invo_name, argc, argv, 0); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [switches] file", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case DEBUGSW: debug++; continue; case DISTSW: msgstate = resent; continue; case VERBSW: verbose++; continue; case NVERBSW: verbose = 0; continue; } } if (msg) { adios(EX_USAGE, NULL, "only one message at a time!"); } else { msg = cp; } } if (!msg) { adios(EX_USAGE, NULL, "usage: %s [switches] file", invo_name); } if ((in = fopen(msg, "r")) == NULL) { adios(EX_IOERR, msg, "unable to open"); } if (debug) { verbose++; out = stdout; } else { tmpfil = mh_xstrdup(m_mktemp2("/tmp/", invo_name, NULL, &out)); } /* check for "Aliasfile:" profile entry */ if ((cp = context_find("Aliasfile"))) { char *dp, **ap; aliasflg = 1; for (ap=brkstring(dp=mh_xstrdup(cp), " ", "\n"); ap && *ap; ap++) { if ((state = alias(etcpath(*ap))) != AK_OK) { adios(EX_IOERR, NULL, "aliasing error in file %s: %s", *ap, akerror(state)); } } } hdrtab = (msgstate == normal) ? NHeaders : RHeaders; for (compnum = 1, state = FLD2;;) { switch (state = m_getfld2(state, &f, in)) { case FLD2: compnum++; putfmt(f.name, f.value, out); continue; case BODY2: finish_headers(out); fprintf(out, "\n%s", f.value); while ((state = m_getfld2(state, &f, in)) == BODY2) { if (f.valuelen > NAMESZ+1 || (!f.crlf && f.valuelen > NAMESZ)) { adios(EX_DATAERR, NULL, "Body contains a to long line"); } fputs(f.value, out); } break; case FILEEOF2: finish_headers(out); break; case LENERR2: case FMTERR2: case IOERR2: adios(EX_DATAERR, NULL, "message format error in component #%d", compnum); default: adios(EX_SOFTWARE, NULL, "getfld() returned %d", state); } break; } fclose(in); if (state != FILEEOF2) { adios(EX_IOERR, "m_getfld2", "Error while reading body"); } if (debug) { struct mailname *i = recipients; /* stop here */ puts("----EOM----"); while (i) { fputs(i->m_mbox, stdout); if (i->m_host) { fputs("@", stdout); fputs(i->m_host, stdout); } fputs("\n", stdout); i = i->m_next; mnfree(recipients); recipients = i; } exit(EX_OK); } fclose(out); /* process Fcc */ if (*fccs) { fcc(tmpfil, fccs); } if (bccs) { process_bccs(tmpfil); if (!(msgflags & MVIS)) { /* only Bcc rcpts: we're finished here */ unlink(tmpfil); exit(EX_OK); } } /* ** re-open the temp file, unlink it and exec sendmail, giving it ** the msg temp file as std in. */ if (!freopen(tmpfil, "r", stdin)) { adios(EX_IOERR, tmpfil, "can't reopen for sendmail"); } unlink(tmpfil); if (recipientsc == 0) { adios(EX_DATAERR, NULL, "message has no recipients"); } sargv = mh_xcalloc(recipientsc + 4, sizeof(char **)); argp = sargv; *argp++ = "send-mail"; *argp++ = "-i"; /* don't stop on "." */ if (verbose) { *argp++ = "-v"; } while (recipients != NULL) { cp = mh_xstrdup(recipients->m_mbox); if (recipients->m_host) { cp = add("@", cp); cp = add(recipients->m_host, cp); } *argp++ = cp; cp = NULL; recipients = recipients->m_next; } *argp = NULL; execvp(sendmail, sargv); if (errno == E2BIG) { adios(EX_DATAERR, sendmail, "too much arguments, probably to much recipients"); } adios(EX_OSERR, sendmail, "can't exec"); return -1; } /* DRAFT GENERATION */ static void putfmt(char *name, char *str, FILE *out) { int i; struct headers *hdr; struct mailname addr_start, *addr_end; size_t addrc = 0; ssize_t ret; addr_end = &addr_start; addr_end->m_next = NULL; /* remove leading whitespace */ while (*str==' ' || *str=='\t') { str++; } if ((i = get_header(name, hdrtab)) == NOTOK) { /* no header we would care for */ if (mh_strcasecmp(name, attach_hdr)==0) { return; } if (mh_strcasecmp(name, sign_hdr)==0) { return; } if (mh_strcasecmp(name, enc_hdr)==0) { return; } /* push it through */ fprintf(out, "%s: %s", name, str); return; } /* it's one of the interesting headers */ hdr = &hdrtab[i]; if (hdr->flags & HIGN || strcmp(str, "\n")==0) { return; } if (hdr->flags & HBAD) { advise(NULL, "illegal header line -- %s:", name); badmsg++; return; } msgflags |= hdr->set; if (hdr->flags & HFCC) { process_fcc(str); return; } if (hdr->flags & HSUB) { subject = mh_xstrdup(str); } if (!(hdr->flags & HADR)) { fprintf(out, "%s: %s", name, str); return; } if ((ret = getmboxes(str, &addr_end)) < 0) { adios(EX_DATAERR, NULL, "can't parse address: %s", str); } addrc += ret; if (aliasflg) { addrc += do_aliasing(&addr_start, &addr_end); } if (hdr->flags & HBCC) { addr_end->m_next = bccs; bccs = addr_start.m_next; return; } if (hdr->set & MFRM) { struct mailname *mp = NULL; struct mailname *my = NULL; /* needed because the address parser holds global state */ ismymbox(NULL); for (mp = addr_start.m_next; mp; mp = mp->m_next) { if (ismymbox(mp)) { msgflags |= MFMM; if (my == NULL) { from = my = mp; } } } if (addrc > 1) { sender = my; } } if (!(hdr->flags & HDCC)) { putadr(name, addr_start.m_next); } if (hdr->flags & HTRY) { addr_end->m_next = recipients; recipients = addr_start.m_next; recipientsc += i; } } /* ** Add yet missing headers. */ static void finish_headers(FILE *out) { char *cp; char from[BUFSIZ]; /* my network address */ char signature[BUFSIZ]; /* my signature */ char *resentstr = (msgstate == resent) ? "Resent-" : ""; if (!(msgflags & MDAT)) { fprintf(out, "%sDate: %s\n", resentstr, dtimenow()); } if (sender != NULL) { snprintf(signature, sizeof(signature), "%s", sender->m_text); } else if ((cp = context_find("Default-From")) != NULL) { snprintf(signature, sizeof(signature), "%s", cp); } else { snprintf(from, sizeof(from), "%s@%s", getusername(), LocalName()); if ((cp = getfullname()) && *cp) { snprintf(signature, sizeof(signature), "%s <%s>", cp, from); } else { snprintf(signature, sizeof(signature), "%s", from); } } if (!(msgflags & MFRM)) { fprintf(out, "%sFrom: %s\n", resentstr, signature); } else { /* ** Add a Sender: header because the From: header could ** be fake or contain multiple addresses. */ if (!(msgflags & MFMM) || sender != NULL) { fprintf(out, "%sSender: %s\n", resentstr, signature); } } if (!(msgflags & MVIS)) { fprintf(out, "%sBcc: undisclosed-recipients:;\n", resentstr); } if (badmsg) { unlink(tmpfil); adios(EX_DATAERR, NULL, "re-format message and try again"); } } /* ** Return index of the requested header in the table, or NOTOK if missing. */ static int get_header(char *header, struct headers *table) { struct headers *h; for (h=table; h->value; h++) { if (mh_strcasecmp(header, h->value)==0) { return (h - table); } } return NOTOK; } /* ** output the address list for header "name". The address list ** is a linked list of mailname structs. "nl" points to the head ** of the list. Alias substitution should be done on nl. */ static void putadr(char *name, struct mailname *nl) { struct mailname *mp; char *cp; int linepos; int namelen; fprintf(out, "%s: ", name); namelen = strlen(name) + 2; linepos = namelen; for (mp = nl; mp; ) { if (linepos > MAX_SM_FIELD) { fprintf(out, "\n%s: ", name); linepos = namelen; } if (mp->m_ingrp) { if (mp->m_gname != NULL) { cp = mh_xstrdup(mp->m_gname); cp = add(";", cp); linepos = putone(cp, linepos, namelen); mh_free0(&cp); cp = NULL; } } else { linepos = putone(mp->m_text, linepos, namelen); } mp = mp->m_next; } putc('\n', out); } static int putone(char *adr, int pos, int indent) { int len; static int linepos; len = strlen(adr); if (pos == indent) { linepos = pos; } else if (linepos+len > OUTPUTLINELEN) { fprintf(out, ",\n%*s", indent, ""); linepos = indent; pos += indent + 2; } else { fputs(", ", out); linepos += 2; pos += 2; } fputs(adr, out); linepos += len; return (pos+len); } static void process_fcc(char *str) { char *cp, *pp; int state = 0; if (strlen(str)+strlen(fccs) > sizeof fccs /2) { adios(EX_DATAERR, NULL, "Too much Fcc data"); } /* todo: better have three states: SEPARATOR, PLUS, WORD */ for (cp=pp=str; *cp; cp++) { switch (*cp) { case ' ': case '\t': case '\n': case ',': if (state != 0) { state = 0; *cp = '\0'; if (*pp=='+' || *pp=='@') { strcat(fccs, " "); } else { strcat(fccs, " +"); } strcat(fccs, pp); } break; default: if (state == 0) { state = 1; pp = cp; } break; } } } static void fcc(char *file, char *folders) { int status; char cmd[BUFSIZ]; if (verbose) { printf("%sFcc: %s\n", msgstate == resent ? "Resent-" : "", folders); fflush(stdout); } if (100+strlen(file)+strlen(folders) > sizeof cmd) { adios(EX_DATAERR, NULL, "Too much Fcc data"); } /* hack: read from /dev/null and refile(1) won't question us */ snprintf(cmd, sizeof cmd, "m_next) { bccdraft = mh_xstrdup(m_mktemp2("/tmp/", invo_name, NULL, &out)); fprintf(out, "To: %s\n", mp->m_text); if (from) { fprintf(out, "From: %s\n", from->m_text); } fprintf(out, "Subject: [BCC] %s", subject ? subject : ""); fprintf(out, "%s: %s\n", attach_hdr, origmsg); fprintf(out, "------------\n"); fclose(out); if (execprogl("send", "send", bccdraft, (char *)NULL) != 0) { admonish(invo_name, "Problems to send Bcc to %s", mp->m_text); unlink(bccdraft); } } } /* * Do aliasing on a mailname linked list * Begin at start->m_next * End if m_next == NULL * **end is set to the new end. * Return the number of new mainames in the list */ static size_t do_aliasing(struct mailname *start, struct mailname **end) { struct mailname *prev, *cur; char *cp; size_t i = 0; ssize_t e; prev = start; cur = prev->m_next; while (cur != NULL) { if (cur->m_nohost) { cp = akvalue(cur->m_mbox); if (strcmp(cp, cur->m_mbox) != 0) { prev->m_next = cur->m_next; if ((e = getmboxes(cp, &prev)) < 0) { goto error; } i += e; i -= 1; mnfree(cur); } else { prev = cur; } } else { prev = cur; } cur = prev->m_next; } *end = prev; return i; error: adios(EX_CONFIG, NULL, "can't parse alias %s: %s", cur->m_mbox, cp); return 0; /* not reached */ } mmh-0.4/uip/mhsign.sh0000755000000000000000000001562613414435726013300 0ustar rootroot#!/bin/sh # Based on mhsign 1.1.0.9 2007/05/30 14:48:40 by Neil Rickert # Adjusted to mmh by markus schnalke , 2012-07 # mhsign: # -encrypt: Encrypt to recipients of message. This implies signing. # -mime: Use MIME pgp standard. For signature, trailing blanks # will be removed and any "From " line will be indented for # best compatibility. Enforced for multipart messages. usage="Usage: mhsign [-encrypt] [-mime] [-Version] [-help] file" # defaults usemime=n function=sign # find out the signing key userid="$MMHPGPKEY" if [ -z "$userid" ] ; then userid="`mhparam pgpkey`" fi if [ -z "$userid" ] ; then userid="`gpg --list-secret-keys --with-colons --fixed-list-mode \ 2>/dev/null | grep '^sec' | sort -t: -k3,3nr -k 6,6nr | awk -F: ' $7=="" || $7 > "'"\`date +%s\`"'" { print $5; exit; } '`" fi if [ -z "$userid" ] ; then echo "No secret key found" >&2 exit 1 fi # find out the file of recipient key exceptions (for encrypt only) keyfile="${MMH:-$HOME/.mmh}/pgpkeys" if [ ! -r "$keyfile" ] ; then keyfile="${GNUPGHOME:-$HOME/.gnupg}/pgpkeys" if [ ! -r "$keyfile" ] ; then keyfile=/dev/null fi fi # prepend the default options from the profile set -- `mhparam -nocomp ${0##*/}` "$@" while : ; do case "$1" in -e*) function=encrypt ;; -m*) usemime=y ;; -V*) echo "mhsign has no own version number, thus this instead:" folder -Version exit 0 ;; -h*|-*) echo "$usage" >&2 exit 1 ;; *) break esac shift done if [ $# -ne 1 ] ; then echo "$usage" >&2 exit 1 fi TEMP=/tmp/${0##*/}.$$ umask 077 mkdir $TEMP || exit 1 trap "rm -rf $TEMP" 0 1 2 15 ### lookupkeyfile address -- lookup one address in our database lookupkeyfile() { key=`grep -i "^[^#].*[ ]$1\$" "$keyfile" 2>/dev/null` if [ $? != 0 ] ; then return 1 fi echo "$key" | sed 's/[ ].*//;q' return 0 } ### lookupkeyring address -- lookup one address in keyring lookupkeyring() { key=`gpg --list-keys --with-colons "<$1>" 2>/dev/null` if [ $? != 0 ] ; then return 1 fi echo "$key" | sed -n '/^pub:[^idre]:/{p;q;}' | cut -d: -f5 return 0 } ### Do a best guess at FQDN mh_hostname() { hostname -f 2>/dev/null || uname -n } ### lookupkeys file -- set $KL to list of recipient keys lookupkeys() { KL= status=0 if whom -ali -notocc -bcc "$1" >/dev/null ; then echo "Encryption is not supported for BCCs" >&2 return 1 fi # extract the actual address format='%<{error}%{error}: %{text}%|%(addr{text})%>' addresses=`whom -ali -tocc -nobcc "$1" |sed 's_$_,_'` addresses=`%libdir%/ap -form "=$format" "$addresses"` for i in $addresses ; do case "$i" in '|'*) echo "Ignoring pipe address" >&2 continue ;; *@*) ;; *) i="$i@`mh_hostname`" ;; esac if k=`lookupkeyfile "$i"` ; then KL="$KL $k" elif k=`lookupkeyring "$i"` ; then KL="$KL $k" else echo "Could not find key for <$i>" >&2 status=1 fi done return $status } ### getheader headername msgfile getheader() { HDR=`sed -n -e '/^-*$/q' -e 's/^\([^ :]*\):.*/\1/p' $2 | grep -i '^'"$1"'$' | head -1` if [ "$HDR" = "" ] ; then return 1 ; fi sed -n -e ':a /^-*$/q /^'"$HDR"':/b x d b a :x p n /^[ ]/b x b a' $2 return 0 } ### headbody msgfile # separate msgfile into $TEMP/head $TEMP/body headbody() { sed -n '1,/^\-*$/p' "$1" > $TEMP/head sed '1,/^-*$/d' "$1" > $TEMP/body } ### fixheaders -- remove Content headers, add newheaders fixheaders() { sed -n ':a /^-*$/q /^[Cc][Oo][Nn][Tt][Ee][Nn][Tt]-/b r p n b a :r n /^[ ]/b r b a' $TEMP/head cat $TEMP/newheaders grep "^-" $TEMP/head || echo "" } ### newboundary -- output a suitable boundary marker newboundary() { b=$$_`date|sed 's/[ : ]/_/g'` for i in 0 x '=' _ + , Z 9 4 ; do if grep "^--$b" $TEMP/body >/dev/null 2>&1 ; then ## oops, bad boundary -- try again b=`echo $i$b | tr \ 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456780=+,_' \ '3Ba+c98bdACmzXpqR,tTuMDSs_hLkwZ0ef7PQrW=2x5l6E14ZKivIVgOjoJnGNUyHF'` else echo "$b" return 0 fi done echo "Failed to generate unique mime boundary" >&2 exit 1 } ### detachsign -- sign $TEMP/body, output in $TEMP/body.asc detachsign() { gpg -u "$userid" --armor --textmode --detach-sign \ <$TEMP/body >$TEMP/body.asc } ### sign --- inline signature for $TEMP/body, output in $TEMP/body.asc sign() { gpg -u "$userid" --armor --textmode --clearsign \ <$TEMP/body >$TEMP/body.asc } ### encrypt recipients -- encrypt $TEMP/body to recipients encrypt() { R= for i in $KL ; do R="$R -r $i" done gpg --no-encrypt-to -u "$userid" --armor --textmode \ --always-trust --output $TEMP/body.asc \ -r "$userid" $R --sign --encrypt $TEMP/body } ### Mainline processing FILE="$1" ## we assume a disk file if [ ! -r "$FILE" ] ; then echo "cannot read $FILE" >&2 exit 1 fi case "$function" in encrypt) lookupkeys "$FILE" || exit 1 esac cp "$FILE" "$FILE.orig" outfile="$FILE" headbody "$FILE" CT="" if grep -i "^mime-version:" $TEMP/head >/dev/null 2>&1 ; then >$TEMP/newheaders if CT=`getheader content-type $TEMP/head` ; then echo "$CT" >$TEMP/newbody if grep -i multipart $TEMP/newbody >/dev/null 2>&1 ; then usemime=y # Force MIME if already multi-part fi getheader content-transfer-encoding $TEMP/head \ >>$TEMP/newbody || : else CT="" fi else echo "Mime-Version: 1.0" >$TEMP/newheaders fi if [ "$usemime" = n ] ; then ### non-MIME ### case "$function" in sign) sign || exit 1 ;; encrypt) encrypt || exit 1 ;; esac cat $TEMP/head $TEMP/body.asc >$outfile || exit 1 exit 0 fi ### MIME ### BDRY="`newboundary`" if [ "$CT" = "" ] ; then echo "Content-Type: text/plain; charset=us-ascii" >$TEMP/newbody fi echo >>$TEMP/newbody case $function in sign) sed 's/^From / &/; s/[ ]*$//' $TEMP/body >>$TEMP/newbody if grep "^From " $TEMP/body >/dev/null 2>&1 ; then echo 'Warning: "From " lines in message body have been indented' >&2 fi if grep "[ ]$" $TEMP/body >/dev/null 2>&1 ; then echo 'Warning: trailing blanks removed from message body' >&2 fi echo 'Content-Type: multipart/signed; protocol="application/pgp-signature";' >>$TEMP/newheaders echo " micalg=pgp-sha1"'; boundary="'"$BDRY"'"' >>$TEMP/newheaders sed -e 's/$/ /' "$TEMP/newbody" >"$TEMP/body" detachsign || exit 1 ( echo "--$BDRY" cat $TEMP/newbody echo echo "--$BDRY" echo "Content-Type: application/pgp-signature" echo cat $TEMP/body.asc echo echo "--$BDRY--" echo ) >$TEMP/body ;; encrypt) cat $TEMP/body >>$TEMP/newbody echo 'Content-Type: multipart/encrypted; protocol="application/pgp-encrypted";' >>$TEMP/newheaders echo " boundary=\"$BDRY\"" >> $TEMP/newheaders mv $TEMP/newbody $TEMP/body || exit 1 encrypt || exit 1 ( echo "--$BDRY" echo "Content-Type: application/pgp-encrypted" echo echo "Version: 1" echo echo "--$BDRY" echo "Content-Type: application/octet-stream" echo cat $TEMP/body.asc echo echo "--$BDRY--" echo ) >"$TEMP/body" ;; esac fixheaders | cat - $TEMP/body >"$outfile" mmh-0.4/uip/mhlist.c0000644000000000000000000001452513414435726013115 0ustar rootroot/* ** mhlist.c -- list the contents of MIME messages ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include #include #include #include #include static struct swit switches[] = { #define VERBSW 0 { "verbose", 0 }, #define NVERBSW 1 { "noverbose", 2 }, #define FILESW 2 /* interface from show */ { "file file", 0 }, #define PARTSW 3 { "part number", 0 }, #define TYPESW 4 { "type content", 0 }, #define VERSIONSW 5 { "Version", 0 }, #define HELPSW 6 { "help", 0 }, #define DEBUGSW 7 { "debug", -5 }, { NULL, 0 } }; char *version=VERSION; /* mhparse.c */ extern char *tmp; /* directory to place temp files */ /* mhmisc.c */ extern int npart; extern int ntype; extern char *parts[NPARTS + 1]; extern char *types[NTYPES + 1]; extern int userrs; /* ** This is currently needed to keep mhparse happy. ** This needs to be changed. */ pid_t xpid = 0; int debugsw = 0; int verbosw = 0; #define quitser pipeser /* mhparse.c */ CT parse_mime(char *); /* mhmisc.c */ int part_ok(CT, int); int type_ok(CT, int); void set_endian(void); void flush_errors(void); /* mhlistsbr.c */ void list_all_messages(CT *, int, int); /* mhfree.c */ void free_content(CT); extern CT *cts; void freects_done(); /* ** static prototypes */ static void pipeser(int); int main(int argc, char **argv) { int msgnum; char *cp, *file = NULL, *folder = NULL; char *maildir, buf[100], **argp; char **arguments; struct msgs_array msgs = { 0, 0, NULL }; struct msgs *mp = NULL; CT ct, *ctp; if (atexit(freects_done) != 0) { adios(EX_OSERR, NULL, "atexit failed"); } setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; /* ** Parse arguments */ while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case PARTSW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); if (npart >= NPARTS) adios(EX_USAGE, NULL, "too many parts (starting with %s), %d max", cp, NPARTS); parts[npart++] = cp; continue; case TYPESW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); if (ntype >= NTYPES) adios(EX_USAGE, NULL, "too many types (starting with %s), %d max", cp, NTYPES); types[ntype++] = cp; continue; case FILESW: if (!(cp = *argp++) || (*cp == '-' && cp[1])) adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); file = *cp == '-' ? cp : mh_xstrdup(expanddir(cp)); continue; case VERBSW: verbosw = 1; continue; case NVERBSW: verbosw = 0; continue; case DEBUGSW: debugsw = 1; continue; } } if (*cp == '+' || *cp == '@') { if (folder) adios(EX_USAGE, NULL, "only one folder at a time!"); else folder = mh_xstrdup(expandfol(cp)); } else app_msgarg(&msgs, cp); } /* null terminate the list of acceptable parts/types */ parts[npart] = NULL; types[ntype] = NULL; set_endian(); /* ** Check for storage directory. If specified, ** then store temporary files there. Else we ** store them in standard nmh directory. */ if ((cp = context_find(nmhstorage)) && *cp) tmp = concat(cp, "/", invo_name, NULL); else tmp = mh_xstrdup(toabsdir(invo_name)); if (file && msgs.size) adios(EX_USAGE, NULL, "cannot specify msg and file at same time!"); /* ** check if message is coming from file */ if (file) { cts = mh_xcalloc(2, sizeof(*cts)); ctp = cts; if ((ct = parse_mime(file))) *ctp++ = ct; } else { /* ** message(s) are coming from a folder */ if (!msgs.size) app_msgarg(&msgs, seq_cur); if (!folder) folder = getcurfol(); maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) adios(EX_OSERR, maildir, "unable to change directory to"); /* read folder and create message structure */ if (!(mp = folder_read(folder))) adios(EX_IOERR, NULL, "unable to read folder %s", folder); /* check for empty folder */ if (mp->nummsg == 0) adios(EX_DATAERR, NULL, "no messages in %s", folder); /* parse all the message ranges/sequences and set SELECTED */ for (msgnum = 0; msgnum < msgs.size; msgnum++) { if (!m_convert(mp, msgs.msgs[msgnum])) { exit(EX_SOFTWARE); } } seq_setprev(mp); /* set the previous-sequence */ cts = mh_xcalloc(mp->numsel + 1, sizeof(*cts)); ctp = cts; for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (is_selected(mp, msgnum)) { char *msgnam; msgnam = m_name(msgnum); if ((ct = parse_mime(msgnam))) *ctp++ = ct; } } } if (!*cts) exit(EX_SOFTWARE); userrs = 1; SIGNAL(SIGQUIT, quitser); SIGNAL(SIGPIPE, pipeser); /* ** Get the associated umask for the relevant contents. */ for (ctp = cts; *ctp; ctp++) { struct stat st; ct = *ctp; if (type_ok(ct, 1) && !ct->c_umask) { if (stat(ct->c_file, &st) != NOTOK) ct->c_umask = ~(st.st_mode & 0777); else ct->c_umask = ~m_gmprot(); } } /* ** List the message content */ list_all_messages(cts, verbosw, debugsw); /* Now free all the structures for the content */ for (ctp = cts; *ctp; ctp++) free_content(*ctp); mh_free0(&cts); /* If reading from a folder, do some updating */ if (mp) { context_replace(curfolder, folder); /* update current folder */ seq_setcur(mp, mp->hghsel); /* update current message */ seq_save(mp); /* synchronize sequences */ context_save(); /* save the context file */ } return EX_OK; } static void pipeser(int i) { if (i == SIGQUIT) { unlink("core"); fflush(stdout); fprintf(stderr, "\n"); fflush(stderr); } _exit(EX_IOERR); /* NOTREACHED */ } mmh-0.4/uip/mhfree.c0000644000000000000000000000742113414435726013060 0ustar rootroot/* ** mhfree.c -- routines to free the data structures used to ** -- represent MIME messages ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include /* The list of top-level contents to display */ CT *cts = NULL; /* ** prototypes */ void free_content(CT); void free_header(CT); void free_ctinfo(CT); void free_encoding(CT, int); void freects_done(); /* ** static prototypes */ static void free_text(CT); static void free_multi(CT); static void free_partial(CT); /* ** Primary routine to free a MIME content structure */ void free_content(CT ct) { if (!ct) return; /* ** free all the header fields */ free_header(ct); if (ct->c_partno) mh_free0(&(ct->c_partno)); if (ct->c_vrsn) mh_free0(&(ct->c_vrsn)); if (ct->c_ctline) mh_free0(&(ct->c_ctline)); free_ctinfo(ct); /* ** some of the content types have extra ** parts which need to be freed. */ switch (ct->c_type) { case CT_MULTIPART: free_multi(ct); break; case CT_MESSAGE: if (ct->c_subtype == MESSAGE_PARTIAL) { free_partial(ct); } break; case CT_TEXT: free_text(ct); break; } if (ct->c_charset) mh_free0(&(ct->c_charset)); if (ct->c_showproc) mh_free0(&(ct->c_showproc)); if (ct->c_storeproc) mh_free0(&(ct->c_storeproc)); if (ct->c_celine) mh_free0(&(ct->c_celine)); /* free structures for content encodings */ free_encoding(ct, 1); if (ct->c_id) mh_free0(&(ct->c_id)); if (ct->c_descr) mh_free0(&(ct->c_descr)); if (ct->c_dispo) mh_free0(&(ct->c_dispo)); if (ct->c_file) { if (ct->c_unlink) unlink(ct->c_file); mh_free0(&(ct->c_file)); } if (ct->c_fp) fclose(ct->c_fp); if (ct->c_storage) mh_free0(&(ct->c_storage)); if (ct->c_folder) mh_free0(&(ct->c_folder)); mh_free0(&ct); } /* ** Free the linked list of header fields ** for this content. */ void free_header(CT ct) { HF hp1, hp2; hp1 = ct->c_first_hf; while (hp1) { hp2 = hp1->next; mh_free0(&(hp1->name)); mh_free0(&(hp1->value)); mh_free0(&hp1); hp1 = hp2; } ct->c_first_hf = NULL; ct->c_last_hf = NULL; } void free_ctinfo(CT ct) { char **ap; CI ci; ci = &ct->c_ctinfo; if (ci->ci_type) { mh_free0(&(ci->ci_type)); } if (ci->ci_subtype) { mh_free0(&(ci->ci_subtype)); } for (ap = ci->ci_attrs; *ap; ap++) { mh_free0(ap); } if (ci->ci_comment) { mh_free0(&(ci->ci_comment)); } if (ci->ci_magic) { mh_free0(&(ci->ci_magic)); } } static void free_text(CT ct) { struct text *t; if (!(t = (struct text *) ct->c_ctparams)) return; mh_free0(&t); } static void free_multi(CT ct) { struct multipart *m; struct part *part, *next; if (!(m = (struct multipart *) ct->c_ctparams)) return; if (m->mp_start) mh_free0(&(m->mp_start)); if (m->mp_stop) mh_free0(&(m->mp_stop)); for (part = m->mp_parts; part; part = next) { next = part->mp_next; free_content(part->mp_part); mh_free0(&part); } mh_free0(&m); } static void free_partial(CT ct) { struct partial *p; if (!(p = (struct partial *) ct->c_ctparams)) return; if (p->pm_partid) mh_free0(&(p->pm_partid)); mh_free0(&p); } /* ** Free data structures related to encoding/decoding ** Content-Transfer-Encodings. */ void free_encoding(CT ct, int toplevel) { CE ce; if (!(ce = ct->c_cefile)) return; if (ce->ce_fp) { fclose(ce->ce_fp); ce->ce_fp = NULL; } if (ce->ce_file) { if (ce->ce_unlink) unlink(ce->ce_file); mh_free0(&(ce->ce_file)); } if (toplevel) { mh_free0(&ce); } else { ct->c_ceopenfnx = NULL; } } void freects_done() { CT *ctp; if ((ctp = cts)) { for (; *ctp; ctp++){ free_content(*ctp); } } } mmh-0.4/uip/dist.c0000644000000000000000000000733113414435726012555 0ustar rootroot/* ** dist.c -- re-distribute a message ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include static struct swit switches[] = { #define ANNOSW 0 { "annotate", 0 }, #define NANNOSW 1 { "noannotate", 2 }, #define EDITRSW 2 { "editor editor", 0 }, #define FORMSW 3 { "form formfile", 0 }, #define WHATSW 4 { "whatnowproc program", 0 }, #define VERSIONSW 5 { "Version", 0 }, #define HELPSW 6 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; int main(int argc, char **argv) { int anot = 0; int in, out; char *cp, *cwd, *maildir, *msgnam; char *ed = NULL, *folder = NULL; char *form = NULL, *msg = NULL, buf[BUFSIZ], drft[BUFSIZ]; char **argp, **arguments; struct msgs *mp = NULL; char *fmtstr; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [msg] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case ANNOSW: anot++; continue; case NANNOSW: anot = 0; continue; case EDITRSW: if (!(ed = *argp++) || *ed == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case WHATSW: if (!(whatnowproc = *argp++) || *whatnowproc == '-') { adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case FORMSW: if (!(form = *argp++) || *form == '-') { adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; } } if (*cp == '+' || *cp == '@') { if (folder) { adios(EX_USAGE, NULL, "only one folder at a time!"); } else { folder = mh_xstrdup(expandfol(cp)); } } else { if (msg) { adios(EX_USAGE, NULL, "only one message at a time!"); } else { msg = cp; } } } cwd = mh_xstrdup(pwd()); strncpy(drft, m_draft(seq_beyond), sizeof(drft)); if ((out = creat(drft, m_gmprot())) == NOTOK) { adios(EX_CANTCREAT, drft, "unable to create"); } fmtstr = new_fs(form, distcomps); if (write(out, fmtstr, strlen(fmtstr)) != (int)strlen(fmtstr)) { adios(EX_IOERR, drft, "error writing"); } close(out); if (!msg) { msg = seq_cur; } if (!folder) { folder = getcurfol(); } maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) { adios(EX_OSERR, maildir, "unable to change directory to"); } if (!(mp = folder_read(folder))) { adios(EX_IOERR, NULL, "unable to read folder %s", folder); } /* check for empty folder */ if (mp->nummsg == 0) { adios(EX_NOINPUT, NULL, "no messages in %s", folder); } /* parse the message range/sequence/name and set SELECTED */ if (!m_convert(mp, msg)) { exit(EX_USAGE); } seq_setprev(mp); if (mp->numsel > 1) { adios(EX_USAGE, NULL, "only one message at a time!"); } msgnam = mh_xstrdup(m_name(mp->lowsel)); if ((in = open(msgnam, O_RDONLY)) == NOTOK) { adios(EX_IOERR, msgnam, "unable to open message"); } context_replace(curfolder, folder); seq_setcur(mp, mp->lowsel); seq_save(mp); /* synchronize sequences */ context_save(); what_now(ed, NOUSE, drft, msgnam, 1, mp, anot ? "Resent" : NULL, cwd); return EX_SOFTWARE; } mmh-0.4/uip/pick.c0000644000000000000000000006543613414435726012552 0ustar rootroot/* ** pick.c -- search for messages by content ** ** This code is Copyright (c) 2002, 2008, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_TIME_H # include #endif #include static struct swit switches[] = { #define ANDSW 0 { "and", 0 }, #define ORSW 1 { "or", 0 }, #define NOTSW 2 { "not", 0 }, #define LBRSW 3 { "lbrace", 0 }, #define RBRSW 4 { "rbrace", 0 }, #define CCSW 5 { "cc pattern", 0 }, #define DATESW 6 { "date pattern", 0 }, #define FROMSW 7 { "from pattern", 0 }, #define SRCHSW 8 { "search pattern", 0 }, #define SUBJSW 9 { "subject pattern", 0 }, #define TOSW 10 { "to pattern", 0 }, #define OTHRSW 11 { "-othercomponent pattern", 0 }, #define AFTRSW 12 { "after date", 0 }, #define BEFRSW 13 { "before date", 0 }, #define DATFDSW 14 { "datefield field", 5 }, /* 5 chars required to differ from -date */ #define SEQSW 15 { "sequence name", 0 }, #define PUBLSW 16 { "public", 0 }, #define NPUBLSW 17 { "nopublic", 2 }, #define ZEROSW 18 { "zero", 0 }, #define NZEROSW 19 { "nozero", 2 }, #define LISTSW 20 { "list", 0 }, #define NLISTSW 21 { "nolist", 2 }, #define FORMATSW 22 { "format format", 0 }, #define WIDTHSW 23 { "width columns", 0 }, #define THREADSW 24 { "thread", 0 }, #define FILESW 25 { "file file", 0 }, #define VERSIONSW 26 { "Version", 0 }, #define HELPSW 27 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; struct nexus { boolean (*action)(struct field *, int, void *); void (*free)(struct nexus **); void (*debug)(void *, size_t); void *data; }; static struct nexus *head; static boolean body = FALSE; /* ** static prototypes */ static int pcompile(char **, char *); static int pmatches(FILE *, int); static struct nexus * createonethread(char *); static struct nexus * createpickthread(char *); static void scan_mbox(char *, char *, int); static int listsw = -1; void putzero_done(); static void printmsg(FILE *, struct msgs *, int, char *, int); int main(int argc, char **argv) { int publicsw = -1, zerosw = 1, vecp = 0, width = 0; unsigned int seqp = 0; int lo, hi, msgnum; char *maildir, *folder = NULL, buf[100]; char *cp, **argp, **arguments; char *seqs[NUMATTRS + 1], *vec[MAXARGS]; struct msgs_array msgs = { 0, 0, NULL }; struct msgs *mp; char *form = NULL; char *fmtstr; FILE *fp; char *file = NULL; if (atexit(putzero_done) != 0) { adios(EX_OSERR, NULL, "atexit failed"); } setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; if (strcmp(invo_name, "scan")==0) { form = scanformat; } while ((cp = *argp++)) { if (*cp == '-') { if (*++cp == '-') { vec[vecp++] = --cp; goto pattern; } switch (smatch(cp, switches)) { case AMBIGSW: ambigsw(cp, switches); listsw = 0; /* HACK */ exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name); print_help(buf, switches, 1); listsw = 0; /* HACK */ exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); listsw = 0; /* HACK */ exit(argc == 2 ? EX_OK : EX_USAGE); case CCSW: case DATESW: case FROMSW: case SUBJSW: case TOSW: case DATFDSW: case AFTRSW: case BEFRSW: case SRCHSW: case THREADSW: vec[vecp++] = --cp; pattern: if (!(cp = *argp++)) /* allow -xyz arguments */ adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); vec[vecp++] = cp; continue; case OTHRSW: adios(EX_SOFTWARE, NULL, "internal error!"); case ANDSW: case ORSW: case NOTSW: case LBRSW: case RBRSW: vec[vecp++] = --cp; continue; case SEQSW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); /* check if too many sequences specified */ if (seqp >= NUMATTRS) adios(EX_USAGE, NULL, "too many sequences (more than %d) specified", NUMATTRS); if (!seq_nameok(cp)) exit(EX_USAGE); seqs[seqp++] = cp; continue; case PUBLSW: publicsw = 1; continue; case NPUBLSW: publicsw = 0; continue; case ZEROSW: zerosw++; continue; case NZEROSW: zerosw = 0; continue; case LISTSW: listsw = 1; continue; case NLISTSW: listsw = 0; continue; case FORMATSW: if (!(form = *argp++) || *form == '-') { adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case WIDTHSW: if (!(cp = *argp++) || *cp == '-') { adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } width = atoi(cp); continue; case FILESW: if (!(cp = *argp++) || (cp[0] == '-' && cp[1])) { adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } if (strcmp(file = cp, "-")!=0) { file = mh_xstrdup(expanddir(cp)); } continue; } } if (*cp == '+' || *cp == '@') { if (folder) adios(EX_USAGE, NULL, "only one folder at a time!"); else folder = mh_xstrdup(expandfol(cp)); } else app_msgarg(&msgs, cp); } vec[vecp] = NULL; fmtstr = new_fs(form, "pick.default"); if (file) { if (folder) { adios(EX_USAGE, NULL, "\"+folder\" not allowed with -file"); } if (msgs.size) { adios(EX_USAGE, NULL, "\"msgs\" not allowed with -file"); } if (vecp) { adios(EX_USAGE, NULL, "section arguments not allowed with -file"); } scan_mbox(file, fmtstr, width); exit(EX_OK); } /* ** If we didn't specify which messages to search, ** then search the whole folder. */ if (!msgs.size) app_msgarg(&msgs, seq_all); if (!folder) folder = getcurfol(); maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) adios(EX_OSERR, maildir, "unable to change directory to"); /* read folder and create message structure */ if (!(mp = folder_read(folder))) adios(EX_IOERR, NULL, "unable to read folder %s", folder); /* check for empty folder */ if (mp->nummsg == 0) adios(EX_DATAERR, NULL, "no messages in %s", folder); /* parse all the message ranges/sequences and set SELECTED */ for (msgnum = 0; msgnum < msgs.size; msgnum++) if (!m_convert(mp, msgs.msgs[msgnum])) exit(EX_USAGE); seq_setprev(mp); /* set the previous-sequence */ /* ** If we aren't saving the results to a sequence, ** we default to list the results. */ if (listsw == -1) listsw = !seqp; if (publicsw == 1 && is_readonly(mp)) adios(EX_NOPERM, NULL, "folder %s is read-only, so -public not allowed", folder); if (!pcompile(vec, NULL)) exit(EX_SOFTWARE); lo = mp->lowsel; hi = mp->hghsel; /* ** If printing message numbers to standard out, ** force line buffering on. */ if (listsw) setvbuf(stdout, NULL, _IOLBF, 0); /* ** Scan through all the SELECTED messages and check for a ** match. If the message does not match, then unselect it. */ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (is_selected(mp, msgnum)) { if ((fp = fopen(cp = m_name(msgnum), "r")) == NULL) admonish(cp, "unable to read message"); if (fp && pmatches(fp, msgnum)) { if (msgnum < lo) lo = msgnum; if (msgnum > hi) hi = msgnum; if (listsw) { printmsg(fp, mp, msgnum, fmtstr, width); } } else { /* if it doesn't match, then unselect it */ unset_selected(mp, msgnum); } if (fp) fclose(fp); } } if (head) { head->free(&head); } mp->lowsel = lo; mp->hghsel = hi; if (mp->numsel <= 0) adios(EX_DATAERR, NULL, "no messages match specification"); seqs[seqp] = NULL; /* ** Add the matching messages to sequences */ for (seqp = 0; seqs[seqp]; seqp++) if (!seq_addsel(mp, seqs[seqp], publicsw, zerosw)) exit(EX_USAGE); /* ** Print total matched if not printing each matched message number. */ if (!listsw) { printf("%d hit%s\n", mp->numsel, mp->numsel == 1 ? "" : "s"); } context_replace(curfolder, folder); /* update current folder */ seq_save(mp); /* synchronize message sequences */ context_save(); /* save the context file */ folder_free(mp); /* free folder/message structure */ listsw = 0; /* HACK */ return 0; } static void scan_mbox(char *file, char *fmtstr, int width) { FILE *in; int msgnum; int state; if (strcmp(file, "-") == 0) { in = stdin; file = "stdin"; } else if (!(in = fopen(file, "r"))) { adios(EX_IOERR, file, "unable to open"); } for (msgnum = 1; ;msgnum++) { state = scan(in, msgnum, SCN_MBOX, fmtstr, width, 0, 0); if (state != SCNMSG) { break; } } fclose(in); } void putzero_done() { if (listsw && !isatty(fileno(stdout))) printf("0\n"); } static void printmsg(FILE *f, struct msgs *mp, int msgnum, char *fmtstr, int width) { int seqnum; int state; boolean unseen = FALSE; fseek(f, 0L, SEEK_SET); seqnum = seq_getnum(mp, seq_unseen); unseen = in_sequence(mp, seqnum, msgnum); switch (state = scan(f, msgnum, SCN_FOLD, fmtstr, width, msgnum==mp->curmsg, unseen)) { case SCNMSG: case SCNERR: break; case SCNEOF: advise(NULL, "message %d: empty", msgnum); break; default: adios(EX_SOFTWARE, NULL, "scan() botch(%d)", state); } } static struct swit parswit[] = { #define PRAND 0 { "and", 0 }, #define PROR 1 { "or", 0 }, #define PRNOT 2 { "not", 0 }, #define PRLBR 3 { "lbrace", 0 }, #define PRRBR 4 { "rbrace", 0 }, #define PRCC 5 { "cc pattern", 0 }, #define PRDATE 6 { "date pattern", 0 }, #define PRFROM 7 { "from pattern", 0 }, #define PRSRCH 8 { "search pattern", 0 }, #define PRSUBJ 9 { "subject pattern", 0 }, #define PRTO 10 { "to pattern", 0 }, #define PROTHR 11 { "-othercomponent pattern", 15 }, #define PRAFTR 12 { "after date", 0 }, #define PRBEFR 13 { "before date", 0 }, #define PRDATF 14 { "datefield field", 5 }, #define PRTHREAD 15 { "thread msg", 0 }, { NULL, 0 } }; /* DEFINITIONS FOR PATTERN MATCHING */ /* ** We really should be using re_comp() and re_exec() here. Unfortunately, ** pick advertises that lowercase characters matches characters of both ** cases. Since re_exec() doesn't exhibit this behavior, we are stuck ** with this version. Furthermore, we need to be able to save and restore ** the state of the pattern matcher in order to do things "efficiently". ** ** The matching power of this algorithm isn't as powerful as the re_xxx() ** routines (no \(xxx\) and \n constructs). Such is life. */ #define CCHR 2 #define CDOT 4 #define CCL 6 #define NCCL 8 #define CDOL 10 #define CEOF 11 #define STAR 01 #define LBSIZE 1024 #define ESIZE 1024 /* ** DEFINITIONS FOR NEXUS */ #define nxtarg() (*argp ? *argp++ : NULL) #define prvarg() argp-- #define padvise if (!talked++) advise enum nexus_type { TYPE_GREP, TYPE_DATE, TYPE_OR, TYPE_AND, TYPE_NOT }; struct bin_data { struct nexus *left; struct nexus *right; enum nexus_type type; int oldmsgnum; boolean leftmatch; boolean rightmatch; boolean match; }; struct date_data { char *datef; boolean after; struct tws tws; }; struct grep_data { char *header; char *pattern; regex_t *preg; }; static int talked; static int pdebug = 0; static char *datesw; static char **argp; /* ** prototypes for date routines */ static struct tws *tws_parse(char *, int); static struct tws *tws_special(char *); /* ** static prototypes */ static int gcompile(struct grep_data *, const char *); static int tcompile(char *, struct tws *, int); static struct nexus *parse(void); static struct nexus *nexp1(void); static struct nexus *nexp2(void); static struct nexus *nexp3(void); static struct nexus *newnexus(enum nexus_type); static boolean BINaction(struct field *, int, void *); static boolean NOTaction(struct field *, int, void *); static boolean GREPaction(struct field *, int, void *); static boolean DATEaction(struct field *, int, void *); static void BINfree(struct nexus **); static void GREPfree(struct nexus **); static void DATEfree(struct nexus **); static void BINdebug(void *, size_t); static void GREPdebug(void *, size_t); static void DATEdebug(void *, size_t); static int pcompile(char **vec, char *date) { char *cp; if ((cp = getenv("MHPDEBUG")) && *cp) pdebug++; argp = vec; if ((datesw = date) == NULL) datesw = "date"; talked = 0; if ((head = parse()) == NULL) return (talked ? 0 : 1); if (*argp) { padvise(NULL, "%s unexpected", *argp); return 0; } return 1; } static struct nexus * parse(void) { char *cp; struct nexus *n, *o; struct bin_data *bin; if ((n = nexp1()) == NULL || (cp = nxtarg()) == NULL) return n; if (*cp != '-') { padvise(NULL, "%s unexpected", cp); return NULL; } if (*++cp == '-') goto header; switch (smatch(cp, parswit)) { case AMBIGSW: ambigsw(cp, parswit); talked++; return NULL; case UNKWNSW: fprintf(stderr, "-%s unknown\n", cp); talked++; return NULL; case PROR: o = newnexus(TYPE_OR); bin = o->data; bin->left = n; if ((bin->right = parse())) return o; padvise(NULL, "missing disjunctive"); return NULL; header: ; default: prvarg(); return n; } } static struct nexus * nexp1(void) { char *cp; struct nexus *n, *o; struct bin_data *bin; if ((n = nexp2()) == NULL || (cp = nxtarg()) == NULL) return n; if (*cp != '-') { padvise(NULL, "%s unexpected", cp); return NULL; } if (*++cp == '-') goto header; switch (smatch(cp, parswit)) { case AMBIGSW: ambigsw(cp, parswit); talked++; return NULL; case UNKWNSW: fprintf(stderr, "-%s unknown\n", cp); talked++; return NULL; case PRAND: o = newnexus(TYPE_AND); bin = o->data; bin->left = n; if ((bin->right = nexp1())) return o; padvise(NULL, "missing conjunctive"); return NULL; header: ; default: prvarg(); return n; } } static struct nexus * nexp2(void) { char *cp; struct nexus *n; struct bin_data *bin; if ((cp = nxtarg()) == NULL) return NULL; if (*cp != '-') { prvarg(); return nexp3(); } if (*++cp == '-') goto header; switch (smatch(cp, parswit)) { case AMBIGSW: ambigsw(cp, parswit); talked++; return NULL; case UNKWNSW: fprintf(stderr, "-%s unknown\n", cp); talked++; return NULL; case PRNOT: n = newnexus(TYPE_NOT); bin = n->data; if ((bin->left = nexp3())) return n; padvise(NULL, "missing negation"); return NULL; header: ; default: prvarg(); return nexp3(); } } static struct nexus * nexp3(void) { int i; char *cp, *dp; char buffer[BUFSIZ], temp[64]; struct nexus *n; struct grep_data *gdata; struct date_data *twsd; if ((cp = nxtarg()) == NULL) return NULL; if (*cp != '-') { padvise(NULL, "%s unexpected", cp); return NULL; } if (*++cp == '-') { dp = ++cp; goto header; } switch (i = smatch(cp, parswit)) { case AMBIGSW: ambigsw(cp, parswit); talked++; return NULL; case UNKWNSW: fprintf(stderr, "-%s unknown\n", cp); talked++; return NULL; case PRLBR: if ((n = parse()) == NULL) { padvise(NULL, "missing group"); return NULL; } if ((cp = nxtarg()) == NULL) { padvise(NULL, "missing -rbrace"); return NULL; } if (*cp++ == '-' && smatch(cp, parswit) == PRRBR) return n; padvise(NULL, "%s unexpected", --cp); return NULL; default: prvarg(); return NULL; case PRTHREAD: if (!(cp = nxtarg())) { /* allow -xyz arguments */ padvise(NULL, "missing argument to %s", argp[-2]); } return createpickthread(cp); case PRCC: case PRDATE: case PRFROM: case PRTO: case PRSUBJ: strncpy(temp, parswit[i].sw, sizeof(temp)); temp[sizeof(temp) - 1] = '\0'; dp = *brkstring(temp, " ", NULL); header: ; if (!(cp = nxtarg())) { /* allow -xyz arguments */ padvise(NULL, "missing argument to %s", argp[-2]); return NULL; } n = newnexus(TYPE_GREP); gdata = n->data; gdata->header = mh_xstrdup(dp); snprintf(buffer, sizeof(buffer), "%s", cp); dp = buffer; goto pattern; case PRSRCH: n = newnexus(TYPE_GREP); gdata = n->data; gdata->header = NULL; body = TRUE; if (!(cp = nxtarg())) { /* allow -xyz arguments */ padvise(NULL, "missing argument to %s", argp[-2]); return NULL; } dp = cp; pattern: ; if (!gcompile(gdata, dp)) { padvise("regcomp", "pattern error in %s %s", argp[-2], cp); return NULL; } return n; case PROTHR: padvise(NULL, "internal error!"); return NULL; case PRDATF: if (!(datesw = nxtarg()) || *datesw == '-') { padvise(NULL, "missing argument to %s", argp[-2]); return NULL; } return nexp3(); case PRAFTR: case PRBEFR: if (!(cp = nxtarg())) { /* allow -xyz arguments */ padvise(NULL, "missing argument to %s", argp[-2]); return NULL; } n = newnexus(TYPE_DATE); twsd = n->data; twsd->datef = datesw; if (!tcompile(cp, &twsd->tws, twsd->after = i == PRAFTR)) { padvise(NULL, "unable to parse %s %s", argp[-2], cp); return NULL; } return n; } } static struct nexus * newnexus(enum nexus_type t) { struct nexus *p = NULL; struct bin_data *bin; p = mh_xcalloc(1, sizeof(struct nexus)); switch (t) { case TYPE_NOT: p->action = NOTaction; p->debug = BINdebug; p->free = BINfree; p->data = bin = mh_xcalloc(1, sizeof(struct bin_data)); bin->type = t; break; case TYPE_AND: case TYPE_OR: p->action = BINaction; p->debug = BINdebug; p->free = BINfree; p->data = bin = mh_xcalloc(1, sizeof(struct bin_data)); bin->type = t; break; case TYPE_GREP: p->action = GREPaction; p->debug = GREPdebug; p->free = GREPfree; p->data = mh_xcalloc(1, sizeof(struct grep_data)); break; case TYPE_DATE: p->action = DATEaction; p->debug = DATEdebug; p->free = DATEfree; p->data = mh_xcalloc(1, sizeof(struct date_data)); break; default: adios(EX_SOFTWARE, NULL, "unknown nexus type %d", t); } return p; } static int pmatches(FILE *fp, int msgnum) { struct field f = {{0}}; enum state s = FLD2; if (!head) return 1; if (!talked++ && pdebug && head->debug) { head->debug(head->data, 0); } while (s == FLD2 || s == BODY2) { switch (s = m_getfld2(s, &f, fp)) { case LENERR2: s = FLD2; /* FALL */ case FLD2: if (head->action(&f, msgnum, head->data)) { return TRUE; } break; case BODY2: if (!body) { return FALSE; } if (head->action(&f, msgnum, head->data)) { return TRUE; } break; case IOERR2: advise(NULL, "IOERR in message %d\n", msgnum); return FALSE; case FILEEOF2: return FALSE; default: adios(EX_SOFTWARE, "m_getfld2", "returned unknown state %d at message %d", s, msgnum); } } return FALSE; } void print_debug_level(size_t level) { size_t i; for (i = 0; i < level; i++) { fputs("| ", stderr); } } void BINdebug(void *data, size_t level) { struct bin_data *bd = data; print_debug_level(level); switch (bd->type) { case TYPE_OR: fputs("OR\n", stderr); break; case TYPE_AND: fputs("AND\n", stderr); break; case TYPE_NOT: fputs("NOT\n", stderr); break; default: advise(NULL, "binary nexus has unknown type: %d\n", bd->type); return; } if (bd->left && bd->left->debug) { bd->left->debug(bd->left->data, level+1); } else { print_debug_level(level+1); fputs("can't debug left child\n", stderr); } if (bd->right && bd->right->debug) { bd->right->debug(bd->right->data, level+1); } else if (bd->type != TYPE_NOT) { print_debug_level(level+1); fputs("can't debug right child\n", stderr); } } static boolean NOTaction(struct field *f, int msgnum, void *data) { struct bin_data *bin = data; return !bin->left->action(f, msgnum, bin->left->data); } static boolean BINaction(struct field *f, int msgnum, void *data) { struct bin_data *bin = data; if (bin->oldmsgnum != msgnum) { bin->oldmsgnum = msgnum; bin->match = FALSE; bin->leftmatch = FALSE; bin->rightmatch = FALSE; } if (bin->match) { return bin->match; } bin->leftmatch = bin->leftmatch || bin->left->action(f, msgnum, bin->left->data); bin->rightmatch = bin->rightmatch || bin->right->action(f, msgnum, bin->right->data); switch (bin->type) { case TYPE_OR: bin->match = bin->leftmatch || bin->rightmatch; break; case TYPE_AND: bin->match = bin->leftmatch && bin->rightmatch; break; default: adios(EX_SOFTWARE, NULL, "unknown nexus type: %d\n", bin->type); } return bin->match; } static void BINfree(struct nexus **n) { struct bin_data *bd; if (!(*n)) { return; } bd = (*n)->data; if (bd->left && bd->left->free) { bd->left->free(&bd->left); } else { advise(NULL, "BUG: can't free left child"); } if (bd->right && bd->right->free) { bd->right->free(&bd->right); } else { advise(NULL, "BUG: can't free right child"); } mh_free0(n); } static int gcompile(struct grep_data *g, const char *astr) { regex_t *preg = mh_xcalloc(1, sizeof(regex_t)); char *buf; int ret; g->preg = preg; g->pattern = mh_xstrdup(astr); ret = regcomp(preg, astr, REG_ICASE | REG_NOSUB); if (ret != 0) { buf = mh_xcalloc(BUFSIZ, sizeof(char)); regerror(ret, g->preg, buf, BUFSIZ*sizeof(char)); fprintf(stderr, "%s\n", buf); return FALSE; } return TRUE; } static boolean GREPaction(struct field *f, int msgnum, void *data) { struct grep_data *g = data; int ret; char buf[BUFSIZ]; if (!g->header && *f->name) { return FALSE; } /* check for the right field */ if (!(g->header && *g->header && mh_strcasecmp(g->header, f->name)==0)) { return FALSE; } if(decode_rfc2047(f->value, buf, sizeof(buf))) { ret = regexec(g->preg, buf, 0, NULL, 0); } else { ret = regexec(g->preg, f->value, 0, NULL, 0); } switch (ret) { case 0: return TRUE; case REG_NOMATCH: return FALSE; default: regerror(ret, g->preg, buf, sizeof(buf)); fprintf(stderr, "%s\n", buf); return FALSE; } } static void GREPfree(struct nexus **n) { struct grep_data *gd; if (!(*n)) { return; } gd = (*n)->data; mh_free0(&gd->header); regfree(gd->preg); mh_free0(n); } static void GREPdebug(void *data, size_t level) { struct grep_data *gd = data; char *buf, *buf2, *pbuf, *pbuf2; pbuf = pbuf2 = mh_xstrdup(gd->pattern); for (;*pbuf2; pbuf2++) { *pbuf2 = tolower(*pbuf2); } print_debug_level(level); if (gd->header) { buf = buf2 = mh_xstrdup(gd->header); for (;*buf2; buf2++) { *buf2 = tolower(*buf2); } fprintf(stderr, "PETTERN(%s) %s\n", buf, pbuf); } else { fprintf(stderr, "PETTERN(BODY) %s\n", pbuf); } mh_free0(&buf); mh_free0(&pbuf); } static int tcompile(char *ap, struct tws *tb, int isafter) { struct tws *tw; if ((tw = tws_parse(ap, isafter)) == NULL) return 0; twscopy(tb, tw); return 1; } static struct tws * tws_parse(char *ap, int isafter) { char buffer[BUFSIZ]; struct tws *tw, *ts; if ((tw = tws_special(ap)) != NULL) { tw->tw_sec = tw->tw_min = isafter ? 59 : 0; tw->tw_hour = isafter ? 23 : 0; return tw; } if ((tw = dparsetime(ap)) != NULL) return tw; if ((ts = dlocaltimenow()) == NULL) return NULL; snprintf(buffer, sizeof(buffer), "%s %s", ap, dtwszone(ts)); if ((tw = dparsetime(buffer)) != NULL) return tw; snprintf(buffer, sizeof(buffer), "%s %02d:%02d:%02d %s", ap, ts->tw_hour, ts->tw_min, ts->tw_sec, dtwszone(ts)); if ((tw = dparsetime(buffer)) != NULL) return tw; snprintf(buffer, sizeof(buffer), "%02d %s %04d %s", ts->tw_mday, tw_moty[ts->tw_mon], ts->tw_year, ap); if ((tw = dparsetime(buffer)) != NULL) return tw; snprintf(buffer, sizeof(buffer), "%02d %s %04d %s %s", ts->tw_mday, tw_moty[ts->tw_mon], ts->tw_year, ap, dtwszone(ts)); if ((tw = dparsetime(buffer)) != NULL) return tw; return NULL; } static struct tws * tws_special(char *ap) { int i; time_t clock; struct tws *tw; time(&clock); if (!mh_strcasecmp(ap, "today")) return dlocaltime(&clock); if (!mh_strcasecmp(ap, "yesterday")) { clock -= (long) (60 * 60 * 24); return dlocaltime(&clock); } if (!mh_strcasecmp(ap, "tomorrow")) { clock += (long) (60 * 60 * 24); return dlocaltime(&clock); } for (i = 0; tw_ldotw[i]; i++) if (!mh_strcasecmp(ap, tw_ldotw[i])) break; if (tw_ldotw[i]) { if ((tw = dlocaltime(&clock)) == NULL) return NULL; if ((i -= tw->tw_wday) > 0) i -= 7; } else if (*ap != '-') return NULL; else /* -ddd days ago */ i = atoi(ap); /* we should error check this */ clock += (long) ((60 * 60 * 24) * i); return dlocaltime(&clock); } static boolean DATEaction(struct field *f, int msgnum, void *data) { struct date_data *dd = data; boolean state = FALSE; char *bp; struct tws *tw; if (mh_strcasecmp(f->name, dd->datef)!=0) { return FALSE; } bp = mh_xstrdup(f->value); if ((tw = dparsetime(bp)) == NULL) { advise(NULL, "unable to parse %s field in message %d, not matching...", dd->datef, msgnum); state = FALSE; } else if (dd->after) { state = twsort(tw, &dd->tws) > 0; } else { state = twsort(tw, &dd->tws) < 0; } mh_free0(&bp); return state; } static void DATEfree(struct nexus **n) { struct date_data *dd; if (!(*n)) { return; } dd = (*n)->data; mh_free0(n); } static void DATEdebug(void *data, size_t level) { struct date_data *dd = data; print_debug_level(level); fprintf(stderr, "TEMPORAL(%s) %s: %s\n",dd->after ? "after" : "before", dd->datef, dasctime(&dd->tws)); } static struct nexus * createpickthread(char *msgs) { char *folder = NULL; struct msgs_array msgarray = {0}; struct msgs_array files = {0}; struct nexus *ret = NULL; struct nexus *c; struct nexus *or; struct bin_data *bd; char *buf; char **cp = brkstring(msgs, " \t", NULL); int i; for (; cp && *cp; cp++) { switch (**cp) { case '@': case '+': if (folder) { advise("",""); break; } folder = mh_xstrdup(*cp); break; default: app_msgarg(&msgarray, mh_xstrdup(*cp)); } } parse_msgs(&msgarray, folder, &files); for (i = 0; i < files.size; i++) { buf = getthreadid(files.msgs[i]); if (!buf) { adios(EX_DATAERR, NULL, "message %s is not part of a thread", basename(files.msgs[i])); continue; } c = createonethread(buf); if (!ret) { ret = c; continue; } or = newnexus(TYPE_OR); bd = or->data; bd->right = ret; bd->left = c; ret = or; } mh_free0(&(files.msgs)); mh_free0(&(msgarray.msgs)); return ret; } static struct nexus * createonethread(char *c) { struct nexus *ret = newnexus(TYPE_OR); struct nexus *left = newnexus(TYPE_GREP); struct nexus *right = newnexus(TYPE_GREP); struct bin_data *bd = ret->data; struct grep_data *gd = left->data; char buf[BUFSIZ]; bd->left = left; bd->right = right; gd->header = mh_xstrdup("message-id"); snprintf(buf, sizeof(buf), "^[ \t]*<%s>", c); if(!gcompile(gd, buf)) { padvise(NULL, "pattern error %s", c); goto error; } gd = right->data; gd->header = mh_xstrdup("references"); snprintf(buf, sizeof(buf), "^[ \t]*<%s>", c); if(!gcompile(gd, buf)) { padvise(NULL, "pattern error in %s", c); goto error; } return ret; error: GREPfree(&left); GREPfree(&right); BINfree(&ret); return NULL; } mmh-0.4/uip/mhparam.c0000644000000000000000000001266113414435726013241 0ustar rootroot/* ** mhparam.c -- print mh_profile values ** ** Originally contributed by ** Jeffrey C Honig ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include static struct swit switches[] = { #define COMPSW 0 { "components", 0 }, #define NCOMPSW 1 { "nocomponents", 2 }, #define ALLSW 2 { "all", 0 }, #define VERSIONSW 3 { "Version", 0 }, #define HELPSW 4 { "help", 0 }, #define DEBUGSW 5 { "debug", -5 }, { NULL, 0 } }; char *version=VERSION; struct proc { char *p_name; char **p_field; }; char *empty = ""; /* ** This list should contain all values of h/mh.h and config/config.c ** TODO: Add the constants Nbby, MAXARGS, NUMATTRS, NAMESZ */ static struct proc procs [] = { { "#--Version--", &empty }, { "version", &version }, { "lib-version", &lib_version }, { "#--Path-and-File-Names--", &empty }, { "mypath", &mypath }, { "mmhdir", &mmhdir }, { "mmhpath", &mmhpath }, { "profile", &profile }, { "defpath", &defpath }, { "context", &context }, { "ctxpath", &ctxpath }, { "mhetcdir", &mhetcdir }, { "mailspool", &mailspool }, { "mailstore", &mailstore }, { "mh-sequences", &mh_seq }, { "#--Default-Programs--", &empty }, { "editor", &defaulteditor }, { "pager", &defaultpager }, { "sendmail", &sendmail }, { "listproc", &listproc }, { "whatnowproc", &whatnowproc }, { "mimetypequeryproc", &mimetypequeryproc }, { "#--Mail-Folder-Names--", &empty }, { "inbox", &defaultfolder }, { "draftfolder", &draftfolder }, { "trashfolder", &trashfolder }, { "#--Profile-and-Context-Component-Names--", &empty }, { "curfolder-component", &curfolder }, { "inbox-component", &inbox }, { "mimetypequery-component", &mimetypequery }, { "nmhstorage-component", &nmhstorage }, { "nsequence-component", &nsequence }, { "psequence-component", &psequence }, { "usequence-component", &usequence }, { "#--Mmh-specific-Mail-Header-Names--", &empty }, { "attachment-header", &attach_hdr }, { "enc-header", &enc_hdr }, { "sign-header", &sign_hdr }, { "#--File-Permissions--", &empty }, { "foldprot", &foldprot }, { "msgprot", &msgprot }, { "#--Template-File-Names--", &empty }, { "components", &components }, { "digestcomps", &digestcomps }, { "distcomps", &distcomps }, { "forwcomps", &forwcomps }, { "rcvdistcomps", &rcvdistcomps }, { "replcomps", &replcomps }, { "replgroupcomps", &replgroupcomps }, { "mhlformat", &mhlformat }, { "mhlreply", &mhlreply }, { "scanformat", &scanformat }, { "#--Default-Sequence-Names--", &empty }, { "seq-all", &seq_all }, { "seq-beyond", &seq_beyond }, { "seq-cur", &seq_cur }, { "seq-first", &seq_first }, { "seq-last", &seq_last }, { "seq-next", &seq_next }, { "previous-sequence", &seq_prev }, { "unseen-sequence", &seq_unseen }, { "sequence-negation", &seq_neg }, { NULL, NULL }, }; /* ** static prototypes */ static char *p_find(char *); int main(int argc, char **argv) { int i, compp = 0, missed = 0; int all = 0, debug = 0; int components = -1; char *cp, buf[BUFSIZ], **argp; char **arguments, *comps[MAXARGS]; invo_name = mhbasename(argv[0]); context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [profile-components] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case COMPSW: components = 1; break; case NCOMPSW: components = 0; break; case ALLSW: all = 1; break; case DEBUGSW: debug = 1; break; } } else { comps[compp++] = cp; } } if (all) { struct node *np; if (compp) advise(NULL, "profile-components ignored with -all"); if (components >= 0) advise(NULL, "-%scomponents ignored with -all", components ? "" : "no"); /* print all entries in context/profile list */ for (np = m_defs; np; np = np->n_next) printf("%s: %s\n", np->n_name, np->n_field); } else if (debug) { struct proc *ps; /* ** Print the current value of everything in ** procs array. This will show their current ** value (as determined after context is read). */ for (ps = procs; ps->p_name; ps++) printf("%s: %s\n", ps->p_name, *ps->p_field ? *ps->p_field : ""); } else { if (components < 0) components = compp > 1; for (i = 0; i < compp; i++) { char *value; value = context_find(comps[i]); if (!value) value = p_find(comps[i]); if (value) { if (components) printf("%s: ", comps[i]); printf("%s\n", value); } else missed++; } } return missed; } static char * p_find(char *str) { struct proc *ps; for (ps = procs; ps->p_name; ps++) if (!mh_strcasecmp(ps->p_name, str)) return (*ps->p_field); return NULL; } mmh-0.4/uip/mhstore.c0000644000000000000000000006501013414435726013271 0ustar rootroot/* ** mhstore.c -- store the contents of MIME messages ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include #include #include #include #include static struct swit switches[] = { #define AUTOSW 0 { "auto", 0 }, #define NAUTOSW 1 { "noauto", 2 }, #define FILESW 2 /* interface from show */ { "file file", 0 }, #define PARTSW 3 { "part number", 0 }, #define TYPESW 4 { "type content", 0 }, #define VERSIONSW 5 { "Version", 0 }, #define HELPSW 6 { "help", 0 }, #define DEBUGSW 7 { "debug", -5 }, { NULL, 0 } }; char *version=VERSION; /* mhparse.c */ extern char *tmp; /* directory to place temp files */ /* mhmisc.c */ extern int npart; extern int ntype; extern char *parts[NPARTS + 1]; extern char *types[NTYPES + 1]; extern int userrs; int debugsw = 0; #define quitser pipeser /* mhparse.c */ CT parse_mime(char *); /* mhmisc.c */ int part_ok(CT, int); int type_ok(CT, int); void set_endian(void); void flush_errors(void); /* mhfree.c */ void free_content(CT); extern CT *cts; /* The list of top-level contents to display */ void freects_done(); /* ** static prototypes */ static void pipeser(int); int autosw = 1; /* ** Cache of current directory. This must be ** set before these routines are called. */ char *cwd; /* ** The directory in which to store the contents. */ static char *dir; /* ** Type for a compare function for qsort. This keeps ** the compiler happy. */ typedef int (*qsort_comp) (const void *, const void *); /* mhmisc.c */ int part_ok(CT, int); int type_ok(CT, int); int make_intermediates(char *); void flush_errors(void); /* mhshowsbr.c */ int show_content_aux(CT, int, char *, char *); /* ** static prototypes */ static void store_single_message(CT); static int store_switch(CT); static int store_generic(CT); static int store_multi(CT); static int store_partial(CT); static int store_external(CT); static int ct_compar(CT *, CT *); static int store_content(CT, CT); static int output_content_file(CT, int); static int output_content_folder(char *, char *); static int parse_format_string(CT, char *, char *, int, char *); static int copy_some_headers(FILE *, CT); static void store_all_messages(CT *); int main(int argc, char **argv) { int msgnum; char *cp, *file = NULL, *folder = NULL; char *maildir, buf[100], **argp; char **arguments; struct msgs_array msgs = { 0, 0, NULL }; struct msgs *mp = NULL; CT ct, *ctp; FILE *fp; if (atexit(freects_done) != 0) { adios(EX_OSERR, NULL, "atexit failed"); } setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; /* ** Parse arguments */ while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case AUTOSW: autosw++; continue; case NAUTOSW: autosw = 0; continue; case PARTSW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); if (npart >= NPARTS) adios(EX_USAGE, NULL, "too many parts (starting with %s), %d max", cp, NPARTS); parts[npart++] = cp; continue; case TYPESW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); if (ntype >= NTYPES) adios(EX_USAGE, NULL, "too many types (starting with %s), %d max", cp, NTYPES); types[ntype++] = cp; continue; case FILESW: if (!(cp = *argp++) || (*cp == '-' && cp[1])) adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); file = *cp == '-' ? cp : mh_xstrdup(expanddir(cp)); continue; case DEBUGSW: debugsw = 1; continue; } } if (*cp == '+' || *cp == '@') { if (folder) adios(EX_USAGE, NULL, "only one folder at a time!"); else folder = mh_xstrdup(expandfol(cp)); } else app_msgarg(&msgs, cp); } /* null terminate the list of acceptable parts/types */ parts[npart] = NULL; types[ntype] = NULL; set_endian(); /* ** Check if we've specified an additional profile */ if ((cp = getenv("MHSTORE"))) { if ((fp = fopen(cp, "r"))) { readconfig((struct node **) 0, fp, cp, 0); fclose(fp); } else { admonish("", "unable to read $MHSTORE profile (%s)", cp); } } /* ** Read the standard profile setup */ if ((fp = fopen(cp = etcpath("mhn.defaults"), "r"))) { readconfig((struct node **) 0, fp, cp, 0); fclose(fp); } /* ** Cache the current directory before we do any chdirs()'s. */ cwd = mh_xstrdup(pwd()); /* ** Check for storage directory. If specified, ** then store temporary files there. Else we ** store them in standard nmh directory. */ if ((cp = context_find(nmhstorage)) && *cp) tmp = concat(cp, "/", invo_name, NULL); else tmp = mh_xstrdup(toabsdir(invo_name)); if (file && msgs.size) adios(EX_USAGE, NULL, "cannot specify msg and file at same time!"); /* ** check if message is coming from file */ if (file) { cts = mh_xcalloc(2, sizeof(*cts)); ctp = cts; if ((ct = parse_mime(file))) *ctp++ = ct; } else { /* ** message(s) are coming from a folder */ if (!msgs.size) app_msgarg(&msgs, seq_cur); if (!folder) folder = getcurfol(); maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) adios(EX_OSERR, maildir, "unable to change directory to"); /* read folder and create message structure */ if (!(mp = folder_read(folder))) adios(EX_IOERR, NULL, "unable to read folder %s", folder); /* check for empty folder */ if (mp->nummsg == 0) adios(EX_DATAERR, NULL, "no messages in %s", folder); /* parse all the message ranges/sequences and set SELECTED */ for (msgnum = 0; msgnum < msgs.size; msgnum++) if (!m_convert(mp, msgs.msgs[msgnum])) exit(EX_USAGE); seq_setprev(mp); /* set the previous-sequence */ cts = mh_xcalloc(mp->numsel + 1, sizeof(*cts)); ctp = cts; for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (is_selected(mp, msgnum)) { char *msgnam; msgnam = m_name(msgnum); if ((ct = parse_mime(msgnam))) *ctp++ = ct; } } } if (!*cts) exit(EX_SOFTWARE); userrs = 1; SIGNAL(SIGQUIT, quitser); SIGNAL(SIGPIPE, pipeser); /* ** Get the associated umask for the relevant contents. */ for (ctp = cts; *ctp; ctp++) { struct stat st; ct = *ctp; if (type_ok(ct, 1) && !ct->c_umask) { if (stat(ct->c_file, &st) != NOTOK) ct->c_umask = ~(st.st_mode & 0777); else ct->c_umask = ~m_gmprot(); } } /* ** Store the message content */ store_all_messages(cts); /* Now free all the structures for the content */ for (ctp = cts; *ctp; ctp++) free_content(*ctp); mh_free0(&cts); /* If reading from a folder, do some updating */ if (mp) { context_replace(curfolder, folder); /* update current folder */ seq_setcur(mp, mp->hghsel); /* update current message */ seq_save(mp); /* synchronize sequences */ context_save(); /* save the context file */ } return 0; } static void pipeser(int i) { if (i == SIGQUIT) { unlink("core"); fflush(stdout); fprintf(stderr, "\n"); fflush(stderr); exit(EX_TEMPFAIL); } exit(EX_IOERR); /* NOTREACHED */ } /* ** Main entry point to store content from a collection of messages. */ static void store_all_messages(CT *cts) { CT ct, *ctp; char *cp; /* ** Check for the directory in which to ** store any contents. */ if ((cp = context_find(nmhstorage)) && *cp) dir = mh_xstrdup(cp); else dir = mh_xstrdup(cwd); for (ctp = cts; *ctp; ctp++) { ct = *ctp; store_single_message(ct); } flush_errors(); } /* ** Entry point to store the content ** in a (single) message */ static void store_single_message(CT ct) { if (type_ok(ct, 1)) { umask(ct->c_umask); store_switch(ct); if (ct->c_fp) { fclose(ct->c_fp); ct->c_fp = NULL; } if (ct->c_ceclosefnx) (*ct->c_ceclosefnx) (ct); } } /* ** Switching routine to store different content types */ static int store_switch(CT ct) { switch (ct->c_type) { case CT_MULTIPART: return store_multi(ct); break; case CT_MESSAGE: switch (ct->c_subtype) { case MESSAGE_PARTIAL: return store_partial(ct); break; case MESSAGE_EXTERNAL: return store_external(ct); case MESSAGE_RFC822: default: return store_generic(ct); break; } break; case CT_APPLICATION: case CT_TEXT: case CT_AUDIO: case CT_IMAGE: case CT_VIDEO: return store_generic(ct); break; default: adios(EX_DATAERR, NULL, "unknown content type %d", ct->c_type); break; } return OK; /* NOT REACHED */ } /* ** Generic routine to store a MIME content. ** (application, audio, video, image, text, message/rfc922) */ static int store_generic(CT ct) { char **ap, **vp, *cp, *filename; CI ci = &ct->c_ctinfo; /* ** Check if the content specifies a filename in its MIME parameters. ** Don't bother with this for type "message" ** (only the "message" subtype "rfc822" will use store_generic). */ if (autosw && ct->c_type != CT_MESSAGE) { /* First check for "filename" in Content-Disposition header */ filename = extract_name_value("filename", ct->c_dispo); if (filename && strcmp(filename, ct->c_dispo)!=0) { /* We found "filename" */ cp = mhbasename(filename); if (*cp && *cp!='.' && *cp!='|' && *cp!='!' && !strchr(cp, '%')) { /* filename looks good: use it */ ct->c_storeproc = mh_xstrdup(cp); goto finished; } } /* ** Check the attribute/value pairs, for the attribute "name". ** If found, take the basename, do a few sanity checks and ** copy the value into c_storeproc. */ for (ap = ci->ci_attrs, vp = ci->ci_values; *ap; ap++,vp++) { if (mh_strcasecmp(*ap, "name")!=0) { continue; } cp = mhbasename(*vp); if (*cp && *cp!='.' && *cp!='|' && *cp!='!' && !strchr(cp, '%')) { /* filename looks good: use it */ ct->c_storeproc = mh_xstrdup(cp); } break; } } finished: return store_content(ct, NULL); } /* ** Store the content of a multipart message */ static int store_multi(CT ct) { int result; struct multipart *m = (struct multipart *) ct->c_ctparams; struct part *part; result = NOTOK; for (part = m->mp_parts; part; part = part->mp_next) { CT p = part->mp_part; if (part_ok(p, 1) && type_ok(p, 1)) { result = store_switch(p); if (result == OK && ct->c_subtype == MULTI_ALTERNATE) break; } } return result; } /* ** Reassemble and store the contents of a collection ** of messages of type "message/partial". */ static int store_partial(CT ct) { int cur, hi, i; CT p, *ctp, *ctq; CT *base; struct partial *pm, *qm; qm = (struct partial *) ct->c_ctparams; if (qm->pm_stored) return OK; hi = i = 0; for (ctp = cts; *ctp; ctp++) { p = *ctp; if (p->c_type == CT_MESSAGE && p->c_subtype == ct->c_subtype) { pm = (struct partial *) p->c_ctparams; if (!pm->pm_stored && strcmp(qm->pm_partid, pm->pm_partid) == 0) { pm->pm_marked = pm->pm_partno; if (pm->pm_maxno) hi = pm->pm_maxno; pm->pm_stored = 1; i++; } else pm->pm_marked = 0; } } if (hi == 0) { advise(NULL, "missing (at least) last part of multipart message"); return NOTOK; } base = mh_xcalloc(i + 1, sizeof(*base)); ctq = base; for (ctp = cts; *ctp; ctp++) { p = *ctp; if (p->c_type == CT_MESSAGE && p->c_subtype == ct->c_subtype) { pm = (struct partial *) p->c_ctparams; if (pm->pm_marked) *ctq++ = p; } } *ctq = NULL; if (i > 1) qsort((char *) base, i, sizeof(*base), (qsort_comp) ct_compar); cur = 1; for (ctq = base; *ctq; ctq++) { p = *ctq; pm = (struct partial *) p->c_ctparams; if (pm->pm_marked != cur) { if (pm->pm_marked == cur - 1) { admonish(NULL, "duplicate part %d of %d part multipart message", pm->pm_marked, hi); continue; } missing_part: advise (NULL, "missing %spart %d of %d part multipart message", cur != hi ? "(at least) " : "", cur, hi); goto losing; } else cur++; } if (hi != --cur) { cur = hi; goto missing_part; } /* ** Now cycle through the sorted list of messages of type ** "message/partial" and save/append them to a file. */ ctq = base; ct = *ctq++; if (store_content(ct, NULL) == NOTOK) { losing: mh_free0(&base); return NOTOK; } for (; *ctq; ctq++) { p = *ctq; if (store_content(p, ct) == NOTOK) goto losing; } mh_free0(&base); return OK; } /* ** Show how to retrieve content of type "message/external". */ static int store_external(CT ct) { char **ap, **ep; char *msg; FILE *fp; char buf[BUFSIZ]; msg = add("You need to fetch the contents yourself:", NULL); ap = ct->c_ctinfo.ci_attrs; ep = ct->c_ctinfo.ci_values; for (; *ap; ap++, ep++) { msg = add(concat("\n\t", *ap, ": ", *ep, NULL), msg); } if (!(fp = fopen(ct->c_file, "r"))) { adios(EX_IOERR, ct->c_file, "unable to open"); } fseek(fp, ct->c_begin, SEEK_SET); while (!feof(fp) && ftell(fp) < ct->c_end) { if (!fgets(buf, sizeof buf, fp)) { adios(EX_IOERR, ct->c_file, "unable to read"); } *strchr(buf, '\n') = '\0'; msg = add(concat("\n\t", buf, NULL), msg); } fclose(fp); advise(NULL, msg); return OK; } /* ** Compare the numbering from two different ** message/partials (needed for sorting). */ static int ct_compar(CT *a, CT *b) { struct partial *am = (struct partial *) ((*a)->c_ctparams); struct partial *bm = (struct partial *) ((*b)->c_ctparams); return (am->pm_marked - bm->pm_marked); } /* ** Store contents of a message or message part to ** a folder, a file, the standard output, or pass ** the contents to a command. ** ** If the current content to be saved is a followup part ** to a collection of messages of type "message/partial", ** then field "p" is a pointer to the Content structure ** to the first message/partial in the group. */ static int store_content(CT ct, CT p) { int appending = 0, msgnum = 0; int is_partial = 0, first_partial = 0; int last_partial = 0; char *cp, buffer[BUFSIZ]; /* ** Do special processing for messages of ** type "message/partial". ** ** We first check if this content is of type ** "message/partial". If it is, then we need to check ** whether it is the first and/or last in the group. ** ** Then if "p" is a valid pointer, it points to the Content ** structure of the first partial in the group. So we copy ** the file name and/or folder name from that message. In ** this case, we also note that we will be appending. */ if (ct->c_type == CT_MESSAGE && ct->c_subtype == MESSAGE_PARTIAL) { struct partial *pm = (struct partial *) ct->c_ctparams; /* Yep, it's a message/partial */ is_partial = 1; /* But is it the first and/or last in the collection? */ if (pm->pm_partno == 1) first_partial = 1; if (pm->pm_maxno && pm->pm_partno == pm->pm_maxno) last_partial = 1; /* ** If "p" is a valid pointer, then it points to the ** Content structure for the first message in the group. ** So we just copy the filename or foldername information ** from the previous iteration of this function. */ if (p) { appending = 1; ct->c_storage = mh_xstrdup(p->c_storage); /* record the folder name */ if (p->c_folder) { ct->c_folder = mh_xstrdup(p->c_folder); } goto got_filename; } } /* ** Get storage formatting string. ** ** 1) If we have storeproc defined, then use that ** 2) Else check for a mhstore-store-/ entry ** 3) Else check for a mhstore-store- entry ** 4) Else if content is "message", use "+" (current folder) ** 5) Else use string "%m%P.%s". */ if (!(cp = ct->c_storeproc) || !*cp) { CI ci = &ct->c_ctinfo; snprintf(buffer, sizeof(buffer), "%s-store-%s/%s", invo_name, ci->ci_type, ci->ci_subtype); if ((cp = context_find(buffer)) == NULL || *cp == '\0') { snprintf(buffer, sizeof(buffer), "%s-store-%s", invo_name, ci->ci_type); if ((cp = context_find(buffer)) == NULL || *cp == '\0') { cp = ct->c_type == CT_MESSAGE ? "+" : "%m%P.%s"; } } } /* ** Check the beginning of storage formatting string ** to see if we are saving content to a folder. */ if (*cp == '+' || *cp == '@') { char *tmpfilenam, *folder; /* Store content in temporary file for now */ tmpfilenam = m_mktemp(invo_name, NULL, NULL); ct->c_storage = mh_xstrdup(tmpfilenam); /* Get the folder name */ if (cp[1]) folder = mh_xstrdup(expandfol(cp)); else folder = getcurfol(); /* Check if folder exists */ create_folder(toabsdir(folder), 0, exit); /* Record the folder name */ ct->c_folder = mh_xstrdup(folder); if (cp[1]) mh_free0(&folder); goto got_filename; } /* ** Parse and expand the storage formatting string ** in `cp' into `buffer'. */ parse_format_string(ct, cp, buffer, sizeof(buffer), dir); /* ** If formatting begins with '|' or '!', then pass ** content to standard input of a command and return. */ if (buffer[0] == '|' || buffer[0] == '!') return show_content_aux(ct, 0, buffer + 1, dir); /* record the filename */ ct->c_storage = mh_xstrdup(buffer); got_filename: /* flush the output stream */ fflush(stdout); /* Now save or append the content to a file */ if (output_content_file(ct, appending) == NOTOK) return NOTOK; /* ** If necessary, link the file into a folder and remove ** the temporary file. If this message is a partial, ** then only do this if it is the last one in the group. */ if (ct->c_folder && (!is_partial || last_partial)) { msgnum = output_content_folder(ct->c_folder, ct->c_storage); unlink(ct->c_storage); if (msgnum == NOTOK) return NOTOK; } /* ** Now print out the name/number of the message ** that we are storing. */ if (is_partial) { if (first_partial) fprintf(stderr, "reassembling partials "); if (last_partial) fprintf(stderr, "%s", ct->c_file); else fprintf(stderr, "%s,", ct->c_file); } else { fprintf(stderr, "storing message %s", ct->c_file); if (ct->c_partno) fprintf(stderr, " part %s", ct->c_partno); } /* ** Unless we are in the "middle" of group of message/partials, ** we now print the name of the file, folder, and/or message ** to which we are storing the content. */ if (!is_partial || last_partial) { if (ct->c_folder) { fprintf(stderr, " to folder %s as message %d\n", ct->c_folder, msgnum); } else if (strcmp(ct->c_storage, "-")==0) { fprintf(stderr, " to stdout\n"); } else { int cwdlen; cwdlen = strlen(cwd); fprintf(stderr, " as file %s\n", strncmp(ct->c_storage, cwd, cwdlen)!=0 || ct->c_storage[cwdlen] != '/' ? ct->c_storage : ct->c_storage + cwdlen + 1); } } return OK; } /* ** Output content to a file */ static int output_content_file(CT ct, int appending) { int filterstate; char *file, buffer[BUFSIZ]; long pos, last; FILE *fp; /* ** If the pathname contains directories, make sure ** all of them exist. */ if (strchr(ct->c_storage, '/') && make_intermediates(ct->c_storage) == NOTOK) return NOTOK; if (ct->c_encoding != CE_7BIT) { int cc, fd; if (!ct->c_ceopenfnx) { advise(NULL, "don't know how to decode part %s of message %s", ct->c_partno, ct->c_file); return NOTOK; } file = appending || strcmp(ct->c_storage, "-")==0 ? NULL : ct->c_storage; if ((fd = (*ct->c_ceopenfnx) (ct, &file)) == NOTOK) return NOTOK; if (strcmp(file, ct->c_storage)==0) { (*ct->c_ceclosefnx) (ct); return OK; } /* ** Send to standard output */ if (strcmp(ct->c_storage, "-")==0) { int gd; if ((gd = dup(fileno(stdout))) == NOTOK) { advise("stdout", "unable to dup"); losing: (*ct->c_ceclosefnx) (ct); return NOTOK; } if ((fp = fdopen(gd, appending ? "a" : "w")) == NULL) { advise("stdout", "unable to fdopen (%d, \"%s\") from", gd, appending ? "a" : "w"); close(gd); goto losing; } } else { /* ** Open output file */ if ((fp = fopen(ct->c_storage, appending ? "a" : "w")) == NULL) { advise(ct->c_storage, "unable to fopen for %s", appending ? "appending" : "writing"); goto losing; } } /* ** Filter the header fields of the initial enclosing ** message/partial into the file. */ if (ct->c_type == CT_MESSAGE && ct->c_subtype == MESSAGE_PARTIAL) { struct partial *pm = (struct partial *) ct->c_ctparams; if (pm->pm_partno == 1) copy_some_headers(fp, ct); } for (;;) { switch (cc = read(fd, buffer, sizeof(buffer))) { case NOTOK: advise(file, "error reading content from"); break; case OK: break; default: fwrite(buffer, sizeof(*buffer), cc, fp); continue; } break; } (*ct->c_ceclosefnx) (ct); if (cc != NOTOK && fflush(fp)) advise(ct->c_storage, "error writing to"); fclose(fp); return (cc != NOTOK ? OK : NOTOK); } if (!ct->c_fp && (ct->c_fp = fopen(ct->c_file, "r")) == NULL) { advise(ct->c_file, "unable to open for reading"); return NOTOK; } pos = ct->c_begin; last = ct->c_end; fseek(ct->c_fp, pos, SEEK_SET); if (strcmp(ct->c_storage, "-")==0) { int gd; if ((gd = dup(fileno(stdout))) == NOTOK) { advise("stdout", "unable to dup"); return NOTOK; } if ((fp = fdopen(gd, appending ? "a" : "w")) == NULL) { advise("stdout", "unable to fdopen (%d, \"%s\") from", gd, appending ? "a" : "w"); close(gd); return NOTOK; } } else { if ((fp = fopen(ct->c_storage, appending ? "a" : "w")) == NULL) { advise(ct->c_storage, "unable to fopen for %s", appending ? "appending" : "writing"); return NOTOK; } } /* ** Copy a few of the header fields of the initial ** enclosing message/partial into the file. */ filterstate = 0; if (ct->c_type == CT_MESSAGE && ct->c_subtype == MESSAGE_PARTIAL) { struct partial *pm = (struct partial *) ct->c_ctparams; if (pm->pm_partno == 1) { copy_some_headers(fp, ct); filterstate = 1; } } while (fgets(buffer, sizeof(buffer) - 1, ct->c_fp)) { if ((pos += strlen(buffer)) > last) { int diff; diff = strlen(buffer) - (pos - last); if (diff >= 0) buffer[diff] = '\0'; } /* ** If this is the first content of a group of ** message/partial contents, then we only copy a few ** of the header fields of the enclosed message. */ if (filterstate) { switch (buffer[0]) { case ' ': case '\t': if (filterstate < 0) buffer[0] = 0; break; case '\n': filterstate = 0; break; default: if (!uprf(buffer, XXX_FIELD_PRF) && !uprf(buffer, VRSN_FIELD) && !uprf(buffer, "Subject:") && !uprf(buffer, "Message-ID:")) { filterstate = -1; buffer[0] = 0; break; } filterstate = 1; break; } } fputs(buffer, fp); if (pos >= last) break; } if (fflush(fp)) advise(ct->c_storage, "error writing to"); fclose(fp); fclose(ct->c_fp); ct->c_fp = NULL; return OK; } /* ** Add a file to a folder. ** ** Return the new message number of the file ** when added to the folder. Return -1, if ** there is an error. */ static int output_content_folder(char *folder, char *filename) { int msgnum; struct msgs *mp; /* Read the folder. */ if ((mp = folder_read(folder))) { /* Link file into folder */ msgnum = folder_addmsg(&mp, filename, 0, 0, 0, 0, NULL); } else { advise(NULL, "unable to read folder %s", folder); return NOTOK; } /* free folder structure */ folder_free(mp); /* ** Return msgnum. We are relying on the fact that ** msgnum will be -1, if folder_addmsg() had an error. */ return msgnum; } /* ** Parse and expand the storage formatting string ** pointed to by "cp" into "buffer". */ static int parse_format_string(CT ct, char *cp, char *buffer, int buflen, char *dir) { int len; char *bp; CI ci = &ct->c_ctinfo; /* ** If storage string is "-", just copy it, and ** return (send content to standard output). */ if (cp[0] == '-' && cp[1] == '\0') { strncpy(buffer, cp, buflen); return 0; } bp = buffer; bp[0] = '\0'; /* ** If formatting string is a pathname that doesn't ** begin with '/', then preface the path with the ** appropriate directory. */ if (*cp != '/' && *cp != '|' && *cp != '!') { snprintf(bp, buflen, "%s/", dir[1] ? dir : ""); len = strlen(bp); bp += len; buflen -= len; } for (; *cp; cp++) { /* We are processing a storage escape */ if (*cp == '%') { switch (*++cp) { case 'a': /* ** Insert parameters from Content-Type. ** This is only valid for '|' commands. */ if (buffer[0] != '|' && buffer[0] != '!') { *bp++ = *--cp; *bp = '\0'; buflen--; continue; } else { char **ap, **ep; char *s = ""; for (ap=ci->ci_attrs, ep=ci->ci_values; *ap; ap++, ep++) { snprintf(bp, buflen, "%s%s=\"%s\"", s, *ap, *ep); len = strlen(bp); bp += len; buflen -= len; s = " "; } } break; case 'm': /* insert message number */ snprintf(bp, buflen, "%s", mhbasename(ct->c_file)); break; case 'P': /* insert part number with leading dot */ if (ct->c_partno) snprintf(bp, buflen, ".%s", ct->c_partno); break; case 'p': /* insert part number withouth leading dot */ if (ct->c_partno) strncpy(bp, ct->c_partno, buflen); break; case 't': /* insert content type */ strncpy(bp, ci->ci_type, buflen); break; case 's': /* insert content subtype */ strncpy(bp, ci->ci_subtype, buflen); break; case '%': /* insert the character % */ goto raw; default: *bp++ = *--cp; *bp = '\0'; buflen--; continue; } /* Advance bp and decrement buflen */ len = strlen(bp); bp += len; buflen -= len; } else { raw: *bp++ = *cp; *bp = '\0'; buflen--; } } return 0; } /* ** Copy some of the header fields of the initial message/partial ** message into the header of the reassembled message. */ static int copy_some_headers(FILE *out, CT ct) { HF hp; hp = ct->c_first_hf; /* start at first header field */ while (hp) { /* ** A few of the header fields of the enclosing ** messages are not copied. */ if (!uprf(hp->name, XXX_FIELD_PRF) && mh_strcasecmp(hp->name, VRSN_FIELD) && mh_strcasecmp(hp->name, "Subject") && mh_strcasecmp(hp->name, "Message-ID")) fprintf(out, "%s:%s", hp->name, hp->value); hp = hp->next; /* next header field */ } return OK; } mmh-0.4/uip/mhpath.c0000644000000000000000000000656713414435726013105 0ustar rootroot/* ** mhpath.c -- print full pathnames of nmh messages and folders ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include static struct swit switches[] = { #define VERSIONSW 0 { "Version", 0 }, #define HELPSW 1 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; int main(int argc, char **argv) { int i; char *cp, *maildir, *folder = NULL; char **argp; char **arguments, buf[BUFSIZ]; struct msgs_array msgs = { 0, 0, NULL }; struct msgs *mp; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; /* ** Parse arguments */ while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); } } if (*cp == '+' || *cp == '@') { if (folder) { adios(EX_USAGE, NULL, "only one folder at a time!"); } else { folder = mh_xstrdup(expandfol(cp)); } } else { app_msgarg(&msgs, cp); } } if (!folder) folder = getcurfol(); maildir = toabsdir(folder); /* If no messages are given, print folder pathname */ if (!msgs.size) { printf("%s\n", maildir); exit(EX_OK); } if (chdir(maildir) == NOTOK) adios(EX_OSERR, maildir, "unable to change directory to"); /* read folder and create message structure */ if (!(mp = folder_read(folder))) adios(EX_IOERR, NULL, "unable to read folder %s", folder); /* ** We need to make sure there is message status space ** for all the message numbers from 1 to one beyond last since ** mhpath can select empty slots. If we are adding ** space at the end, we go ahead and add 10 slots. */ if (mp->hghmsg >= mp->hghoff) { if (!(mp = folder_realloc(mp, 1, mp->hghmsg + 10))) { adios(EX_OSERR, NULL, "unable to allocate folder storage"); } } else if (mp->lowoff > 1) { if (!(mp = folder_realloc(mp, 1, mp->hghoff))) { adios(EX_OSERR, NULL, "unable to allocate folder storage"); } } /* ** TODO: As folder_realloc() checks itself if the realloc ** really is necessary, why don't we then: ** if (!(mp = folder_realloc (mp, 1, mp->hghmsg+1))) ** adios (NULL, "unable to allocate folder storage"); ** ? This at least appears most clear to me. -- meillo */ mp->msgflags |= ALLOW_BEYOND; /* allow the beyond sequence */ /* parse all the message ranges/sequences and set SELECTED */ for (i = 0; i < msgs.size; i++) { if (!m_convert(mp, msgs.msgs[i])) { exit(EX_SOFTWARE); } } seq_setprev(mp); /* set the previous-sequence */ /* print the path of all selected messages */ for (i = mp->lowsel; i <= mp->hghsel; i++) if (is_selected(mp, i)) printf("%s/%s\n", mp->foldpath, m_name(i)); seq_save(mp); /* synchronize message sequences */ context_save(); /* save the context file */ folder_free(mp); /* free folder/message structure */ return EX_OK; } mmh-0.4/uip/comp.c0000644000000000000000000001040013414435726012537 0ustar rootroot/* ** comp.c -- compose a message ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include static struct swit switches[] = { #define EDITRSW 0 { "editor editor", 0 }, #define FORMSW 1 { "form formfile", 0 }, #define USESW 2 { "use", 0 }, #define NUSESW 3 { "nouse", 2 }, #define WHATSW 4 { "whatnowproc program", 0 }, #define VERSIONSW 5 { "Version", 0 }, #define HELPSW 6 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; int main(int argc, char **argv) { int use = NOUSE; int in, out; char *cp, *cwd, *maildir; char *ed = NULL, *form = NULL; char *folder = NULL, *msg = NULL, buf[BUFSIZ]; char drft[BUFSIZ], **argp, **arguments; struct msgs *mp = NULL; char *fmtstr; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [msg] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case EDITRSW: if (!(ed = *argp++) || *ed == '-') { adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case WHATSW: if (!(whatnowproc = *argp++) || *whatnowproc == '-') { adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case FORMSW: if (!(form = *argp++) || *form == '-') { adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case USESW: use++; continue; case NUSESW: use = NOUSE; continue; } } if (*cp == '+' || *cp == '@') { if (folder) { adios(EX_USAGE, NULL, "only one folder at a time!"); } else { folder = mh_xstrdup(expandfol(cp)); } } else { if (msg) { adios(EX_USAGE, NULL, "only one message at a time!"); } else { msg = cp; } } } cwd = mh_xstrdup(pwd()); if (form && (folder || msg)) { adios(EX_USAGE, NULL, "can't mix forms and folders/msgs"); } if (use && folder) { adios(EX_USAGE, NULL, "can't mix -use and +folder"); } if (use) { /* Don't copy; the draft shall get removed in the end. */ strncpy(drft, m_draft(msg ? msg : seq_cur), sizeof(drft)); } else if (folder || msg) { /* Take a message as the "form" for the new message. */ if (!msg) msg = seq_cur; if (!folder) folder = getcurfol(); maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) { adios(EX_OSERR, maildir, "unable to change directory to"); } /* read folder and create message structure */ if (!(mp = folder_read(folder))) { adios(EX_IOERR, NULL, "unable to read folder %s", folder); } /* check for empty folder */ if (mp->nummsg == 0) { adios(EX_DATAERR, NULL, "no messages in %s", folder); } /* parse the message range/sequence/name and set SELECTED */ if (!m_convert(mp, msg)) { exit(EX_SOFTWARE); } seq_setprev(mp); /* set the previous-sequence */ if (mp->numsel > 1) { adios(EX_USAGE, NULL, "only one message at a time!"); } if ((in = open(form = mh_xstrdup(m_name(mp->lowsel)), O_RDONLY)) == NOTOK) { adios(EX_IOERR, form, "unable to open message"); } strncpy(drft, m_draft(seq_beyond), sizeof(drft)); if ((out = creat(drft, m_gmprot())) == NOTOK) { adios(EX_CANTCREAT, drft, "unable to create"); } cpydata(in, out, form, drft); close(in); close(out); } else { fmtstr = new_fs(form, components); strncpy(drft, m_draft(seq_beyond), sizeof(drft)); if ((out = creat(drft, m_gmprot())) == NOTOK) { adios(EX_CANTCREAT, drft, "unable to create"); } if (write(out, fmtstr, strlen(fmtstr)) != (int)strlen(fmtstr)) { adios(EX_IOERR, drft, "error writing"); } close(out); } context_save(); what_now(ed, use, drft, NULL, 0, NULLMP, NULL, cwd); return EX_OSERR; } mmh-0.4/uip/scansbr.c0000644000000000000000000001436013414435726013245 0ustar rootroot/* ** scansbr.c -- routines to help scan along... ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include #define MAXSCANL 256 /* longest possible scan line */ static struct format *fmt; static struct comp *datecomp; /* pntr to "date" comp */ static int ncomps = 0; /* # of interesting components */ static int dat[5]; /* aux. data for format routine */ char *scanl = NULL; /* text of most recent scanline */ #define FPUTS(buf) {\ if (fputs(buf, scnout) == EOF)\ adios(EX_IOERR, scnmsg, "write error on");\ } /* ** prototypes */ int sc_width(void); /* from termsbr.c */ #ifdef MULTIBYTE_SUPPORT #define SCAN_CHARWIDTH MB_CUR_MAX #else #define SCAN_CHARWIDTH 1 #endif int scan(FILE *inb, int innum, int outnum, char *fmtstr, int width, int curflg, int unseen) { static int slwidth; int compnum, i; enum state state; struct field f = {{0}}; char *cp; struct comp *cptr; char *scnmsg = NULL; FILE *scnout = NULL; int incing = (outnum != SCN_MBOX && outnum != SCN_FOLD); int scanfolder = (outnum == SCN_FOLD); long fpos; struct stat st; int blankline; /* first-time only initialization */ if (!scanl) { if (incing) umask(~m_gmprot()); if (fmtstr) { if (width == 0) { if ((width = sc_width()) < WIDTH/2) width = WIDTH/2; else if (width > MAXSCANL) width = MAXSCANL; } dat[3] = slwidth = width; scanl = mh_xcalloc(slwidth + 2, SCAN_CHARWIDTH); /* probably for \n and \0 */ /* Compile format string */ ncomps = fmt_compile(fmtstr, &fmt) + 1; FINDCOMP(datecomp, "date"); } else { ncomps = 1; datecomp = NULL; } } if (feof(inb)) { return SCNEOF; } /* ** each-message initialization */ dat[0] = innum ? innum : outnum; dat[1] = curflg; dat[4] = unseen; fpos = ftell(inb); if (incing) { scnmsg = m_name(outnum); if (*scnmsg == '?') /* msg num out of range */ return SCNNUM; if (!(scnout = fopen(scnmsg, "w"))) adios(EX_IOERR, scnmsg, "unable to write"); } /* scan - main loop */ for (compnum = 1, state = FLD2; ; ) { state = m_getfld2(state, &f, inb); switch (state) { case LENERR2: state = FLD2; /* FALL */ case FLD2: compnum++; if (incing) { FPUTS(f.name); FPUTS(":"); FPUTS(f.value); } if (fmtstr && (cptr = wantcomp[CHASH(f.name)])) { /* ** we're interested in this component, ** but find the right one in the hash ** collision chain ... */ do { if (mh_strcasecmp(f.name, cptr->c_name)!=0) { continue; } if (cptr->c_text) { free(cptr->c_text); cptr->c_text = NULL; } cptr->c_text = mh_xstrdup(f.value); cp = cptr->c_text + strlen(cptr->c_text) - 1; for (; cp >= cptr->c_text; cp--) { if (isspace(*cp)) { *cp = '\0'; } else { break; } } break; } while ((cptr = cptr->c_next)); } break; case BODY2: compnum = -1; if (scanfolder) { /* stop here if we scan a msg in a folder */ state = FILEEOF2; goto finished; } /* otherwise (mbox): snarf the body */ if (strncmp("From ", f.value, 5)==0) { state = FILEEOF2; goto finished; } if (incing) { FPUTS("\n"); FPUTS(f.value); } body:; blankline = 0; while ((state = m_getfld2(state, &f, inb)) == BODY2) { /* ** recognize From lines without blank lines ** before them as well. */ if (strncmp("From ", f.value, 5)==0) { state = FILEEOF2; goto finished; } /* ** delay the printing of blank lines ** because if it's the end of the message, ** then we must omit the blank line, ** as it is not part of the message but ** part of the mbox format */ if (blankline) { /* print the delayed blank line */ FPUTS("\n"); blankline = 0; } if (strcmp(f.value, "\n")==0) { blankline = 1; continue; } if (incing) { FPUTS(f.value); } } goto finished; case FMTERR2: if (strncmp("From ", f.value, 5)==0) { state = FILEEOF2; goto finished; } state = FLD2; fprintf(stderr, innum ? "??Format error (message %d) in " : "??Format error in ", outnum ? outnum : innum); fprintf(stderr, "component %d\n", compnum); continue; case IOERR2: fprintf(stderr, innum ? "??Format error (message %d) in " : "??Format error in ", outnum ? outnum : innum); fprintf(stderr, "component %d\n", compnum); if (incing) { FPUTS("\n\nBAD MSG:\n"); FPUTS(f.name); /* XXX use f.field? */ FPUTS("\n"); state = BODY2; goto body; } /* fall through if we scan only */ case FILEEOF2: goto finished; default: adios(EX_SOFTWARE, NULL, "getfld() returned %d", state); } } finished: /* Format and output the scan line. */ if (ferror(inb)) { advise("read", "unable to"); return SCNFAT; } if (incing) { if ((dat[2] = ftell(scnout)) == EOF) adios(EX_IOERR, scnmsg, "write error on"); } else if (!scanfolder) { if ((dat[2] = ftell(inb)) == EOF) adios(EX_IOERR, scnmsg, "write error on"); dat[2] -= fpos; } if (fmtstr) { fstat(fileno(inb), &st); if (scanfolder) { dat[2] = st.st_size; } if (datecomp && !datecomp->c_text) { if (!datecomp->c_text) { if (!datecomp->c_tws) datecomp->c_tws = mh_xcalloc(1, sizeof(*datecomp->c_tws)); if (!datecomp->c_tws) adios(EX_OSERR, NULL, "unable to allocate tws buffer"); *datecomp->c_tws = *dlocaltime((time_t *) &st.st_mtime); datecomp->c_flags |= CF_DATEFAB|CF_TRUE; } else { datecomp->c_flags &= ~CF_DATEFAB; } } /* print the scan line */ fmt_scan(fmt, scanl, slwidth, dat); fputs(scanl, stdout); } /* clean up old values */ for (i=0; i < sizeof(wantcomp)/sizeof(wantcomp[0]); i++) { for (cptr=wantcomp[i]; cptr; cptr=cptr->c_next) { if (cptr->c_text) { free(cptr->c_text); cptr->c_text = NULL; } } } if (incing && (ferror(scnout) || fclose(scnout) == EOF)) adios(EX_IOERR, scnmsg, "write error on"); return (state == FILEEOF2 ? SCNMSG : SCNERR); } mmh-0.4/uip/forw.c0000644000000000000000000001762413414435726012575 0ustar rootroot/* ** forw.c -- forward a message, or group of messages. ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #define IFORMAT "digest-issue-%s" #define VFORMAT "digest-volume-%s" static struct swit switches[] = { #define ANNOSW 0 { "annotate", 0 }, #define NANNOSW 1 { "noannotate", 2 }, #define EDITRSW 2 { "editor editor", 0 }, #define FORMSW 3 { "form formfile", 0 }, #define DGSTSW 4 { "digest list", 0 }, #define ISSUESW 5 { "issue number", 0 }, #define VOLUMSW 6 { "volume number", 0 }, #define WHATSW 7 { "whatnowproc program", 0 }, #define VERSIONSW 8 { "Version", 0 }, #define HELPSW 9 { "help", 0 }, #define BILDSW 10 { "build", 5 }, /* interface from mhe */ { NULL, 0 } }; char *version=VERSION; static char drft[BUFSIZ]; static struct msgs *mp = NULL; /* ** static prototypes */ static void add_forw_hdr(char *); static int build_form(char *, char *, int, int); int main(int argc, char **argv) { int msgp = 0, anot = 0; int issue = 0, volume = 0; int in; int out, msgnum; char *cp, *cwd, *maildir; char *digest = NULL, *ed = NULL; char *folder = NULL; char *form = NULL, buf[BUFSIZ], value[10]; char **argp, **arguments, *msgs[MAXARGS]; char *fmtstr; int buildsw = 0; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case ANNOSW: anot++; continue; case NANNOSW: anot = 0; continue; case EDITRSW: if (!(ed = *argp++) || *ed == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case WHATSW: if (!(whatnowproc = *argp++) || *whatnowproc == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case BILDSW: buildsw++; continue; case FORMSW: if (!(form = *argp++) || *form == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case DGSTSW: if (!(digest = *argp++) || *digest == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case ISSUESW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); if ((issue = atoi(cp)) < 1) adios(EX_USAGE, NULL, "bad argument %s %s", argp[-2], cp); continue; case VOLUMSW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); if ((volume = atoi(cp)) < 1) adios(EX_USAGE, NULL, "bad argument %s %s", argp[-2], cp); continue; } } if (*cp == '+' || *cp == '@') { if (folder) adios(EX_USAGE, NULL, "only one folder at a time!"); else folder = mh_xstrdup(expandfol(cp)); } else { msgs[msgp++] = cp; } } cwd = mh_xstrdup(pwd()); strncpy(drft, buildsw ? toabsdir("draft") : m_draft(seq_beyond), sizeof(drft)); /* ** FIXME: (concerning MHE support (buildsw) only) ** There's no check if the draft already exists. mmh has removed ** this case by having the draft folder. I won't add code only to ** handle this legacy issue for MHE. -- meillo@marmaro.de 2012-05 */ /* ** Forwarding a message. */ if (!msgp) msgs[msgp++] = seq_cur; if (!folder) folder = getcurfol(); maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) adios(EX_OSERR, maildir, "unable to change directory to"); /* read folder and create message structure */ if (!(mp = folder_read(folder))) adios(EX_IOERR, NULL, "unable to read folder %s", folder); /* check for empty folder */ if (mp->nummsg == 0) adios(EX_DATAERR, NULL, "no messages in %s", folder); /* parse all the message ranges/sequences and set SELECTED */ for (msgnum = 0; msgnum < msgp; msgnum++) { if (!m_convert(mp, msgs[msgnum])) { exit(EX_SOFTWARE); } } seq_setprev(mp); /* set the previous sequence */ if ((out = creat(drft, m_gmprot())) == NOTOK) adios(EX_CANTCREAT, drft, "unable to create"); /* Open form (component) file. */ if (digest) { if (issue == 0) { snprintf(buf, sizeof(buf), IFORMAT, digest); if (volume == 0 && (cp = context_find(buf)) && ((issue = atoi(cp)) < 0)) issue = 0; issue++; } if (volume == 0) { snprintf(buf, sizeof(buf), VFORMAT, digest); if ((cp = context_find(buf)) == NULL || (volume = atoi(cp)) <= 0) volume = 1; } if (!form) form = digestcomps; in = build_form(form, digest, volume, issue); cpydata(in, out, form, drft); close(in); } else { fmtstr = new_fs(form, forwcomps); if (write(out, fmtstr, strlen(fmtstr)) != (int)strlen(fmtstr)) { adios(EX_IOERR, drft, "error writing"); } } close(out); add_forw_hdr(drft); if (digest) { snprintf(buf, sizeof(buf), IFORMAT, digest); snprintf(value, sizeof(value), "%d", issue); context_replace(buf, mh_xstrdup(value)); snprintf(buf, sizeof(buf), VFORMAT, digest); snprintf(value, sizeof(value), "%d", volume); context_replace(buf, mh_xstrdup(value)); } context_replace(curfolder, folder); /* update current folder */ seq_setcur(mp, mp->lowsel); /* update current message */ seq_save(mp); /* synchronize sequences */ context_save(); /* save the context file */ if (buildsw) exit(EX_OK); what_now(ed, NOUSE, drft, NULL, 0, mp, anot ? "Forwarded" : NULL, cwd); return EX_OSERR; } /* ** Create an attachment header for the to be forward messages. */ static void add_forw_hdr(char *draft) { int msgnum; char buf[BUFSIZ]; char *vec[MAXARGS]; int vecp = 0; vec[vecp++] = "anno"; vec[vecp++] = "-append"; vec[vecp++] = "-nodate"; vec[vecp++] = draft; vec[vecp++] = "-comp"; vec[vecp++] = attach_hdr; vec[vecp++] = "-text"; snprintf(buf, sizeof buf, "+%s", mp->foldpath); for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (!is_selected(mp, msgnum)) { continue; } if (strlen(buf) + 1 + strlen(m_name(msgnum)) + 1 > sizeof buf) { adios(EX_DATAERR, NULL, "Attachment header line too long. " "Forward less messages."); } strcat(buf, " "); strcat(buf, m_name(msgnum)); } vec[vecp++] = buf; vec[vecp] = NULL; if (execprog(*vec, vec) != 0) { advise(NULL, "unable to add attachment header"); } } static int build_form(char *form, char *digest, int volume, int issue) { int in; int fmtsize; char *fmtstr; char *line, tmpfil[BUFSIZ]; FILE *tmp; struct comp *cptr; struct format *fmt; int dat[5]; char *cp = NULL; /* Get new format string */ fmtstr = new_fs(form, NULL); fmtsize = strlen(fmtstr) + 256; /* Compile format string */ fmt_compile(fmtstr, &fmt); FINDCOMP(cptr, "digest"); if (cptr) cptr->c_text = digest; FINDCOMP(cptr, "date"); if (cptr) cptr->c_text = mh_xstrdup(dtimenow()); dat[0] = issue; dat[1] = volume; dat[2] = 0; dat[3] = fmtsize; dat[4] = 0; cp = m_mktemp2(NULL, invo_name, NULL, &tmp); if (cp == NULL) { adios(EX_CANTCREAT, "forw", "unable to create temporary file"); } strncpy(tmpfil, cp, sizeof(tmpfil)); unlink(tmpfil); if ((in = dup(fileno(tmp))) == NOTOK) adios(EX_OSERR, "dup", "unable to"); line = mh_xcalloc(fmtsize, sizeof(char)); fmt_scan(fmt, line, fmtsize, dat); fputs(line, tmp); mh_free0(&line); if (fclose(tmp)) adios(EX_IOERR, tmpfil, "error writing"); lseek(in, (off_t) 0, SEEK_SET); return in; } mmh-0.4/uip/mhmisc.c0000644000000000000000000000767213414435726013102 0ustar rootroot/* ** mhparse.c -- misc routines to process MIME messages ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include extern int debugsw; /* ** limit actions to specified parts or content types */ int npart = 0; int ntype = 0; char *parts[NPARTS + 1]; char *types[NTYPES + 1]; int endian = 0; /* little or big endian */ int userrs = 0; static char *errs = NULL; /* ** prototypes */ int part_ok(CT, int); int type_ok(CT, int); void set_endian(void); int make_intermediates(char *); void content_error(char *, CT, char *, ...); void flush_errors(void); int part_ok(CT ct, int sP) { char **ap; int len; if (npart == 0 || (ct->c_type == CT_MULTIPART && (sP || ct->c_subtype))) return 1; for (ap = parts; *ap; ap++) { len = strlen(*ap); if (strncmp(*ap, ct->c_partno, len)==0 && (!ct->c_partno[len] || ct->c_partno[len] == '.' )) return 1; } return 0; } int type_ok(CT ct, int sP) { char **ap; char buffer[BUFSIZ]; CI ci = &ct->c_ctinfo; if (ntype == 0 || (ct->c_type == CT_MULTIPART && (sP || ct->c_subtype))) return 1; snprintf(buffer, sizeof(buffer), "%s/%s", ci->ci_type, ci->ci_subtype); for (ap = types; *ap; ap++) if (!mh_strcasecmp(*ap, ci->ci_type) || !mh_strcasecmp(*ap, buffer)) return 1; return 0; } void set_endian(void) { union { long l; char c[sizeof(long)]; } un; un.l = 1; endian = un.c[0] ? -1 : 1; if (debugsw) fprintf(stderr, "%s endian architecture\n", endian > 0 ? "big" : "little"); } int make_intermediates(char *file) { char *cp; for (cp = file + 1; (cp = strchr(cp, '/')); cp++) { struct stat st; *cp = '\0'; if (stat(file, &st) == NOTOK) { int answer; char *ep; if (errno != ENOENT) { advise(file, "error on directory"); losing_directory: *cp = '/'; return NOTOK; } ep = concat("Create directory \"", file, "\"? ", NULL); answer = getanswer(ep); mh_free0(&ep); if (!answer) goto losing_directory; if (!makedir(file)) { advise(NULL, "unable to create directory %s", file); goto losing_directory; } } *cp = '/'; } return OK; } /* ** Construct error message for content */ void content_error(char *what, CT ct, char *fmt, ...) { int i, len, buflen; char *bp, buffer[BUFSIZ]; CI ci; bp = buffer; buflen = sizeof(buffer); if (userrs && invo_name && *invo_name) { snprintf(bp, buflen, "%s: ", invo_name); len = strlen(bp); bp += len; buflen -= len; } { va_list arglist; va_start(arglist, fmt); vsnprintf(bp, buflen, fmt, arglist); va_end(arglist); } len = strlen(bp); bp += len; buflen -= len; ci = &ct->c_ctinfo; if (what) { char *s; if (*what) { snprintf(bp, buflen, " %s: ", what); len = strlen(bp); bp += len; buflen -= len; } if ((s = strerror(errno))) snprintf(bp, buflen, "%s", s); else snprintf(bp, buflen, "Error %d", errno); len = strlen(bp); bp += len; buflen -= len; } i = strlen(invo_name) + 2; /* Now add content type and subtype */ snprintf(bp, buflen, "\n%*.*s(content %s/%s", i, i, "", ci->ci_type, ci->ci_subtype); len = strlen(bp); bp += len; buflen -= len; /* Now add the message/part number */ if (ct->c_file) { snprintf(bp, buflen, " in message %s", ct->c_file); len = strlen(bp); bp += len; buflen -= len; if (ct->c_partno) { snprintf(bp, buflen, ", part %s", ct->c_partno); len = strlen(bp); bp += len; buflen -= len; } } snprintf(bp, buflen, ")"); len = strlen(bp); bp += len; buflen -= len; if (userrs) { *bp++ = '\n'; *bp = '\0'; buflen--; errs = add(buffer, errs); } else { advise(NULL, "%s", buffer); } } void flush_errors(void) { if (errs) { fflush(stdout); fprintf(stderr, "%s", errs); mh_free0(&errs); } } mmh-0.4/uip/distsbr.c0000644000000000000000000001032413414435726013260 0ustar rootroot/* ** distsbr.c -- routines to do additional "dist-style" processing ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include static int hdrfd = NOTOK; static int txtfd = NOTOK; /* ** static prototypes */ static int ready_msg(char *); int distout(char *drft, char *msgnam, char *backup) { enum state state; struct field f = {{0}}; unsigned char *dp; int resent = 0; FILE *ifp, *ofp; strcpy(backup, m_mktemp(toabsdir(invo_name), NULL, NULL)); if (rename(drft, backup) == NOTOK) { advise(backup, "unable to rename %s to",drft); return NOTOK; } if (ready_msg(msgnam) != OK) { return NOTOK; } if (!(ifp = fopen(backup, "r"))) { advise(backup, "unable to read"); return NOTOK; } if (!(ofp = fopen(drft, "w"))) { fclose(ifp); advise(drft, "unable to create temporary file"); return NOTOK; } chmod(drft, m_gmprot()); lseek(hdrfd, (off_t) 0, SEEK_SET); /* msgnam not accurate */ cpydata(hdrfd, fileno(ofp), msgnam, drft); state = FLD2; while (1) { switch (state = m_getfld2(state, &f, ifp)) { case FLD2: if (!uprf(f.name, "resent")) { advise(NULL, "Please re-edit draft to remove the ``%s'' header.", f.name); goto leave_bad; } resent = 1; fprintf(ofp, "%s: %s", f.name, f.value); break; case BODY2: for (dp = f.value; *dp; dp++) { if (!isspace(*dp)) { advise(NULL, "Please re-edit draft to consist of headers only."); goto leave_bad; } } case FILEEOF2: goto process; case LENERR2: case FMTERR2: case IOERR2: advise(NULL, "Please re-edit draft and fix that header."); leave_bad: ; fclose(ifp); fclose(ofp); unlink(drft); if (rename(backup, drft) == NOTOK) { advise(drft, "unable to rename %s to", backup); } return NOTOK; default: advise(NULL, "getfld() returned %d", state); return NOTOK; } } process: ; fclose(ifp); fflush(ofp); if (!resent) { advise(NULL, "Please re-edit draft to include a ``Resent-To:'' header."); fclose(ofp); unlink(drft); if (rename(backup, drft) == NOTOK) { advise(drft, "unable to rename %s to", backup); } return NOTOK; } if (txtfd != NOTOK) { lseek(txtfd, (off_t) 0, SEEK_SET); /* msgnam not accurate */ cpydata(txtfd, fileno(ofp), msgnam, drft); } fclose(ofp); return OK; } static int ready_msg(char *msgnam) { enum state state; struct field f = {{0}}; char tmpfil[BUFSIZ]; int out; FILE *ifp, *ofp; char *cp = NULL; if (hdrfd != NOTOK) { close(hdrfd); hdrfd = NOTOK; } if (txtfd != NOTOK) { close(txtfd); txtfd = NOTOK; } if (!(ifp = fopen(msgnam, "r"))) { advise(msgnam, "unable to open message"); return NOTOK; } cp = m_mktemp2(NULL, "dist", &hdrfd, NULL); if (!cp) { fclose(ifp); advise("distsbr", "unable to create temporary file"); return NOTOK; } fchmod(hdrfd, 0600); strncpy(tmpfil, cp, sizeof(tmpfil)); if ((out = dup(hdrfd)) == NOTOK || !(ofp = fdopen(out, "w"))) { fclose(ifp); advise(NULL, "no file descriptors -- you lose big"); return NOTOK; } unlink(tmpfil); state = FLD2; while (1) { state = m_getfld2(state, &f, ifp); switch (state) { case FLD2: if (uprf(f.name, "resent")) { fprintf(ofp, "Prev-"); } fprintf(ofp, "%s: %s", f.name, f.value); break; case BODY2: fclose(ofp); cp = m_mktemp2(NULL, "dist", &txtfd, NULL); if (!cp) { advise("distsbr", "unable to create temp file"); return NOTOK; } fchmod(txtfd, 0600); strncpy(tmpfil, cp, sizeof(tmpfil)); if ((out = dup(txtfd)) == NOTOK || !(ofp = fdopen(out, "w"))) { advise(NULL, "no file descriptors -- you lose"); return NOTOK; } unlink(tmpfil); fputs("\n", ofp); while (state == BODY2) { fputs(f.value, ofp); state = m_getfld2(state, &f, ifp); } /* FALL */ case FILEEOF2: goto process; case LENERR2: case FMTERR2: case IOERR2: advise(NULL, "format error in message %s", msgnam); return NOTOK; default: advise(NULL, "getfld() returned %d", state); return NOTOK; } } process: ; fclose(ifp); fclose(ofp); return OK; } mmh-0.4/uip/folder.c0000644000000000000000000004006713414435726013070 0ustar rootroot/* ** folder(s).c -- set/list the current message and/or folder ** -- push/pop a folder onto/from the folder stack ** -- list the folder stack ** ** This code is Copyright (c) 2002, 2008, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include static struct swit switches[] = { #define ALLSW 0 { "all", 0 }, #define NALLSW 1 { "noall", 2 }, #define CREATSW 2 { "create", 0 }, #define NCREATSW 3 { "nocreate", 2 }, #define FASTSW 4 { "fast", 0 }, #define NFASTSW 5 { "nofast", 2 }, #define PACKSW 6 { "pack", 0 }, #define NPACKSW 7 { "nopack", 2 }, #define VERBSW 8 { "verbose", 0 }, #define NVERBSW 9 { "noverbose", 2 }, #define RECURSW 10 { "recurse", 0 }, #define NRECRSW 11 { "norecurse", 2 }, #define TOTALSW 12 { "total", 0 }, #define NTOTLSW 13 { "nototal", 2 }, #define LISTSW 14 { "list", 0 }, #define NLISTSW 15 { "nolist", 2 }, #define PRNTSW 16 { "print", 0 }, #define NPRNTSW 17 { "noprint", -4 }, #define PUSHSW 18 { "push", 0 }, #define POPSW 19 { "pop", 0 }, #define VERSIONSW 20 { "Version", 0 }, #define HELPSW 21 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; static int fshort = 0; /* output only folder names */ static int fcreat = 0; /* should we ask to create new folders? */ static int fpack = 0; /* are we packing the folder? */ static int fverb = 0; /* print actions taken while packing folder */ static int frecurse = 0; /* recurse through subfolders */ static int ftotal = 0; /* should we output the totals? */ static int all = 0; /* should we output all folders */ static int total_folders = 0; /* total number of folders */ static char *nmhdir; static char *stack = "Folder-Stack"; static char folder[BUFSIZ]; /* ** Structure to hold information about ** folders as we scan them. */ struct FolderInfo { char *name; int nummsg; int curmsg; int lowmsg; int hghmsg; int others; /* others == 1 if other files in folder */ int error; /* error == 1 for unreadable folder */ }; /* ** Dynamically allocated space to hold ** all the folder information. */ static struct FolderInfo *fi; static int maxFolderInfo; /* ** static prototypes */ static int get_folder_info(char *, char *); static crawl_callback_t get_folder_info_callback; static void print_folders(void); static int sfold(struct msgs *, char *); static void readonly_folders(void); static int folder_pack(struct msgs **, int); int main(int argc, char **argv) { int printsw = 0, listsw = 0; int pushsw = 0, popsw = 0; char *cp, *dp, *msg = NULL, *argfolder = NULL; char **ap, **argp, buf[BUFSIZ], **arguments; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); /* ** If program was invoked with name ending ** in `s', then add switch `-all'. */ if (argv[0][strlen(argv[0]) - 1] == 's') all = 1; arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [msg] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case ALLSW: all = 1; continue; case NALLSW: all = 0; continue; case CREATSW: fcreat = 1; continue; case NCREATSW: fcreat = -1; continue; case FASTSW: fshort++; continue; case NFASTSW: fshort = 0; continue; case PACKSW: fpack++; continue; case NPACKSW: fpack = 0; continue; case VERBSW: fverb++; continue; case NVERBSW: fverb = 0; continue; case RECURSW: frecurse++; continue; case NRECRSW: frecurse = 0; continue; case TOTALSW: ftotal = 1; continue; case NTOTLSW: ftotal = -1; continue; case PRNTSW: printsw = 1; continue; case NPRNTSW: printsw = 0; continue; case LISTSW: listsw = 1; continue; case NLISTSW: listsw = 0; continue; case PUSHSW: pushsw = 1; listsw = 1; popsw = 0; continue; case POPSW: popsw = 1; listsw = 1; pushsw = 0; continue; } } if (*cp == '+' || *cp == '@') { if (argfolder) adios(EX_USAGE, NULL, "only one folder at a time!"); else argfolder = mh_xstrdup(expandfol(cp)); } else { if (msg) adios(EX_USAGE, NULL, "only one (current) message at a time!"); else msg = cp; } } nmhdir = concat(toabsdir("+"), "/", NULL); /* ** If we aren't working with the folder stack ** (-push, -pop, -list) then the default is to print. */ if (pushsw == 0 && popsw == 0 && listsw == 0) printsw++; /* Pushing a folder onto the folder stack */ if (pushsw) { if (!argfolder) { /* If no folder is given, the current folder and */ /* the top of the folder stack are swapped. */ if ((cp = context_find(stack))) { dp = mh_xstrdup(cp); ap = brkstring(dp, " ", "\n"); argfolder = mh_xstrdup(*ap++); } else { adios(EX_USAGE, NULL, "no other folder"); } for (cp = mh_xstrdup(getcurfol()); *ap; ap++) cp = add(*ap, add(" ", cp)); mh_free0(&dp); context_replace(stack, cp); /* update folder stack */ } else { /* update folder stack */ context_replace(stack, (cp = context_find (stack)) ? concat(getcurfol(), " ", cp, NULL) : mh_xstrdup(getcurfol())); } } /* Popping a folder off of the folder stack */ if (popsw) { if (argfolder) adios(EX_USAGE, NULL, "sorry, no folders allowed with -pop"); if ((cp = context_find(stack))) { dp = mh_xstrdup(cp); ap = brkstring(dp, " ", "\n"); argfolder = mh_xstrdup(*ap++); } else { adios(EX_DATAERR, NULL, "folder stack empty"); } if (*ap) { /* if there's anything left in the stack */ cp = mh_xstrdup(*ap++); for (; *ap; ap++) cp = add(*ap, add(" ", cp)); context_replace(stack, cp); /* update folder stack */ } else { /* delete folder stack entry from context */ context_del(stack); } mh_free0(&dp); } if (pushsw || popsw) { cp = toabsdir(argfolder); if (access(cp, F_OK) == NOTOK) adios(EX_DATAERR, cp, "unable to find folder"); /* update current folder */ context_replace(curfolder, argfolder); context_save(); /* save the context file */ argfolder = NULL; } /* Listing the folder stack */ if (listsw) { printf("%s", argfolder ? argfolder : getcurfol()); if ((cp = context_find(stack))) { dp = mh_xstrdup(cp); for (ap = brkstring(dp, " ", "\n"); *ap; ap++) printf(" %s", *ap); mh_free0(&dp); } printf("\n"); if (!printsw) { exit(EX_OK); } } /* Allocate initial space to record folder information */ maxFolderInfo = CRAWL_NUMFOLDERS; fi = mh_xcalloc(maxFolderInfo, sizeof(*fi)); /* ** Scan the folders */ /* ** change directory to base of nmh directory for ** crawl_folders */ if (chdir(nmhdir) == NOTOK) { adios(EX_OSERR, nmhdir, "unable to change directory to"); } if (all || ftotal > 0) { /* ** If no folder is given, do them all */ if (!argfolder) { if (msg) admonish(NULL, "no folder given for message %s", msg); readonly_folders(); /* do any readonly folders */ strncpy(folder, (cp = context_find(curfolder)) ? cp : "", sizeof(folder)); crawl_folders(".", get_folder_info_callback, NULL); } else { strncpy(folder, argfolder, sizeof(folder)); if (get_folder_info(argfolder, msg)) { /* update current folder */ context_replace(curfolder, argfolder); context_save(); } /* ** Since recurse wasn't done in get_folder_info(), ** we still need to list all level-1 sub-folders. */ if (!frecurse) crawl_folders(folder, get_folder_info_callback, NULL); } } else { strncpy(folder, argfolder ? argfolder : getcurfol(), sizeof(folder)); /* ** Check if folder exists. If not, then see if ** we should create it, or just exit. */ create_folder(toabsdir(folder), fcreat, exit); if (get_folder_info(folder, msg) && argfolder) { /* update current folder */ context_replace(curfolder, argfolder); } } /* ** Print out folder information */ print_folders(); context_save(); return EX_OK; } static int get_folder_info_body(char *fold, char *msg, boolean *crawl_children) { int i, retval = 1; struct msgs *mp = NULL; i = total_folders++; /* ** if necessary, reallocate the space ** for folder information */ if (total_folders >= maxFolderInfo) { maxFolderInfo += CRAWL_NUMFOLDERS; fi = mh_xrealloc(fi, maxFolderInfo * sizeof(*fi)); } fi[i].name = fold; fi[i].nummsg = 0; fi[i].curmsg = 0; fi[i].lowmsg = 0; fi[i].hghmsg = 0; fi[i].others = 0; fi[i].error = 0; if ((ftotal > 0) || !fshort || msg || fpack) { /* ** create message structure and get folder info */ if (!(mp = folder_read(fold))) { admonish(NULL, "unable to read folder %s", fold); return 0; } /* set the current message */ if (msg && !sfold(mp, msg)) retval = 0; if (fpack) { if (folder_pack(&mp, fverb) == -1) { exit(EX_OK); } seq_save(mp); /* synchronize the sequences */ context_save(); /* save the context file */ } /* record info for this folder */ if ((ftotal > 0) || !fshort) { fi[i].nummsg = mp->nummsg; fi[i].curmsg = mp->curmsg; fi[i].lowmsg = mp->lowmsg; fi[i].hghmsg = mp->hghmsg; fi[i].others = other_files(mp); } folder_free(mp); /* free folder/message structure */ } *crawl_children = (frecurse && (fshort || fi[i].others) && (fi[i].error == 0)); return retval; } static boolean get_folder_info_callback(char *fold, void *baton) { boolean crawl_children; get_folder_info_body(fold, NULL, &crawl_children); fflush(stdout); return crawl_children; } static int get_folder_info(char *fold, char *msg) { boolean crawl_children; int retval; retval = get_folder_info_body(fold, msg, &crawl_children); if (crawl_children) { crawl_folders(fold, get_folder_info_callback, NULL); } return retval; } /* ** Print folder information */ static void print_folders(void) { int i, len, hasempty = 0, curprinted; int maxlen = 0, maxnummsg = 0, maxlowmsg = 0; int maxhghmsg = 0, maxcurmsg = 0, total_msgs = 0; int nummsgdigits, lowmsgdigits; int hghmsgdigits, curmsgdigits; char tmpname[BUFSIZ]; /* ** compute a few values needed to for ** printing various fields */ for (i = 0; i < total_folders; i++) { /* length of folder name */ len = strlen(fi[i].name); if (len > maxlen) maxlen = len; /* If folder has error, skip the rest */ if (fi[i].error) continue; /* calculate total number of messages */ total_msgs += fi[i].nummsg; /* maximum number of messages */ if (fi[i].nummsg > maxnummsg) maxnummsg = fi[i].nummsg; /* maximum low message */ if (fi[i].lowmsg > maxlowmsg) maxlowmsg = fi[i].lowmsg; /* maximum high message */ if (fi[i].hghmsg > maxhghmsg) maxhghmsg = fi[i].hghmsg; /* maximum current message */ if (fi[i].curmsg >= fi[i].lowmsg && fi[i].curmsg <= fi[i].hghmsg && fi[i].curmsg > maxcurmsg) maxcurmsg = fi[i].curmsg; /* check for empty folders */ if (fi[i].nummsg == 0) hasempty = 1; } nummsgdigits = num_digits(maxnummsg); lowmsgdigits = num_digits(maxlowmsg); hghmsgdigits = num_digits(maxhghmsg); curmsgdigits = num_digits(maxcurmsg); if (hasempty && nummsgdigits < 2) nummsgdigits = 2; /* ** Print folder information */ if (all || fshort || ftotal < 1) { for (i = 0; i < total_folders; i++) { if (fshort) { printf("%s\n", fi[i].name); continue; } /* Add `+' to end of name, if folder is current */ if (strcmp(folder, fi[i].name)!=0) snprintf(tmpname, sizeof(tmpname), "%s", fi[i].name); else snprintf(tmpname, sizeof(tmpname), "%s+", fi[i].name); if (fi[i].error) { printf("%-*s is unreadable\n", maxlen+1, tmpname); continue; } printf("%-*s ", maxlen+1, tmpname); curprinted = 0; /* remember if we print cur */ if (fi[i].nummsg == 0) { printf("has %*s messages%*s", nummsgdigits, "no", fi[i].others ? lowmsgdigits + hghmsgdigits + 5 : 0, ""); } else { printf("has %*d message%s (%*d-%*d)", nummsgdigits, fi[i].nummsg, (fi[i].nummsg == 1) ? " " : "s", lowmsgdigits, fi[i].lowmsg, hghmsgdigits, fi[i].hghmsg); if (fi[i].curmsg >= fi[i].lowmsg && fi[i].curmsg <= fi[i].hghmsg) { curprinted = 1; printf("; cur=%*d", curmsgdigits, fi[i].curmsg); } } if (fi[i].others) printf(";%*s (others)", curprinted ? 0 : curmsgdigits + 6, ""); printf("\n"); } } /* ** Print folder/message totals */ if (ftotal > 0 || (all && !fshort && ftotal >= 0)) { if (all) printf("\n"); printf("TOTAL = %d message%c in %d folder%s\n", total_msgs, total_msgs != 1 ? 's' : ' ', total_folders, total_folders != 1 ? "s" : ""); } fflush(stdout); } /* ** Set the current message and sychronize sequences */ static int sfold(struct msgs *mp, char *msg) { /* parse the message range/sequence/name and set SELECTED */ if (!m_convert(mp, msg)) return 0; if (mp->numsel > 1) { admonish(NULL, "only one message at a time!"); return 0; } seq_setprev(mp); /* set the previous-sequence */ seq_setcur(mp, mp->lowsel); /* set current message */ seq_save(mp); /* synchronize message sequences */ context_save(); /* save the context file */ return 1; } /* ** Do the read only folders */ static void readonly_folders(void) { int atrlen; char atrcur[BUFSIZ]; struct node *np; snprintf(atrcur, sizeof(atrcur), "atr-%s-", seq_cur); atrlen = strlen(atrcur); for (np = m_defs; np; np = np->n_next) if (strncmp(np->n_name, atrcur, atrlen)==0 && strncmp(np->n_name+atrlen, nmhdir, strlen(nmhdir))!=0) /* Why do we exclude absolute path names? --meillo */ get_folder_info(np->n_name + atrlen, NULL); } /* ** pack (renumber) the messages in a folder ** into a contiguous range from 1 to n. ** Return -1 if error, else return 0. */ static int folder_pack(struct msgs **mpp, int verbose) { int hole, msgnum, newcurrent = 0; char newmsg[BUFSIZ], oldmsg[BUFSIZ]; struct msgs *mp; mp = *mpp; /* ** Just return if folder is empty. */ if (mp->nummsg == 0) return 0; /* ** Make sure we have message status space allocated ** for all numbers from 1 to current high message. */ if (mp->lowoff > 1) { if ((mp = folder_realloc(mp, 1, mp->hghmsg))) *mpp = mp; else { advise(NULL, "unable to allocate folder storage"); return -1; } } for (msgnum = mp->lowmsg, hole = 1; msgnum <= mp->hghmsg; msgnum++) { if (does_exist(mp, msgnum)) { if (msgnum != hole) { strncpy(newmsg, m_name(hole), sizeof(newmsg)); strncpy(oldmsg, m_name(msgnum), sizeof(oldmsg)); if (verbose) printf("message %s becomes %s\n", oldmsg, newmsg); /* ** Invoke the external refile hook for each ** message being renamed. This is done ** before the file is renamed so that the ** old message file is around for the hook. */ snprintf(oldmsg, sizeof (oldmsg), "%s/%d", mp->foldpath, msgnum); snprintf(newmsg, sizeof (newmsg), "%s/%d", mp->foldpath, hole); ext_hook("ref-hook", oldmsg, newmsg); /* move the message file */ if (rename(oldmsg, newmsg) == -1) { advise(newmsg, "unable to rename %s to", oldmsg); return -1; } /* check if this is the current message */ if (msgnum == mp->curmsg) newcurrent = hole; /* copy the attribute flags for this message */ copy_msg_flags(mp, hole, msgnum); if (msgnum == mp->lowsel) mp->lowsel = hole; if (msgnum == mp->hghsel) mp->hghsel = hole; /* ** mark that sequence information has ** been modified */ mp->msgflags |= SEQMOD; } hole++; } } /* record the new number for the high/low message */ mp->lowmsg = 1; mp->hghmsg = hole - 1; if (newcurrent) seq_setcur(mp, newcurrent); return 0; } mmh-0.4/uip/rmm.c0000644000000000000000000000625113414435726012405 0ustar rootroot/* ** rmm.c -- remove a message(s) ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include static struct swit switches[] = { #define UNLINKSW 0 { "unlink", 0 }, #define NUNLINKSW 1 { "nounlink", 2 }, #define VERSIONSW 2 { "Version", 0 }, #define HELPSW 3 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; int main(int argc, char **argv) { int msgnum, unlink_msgs = 0, vecp = 0; char *cp, *maildir, *folder = NULL, **vec; char buf[BUFSIZ], **argp; char **arguments; struct msgs_array msgs = { 0, 0, NULL }; struct msgs *mp; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; /* parse arguments */ while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown\n", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case UNLINKSW: unlink_msgs++; continue; case NUNLINKSW: unlink_msgs = 0; continue; } } if (*cp == '+' || *cp == '@') { if (folder) { adios(EX_USAGE, NULL, "only one folder at a time!"); } else { folder = mh_xstrdup(expandfol(cp)); } } else { app_msgarg(&msgs, cp); } } if (!msgs.size) { app_msgarg(&msgs, seq_cur); } if (!folder) { folder = getcurfol(); } maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) { adios(EX_OSERR, maildir, "unable to change directory to"); } /* read folder and create message structure */ if (!(mp = folder_read(folder))) { adios(EX_IOERR, NULL, "unable to read folder %s", folder); } if (mp->nummsg == 0) { adios(EX_DATAERR, NULL, "no messages in %s", folder); } /* ** parse all the message ranges/sequences and set SELECTED ** (We do this for the refiling case as well, to complain ** about invalid msg arguments in rmm, before we call refile.) */ for (msgnum = 0; msgnum < msgs.size; msgnum++) { if (!m_convert(mp, msgs.msgs[msgnum])) { exit(EX_USAGE); } } context_replace(curfolder, folder); context_save(); if (unlink_msgs) { /* "remove" the SELECTED messages */ folder_delmsgs(mp, 1); seq_setprev(mp); seq_save(mp); folder_free(mp); return 0; } /* remove by refiling. */ folder_free(mp); fflush(stdout); if (msgs.size+6 > MAXARGS) { adios(EX_SOFTWARE, NULL, "more than %d messages for refile exec", MAXARGS - 6); } vec = mh_xcalloc(msgs.size + 6, sizeof(*vec)); vec[vecp++] = "refile"; vec[vecp++] = "-src"; vec[vecp++] = concat("+", folder, NULL); vec[vecp++] = "-nolink"; vec[vecp++] = concat("+", trashfolder, NULL); for (msgnum = 0; msgnum < msgs.size; msgnum++) { vec[vecp++] = msgs.msgs[msgnum]; } vec[vecp] = NULL; return execprog(*vec, vec); } mmh-0.4/uip/ap.c0000644000000000000000000000650313414435726012212 0ustar rootroot/* ** ap.c -- parse addresses 822-style ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #define NADDRS 100 #define FORMAT "=%<{error}%{error}: %{text}%|%(putstr(proper{text}))%>" static struct swit switches[] = { #define FORMSW 0 { "form formatfile", 0 }, #define NORMSW 1 { "normalize", 0 }, #define NNORMSW 2 { "nonormalize", 2 }, #define VERSIONSW 3 { "Version", 0 }, #define HELPSW 4 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; static struct format *fmt; static int dat[5]; /* ** static prototypes */ static int process(char *, int); int main(int argc, char **argv) { int addrp = 0, normalize = AD_HOST; int status = 0; char *cp, *form = NULL, *fmtstr; char buf[BUFSIZ], **argp; char **arguments, *addrs[NADDRS]; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [switches] addrs ...", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case FORMSW: if (!(form = *argp++) || *form == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case NORMSW: normalize = AD_HOST; continue; case NNORMSW: normalize = AD_NHST; continue; } } if (addrp > NADDRS) adios(EX_USAGE, NULL, "more than %d addresses", NADDRS); else addrs[addrp++] = cp; } addrs[addrp] = NULL; if (addrp == 0) adios(EX_USAGE, NULL, "usage: %s [switches] addrs ...", invo_name); /* get new format string */ fmtstr = new_fs(form, FORMAT); fmt_norm = normalize; fmt_compile(fmtstr, &fmt); dat[0] = 0; dat[1] = 0; dat[2] = 0; dat[3] = BUFSIZ; dat[4] = 0; for (addrp = 0; addrs[addrp]; addrp++) status += process(addrs[addrp], normalize); return status; } struct pqpair { char *pq_text; char *pq_error; struct pqpair *pq_next; }; static int process(char *arg, int norm) { int status = 0; char *cp; char buffer[BUFSIZ + 1], error[BUFSIZ]; struct comp *cptr; struct pqpair *p, *q; struct pqpair pq; struct mailname *mp; (q = &pq)->pq_next = NULL; while ((cp = getname(arg))) { p = mh_xcalloc(1, sizeof(*p)); if ((mp = getm(cp, NULL, 0, norm, error)) == NULL) { p->pq_text = mh_xstrdup(cp); p->pq_error = mh_xstrdup(error); status++; } else { p->pq_text = mh_xstrdup(mp->m_text); mnfree(mp); } q = (q->pq_next = p); } for (p = pq.pq_next; p; p = q) { FINDCOMP(cptr, "text"); if (cptr) cptr->c_text = p->pq_text; FINDCOMP(cptr, "error"); if (cptr) cptr->c_text = p->pq_error; fmt_scan(fmt, buffer, BUFSIZ, dat); fputs(buffer, stdout); mh_free0(&(p->pq_text)); if (p->pq_error) mh_free0(&(p->pq_error)); q = p->pq_next; mh_free0(&p); } return status; } mmh-0.4/uip/refile.c0000644000000000000000000001472413414435726013064 0ustar rootroot/* ** refile.c -- move or link message(s) from a source folder ** -- into one or more destination folders ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include static struct swit switches[] = { #define LINKSW 0 { "link", 0 }, #define NLINKSW 1 { "nolink", 2 }, #define SRCSW 2 { "src +folder", 0 }, #define FILESW 3 { "file file", 0 }, #define VERSIONSW 4 { "Version", 0 }, #define HELPSW 5 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; static char maildir[BUFSIZ]; struct st_fold { char *f_name; struct msgs *f_mp; }; /* ** static prototypes */ static void opnfolds(struct st_fold *, int); static void clsfolds(struct st_fold *, int); static int m_file(char *, struct st_fold *, int, int); int main(int argc, char **argv) { int linkf = 0, filep = 0; int foldp = 0; int i, msgnum; char *cp, *folder = NULL, buf[BUFSIZ]; char **argp, **arguments; char *filevec[NFOLDERS + 1]; char **files = filevec; struct st_fold folders[NFOLDERS + 1]; struct msgs_array msgs = { 0, 0, NULL }; struct msgs *mp; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; /* ** Parse arguments */ while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown\n", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [msgs] [switches] +folder ...", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case LINKSW: linkf++; continue; case NLINKSW: linkf = 0; continue; case SRCSW: if (folder) adios(EX_USAGE, NULL, "only one source folder at a time!"); if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); folder = mh_xstrdup(expandfol(cp)); continue; case FILESW: if (filep > NFOLDERS) adios(EX_USAGE, NULL, "only %d files allowed!", NFOLDERS); if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); files[filep++] = mh_xstrdup(expanddir(cp)); continue; } } if (*cp == '+' || *cp == '@') { if (foldp > NFOLDERS) adios(EX_USAGE, NULL, "only %d folders allowed!", NFOLDERS); folders[foldp++].f_name = mh_xstrdup(expandfol(cp)); } else app_msgarg(&msgs, cp); } if (foldp == 0) adios(EX_USAGE, NULL, "no folder specified"); if (filep > 0) { /* ** We are refiling one or more files (-file) to the folders */ if (msgs.size) { adios(EX_USAGE, NULL, "use -file or msgs, not both"); } if (folder) { adios(EX_USAGE, NULL, "use -file or -src, not both"); } opnfolds(folders, foldp); for (i = 0; i < filep; i++) { if (m_file(files[i], folders, foldp, 0)) { exit(EX_IOERR); } } /* If -nolink, then unlink files */ if (!linkf) { int i; char **files = filevec; for (i = 0; i < filep; i++) { if (unlink(files[i]) == NOTOK) { admonish(files[i], "unable to unlink"); } } } exit(EX_OK); } /* ** We are refiling messages to the folders */ if (!msgs.size) { app_msgarg(&msgs, seq_cur); } if (!folder) { folder = getcurfol(); } strncpy(maildir, toabsdir(folder), sizeof(maildir)); if (chdir(maildir) == NOTOK) { adios(EX_OSERR, maildir, "unable to change directory to"); } /* read source folder and create message structure */ if (!(mp = folder_read(folder))) { adios(EX_IOERR, NULL, "unable to read folder %s", folder); } if (mp->nummsg == 0) { adios(EX_DATAERR, NULL, "no messages in %s", folder); } /* parse the message range/sequence/name and set SELECTED */ for (msgnum = 0; msgnum < msgs.size; msgnum++) { if (!m_convert(mp, msgs.msgs[msgnum])) { exit(EX_SOFTWARE); } } seq_setprev(mp); /* create folder structures for each destination folder */ opnfolds(folders, foldp); /* ** Link all the selected messages into destination folders. ** ** This causes the add hook to be run for messages that are ** linked into another folder. The refile hook is run for ** messages that are moved to another folder. */ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (is_selected(mp, msgnum)) { cp = mh_xstrdup(m_name(msgnum)); if (m_file(cp, folders, foldp, !linkf)) { exit(EX_IOERR); } mh_free0(&cp); } } /* ** If -nolink, then remove (= unlink) messages from source folder. ** ** Note that folder_delmsgs does not call the delete hook ** because the message has already been handled above. */ if (!linkf) { folder_delmsgs(mp, 0); } clsfolds(folders, foldp); if (linkf) { seq_setcur(mp, mp->hghsel); } seq_save(mp); context_save(); folder_free(mp); return 0; } /* ** Read all the destination folders and ** create folder structures for all of them. */ static void opnfolds(struct st_fold *folders, int nfolders) { char nmaildir[BUFSIZ]; struct st_fold *fp, *ep; struct msgs *mp; for (fp = folders, ep = folders + nfolders; fp < ep; fp++) { chdir(toabsdir("+")); strncpy(nmaildir, toabsdir(fp->f_name), sizeof(nmaildir)); create_folder(nmaildir, 0, exit); if (chdir(nmaildir) == NOTOK) { adios(EX_OSERR, nmaildir, "unable to change directory to"); } if (!(mp = folder_read(fp->f_name))) { adios(EX_IOERR, NULL, "unable to read folder %s", fp->f_name); } mp->curmsg = 0; fp->f_mp = mp; chdir(maildir); } } /* ** Set the Previous-Sequence and then sychronize the ** sequence file, for each destination folder. */ static void clsfolds(struct st_fold *folders, int nfolders) { struct st_fold *fp, *ep; struct msgs *mp; for (fp = folders, ep = folders + nfolders; fp < ep; fp++) { mp = fp->f_mp; seq_setprev(mp); seq_save(mp); } } /* ** Link (or copy) the message into each of ** the destination folders. */ static int m_file(char *msgfile, struct st_fold *folders, int nfolders, int refile) { int msgnum; struct st_fold *fp, *ep; for (fp = folders, ep = folders + nfolders; fp < ep; fp++) { if ((msgnum = folder_addmsg(&fp->f_mp, msgfile, 1, 0, 0, nfolders == 1 && refile, maildir)) == -1) { return 1; } } return 0; } mmh-0.4/uip/aliasbr.c0000644000000000000000000002227313414435726013231 0ustar rootroot/* ** aliasbr.c -- new aliasing mechanism ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include static int akvis; static char *akerrst; struct aka *akahead = NULL; struct aka *akatail = NULL; struct home *homehead = NULL; struct home *hometail = NULL; /* ** prototypes */ int alias(char *); int akvisible(void); void init_pw(void); char *akresult(struct aka *); char *akvalue(char *); char *akerror(int); static char *akval(struct aka *, char *); static int aleq(char *, char *); static char *scanp(unsigned char *); static char *getp(char *); static char *seekp(char *, char *, char **); static int addfile(struct aka *, char *); static int addgroup(struct aka *, char *); static int addmember(struct aka *, char *); static char *getalias(char *); static void add_aka(struct aka *, char *); static struct aka *akalloc(char *); static struct home *hmalloc(struct passwd *); struct home *seek_home(char *); /* Do mh alias substitution on 's' and return the results. */ char * akvalue(char *s) { char *v; akvis = -1; v = akval(akahead, s); if (akvis == -1) akvis = 0; return v; } int akvisible(void) { return akvis; } char * akresult(struct aka *ak) { char *cp = NULL, *dp, *pp; struct adr *ad; for (ad = ak->ak_addr; ad; ad = ad->ad_next) { pp = ad->ad_local ? akval(ak->ak_next, ad->ad_text) : mh_xstrdup(ad->ad_text); if (cp) { dp = cp; cp = concat(cp, ",", pp, NULL); mh_free0(&dp); mh_free0(&pp); } else cp = pp; } if (akvis == -1) akvis = ak->ak_visible; return cp; } static char * akval(struct aka *ak, char *s) { if (!s) return s; /* XXX */ for (; ak; ak = ak->ak_next) { if (aleq (s, ak->ak_name)) { return akresult (ak); } else if (strchr (s, ':')) { /* ** The first address in a blind list will contain the ** alias name, so try to match, but just with just the ** address (not including the list name). If there's a ** match, then replace the alias part with its ** expansion. */ char *name = getname(s); char *cp = NULL; if (name) { /* ** s is of the form "Blind list: address". If address ** is an alias, expand it. */ struct mailname *mp = getm(name, NULL, 0, AD_NAME, NULL); if (mp && mp->m_ingrp) { char *gname = add (mp->m_gname, NULL); if (gname && aleq(name, ak->ak_name)) { /* Will leak cp. */ cp = concat (gname, akresult (ak), NULL); free(gname); } } mnfree(mp); } /* Need to flush getname after use. */ while (getname("")) continue; if (cp) { return cp; } } } return mh_xstrdup(s); } static int aleq(char *string, char *aliasent) { char c; while ((c = *string++)) if (*aliasent == '*') return 1; else if ((c | 040) != (*aliasent | 040)) return 0; else aliasent++; return (*aliasent == 0 || *aliasent == '*'); } /* ** file needs to be absolute or relative to cwd */ int alias(char *file) { int i; char *bp, *cp, *pp; char lc, *ap; struct aka *ak = NULL; FILE *fp; if ((fp = fopen(file, "r")) == NULL) { akerrst = file; return AK_NOFILE; } while (vfgets(fp, &ap) == OK) { bp = ap; switch (*(pp = scanp(bp))) { case '<': /* recurse a level */ if (!*(cp = getp(pp + 1))) { akerrst = "'<' without alias-file"; fclose(fp); return AK_ERROR; } if ((i = alias(cp)) != AK_OK) { fclose(fp); return i; } case ':': /* comment */ case ';': case '#': case 0: continue; } akerrst = bp; if (!*(cp = seekp(pp, &lc, &ap))) { fclose(fp); return AK_ERROR; } if (!(ak = akalloc(cp))) { fclose(fp); return AK_LIMIT; } switch (lc) { case ':': ak->ak_visible = 0; break; case ';': ak->ak_visible = 1; break; default: fclose(fp); return AK_ERROR; } switch (*(pp = scanp(ap))) { case 0: /* EOL */ fclose(fp); return AK_ERROR; case '<': /* read values from file */ if (!*(cp = getp(pp + 1))) { fclose(fp); return AK_ERROR; } if (!addfile(ak, cp)) { fclose(fp); return AK_NOFILE; } break; case '=': /* UNIX group */ if (!*(cp = getp(pp + 1))) { fclose(fp); return AK_ERROR; } if (!addgroup(ak, cp)) { fclose(fp); return AK_NOGROUP; } break; case '+': /* UNIX group members */ if (!*(cp = getp(pp + 1))) { fclose(fp); return AK_ERROR; } if (!addmember(ak, cp)) { fclose(fp); return AK_NOGROUP; } break; default: /* list */ while ((cp = getalias(pp))) add_aka(ak, cp); break; } } fclose(fp); return AK_OK; } char * akerror(int i) { static char buffer[BUFSIZ]; switch (i) { case AK_NOFILE: snprintf(buffer, sizeof(buffer), "unable to read '%s'", akerrst); break; case AK_ERROR: snprintf(buffer, sizeof(buffer), "error in line '%s'", akerrst); break; case AK_LIMIT: snprintf(buffer, sizeof(buffer), "out of memory while on '%s'", akerrst); break; case AK_NOGROUP: snprintf(buffer, sizeof(buffer), "no such group as '%s'", akerrst); break; default: snprintf(buffer, sizeof(buffer), "unknown error (%d)", i); break; } return buffer; } static char * scanp(unsigned char *p) { while (isspace(*p)) p++; return p; } static char * getp(char *p) { unsigned char *cp = scanp(p); p = cp; while (!isspace(*cp) && *cp) cp++; *cp = 0; return p; } static char * seekp(char *p, char *c, char **a) { unsigned char *cp; p = cp = scanp(p); while (!isspace(*cp) && *cp && *cp != ':' && *cp != ';') cp++; *c = *cp; *cp++ = 0; *a = cp; return p; } static int addfile(struct aka *ak, char *file) { char *cp; char buffer[BUFSIZ]; FILE *fp; if (!(fp = fopen(etcpath(file), "r"))) { akerrst = file; return 0; } while (fgets(buffer, sizeof buffer, fp)) while ((cp = getalias(buffer))) add_aka(ak, cp); fclose(fp); return 1; } static int addgroup(struct aka *ak, char *grp) { char *gp; struct group *gr = getgrnam(grp); struct home *hm = NULL; if (!gr) gr = getgrgid(atoi(grp)); if (!gr) { akerrst = grp; return 0; } while ((gp = *gr->gr_mem++)) { struct passwd *pw; for (hm = homehead; hm; hm = hm->h_next) if (strcmp(hm->h_name, gp)==0) { add_aka(ak, hm->h_name); break; } if ((pw = getpwnam(gp))) { hmalloc(pw); add_aka(ak, gp); } } return 1; } static int addmember(struct aka *ak, char *grp) { gid_t gid; struct group *gr = getgrnam(grp); struct home *hm = NULL; if (gr) gid = gr->gr_gid; else { gid = atoi(grp); gr = getgrgid(gid); } if (!gr) { akerrst = grp; return 0; } init_pw(); for (hm = homehead; hm; hm = hm->h_next) if (hm->h_gid == gid) add_aka(ak, hm->h_name); return 1; } static char * getalias(char *addrs) { unsigned char *pp, *qp; static char *cp = NULL; if (cp == NULL) cp = addrs; else if (*cp == 0) return (cp = NULL); for (pp = cp; isspace(*pp); pp++) continue; if (*pp == 0) return (cp = NULL); for (qp = pp; *qp != 0 && *qp != ','; qp++) continue; if (*qp == ',') *qp++ = 0; for (cp = qp, qp--; qp > pp; qp--) if (*qp != 0) { if (isspace(*qp)) *qp = 0; else break; } return pp; } static void add_aka(struct aka *ak, char *pp) { struct adr *ad, *ld; for (ad = ak->ak_addr, ld = NULL; ad; ld = ad, ad = ad->ad_next) if (strcmp(pp, ad->ad_text)==0) return; ad = mh_xcalloc(1, sizeof(*ad)); ad->ad_text = mh_xstrdup(pp); ad->ad_local = strchr(pp, '@') == NULL; ad->ad_next = NULL; if (ak->ak_addr) ld->ad_next = ad; else ak->ak_addr = ad; } void init_pw(void) { struct passwd *pw; static int init = 0; if (!init) { /* read the passwd database and build a list */ setpwent(); while ((pw = getpwent())) { if (!hmalloc(pw)) { break; } } endpwent(); init++; /* now we're initialized */ } } static struct aka * akalloc(char *id) { struct aka *p; p = mh_xcalloc(1, sizeof(*p)); p->ak_name = mh_xstrdup(id); p->ak_visible = 0; p->ak_addr = NULL; p->ak_next = NULL; if (akatail != NULL) akatail->ak_next = p; if (akahead == NULL) akahead = p; akatail = p; return p; } static struct home * hmalloc(struct passwd *pw) { struct home *p; p = mh_xcalloc(1, sizeof(*p)); p->h_name = mh_xstrdup(pw->pw_name); p->h_uid = pw->pw_uid; p->h_gid = pw->pw_gid; p->h_home = mh_xstrdup(pw->pw_dir); p->h_shell = mh_xstrdup(pw->pw_shell); p->h_ngrps = 0; p->h_next = NULL; /* append to end */ if (!homehead) homehead = p; if (hometail) hometail->h_next = p; hometail = p; return p; } struct home * seek_home(char *name) { struct home *hp; struct passwd *pw; char lname[32]; unsigned char *c; char *c1; for (hp = homehead; hp; hp = hp->h_next) if (!mh_strcasecmp(name, hp->h_name)) return hp; /* ** The only place where there might be problems. ** This assumes that ALL usernames are kept in lowercase. */ for (c = name, c1 = lname; *c && (c1 - lname < (int)sizeof(lname) - 1); c++, c1++) { if (isalpha(*c) && isupper(*c)) *c1 = tolower(*c); else *c1 = *c; } *c1 = '\0'; if ((pw = getpwnam(lname))) return(hmalloc(pw)); return NULL; } mmh-0.4/uip/sendfiles.sh0000755000000000000000000000113313414435726013753 0ustar rootroot#!/bin/sh # # Send multiples files non-interactively # adjust if needed attachment_header=`mhparam Attachment-Header` if [ $# -lt 3 ]; then echo 'usage: sendfiles RECIPIENT SUBJECT FILES...' 1>&2 exit 1; fi rcpt="$1" shift subject="$1" shift cat 1>&2 < #include #include #include #include #include /* ** maximum number of names */ #define NVEC 50 static struct swit switches[] = { #define FILESW 0 { "file aliasfile", 0 }, #define LISTSW 1 { "list", 0 }, #define NLISTSW 2 { "nolist", 2 }, #define NORMSW 3 { "normalize", 0 }, #define NNORMSW 4 { "nonormalize", 2 }, #define USERSW 5 { "user", 0 }, #define NUSERSW 6 { "nouser", 2 }, #define VERSIONSW 7 { "Version", 0 }, #define HELPSW 8 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; static int pos = 1; extern struct aka *akahead; /* ** prototypes */ static void print_aka(char *, int, int); static void print_usr(char *, int, int); int main(int argc, char **argv) { int i, vecp = 0, inverted = 0, list = 0; int deffiles = 1, normalize = AD_NHST; char *cp, **ap, **argp, buf[BUFSIZ]; char *vec[NVEC], **arguments; struct aka *ak; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [switches] aliases ...", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case FILESW: if (!(cp = *argp++) || *cp == '-') { adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } if ((i = alias(cp)) != AK_OK) adios(EX_USAGE, NULL, "aliasing error in %s: %s", cp, akerror(i)); deffiles = 0; continue; case LISTSW: list++; continue; case NLISTSW: list = 0; continue; case NORMSW: normalize = AD_HOST; continue; case NNORMSW: normalize = AD_NHST; continue; case USERSW: inverted++; continue; case NUSERSW: inverted = 0; continue; } } vec[vecp++] = cp; } /* process default Aliasfile: profile entry */ if (deffiles && (cp = context_find("Aliasfile"))) { char *dp = NULL; for (ap = brkstring(dp=mh_xstrdup(cp), " ", "\n"); ap && *ap; ap++) { if ((i = alias(etcpath(*ap))) != AK_OK) { adios(EX_DATAERR, NULL, "aliasing error in %s: %s", *ap, akerror(i)); } } if (dp) { mh_free0(&dp); } } /* ** If -user is specified */ if (inverted) { if (vecp == 0) adios(EX_USAGE, NULL, "usage: %s -user addresses ... (you forgot the addresses)", invo_name); for (i = 0; i < vecp; i++) print_usr(vec[i], list, normalize); exit(EX_OK); } if (vecp) { /* print specified aliases */ for (i = 0; i < vecp; i++) print_aka(akvalue(vec[i]), list, 0); } else { /* print them all */ for (ak = akahead; ak; ak = ak->ak_next) { printf("%s: ", ak->ak_name); pos += strlen(ak->ak_name) + 1; print_aka(akresult(ak), list, pos); } } return EX_OK; } static void print_aka(char *p, int list, int margin) { char c; if (p == NULL) { printf("\n"); return; } while ((c = *p++)) { switch (c) { case ',': if (*p) { if (list) printf("\n%*s", margin, ""); else { if (pos >= 68) { printf(",\n "); pos = 2; } else { printf(", "); pos += 2; } } } case 0: break; default: pos++; putchar(c); } } putchar('\n'); pos = 1; } static void print_usr(char *s, int list, int norm) { char *cp, *pp, *vp; struct aka *ak; struct mailname *mp, *np; if ((pp = getname(s)) == NULL) adios(EX_DATAERR, NULL, "no address in \"%s\"", s); if ((mp = getm(pp, NULL, 0, norm, NULL)) == NULL) adios(EX_DATAERR, NULL, "bad address \"%s\"", s); while (getname("")) continue; vp = NULL; for (ak = akahead; ak; ak = ak->ak_next) { pp = akresult(ak); while ((cp = getname(pp))) { if ((np = getm(cp, NULL, 0, norm, NULL)) == NULL) continue; if (!mh_strcasecmp(mp->m_host, np->m_host) && !mh_strcasecmp(mp->m_mbox, np->m_mbox)) { vp = vp ? add(ak->ak_name, add(",", vp)) : mh_xstrdup(ak->ak_name); mnfree(np); while (getname("")) continue; break; } mnfree(np); } } mnfree(mp); print_aka(vp ? vp : s, list, 0); if (vp) mh_free0(&vp); } mmh-0.4/uip/burst.c0000644000000000000000000001652313414435726012754 0ustar rootroot/* ** burst.c -- explode digests into individual messages ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include static struct swit switches[] = { #define VERBSW 0 { "verbose", 0 }, #define NVERBSW 1 { "noverbose", 2 }, #define VERSIONSW 2 { "Version", 0 }, #define HELPSW 3 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; static char delim3[] = "-------"; struct smsg { long s_start; long s_stop; }; /* ** static prototypes */ static int find_delim(int, struct smsg *); static void burst(struct msgs **, int, struct smsg *, int, int, char *); static void cpybrst(FILE *, FILE *, char *, char *, int); int main(int argc, char **argv) { int verbosw = 0; int msgp = 0, hi, msgnum, numburst; char *cp, *maildir, *folder = NULL, buf[BUFSIZ]; char **argp, **arguments, *msgs[MAXARGS]; struct smsg *smsgs; struct msgs *mp; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown\n", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case VERBSW: verbosw++; continue; case NVERBSW: verbosw = 0; continue; } } if (*cp == '+' || *cp == '@') { if (folder) adios(EX_USAGE, NULL, "only one folder at a time!"); else folder = mh_xstrdup(expandfol(cp)); } else { msgs[msgp++] = cp; } } if (!msgp) msgs[msgp++] = seq_cur; if (!folder) folder = getcurfol(); maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) adios(EX_SOFTWARE, maildir, "unable to change directory to"); /* read folder and create message structure */ if (!(mp = folder_read(folder))) adios(EX_IOERR, NULL, "unable to read folder %s", folder); /* check for empty folder */ if (mp->nummsg == 0) adios(EX_DATAERR, NULL, "no messages in %s", folder); /* parse all the message ranges/sequences and set SELECTED */ for (msgnum = 0; msgnum < msgp; msgnum++) if (!m_convert(mp, msgs[msgnum])) exit(EX_SOFTWARE); seq_setprev(mp); /* set the previous-sequence */ smsgs = mh_xcalloc(MAXFOLDER + 2, sizeof(*smsgs)); hi = mp->hghmsg + 1; /* burst all the SELECTED messages */ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (is_selected(mp, msgnum)) { if ((numburst = find_delim(msgnum, smsgs)) > 0) { if (verbosw) printf("%d message%s exploded from digest %d\n", numburst, numburst > 1 ? "s" : "", msgnum); burst(&mp, msgnum, smsgs, numburst, verbosw, maildir); } else if (numburst == 0) { admonish(NULL, "message %d not in digest format", msgnum); } else { adios(EX_SOFTWARE, NULL, "burst() botch -- you lose big"); } } } mh_free0(&smsgs); context_replace(curfolder, folder); /* ** The first message extracted from the first digest ** becomes the current message. */ if (hi <= mp->hghmsg) { seq_setcur(mp, hi); } seq_save(mp); context_save(); folder_free(mp); return 0; } /* ** Scan the message and find the beginning and ** end of all the messages in the digest. */ static int find_delim(int msgnum, struct smsg *smsgs) { int ld3, wasdlm, msgp; long pos; char c, *msgnam; int cc; char buffer[BUFSIZ]; FILE *in; ld3 = strlen(delim3); if ((in = fopen(msgnam = m_name(msgnum), "r")) == NULL) adios(EX_IOERR, msgnam, "unable to read message"); for (msgp = 0, pos = 0L; msgp <= MAXFOLDER; msgp++) { while (fgets(buffer, sizeof(buffer), in) && buffer[0] == '\n') pos += (long) strlen(buffer); if (feof(in)) { break; } fseek(in, pos, SEEK_SET); smsgs[msgp].s_start = pos; for (c = 0; fgets(buffer, sizeof(buffer), in); c = buffer[0]) { if (strncmp(buffer, delim3, ld3) == 0 && (msgp == 1 || c == '\n')) { cc = getc(in); ungetc(cc, in); if (cc == '\n' || cc == EOF) { break; } } else pos += (long) strlen(buffer); } wasdlm = strncmp(buffer, delim3, ld3) == 0; if (smsgs[msgp].s_start != pos) smsgs[msgp].s_stop = (c == '\n' && wasdlm) ? pos - 1 : pos; if (feof(in)) { break; } pos += (long) strlen(buffer); } fclose(in); return (msgp > 0) ? msgp-1 : 0; /* toss "End of XXX Digest" */ } /* ** Burst out the messages in the digest into the folder */ static void burst(struct msgs **mpp, int msgnum, struct smsg *smsgs, int numburst, int verbosw, char *maildir) { int i, j, mode; char *msgnam; char destfil[BUFSIZ]; FILE *in, *out; struct stat st; struct msgs *mp; if ((in = fopen(msgnam = m_name(msgnum), "r")) == NULL) adios(EX_IOERR, msgnam, "unable to read message"); mode = fstat(fileno(in), &st) != NOTOK ? (int)(st.st_mode & 0777) : m_gmprot(); mp = *mpp; /* ** Ensure we have enough space in the folder ** structure for all the new messages. */ if ((mp->hghmsg + numburst > mp->hghoff) && !(mp = folder_realloc(mp, mp->lowoff, mp->hghmsg + numburst))) adios(EX_OSERR, NULL, "unable to allocate folder storage"); *mpp = mp; /* ** At this point, there is an array of numburst smsgs, each ** element of which contains the starting and stopping offsets ** (seeks) of the message in the digest. Go through the message ** numbers. Ignore smsgs[0], which is the table of contents. */ for (j=1, i=mp->hghmsg+1; j<=numburst; j++, i++) { snprintf(destfil, sizeof destfil, "%s/%d", maildir, i); if (!(out = fopen(destfil, "w"))) { adios(EX_IOERR, destfil, "unable to open"); } if (verbosw) { printf("message %d of digest %d becomes message %d\n", j, msgnum, i); } chmod(destfil, mode); fseek(in, smsgs[j].s_start, SEEK_SET); cpybrst(in, out, msgnam, destfil, (int) (smsgs[j].s_stop - smsgs[j].s_start)); fclose(out); mp->hghmsg++; mp->nummsg++; /* ** Bursting each message is equivalent to adding a ** new message from the point of view of the external hooks. */ ext_hook("add-hook", destfil, NULL); copy_msg_flags(mp, i, msgnum); mp->msgflags |= SEQMOD; } fclose(in); } /* ** Copy a message which is being burst out of a digest. ** It will remove any "dashstuffing" in the message. */ static void cpybrst(FILE *in, FILE *out, char *ifile, char *ofile, int len) { int c; enum { S1, S2, S3 } state; for (state = S1; (c = fgetc(in)) != EOF && len > 0; len--) { if (c == 0) continue; switch (state) { case S1: switch (c) { case '-': state = S3; break; default: state = S2; case '\n': fputc(c, out); break; } break; case S2: switch (c) { case '\n': state = S1; default: fputc(c, out); break; } break; case S3: switch (c) { case ' ': state = S2; break; default: state = (c == '\n') ? S1 : S2; fputc('-', out); fputc(c, out); break; } break; } } if (ferror(in) && !feof(in)) adios(EX_IOERR, ifile, "error reading"); if (ferror(out)) adios(EX_IOERR, ofile, "error writing"); } mmh-0.4/uip/mhmail.c0000644000000000000000000000774713414435726013074 0ustar rootroot/* ** mhmail.c -- simple mail program ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include static struct swit switches[] = { #define BODYSW 0 { "bodytext text", 0 }, #define CCSW 1 { "cc addrs ...", 0 }, #define FROMSW 2 { "from addr", 0 }, #define SUBJSW 3 { "subject text", 0 }, #define VERSIONSW 4 { "Version", 0 }, #define HELPSW 5 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; static char tmpfil[BUFSIZ]; /* ** static prototypes */ static void intrser(int); int main(int argc, char **argv) { int status, iscc = 0, nvec; char *cp, *tolist = NULL, *cclist = NULL, *subject = NULL; char *from = NULL, *body = NULL, **argp, **arguments; char *vec[5], buf[BUFSIZ]; FILE *out; char *tfile = NULL; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* Without arguments, exit. */ if (argc == 1) { adios(EX_USAGE, NULL, "no interactive mail shell. Use inc/scan/show instead."); } context_read(); arguments = getarguments(invo_name, argc, argv, 0); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s addrs... [switches]", invo_name); print_help(buf, switches, 0); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case FROMSW: if (!(from = *argp++) || *from == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case BODYSW: if (!(body = *argp++) || *body == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case CCSW: iscc++; continue; case SUBJSW: if (!(subject = *argp++) || *subject == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; } } if (iscc) cclist = cclist ? add(cp, add(", ", cclist)) : mh_xstrdup(cp); else tolist = tolist ? add(cp, add(", ", tolist)) : mh_xstrdup(cp); } if (tolist == NULL) adios(EX_USAGE, NULL, "usage: %s addrs ... [switches]", invo_name); tfile = m_mktemp2("/tmp/", invo_name, NULL, &out); if (tfile == NULL) adios(EX_CANTCREAT, "mhmail", "unable to create temporary file"); chmod(tfile, 0600); strncpy(tmpfil, tfile, sizeof(tmpfil)); SIGNAL2(SIGINT, intrser); fprintf(out, "To: %s\n", tolist); if (cclist) fprintf(out, "Cc: %s\n", cclist); if (subject) fprintf(out, "Subject: %s\n", subject); if (from) fprintf(out, "From: %s\n", from); fputs("\n", out); if (body) { fprintf(out, "%s", body); if (*body && body[strlen(body) - 1] != '\n') fputs("\n", out); } else { int empty = 1; while (fgets(buf, sizeof buf, stdin)) { if (buf[0]=='.' && buf[1]=='\n') { /* A period alone on a line means EOF. */ break; } empty = 0; if (fputs(buf, out) == EOF) { adios(EX_IOERR, tmpfil, "error writing"); } } if (empty) { unlink(tmpfil); adios(EX_DATAERR, NULL, "not sending message with empty body"); } } fclose(out); nvec = 0; vec[nvec++] = "spost"; vec[nvec++] = tmpfil; vec[nvec] = NULL; if ((status = execprog(*vec, vec))) { /* spost failed, save draft as dead.letter */ int in, out; in = open(tmpfil, O_RDONLY); out = creat("dead.letter", 0600); if (in == -1 || out == -1) { fprintf(stderr, "Letter left at %s.\n", tmpfil); exit(status); } cpydata(in, out, tmpfil, "dead.letter"); close(in); close(out); fprintf(stderr, "Letter saved in dead.letter\n"); } unlink(tmpfil); exit(status); } static void intrser(int i) { unlink(tmpfil); _exit(EX_IOERR); } mmh-0.4/uip/sortm.c0000644000000000000000000003166713414435726012767 0ustar rootroot/* ** sortm.c -- sort messages in a folder by date/time ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_PARAM_H # include #endif static struct swit switches[] = { #define DATESW 0 { "datefield field", 0 }, #define TEXTSW 1 { "textfield field", 0 }, #define NSUBJSW 2 { "notextfield", 2 }, #define LIMSW 3 { "limit days", 0 }, #define NLIMSW 4 { "nolimit", 2 }, #define VERBSW 5 { "verbose", 0 }, #define NVERBSW 6 { "noverbose", 2 }, #define VERSIONSW 7 { "Version", 0 }, #define HELPSW 8 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; struct smsg { int s_msg; time_t s_clock; char *s_subj; }; static struct smsg *smsgs; int nmsgs; char *subjsort = NULL; /* sort on subject if != 0 */ time_t datelimit = 0; int submajor = 0; /* if true, sort on subject-major */ int verbose; /* This keeps compiler happy on calls to qsort */ typedef int (*qsort_comp) (const void *, const void *); /* ** static prototypes */ static int read_hdrs(struct msgs *, char *); static int get_fields(char *, int, struct smsg *); static int dsort(struct smsg **, struct smsg **); static int subsort(struct smsg **, struct smsg **); static int txtsort(struct smsg **, struct smsg **); static void rename_chain(struct msgs *, struct smsg **, int, int); static void rename_msgs(struct msgs *, struct smsg **); int main(int argc, char **argv) { int i, msgnum; unsigned char *cp; char *maildir, *datesw = NULL; char *folder = NULL, buf[BUFSIZ], **argp; char **arguments; struct msgs_array msgs = { 0, 0, NULL }; struct msgs *mp; struct smsg **dlist; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; /* ** Parse arguments */ while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case DATESW: if (datesw) adios(EX_USAGE, NULL, "only one date field at a time"); if (!(datesw = *argp++) || *datesw == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case TEXTSW: if (subjsort) adios(EX_USAGE, NULL, "only one text field at a time"); if (!(subjsort = *argp++) || *subjsort == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case NSUBJSW: subjsort = NULL; continue; case LIMSW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); while (*cp == '0') cp++; /* skip any leading zeros */ if (!*cp) { /* hit end of string */ submajor++; /* sort subject-major */ continue; } if (!isdigit(*cp) || !(datelimit = atoi(cp))) adios(EX_USAGE, NULL, "impossible limit %s", cp); datelimit *= 60*60*24; continue; case NLIMSW: submajor = 0; /* use date-major, but */ datelimit = 0; /* use no limit */ continue; case VERBSW: verbose++; continue; case NVERBSW: verbose = 0; continue; } } if (*cp == '+' || *cp == '@') { if (folder) adios(EX_USAGE, NULL, "only one folder at a time!"); else folder = mh_xstrdup(expandfol(cp)); } else app_msgarg(&msgs, cp); } if (!msgs.size) app_msgarg(&msgs, seq_all); if (!datesw) datesw = "date"; if (!folder) folder = getcurfol(); maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) adios(EX_OSERR, maildir, "unable to change directory to"); /* read folder and create message structure */ if (!(mp = folder_read(folder))) adios(EX_IOERR, NULL, "unable to read folder %s", folder); /* check for empty folder */ if (mp->nummsg == 0) adios(EX_DATAERR, NULL, "no messages in %s", folder); /* parse all the message ranges/sequences and set SELECTED */ for (msgnum = 0; msgnum < msgs.size; msgnum++) if (!m_convert(mp, msgs.msgs[msgnum])) exit(EX_USAGE); seq_setprev(mp); /* set the previous sequence */ if ((nmsgs = read_hdrs(mp, datesw)) <= 0) adios(EX_DATAERR, NULL, "no messages to sort"); /* ** sort a list of pointers to our "messages to be sorted". */ dlist = mh_xcalloc(nmsgs+1, sizeof(*dlist)); for (i = 0; i < nmsgs; i++) dlist[i] = &smsgs[i]; dlist[nmsgs] = 0; if (verbose) { /* announce what we're doing */ if (subjsort) printf("sorting by %s-major %s-minor\n", submajor ? subjsort : datesw, submajor ? datesw : subjsort); else printf("sorting by datefield %s\n", datesw); } /* first sort by date, or by subject-major, date-minor */ qsort((char *) dlist, nmsgs, sizeof(*dlist), (qsort_comp) (submajor && subjsort ? txtsort : dsort)); /* ** if we're sorting on subject, we need another list ** in subject order, then a merge pass to collate the ** two sorts. */ if (!submajor && subjsort) { /* already date sorted */ struct smsg **slist, **flist; struct smsg ***il, **fp, **dp; slist = mh_xcalloc(nmsgs+1, sizeof(*slist)); memcpy((char *)slist, (char *)dlist, (nmsgs+1)*sizeof(*slist)); qsort((char *)slist, nmsgs, sizeof(*slist), (qsort_comp) subsort); /* ** make an inversion list so we can quickly find ** the collection of messages with the same subj ** given a message number. */ il = mh_xcalloc(mp->hghsel+1, sizeof(*il)); if (! il) adios(EX_OSERR, NULL, "couldn't allocate msg list"); for (i = 0; i < nmsgs; i++) il[slist[i]->s_msg] = &slist[i]; /* ** make up the final list, chronological but with ** all the same subjects grouped together. */ flist = mh_xcalloc(nmsgs+1, sizeof(*flist)); fp = flist; for (dp = dlist; *dp;) { struct smsg **s = il[(*dp++)->s_msg]; /* see if we already did this guy */ if (! s) continue; *fp++ = *s++; /* ** take the next message(s) if there is one, ** its subject isn't null and its subject ** is the same as this one and it's not too ** far away in time. */ while (*s && (*s)->s_subj[0] && strcmp((*s)->s_subj, s[-1]->s_subj) == 0 && (datelimit == 0 || (*s)->s_clock - s[-1]->s_clock <= datelimit)) { il[(*s)->s_msg] = 0; *fp++ = *s++; } } *fp = 0; mh_free0(&slist); mh_free0(&dlist); dlist = flist; } /* ** At this point, dlist is a sorted array of pointers to smsg ** structures, each of which contains a message number. */ rename_msgs(mp, dlist); context_replace(curfolder, folder); /* update current folder */ seq_save(mp); /* synchronize message sequences */ context_save(); /* save the context file */ folder_free(mp); /* free folder/message structure */ return 0; } static int read_hdrs(struct msgs *mp, char *datesw) { int msgnum; struct tws tb; struct smsg *s; twscopy(&tb, dlocaltimenow()); smsgs = mh_xcalloc(mp->hghsel - mp->lowsel + 2, sizeof(*smsgs)); s = smsgs; for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (is_selected(mp, msgnum)) { if (get_fields(datesw, msgnum, s)) { s->s_msg = msgnum; s++; } } } s->s_msg = 0; return(s - smsgs); } /* ** Parse the message and get the data or subject field, ** if needed. */ static int get_fields(char *datesw, int msg, struct smsg *smsg) { enum state state; struct field f = {{0}}; int compnum; char *msgnam; struct tws *tw; char *datecomp = NULL, *subjcomp = NULL; FILE *in; if ((in = fopen(msgnam = m_name(msg), "r")) == NULL) { admonish(msgnam, "unable to read message"); return (0); } for (compnum = 1, state = FLD2;; compnum++) { switch (state = m_getfld2(state, &f, in)) { case LENERR2: state = FLD2; /* FALL */ case FLD2: if (mh_strcasecmp(f.name, datesw)==0) { datecomp = mh_xstrdup(f.value); if (!subjsort || subjcomp) { break; } } else if (subjsort && mh_strcasecmp(f.name, subjsort)==0) { subjcomp = mh_xstrdup(f.value); if (datecomp) { break; } } continue; case BODY2: case FILEEOF2: break; case FMTERR2: admonish(NULL, "format error in message %d (header #%d)", msg, compnum); state = FLD2; continue; case IOERR2: admonish(NULL, "format error in message %d (header #%d)", msg, compnum); if (datecomp) { mh_free0(&datecomp); } if (subjcomp) { mh_free0(&subjcomp); } fclose(in); return (0); default: adios(EX_SOFTWARE, NULL, "internal error -- you lose"); } break; } /* ** If no date component, then use the modification ** time of the file as its date */ if (!datecomp || (tw = dparsetime(datecomp)) == NULL) { struct stat st; admonish(NULL, "can't parse %s field in message %d", datesw, msg); fstat(fileno(in), &st); smsg->s_clock = st.st_mtime; } else { smsg->s_clock = dmktime(tw); } if (subjsort) { if (subjcomp) { /* ** try to make the subject "canonical": delete ** leading "re:", everything but letters & smash ** letters to lower case. */ char *cp, *cp2; unsigned char c; cp = subjcomp; cp2 = subjcomp; if (strcmp(subjsort, "subject") == 0) { while ((c = *cp)) { if (! isspace(c)) { if(uprf(cp, "re:")) cp += 2; else break; } cp++; } } while ((c = *cp++)) { if (isalnum(c)) *cp2++ = isupper(c) ? tolower(c) : c; } *cp2 = '\0'; } else subjcomp = ""; smsg->s_subj = subjcomp; } fclose(in); if (datecomp) mh_free0(&datecomp); return (1); } /* ** sort on dates. */ static int dsort(struct smsg **a, struct smsg **b) { if ((*a)->s_clock < (*b)->s_clock) return (-1); else if ((*a)->s_clock > (*b)->s_clock) return (1); else if ((*a)->s_msg < (*b)->s_msg) return (-1); else return (1); } /* ** sort on subjects. */ static int subsort(struct smsg **a, struct smsg **b) { int i; if ((i = strcmp((*a)->s_subj, (*b)->s_subj))) return (i); return (dsort(a, b)); } static int txtsort(struct smsg **a, struct smsg **b) { int i; if ((i = strcmp((*a)->s_subj, (*b)->s_subj))) return (i); else if ((*a)->s_msg < (*b)->s_msg) return (-1); else return (1); } static void rename_chain(struct msgs *mp, struct smsg **mlist, int msg, int endmsg) { int nxt, old, new; char *newname, oldname[BUFSIZ]; char newbuf[MAXPATHLEN + 1]; for (;;) { nxt = mlist[msg] - smsgs; /* mlist[msg] is a ptr into smsgs */ mlist[msg] = (struct smsg *)0; old = smsgs[nxt].s_msg; new = smsgs[msg].s_msg; strncpy(oldname, m_name(old), sizeof(oldname)); newname = m_name(new); if (verbose) printf("message %d becomes message %d\n", old, new); snprintf(oldname, sizeof (oldname), "%s/%d", mp->foldpath, old); snprintf(newbuf, sizeof (newbuf), "%s/%d", mp->foldpath, new); ext_hook("ref-hook", oldname, newbuf); if (rename(oldname, newname) == NOTOK) adios(EX_IOERR, newname, "unable to rename %s to", oldname); copy_msg_flags(mp, new, old); if (mp->curmsg == old) seq_setcur(mp, new); if (nxt == endmsg) break; msg = nxt; } /* if (nxt != endmsg); */ /* rename_chain(mp, mlist, nxt, endmsg); */ } static void rename_msgs(struct msgs *mp, struct smsg **mlist) { int i, j, old, new; seqset_t tmpset; char f1[BUFSIZ], tmpfil[BUFSIZ]; char newbuf[MAXPATHLEN + 1]; struct smsg *sp; strncpy(tmpfil, m_name(mp->hghmsg + 1), sizeof(tmpfil)); for (i = 0; i < nmsgs; i++) { if (! (sp = mlist[i])) continue; /* did this one */ j = sp - smsgs; if (j == i) continue; /* this one doesn't move */ /* ** the guy that was msg j is about to become msg i. ** rename 'j' to make a hole, then recursively rename ** guys to fill up the hole. */ old = smsgs[j].s_msg; new = smsgs[i].s_msg; strncpy(f1, m_name(old), sizeof(f1)); if (verbose) printf("renaming message chain from %d to %d\n", old, new); /* ** Run the external hook to refile the old message as the ** temporary message number that is off of the end of the ** messages in the folder. */ snprintf(f1, sizeof (f1), "%s/%d", mp->foldpath, old); snprintf(newbuf, sizeof (newbuf), "%s/%d", mp->foldpath, mp->hghmsg + 1); ext_hook("ref-hook", f1, newbuf); if (rename(f1, tmpfil) == NOTOK) adios(EX_IOERR, tmpfil, "unable to rename %s to ", f1); get_msg_flags(mp, &tmpset, old); rename_chain(mp, mlist, j, i); /* ** Run the external hook to refile the temorary message number ** to the real place. */ snprintf(f1, sizeof (f1), "%s/%d", mp->foldpath, new); ext_hook("ref-hook", newbuf, f1); if (rename(tmpfil, m_name(new)) == NOTOK) adios(EX_IOERR, m_name(new), "unable to rename %s to", tmpfil); set_msg_flags(mp, &tmpset, new); mp->msgflags |= SEQMOD; } } mmh-0.4/uip/mhbuild.c0000644000000000000000000010441313414435726013235 0ustar rootroot/* ** mhbuild.c -- expand/translate MIME composition files ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ /* ** This code was originally part of mhn.c. I split it into ** a separate program (mhbuild.c). But the code still has some of ** the mhn.c code in it. This program needs additional ** streamlining and removal of unneeded code. */ #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_TIME_H # include #endif #include static struct swit switches[] = { #define VERBSW 0 { "verbose", 0 }, #define NVERBSW 1 { "noverbose", 2 }, #define VERSIONSW 2 { "Version", 0 }, #define HELPSW 3 { "help", 0 }, #define DEBUGSW 4 { "debug", -5 }, { NULL, 0 } }; char *version=VERSION; /* ** Directory to place tmp files. This must ** be set before these routines are called. */ char *tmp; pid_t xpid = 0; static char prefix[] = "----- =_aaaaaaaaaa"; /* ** prototypes */ /* mhmisc.c */ int make_intermediates(char *); void content_error(char *, CT, char *, ...); /* mhfree.c */ void free_content(CT); void free_ctinfo(CT); void free_encoding(CT, int); /* ** static prototypes */ static int init_decoded_content(CT); static char *fgetstr(char *, int, FILE *); static int user_content(FILE *, char *, char *, CT *); static void set_id(CT, int); static int compose_content(CT); static int scan_content(CT); static int build_headers(CT); static CT build_mime(char *); int debugsw = 0; int verbosw = 0; /* ** Temporary files */ static char infile[BUFSIZ]; static int unlink_infile = 0; static char outfile[BUFSIZ]; static int unlink_outfile = 0; void unlink_done(); /* mhoutsbr.c */ int output_message(CT, char *); int output_message_fp(CT, FILE *, char*); /* mhmisc.c */ void set_endian(void); /* mhfree.c */ void free_content(CT); int main(int argc, char **argv) { char *cp, buf[BUFSIZ]; char buffer[BUFSIZ], *compfile = NULL; char **argp, **arguments; CT ct; FILE *fp = NULL; FILE *fp_out = NULL; if (atexit(unlink_done) != 0) { adios(EX_OSERR, NULL, "atexit failed"); } setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (cp[0] == '-' && cp[1] == '\0') { if (compfile) adios(EX_USAGE, NULL, "cannot specify both standard input and a file"); else compfile = cp; verbosw = 0; /* turn off -verbose listings */ break; } if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [switches] file", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case VERBSW: verbosw++; continue; case NVERBSW: verbosw = 0; continue; case DEBUGSW: debugsw = 1; continue; } } if (compfile) adios(EX_USAGE, NULL, "only one composition file allowed"); else compfile = cp; } set_endian(); /* ** Check if we've specified an additional profile */ if ((cp = getenv("MHBUILD"))) { if ((fp = fopen(cp, "r"))) { readconfig((struct node **) 0, fp, cp, 0); fclose(fp); } else { admonish("", "unable to read $MHBUILD profile (%s)", cp); } } /* ** Read the standard profile setup */ if ((fp = fopen(cp = etcpath("mhn.defaults"), "r"))) { readconfig((struct node **) 0, fp, cp, 0); fclose(fp); } /* ** Check for storage directory. If defined, we ** will store temporary files there. Else we ** store them in standard nmh directory. */ if ((cp = context_find(nmhstorage)) && *cp) tmp = concat(cp, "/", invo_name, NULL); else tmp = mh_xstrdup(toabsdir(invo_name)); /* Check if we have a file to process */ if (!compfile) adios(EX_USAGE, NULL, "need to specify a %s composition file", invo_name); /* ** Process the composition file from standard input. */ if (compfile[0] == '-' && compfile[1] == '\0') { /* copy standard input to temporary file */ strncpy(infile, m_mktemp(invo_name, NULL, &fp), sizeof(infile)); while (fgets(buffer, BUFSIZ, stdin)) fputs(buffer, fp); fclose(fp); unlink_infile = 1; /* build the content structures for MIME message */ ct = build_mime(infile); /* output MIME message to this temporary file */ strncpy(outfile, m_mktemp(invo_name, NULL, &fp_out), sizeof(outfile)); unlink_outfile = 1; /* output the message */ output_message_fp(ct, fp_out, outfile); fclose(fp_out); /* output the temp file to standard output */ if ((fp = fopen(outfile, "r")) == NULL) adios(EX_IOERR, outfile, "unable to open"); while (fgets(buffer, BUFSIZ, fp)) fputs(buffer, stdout); fclose(fp); unlink(infile); unlink_infile = 0; unlink(outfile); unlink_outfile = 0; free_content(ct); exit(EX_OK); } /* ** Process the composition file from a file. */ /* build the content structures for MIME message */ ct = build_mime(compfile); /* output MIME message to this temporary file */ strncpy(outfile, m_mktemp2(compfile, invo_name, NULL, &fp_out), sizeof(outfile)); unlink_outfile = 1; /* output the message */ output_message_fp(ct, fp_out, outfile); fclose(fp_out); /* Rename composition draft */ snprintf(buffer, sizeof(buffer), "%s.orig", compfile); if (rename(compfile, buffer) == NOTOK) { adios(EX_IOERR, buffer, "unable to rename draft %s to", compfile); } /* Rename output file to take its place */ if (rename(outfile, compfile) == NOTOK) { advise(compfile, "unable to rename output %s to", outfile); rename(buffer, compfile); exit(EX_IOERR); } unlink_outfile = 0; free_content(ct); return 0; } void unlink_done() { /* ** Check if we need to remove stray temporary files. */ if (unlink_infile) { unlink(infile); } if (unlink_outfile) { unlink(outfile); } } /* ** Main routine for translating composition file ** into valid MIME message. It translates the draft ** into a content structure (actually a tree of content ** structures). This message then can be manipulated ** in various ways, including being output via ** output_message(). */ static CT build_mime(char *infile) { enum state state; struct field f = {{0}}; int compnum; char buf[BUFSIZ]; char *cp, *np, *vp; struct multipart *m; struct part **pp; CT ct; FILE *in; HF hp; umask(~m_gmprot()); /* open the composition draft */ if ((in = fopen(infile, "r")) == NULL) { adios(EX_IOERR, infile, "unable to open for reading"); } /* ** Allocate space for primary (outside) content */ ct = mh_xcalloc(1, sizeof(*ct)); /* ** Allocate structure for handling decoded content ** for this part. We don't really need this, but ** allocate it to remain consistent. */ init_decoded_content(ct); /* ** Parse some of the header fields in the composition ** draft into the linked list of header fields for ** the new MIME message. */ for (compnum = 1, state = FLD2;;) { switch (state = m_getfld2(state, &f, in)) { case FLD2: compnum++; /* abort if draft has Mime-Version header field */ if (!mh_strcasecmp(f.name, VRSN_FIELD)) { adios(EX_CONFIG, NULL, "draft shouldn't contain %s: field", VRSN_FIELD); } /* ** abort if draft has Content-Transfer-Encoding ** header field */ if (!mh_strcasecmp(f.name, ENCODING_FIELD)) { adios(EX_CONFIG, NULL, "draft shouldn't contain %s: field", ENCODING_FIELD); } /* ignore any Content-Type fields in the header */ if (!mh_strcasecmp(f.name, TYPE_FIELD)) { continue; } /* add the header data to the list */ add_header(ct, mh_xstrdup(f.name), mh_xstrdup(f.value)); continue; case BODY2: fseek(in, (long) (-strlen(f.value)), SEEK_CUR); break; case FILEEOF2: adios(EX_CONFIG, NULL, "draft has empty body -- no directives!"); /* NOTREACHED */ case LENERR2: case FMTERR2: case IOERR2: adios(EX_CONFIG, NULL, "message format error in component #%d", compnum); default: adios(EX_SOFTWARE, NULL, "getfld() returned %d", state); } break; } /* ** Iterate through the list of headers and call the function to ** MIME-ify them if required. */ for (hp = ct->c_first_hf; hp != NULL; hp = hp->next) { if (encode_rfc2047(hp->name, &hp->value, NULL)) { adios(EX_DATAERR, NULL, "Unable to encode header \"%s\"", hp->name); } } /* ** Now add the MIME-Version header field ** to the list of header fields. */ np = mh_xstrdup(VRSN_FIELD); vp = concat(" ", VRSN_VALUE, "\n", NULL); add_header(ct, np, vp); /* ** We initially assume we will find multiple contents in the ** draft. So create a multipart/mixed content to hold everything. ** We can remove this later, if it is not needed. */ if (get_ctinfo("multipart/mixed", ct, 0) == NOTOK) { exit(EX_DATAERR); } ct->c_type = CT_MULTIPART; ct->c_subtype = MULTI_MIXED; ct->c_file = mh_xstrdup(infile); m = (struct multipart *) mh_xcalloc(1, sizeof(*m)); ct->c_ctparams = (void *) m; pp = &m->mp_parts; /* ** read and parse the composition file ** and the directives it contains. */ while (fgetstr(buf, sizeof(buf) - 1, in)) { struct part *part; CT p; if (user_content(in, infile, buf, &p) == DONE) { admonish(NULL, "ignoring spurious #end"); continue; } if (!p) continue; part = mh_xcalloc(1, sizeof(*part)); *pp = part; pp = &part->mp_next; part->mp_part = p; } /* ** close the composition draft since ** it's not needed any longer. */ fclose(in); /* check if any contents were found */ if (!m->mp_parts) adios(EX_OSERR, NULL, "no content directives found"); /* ** If only one content was found, then remove and ** free the outer multipart content. */ if (!m->mp_parts->mp_next) { CT p; p = m->mp_parts->mp_part; m->mp_parts->mp_part = NULL; /* move header fields */ p->c_first_hf = ct->c_first_hf; p->c_last_hf = ct->c_last_hf; ct->c_first_hf = NULL; ct->c_last_hf = NULL; free_content(ct); ct = p; } else { set_id(ct, 1); } /* ** Fill out, or expand directives. Parse and execute ** commands specified by profile composition strings. */ compose_content(ct); if ((cp = strchr(prefix, 'a')) == NULL) adios(EX_SOFTWARE, NULL, "internal error(4)"); /* ** Scan the contents. Choose a transfer encoding, and ** check if prefix for multipart boundary clashes with ** any of the contents. */ while (scan_content(ct) == NOTOK) { if (*cp < 'z') { (*cp)++; } else { if (*++cp == 0) adios(EX_SOFTWARE, NULL, "giving up trying to find a unique delimiter string"); else (*cp)++; } } /* Build the rest of the header field structures */ build_headers(ct); return ct; } /* ** Set up structures for placing unencoded ** content when building parts. */ static int init_decoded_content(CT ct) { CE ce; ce = mh_xcalloc(1, sizeof(*ce)); ct->c_cefile = ce; ct->c_ceopenfnx = open7Bit; /* since unencoded */ ct->c_ceclosefnx = close_encoding; ct->c_cesizefnx = NULL; /* since unencoded */ return OK; } static char * fgetstr(char *s, int n, FILE *stream) { char *cp, *ep; for (ep = (cp = s) + n; cp < ep; ) { int i; if (!fgets(cp, n, stream)) return (cp != s ? s : NULL); if (cp == s && *cp != '#') return s; cp += (i = strlen(cp)) - 1; if (i <= 1 || *cp-- != '\n' || *cp != '\\') break; *cp = '\0'; n -= (i - 2); } return s; } /* ** Parse the composition draft for text and directives. ** Do initial setup of Content structure. */ static int user_content(FILE *in, char *file, char *buf, CT *ctp) { int vrsn; unsigned char *cp; char **ap; char buffer[BUFSIZ]; struct multipart *m; struct part **pp; struct str2init *s2i; CI ci; CT ct; CE ce; if (buf[0] == '\n' || strcmp(buf, "#\n") == 0) { *ctp = NULL; return OK; } /* allocate basic Content structure */ ct = mh_xcalloc(1, sizeof(*ct)); *ctp = ct; /* allocate basic structure for handling decoded content */ init_decoded_content(ct); ce = ct->c_cefile; ci = &ct->c_ctinfo; set_id(ct, 0); /* ** Handle inline text. Check if line ** is one of the following forms: ** ** 1) doesn't begin with '#' (implicit directive) ** 2) begins with "##" (implicit directive) ** 3) begins with "#<" */ if (buf[0] != '#' || buf[1] == '#' || buf[1] == '<') { int headers; int inlineD; long pos; char content[BUFSIZ]; FILE *out; char *cp; cp = m_mktemp2(NULL, invo_name, NULL, &out); if (cp == NULL) adios(EX_CANTCREAT, "mhbuild", "unable to create temporary file"); /* use a temp file to collect the plain text lines */ ce->ce_file = mh_xstrdup(cp); ce->ce_unlink = 1; if (buf[0] == '#' && buf[1] == '<') { strncpy(content, buf + 2, sizeof(content)); inlineD = 1; goto rock_and_roll; } else { inlineD = 0; } /* the directive is implicit */ strncpy(content, "text/plain", sizeof(content)); headers = 0; strncpy(buffer, buf[0] != '#' ? buf : buf + 1, sizeof(buffer)); for (;;) { int i; if (headers >= 0 && uprf(buffer, DESCR_FIELD) && buffer[i=strlen(DESCR_FIELD)] == ':') { headers = 1; again_descr: ct->c_descr = add(buffer + i + 1, ct->c_descr); if (!fgetstr(buffer, sizeof(buffer) - 1, in)) adios(EX_DATAERR, NULL, "end-of-file after %s: field in plaintext", DESCR_FIELD); switch (buffer[0]) { case ' ': case '\t': i = -1; goto again_descr; case '#': adios(EX_DATAERR, NULL, "#-directive after %s: field in plaintext", DESCR_FIELD); /* NOTREACHED */ default: break; } } if (headers >= 0 && uprf(buffer, DISPO_FIELD) && buffer[i = strlen(DISPO_FIELD)] == ':') { headers = 1; again_dispo: ct->c_dispo = add(buffer + i + 1, ct->c_dispo); if (!fgetstr(buffer, sizeof(buffer) - 1, in)) adios(EX_DATAERR, NULL, "end-of-file after %s: field in plaintext", DISPO_FIELD); switch (buffer[0]) { case ' ': case '\t': i = -1; goto again_dispo; case '#': adios(EX_DATAERR, NULL, "#-directive after %s: field in plaintext", DISPO_FIELD); /* NOTREACHED */ default: break; } } if (headers != 1 || buffer[0] != '\n') fputs(buffer, out); rock_and_roll: headers = -1; pos = ftell(in); if ((cp = fgetstr(buffer, sizeof(buffer) - 1, in)) == NULL) break; if (buffer[0] == '#') { char *bp; if (buffer[1] != '#') break; for (cp = (bp = buffer) + 1; *cp; cp++) *bp++ = *cp; *bp = '\0'; } } fclose(out); /* parse content type */ if (get_ctinfo(content, ct, inlineD) == NOTOK) exit(EX_DATAERR); for (s2i = str2cts; s2i->si_key; s2i++) if (!mh_strcasecmp(ci->ci_type, s2i->si_key)) break; if (!s2i->si_key && !uprf(ci->ci_type, "X-")) s2i++; /* ** check type specified (possibly implicitly) */ switch (ct->c_type = s2i->si_val) { case CT_MESSAGE: if (!mh_strcasecmp(ci->ci_subtype, "rfc822")) { ct->c_encoding = CE_7BIT; goto call_init; } /* else fall... */ case CT_MULTIPART: adios(EX_DATAERR, NULL, "it doesn't make sense to define an in-line %s content", ct->c_type == CT_MESSAGE ? "message" : "multipart"); /* NOTREACHED */ default: call_init: if ((ct->c_ctinitfnx = s2i->si_init)) (*ct->c_ctinitfnx) (ct); break; } if (cp) fseek(in, pos, SEEK_SET); return OK; } /* ** If we've reached this point, the next line ** must be some type of explicit directive. */ if (buf[1] == '@') { adios(EX_DATAERR, NULL, "The #@ directive i.e. message/external-body " "is not supported anymore."); } /* parse directive */ if (get_ctinfo(buf+1, ct, 1) == NOTOK) exit(EX_DATAERR); /* check directive against the list of MIME types */ for (s2i = str2cts; s2i->si_key; s2i++) if (!mh_strcasecmp(ci->ci_type, s2i->si_key)) break; /* ** Check if the directive specified a valid type. ** This will happen if it was one of the following forms: ** ** #type/subtype */ if (s2i->si_key) { if (!ci->ci_subtype) adios(EX_DATAERR, NULL, "missing subtype in \"#%s\"", ci->ci_type); switch (ct->c_type = s2i->si_val) { case CT_MULTIPART: adios(EX_DATAERR, NULL, "use \"#begin ... #end\" instead of \"#%s/%s\"", ci->ci_type, ci->ci_subtype); /* NOTREACHED */ case CT_MESSAGE: if (!mh_strcasecmp(ci->ci_subtype, "partial") || !mh_strcasecmp(ci->ci_subtype, "external-body")) { adios(EX_DATAERR, NULL, "sorry, \"#%s/%s\" isn't supported", ci->ci_type, ci->ci_subtype); } use_forw: admonish(NULL, "use \"#forw [+folder] [msgs]\" instead of \"#%s/%s\"", ci->ci_type, ci->ci_subtype); /* FALL */ default: if ((ct->c_ctinitfnx = s2i->si_init)) (*ct->c_ctinitfnx) (ct); break; } /* Handle [file] argument */ if (ci->ci_magic) { /* check if specifies command to execute */ if (*ci->ci_magic == '|' || *ci->ci_magic == '!') { for (cp = ci->ci_magic + 1; isspace(*cp); cp++) continue; if (!*cp) adios(EX_DATAERR, NULL, "empty pipe command for #%s directive", ci->ci_type); cp = mh_xstrdup(cp); mh_free0(&(ci->ci_magic)); ci->ci_magic = cp; } else { /* record filename of decoded contents */ ce->ce_file = ci->ci_magic; if (access(ce->ce_file, R_OK) == NOTOK) adios(EX_IOERR, "reading", "unable to access %s for", ce->ce_file); ci->ci_magic = NULL; } return OK; } /* ** No [file] argument, so check profile for ** method to compose content. */ snprintf(buffer, sizeof(buffer), "%s-compose-%s/%s", invo_name, ci->ci_type, ci->ci_subtype); if ((cp = context_find(buffer)) == NULL || *cp == '\0') { snprintf(buffer, sizeof(buffer), "%s-compose-%s", invo_name, ci->ci_type); if ((cp = context_find(buffer)) == NULL || *cp == '\0') { content_error(NULL, ct, "don't know how to compose content"); exit(EX_CONFIG); } } ci->ci_magic = mh_xstrdup(cp); return OK; } /* ** Message directive ** #forw [+folder] [msgs] */ if (!mh_strcasecmp(ci->ci_type, "forw")) { int msgnum; char *folder, *arguments[MAXARGS]; struct msgs *mp; if (ci->ci_magic) { int i; ap = brkstring(ci->ci_magic, " ", "\n"); for (i=0; ap[i] && inumsel > 1) { /* we are forwarding multiple messages */ if (get_ctinfo("multipart/digest", ct, 0) == NOTOK) exit(EX_DATAERR); ct->c_type = CT_MULTIPART; ct->c_subtype = MULTI_DIGEST; m = mh_xcalloc(1, sizeof(*m)); ct->c_ctparams = (void *) m; pp = &m->mp_parts; for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (is_selected(mp, msgnum)) { struct part *part; CT p; CE pe; p = mh_xcalloc(1, sizeof(*p)); init_decoded_content(p); pe = p->c_cefile; if (get_ctinfo("message/rfc822", p, 0) == NOTOK) exit(EX_DATAERR); p->c_type = CT_MESSAGE; p->c_subtype = MESSAGE_RFC822; snprintf(buffer, sizeof(buffer), "%s/%d", mp->foldpath, msgnum); pe->ce_file = mh_xstrdup(buffer); part = mh_xcalloc(1, sizeof(*part)); *pp = part; pp = &part->mp_next; part->mp_part = p; } } } else { /* we are forwarding one message */ if (get_ctinfo("message/rfc822", ct, 0) == NOTOK) exit(EX_DATAERR); ct->c_type = CT_MESSAGE; ct->c_subtype = MESSAGE_RFC822; msgnum = mp->lowsel; snprintf(buffer, sizeof(buffer), "%s/%d", mp->foldpath, msgnum); ce->ce_file = mh_xstrdup(buffer); } folder_free(mp); /* free folder/message structure */ return OK; } /* ** #end */ if (!mh_strcasecmp(ci->ci_type, "end")) { free_content(ct); *ctp = NULL; return DONE; } /* ** #begin [ alternative | parallel ] */ if (!mh_strcasecmp(ci->ci_type, "begin")) { if (!ci->ci_magic) { vrsn = MULTI_MIXED; cp = SubMultiPart[vrsn - 1].kv_key; } else if (!mh_strcasecmp(ci->ci_magic, "alternative")) { vrsn = MULTI_ALTERNATE; cp = SubMultiPart[vrsn - 1].kv_key; } else if (!mh_strcasecmp(ci->ci_magic, "parallel")) { vrsn = MULTI_PARALLEL; cp = SubMultiPart[vrsn - 1].kv_key; } else if (uprf(ci->ci_magic, "digest")) { goto use_forw; } else { vrsn = MULTI_UNKNOWN; cp = ci->ci_magic; } free_ctinfo(ct); snprintf(buffer, sizeof(buffer), "multipart/%s", cp); if (get_ctinfo(buffer, ct, 0) == NOTOK) exit(EX_DATAERR); ct->c_type = CT_MULTIPART; ct->c_subtype = vrsn; m = mh_xcalloc(1, sizeof(*m)); ct->c_ctparams = (void *) m; pp = &m->mp_parts; while (fgetstr(buffer, sizeof(buffer) - 1, in)) { struct part *part; CT p; if (user_content(in, file, buffer, &p) == DONE) { if (!m->mp_parts) adios(EX_DATAERR, NULL, "empty \"#begin ... #end\" sequence"); return OK; } if (!p) continue; part = mh_xcalloc(1, sizeof(*part)); *pp = part; pp = &part->mp_next; part->mp_part = p; } admonish(NULL, "premature end-of-file, missing #end"); return OK; } /* ** Unknown directive */ adios(EX_DATAERR, NULL, "unknown directive \"#%s\"", ci->ci_type); return NOTOK; /* NOT REACHED */ } static void set_id(CT ct, int top) { char msgid[BUFSIZ]; static int partno; static time_t clock = 0; static char *msgfmt; if (clock == 0) { time(&clock); snprintf(msgid, sizeof(msgid), "<%d.%ld.%%d@%s>\n", (int) getpid(), (long) clock, LocalName()); partno = 0; msgfmt = mh_xstrdup(msgid); } snprintf(msgid, sizeof(msgid), msgfmt, top ? 0 : ++partno); ct->c_id = mh_xstrdup(msgid); } /* ** Fill out, or expand the various contents in the composition ** draft. Read-in any necessary files. Parse and execute any ** commands specified by profile composition strings. */ static int compose_content(CT ct) { CE ce = ct->c_cefile; switch (ct->c_type) { case CT_MULTIPART: { int partnum; char *pp; char partnam[BUFSIZ]; struct multipart *m = (struct multipart *) ct->c_ctparams; struct part *part; if (ct->c_partno) { snprintf(partnam, sizeof(partnam), "%s.", ct->c_partno); pp = partnam + strlen(partnam); } else { pp = partnam; } /* first, we call compose_content on all the subparts */ for (part = m->mp_parts, partnum = 1; part; part = part->mp_next, partnum++) { CT p = part->mp_part; sprintf(pp, "%d", partnum); p->c_partno = mh_xstrdup(partnam); if (compose_content(p) == NOTOK) return NOTOK; } } break; case CT_MESSAGE: /* Nothing to do for type message */ break; /* ** Discrete types (text/application/audio/image/video) */ default: if (!ce->ce_file) { pid_t child_id; int xstdout, len, buflen; char *bp, **ap, *cp; char *vec[4], buffer[BUFSIZ]; FILE *out; CI ci = &ct->c_ctinfo; char *tfile = NULL; if (!(cp = ci->ci_magic)) adios(EX_SOFTWARE, NULL, "internal error(5)"); tfile = m_mktemp2(NULL, invo_name, NULL, NULL); if (tfile == NULL) { adios(EX_CANTCREAT, "mhbuild", "unable to create temporary file"); } ce->ce_file = mh_xstrdup(tfile); ce->ce_unlink = 1; xstdout = 0; /* Get buffer ready to go */ bp = buffer; bp[0] = '\0'; buflen = sizeof(buffer); /* ** Parse composition string into buffer */ for ( ; *cp; cp++) { if (*cp == '%') { switch (*++cp) { case 'a': { /* ** insert parameters from ** directive */ char **ep; char *s = ""; for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) { snprintf(bp, buflen, "%s%s=\"%s\"", s, *ap, *ep); len = strlen(bp); bp += len; buflen -= len; s = " "; } } break; case 'F': /* %f, and stdout is not-redirected */ xstdout = 1; /* and fall... */ case 'f': /* ** insert temporary filename ** where content should be ** written */ snprintf(bp, buflen, "%s", ce->ce_file); break; case 's': /* insert content subtype */ strncpy(bp, ci->ci_subtype, buflen); break; case '%': /* insert character % */ goto raw; default: *bp++ = *--cp; *bp = '\0'; buflen--; continue; } len = strlen(bp); bp += len; buflen -= len; } else { raw: *bp++ = *cp; *bp = '\0'; buflen--; } } if (verbosw) printf("composing content %s/%s from command\n\t%s\n", ci->ci_type, ci->ci_subtype, buffer); fflush(stdout); /* not sure if need for -noverbose */ vec[0] = "/bin/sh"; vec[1] = "-c"; vec[2] = buffer; vec[3] = NULL; if ((out = fopen(ce->ce_file, "w")) == NULL) adios(EX_IOERR, ce->ce_file, "unable to open for writing"); switch (child_id = fork()) { case NOTOK: adios(EX_OSERR, "fork", "unable to fork"); /* NOTREACHED */ case OK: if (!xstdout) dup2(fileno(out), 1); close(fileno(out)); execvp("/bin/sh", vec); fprintf(stderr, "unable to exec "); perror("/bin/sh"); _exit(EX_OSERR); /* NOTREACHED */ default: fclose(out); if (pidXwait(child_id, NULL)) exit(EX_SOFTWARE); break; } } break; } return OK; } /* ** Scan the content. ** ** 1) choose a transfer encoding. ** 2) check for clashes with multipart boundary string. ** 3) for text content, figure out which character set is being used. ** ** If there is a clash with one of the contents and the multipart boundary, ** this function will exit with NOTOK. This will cause the scanning process ** to be repeated with a different multipart boundary. It is possible ** (although highly unlikely) that this scan will be repeated multiple times. */ static int scan_content(CT ct) { int len; int check8bit = 0, contains8bit = 0; int checklinelen = 0, linelen = 0; int checkboundary = 0, boundaryclash = 0; int checklinespace = 0, linespace = 0; /* trailing whitespace */ unsigned char *cp = NULL, buffer[BUFSIZ]; struct text *t = NULL; FILE *in = NULL; CE ce = ct->c_cefile; /* ** handle multipart by scanning all subparts ** and then checking their encoding. */ if (ct->c_type == CT_MULTIPART) { struct multipart *m = (struct multipart *) ct->c_ctparams; struct part *part; /* initially mark the domain of enclosing multipart as 7bit */ ct->c_encoding = CE_7BIT; for (part = m->mp_parts; part; part = part->mp_next) { CT p = part->mp_part; if (scan_content(p) == NOTOK) { /* choose encoding for subpart */ return NOTOK; } /* ** if necessary, enlarge encoding for enclosing ** multipart */ if (p->c_encoding == CE_BINARY) ct->c_encoding = CE_BINARY; if (p->c_encoding == CE_8BIT && ct->c_encoding != CE_BINARY) ct->c_encoding = CE_8BIT; } return OK; } /* ** Decide what to check while scanning this content. */ switch (ct->c_type) { case CT_TEXT: check8bit = 1; checkboundary = 1; checklinelen = 1; checklinespace = 1; break; case CT_MESSAGE: check8bit = 0; checklinelen = 0; checklinespace = 0; checkboundary = 1; break; case CT_APPLICATION: case CT_AUDIO: case CT_IMAGE: case CT_VIDEO: check8bit = 0; checklinelen = 0; checklinespace = 0; checkboundary = 0; break; } /* ** Scan the unencoded content */ if (check8bit || checklinelen || checklinespace || checkboundary) { if ((in = fopen(ce->ce_file, "r")) == NULL) adios(EX_IOERR, ce->ce_file, "unable to open for reading"); len = strlen(prefix); while (fgets(buffer, sizeof(buffer) - 1, in)) { if (check8bit) { for (cp = buffer; *cp; cp++) { if (!isascii(*cp)) { contains8bit = 1; /* no need to keep checking */ check8bit = 0; } } } if (checklinelen && (strlen(buffer) > CPERLIN + 1)) { linelen = 1; checklinelen = 0; /* no need to keep checking */ } if (checklinespace && (cp = buffer + strlen(buffer) - 2) > buffer && isspace(*cp)) { linespace = 1; /* no need to keep checking */ checklinespace = 0; } /* ** Check if content contains a line that clashes ** with our standard boundary for multipart messages. */ if (checkboundary && buffer[0] == '-' && buffer[1] == '-') { for (cp = buffer + strlen(buffer) - 1; cp >= buffer; cp--) if (!isspace(*cp)) break; *++cp = '\0'; if (strncmp(buffer + 2, prefix, len)==0 && isdigit(buffer[2 + len])) { boundaryclash = 1; /* no need to keep checking */ checkboundary = 0; } } } fclose(in); } /* ** Decide which transfer encoding to use. */ switch (ct->c_type) { case CT_TEXT: /* ** If the text content didn't specify a character ** set, we need to figure out which one was used. */ t = (struct text *) ct->c_ctparams; if (t->tx_charset == CHARSET_UNSPECIFIED) { CI ci = &ct->c_ctinfo; char **ap, **ep; for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) continue; if (contains8bit) { t->tx_charset = CHARSET_UNKNOWN; *ap = concat("charset=", write_charset_8bit(), NULL); } else { t->tx_charset = CHARSET_USASCII; *ap = mh_xstrdup("charset=us-ascii"); } cp = strchr(*ap++, '='); *ap = NULL; *cp++ = '\0'; *ep = cp; } if (contains8bit || linelen || linespace) ct->c_encoding = CE_QUOTED; else ct->c_encoding = CE_7BIT; break; case CT_MESSAGE: ct->c_encoding = CE_7BIT; break; case CT_APPLICATION: case CT_AUDIO: case CT_IMAGE: case CT_VIDEO: /* ** Forcing use of base64, because these types likely ** contain binary data and NUL bytes. Don't care about ** files that would be clean. */ ct->c_encoding = CE_BASE64; break; } return (boundaryclash ? NOTOK : OK); } /* ** Scan the content structures, and build header ** fields that will need to be output into the ** message. */ static int build_headers(CT ct) { int cc, len; char **ap, **ep; char *np, *vp, buffer[BUFSIZ]; CI ci = &ct->c_ctinfo; /* ** If message is type multipart, then add the multipart ** boundary to the list of attribute/value pairs. */ if (ct->c_type == CT_MULTIPART) { char *cp; static int level = 0; /* store nesting level */ ap = ci->ci_attrs; ep = ci->ci_values; snprintf(buffer, sizeof(buffer), "boundary=%s%d", prefix, level++); cp = strchr(*ap++ = mh_xstrdup(buffer), '='); *ap = NULL; *cp++ = '\0'; *ep = cp; } /* ** output the content type and subtype */ np = mh_xstrdup(TYPE_FIELD); vp = concat(" ", ci->ci_type, "/", ci->ci_subtype, NULL); /* keep track of length of line */ len = strlen(TYPE_FIELD) + strlen(ci->ci_type) + strlen(ci->ci_subtype) + 3; /* ** Append the attribute/value pairs to ** the end of the Content-Type line. */ for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) { vp = add(";", vp); len++; snprintf(buffer, sizeof(buffer), "%s=\"%s\"", *ap, *ep); if (len + 1 + (cc = strlen(buffer)) >= CPERLIN) { vp = add("\n\t", vp); len = 8; } else { vp = add(" ", vp); len++; } vp = add(buffer, vp); len += cc; } /* ** Append any RFC-822 comment to the end of ** the Content-Type line. */ if (ci->ci_comment) { snprintf(buffer, sizeof(buffer), "(%s)", ci->ci_comment); if (len + 1 + (cc = 2 + strlen(ci->ci_comment)) >= CPERLIN) { vp = add("\n\t", vp); len = 8; } else { vp = add(" ", vp); len++; } vp = add(buffer, vp); len += cc; } vp = add("\n", vp); add_header(ct, np, vp); /* ** output the Content-ID */ if (ct->c_id) { np = mh_xstrdup(ID_FIELD); vp = concat(" ", ct->c_id, NULL); add_header(ct, np, vp); } /* ** output the Content-Description */ if (ct->c_descr) { np = mh_xstrdup(DESCR_FIELD); vp = concat(" ", ct->c_descr, NULL); if (encode_rfc2047(DESCR_FIELD, &vp, NULL)) { adios(EX_DATAERR, NULL, "Unable to encode %s header", DESCR_FIELD); } add_header(ct, np, vp); } /* ** output the Content-Disposition */ if (ct->c_dispo) { np = mh_xstrdup(DISPO_FIELD); vp = concat(" ", ct->c_dispo, NULL); add_header(ct, np, vp); } /* ** output the Content-Transfer-Encoding */ switch (ct->c_encoding) { case CE_7BIT: /* Nothing to output */ break; case CE_8BIT: if (ct->c_type == CT_MESSAGE) adios(EX_DATAERR, NULL, "internal error, invalid encoding"); np = mh_xstrdup(ENCODING_FIELD); vp = concat(" ", "8bit", "\n", NULL); add_header(ct, np, vp); break; case CE_QUOTED: if (ct->c_type == CT_MESSAGE || ct->c_type == CT_MULTIPART) adios(EX_DATAERR, NULL, "internal error, invalid encoding"); np = mh_xstrdup(ENCODING_FIELD); vp = concat(" ", "quoted-printable", "\n", NULL); add_header(ct, np, vp); break; case CE_BASE64: if (ct->c_type == CT_MESSAGE || ct->c_type == CT_MULTIPART) adios(EX_DATAERR, NULL, "internal error, invalid encoding"); np = mh_xstrdup(ENCODING_FIELD); vp = concat(" ", "base64", "\n", NULL); add_header(ct, np, vp); break; case CE_BINARY: if (ct->c_type == CT_MESSAGE) adios(EX_DATAERR, NULL, "internal error, invalid encoding"); np = mh_xstrdup(ENCODING_FIELD); vp = concat(" ", "binary", "\n", NULL); add_header(ct, np, vp); break; default: adios(EX_DATAERR, NULL, "unknown transfer encoding in content"); break; } /* ** Additional content specific header processing */ switch (ct->c_type) { case CT_MULTIPART: { struct multipart *m; struct part *part; m = (struct multipart *) ct->c_ctparams; for (part = m->mp_parts; part; part = part->mp_next) { CT p; p = part->mp_part; build_headers(p); } } break; default: /* Nothing to do */ break; } return OK; } mmh-0.4/uip/mhoutsbr.c0000644000000000000000000001351613414435726013457 0ustar rootroot/* ** mhoutsbr.c -- routines to output MIME messages ** -- given a Content structure ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include static char nib2b64[0x40+1] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /* ** prototypes */ int output_message(CT, char *); int output_message_fp(CT, FILE *, char *); /* ** static prototypes */ static int output_content(CT, FILE *); static void output_headers(CT, FILE *); static int write8Bit(CT, FILE *); static int writeQuoted(CT, FILE *); static int writeBase64(CT, FILE *); static int writeBase64aux(FILE *, FILE *); /* ** Main routine to output a MIME message contained ** in a Content structure, to a file. Any necessary ** transfer encoding is added. */ int output_message_fp(CT ct, FILE *fp, char *file) { if (output_content(ct, fp) == NOTOK) return NOTOK; if (fflush(fp)) { advise((file?file:""), "error writing to"); return NOTOK; } return OK; } int output_message(CT ct, char *file) { FILE *fp; int status; if ((fp = fopen(file, "w")) == NULL) { advise(file, "unable to open for writing"); return NOTOK; } status = output_message_fp(ct, fp, file); fclose(fp); return status; } /* ** Output a Content structure to a file. */ static int output_content(CT ct, FILE *out) { int result = 0; CI ci = &ct->c_ctinfo; /* ** Output all header fields for this content */ output_headers(ct, out); /* ** Now output the content bodies. */ switch (ct->c_type) { case CT_MULTIPART: { struct multipart *m; struct part *part; m = (struct multipart *) ct->c_ctparams; for (part = m->mp_parts; part; part = part->mp_next) { CT p = part->mp_part; fprintf(out, "\n--%s\n", ci->ci_values[0]); if (output_content(p, out) == NOTOK) return NOTOK; } fprintf(out, "\n--%s--\n", ci->ci_values[0]); } break; case CT_MESSAGE: putc('\n', out); result = write8Bit(ct, out); break; /* ** Handle discrete types (text/application/audio/image/video) */ default: switch (ct->c_encoding) { case CE_7BIT: putc('\n', out); result = write8Bit(ct, out); break; case CE_8BIT: putc('\n', out); result = write8Bit(ct, out); break; case CE_QUOTED: putc('\n', out); result = writeQuoted(ct, out); break; case CE_BASE64: putc('\n', out); result = writeBase64(ct, out); break; case CE_BINARY: advise(NULL, "can't handle binary transfer encoding in content"); result = NOTOK; break; default: advise(NULL, "unknown transfer encoding in content"); result = NOTOK; break; } break; } return result; } /* ** Output all the header fields for a content */ static void output_headers(CT ct, FILE *out) { HF hp; hp = ct->c_first_hf; while (hp) { fprintf(out, "%s:%s", hp->name, hp->value); hp = hp->next; } } /* ** Output a content without any transfer encoding */ static int write8Bit(CT ct, FILE *out) { int fd; char c, *file, buffer[BUFSIZ]; CE ce = ct->c_cefile; file = NULL; if ((fd = (*ct->c_ceopenfnx) (ct, &file)) == NOTOK) return NOTOK; c = '\n'; while (fgets(buffer, sizeof(buffer) - 1, ce->ce_fp)) { c = buffer[strlen(buffer) - 1]; fputs(buffer, out); } if (c != '\n') putc('\n', out); (*ct->c_ceclosefnx) (ct); return OK; } /* ** Output a content using quoted-printable */ static int writeQuoted(CT ct, FILE *out) { int fd; char *cp, *file; char c, buffer[BUFSIZ]; CE ce = ct->c_cefile; file = NULL; if ((fd = (*ct->c_ceopenfnx) (ct, &file)) == NOTOK) return NOTOK; while (fgets(buffer, sizeof(buffer) - 1, ce->ce_fp)) { int n; cp = buffer + strlen(buffer) - 1; if ((c = *cp) == '\n') *cp = '\0'; if (strncmp(cp = buffer, "From ", sizeof("From ") - 1) == 0) { fprintf(out, "=%02X", *cp++ & 0xff); n = 3; } else { n = 0; } for (; *cp; cp++) { if (n + 1 >= CPERLIN) { fputs("=\n", out); n = 0; } switch (*cp) { case ' ': case '\t': putc(*cp, out); n++; break; default: if (*cp < '!' || *cp > '~') { goto three_print; } if (n == 0 && *cp == '.') { /* ** encode dot at start of line, ** because it could be alone ... */ goto three_print; } putc(*cp, out); n++; break; case '=': three_print: fprintf(out, "=%02X", *cp & 0xff); n += 3; break; } } if (c == '\n') { if (cp > buffer && (*--cp == ' ' || *cp == '\t')) fputs("=\n", out); putc('\n', out); } else { fputs("=\n", out); } } (*ct->c_ceclosefnx) (ct); return OK; } /* ** Output a content using base64 */ static int writeBase64(CT ct, FILE *out) { int fd, result; char *file; CE ce = ct->c_cefile; file = NULL; if ((fd = (*ct->c_ceopenfnx) (ct, &file)) == NOTOK) return NOTOK; result = writeBase64aux(ce->ce_fp, out); (*ct->c_ceclosefnx) (ct); return result; } static int writeBase64aux(FILE *in, FILE *out) { unsigned int cc, n; char inbuf[3]; n = BPERLIN; while ((cc = fread(inbuf, sizeof(*inbuf), sizeof(inbuf), in)) > 0) { unsigned long bits; char *bp; char outbuf[4]; if (cc < sizeof(inbuf)) { inbuf[2] = 0; if (cc < sizeof(inbuf) - 1) inbuf[1] = 0; } bits = (inbuf[0] & 0xff) << 16; bits |= (inbuf[1] & 0xff) << 8; bits |= inbuf[2] & 0xff; for (bp = outbuf + sizeof(outbuf); bp > outbuf; bits >>= 6) *--bp = nib2b64[bits & 0x3f]; if (cc < sizeof(inbuf)) { outbuf[3] = '='; if (cc < sizeof inbuf - 1) outbuf[2] = '='; } fwrite(outbuf, sizeof(*outbuf), sizeof(outbuf), out); if (cc < sizeof(inbuf)) { putc('\n', out); return OK; } if (--n <= 0) { n = BPERLIN; putc('\n', out); } } if (n != BPERLIN) putc('\n', out); return OK; } mmh-0.4/uip/rcvpack.c0000644000000000000000000000363013414435726013241 0ustar rootroot/* ** rcvpack.c -- append message to a file ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include static struct swit switches[] = { #define VERSIONSW 0 { "Version", 0 }, #define HELPSW 1 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; int main(int argc, char **argv) { int md; char *cp, *file = NULL, buf[BUFSIZ]; char **argp, **arguments; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; /* parse arguments */ while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [switches] file", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); } } if (file) adios(EX_USAGE, NULL, "only one file at a time!"); else file = cp; } /* copy stdin to stdout, converting rfc822 message to mbox */ if (!file) { if (mbox_copy(fileno(stdout), fileno(stdin)) == NOTOK) { exit(RCV_MBX); } exit(RCV_MOK); return 1; } /* open and lock the file */ if ((md = mbox_open(file, getuid(), getgid(), m_gmprot())) == NOTOK) exit(RCV_MBX); /* append the message */ if (mbox_copy(md, fileno(stdin)) == NOTOK) { mbox_close(file, md); exit(RCV_MBX); } /* close and unlock the file */ if (mbox_close(file, md) == NOTOK) exit(RCV_MBX); exit(RCV_MOK); return 1; } mmh-0.4/uip/rmf.c0000644000000000000000000001240013414435726012367 0ustar rootroot/* ** rmf.c -- remove a folder ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include static struct swit switches[] = { #define INTRSW 0 { "interactive", 0 }, #define NINTRSW 1 { "nointeractive", 2 }, #define VERSIONSW 2 { "Version", 0 }, #define HELPSW 3 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; /* ** static prototypes */ static int rmf(char *); static void rma(char *); int main(int argc, char **argv) { int defolder = 0, interactive = -1; char *cp, *folder = NULL, newfolder[BUFSIZ]; char buf[BUFSIZ], **argp, **arguments; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case INTRSW: interactive = 1; continue; case NINTRSW: interactive = 0; continue; } } if (*cp == '+' || *cp == '@') { if (folder) adios(EX_USAGE, NULL, "only one folder at a time!"); else folder = mh_xstrdup(expandfol(cp)); } else { adios(EX_USAGE, NULL, "usage: %s [+folder] [switches]", invo_name); } } if (!folder) { folder = getcurfol(); defolder++; } if (strcmp(toabsdir(folder), pwd()) == 0) adios(EX_USAGE, NULL, "You can't remove the current working directory"); if (interactive == -1) interactive = defolder; if (strchr(folder, '/') && (*folder != '/') && (*folder != '.')) { strcpy(newfolder, folder); cp = newfolder + strlen(newfolder); while (cp > newfolder && *cp != '/') cp--; if (cp > newfolder) *cp = '\0'; else strncpy(newfolder, getdeffol(), sizeof(newfolder)); } else { strncpy(newfolder, getdeffol(), sizeof(newfolder)); } if (interactive) { cp = concat("Remove folder \"", folder, "\"? ", NULL); if (!getanswer(cp)) exit(EX_OK); mh_free0(&cp); } if (rmf(folder) == OK) { char *cfolder = context_find(curfolder); if (cfolder && strcmp(cfolder, newfolder)!=0) { printf("[+%s now current]\n", newfolder); /* update current folder */ context_replace(curfolder, newfolder); } } context_save(); /* save the context file */ return 0; } static int rmf(char *folder) { int i, others; char *maildir; char cur[BUFSIZ]; struct dirent *dp; DIR *dd; switch (i = chdir(maildir = toabsdir(folder))) { case OK: if (access(".", W_OK) != NOTOK && access("..", W_OK) != NOTOK) break; /* fall otherwise */ case NOTOK: snprintf(cur, sizeof(cur), "atr-%s-%s", seq_cur, toabsdir(folder)); if (!context_del(cur)) { printf("[+%s de-referenced]\n", folder); return OK; } advise(NULL, "you have no profile entry for the %s folder +%s", i == NOTOK ? "unreadable" : "read-only", folder); return NOTOK; } if ((dd = opendir(".")) == NULL) adios(EX_IOERR, NULL, "unable to read folder +%s", folder); others = 0; /* ** Run the external delete hook program. */ ext_hook("del-hook", maildir, NULL); while ((dp = readdir(dd))) { switch (dp->d_name[0]) { case '.': if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0) continue; /* else fall */ case ',': break; default: if (m_atoi(dp->d_name)) break; admonish(NULL, "file \"%s/%s\" not deleted", folder, dp->d_name); others++; continue; } if (unlink(dp->d_name) == NOTOK) { admonish(dp->d_name, "unable to unlink %s:", folder); others++; } } closedir(dd); /* ** Remove any relevant private sequences ** or attributes from context file. */ rma(folder); chdir(".."); if (others == 0) { context_save(); /* Is this needed? meillo 2011-10 */ fflush(stdout); /* Is this needed? meillo 2011-10 */ if (rmdir(maildir) != -1) { return OK; } admonish(maildir, "unable to remove directory"); } advise(NULL, "folder +%s not removed", folder); return NOTOK; } /* ** Remove all the (private) sequence information for ** this folder from the profile/context list. */ static void rma(char *folder) { int alen, j, plen; char *cp; struct node *np, *pp; alen = strlen("atr-"); plen = strlen(cp = mh_xstrdup(toabsdir(folder))) + 1; /* ** Search context list for keys that look like ** "atr-something-folderpath", and remove them. */ for (np = m_defs, pp = NULL; np; np = np->n_next) { if (strncmp(np->n_name, "atr-", alen)==0 && (j = strlen(np->n_name) - plen) > alen && *(np->n_name + j) == '-' && strcmp(cp, np->n_name + j + 1) == 0) { if (!np->n_context) admonish(NULL, "bug: context_del(key=\"%s\")", np->n_name); if (pp) { pp->n_next = np->n_next; np = pp; } else { m_defs = np->n_next; } ctxflags |= CTXMOD; } else { pp = np; } } mh_free0(&cp); } mmh-0.4/uip/mhparse.c0000644000000000000000000013120013414435726013242 0ustar rootroot/* ** mhparse.c -- routines to parse the contents of MIME messages ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include #include #include #include extern int debugsw; extern int endian; /* mhmisc.c */ extern pid_t xpid; /* mhshowsbr.c */ /* ** Directory to place temp files. This must ** be set before these routines are called. */ char *tmp; /* ** Structures for TEXT messages */ struct k2v SubText[] = { { "plain", TEXT_PLAIN }, { "richtext", TEXT_RICHTEXT }, /* defined in RFC-1341 */ { "enriched", TEXT_ENRICHED }, /* defined in RFC-1896 */ { NULL, TEXT_UNKNOWN } /* this one must be last! */ }; struct k2v Charset[] = { { "us-ascii", CHARSET_USASCII }, { "iso-8859-1", CHARSET_LATIN }, { NULL, CHARSET_UNKNOWN } /* this one must be last! */ }; /* ** Structures for MULTIPART messages */ struct k2v SubMultiPart[] = { { "mixed", MULTI_MIXED }, { "alternative", MULTI_ALTERNATE }, { "digest", MULTI_DIGEST }, { "parallel", MULTI_PARALLEL }, { NULL, MULTI_UNKNOWN } /* this one must be last! */ }; /* ** Structures for MESSAGE messages */ struct k2v SubMessage[] = { { "rfc822", MESSAGE_RFC822 }, { "partial", MESSAGE_PARTIAL }, { "external-body", MESSAGE_EXTERNAL }, { NULL, MESSAGE_UNKNOWN } /* this one must be last! */ }; /* ** Structure for APPLICATION messages */ struct k2v SubApplication[] = { { "octet-stream", APPLICATION_OCTETS }, { "postscript", APPLICATION_POSTSCRIPT }, { NULL, APPLICATION_UNKNOWN } /* this one must be last! */ }; /* mhmisc.c */ int part_ok(CT, int); int type_ok(CT, int); int make_intermediates(char *); void content_error(char *, CT, char *, ...); /* mhfree.c */ void free_content(CT); void free_encoding(CT, int); /* ** static prototypes */ static CT get_content(FILE *, char *, int); static int get_comment(CT, unsigned char **, int); static int InitGeneric(CT); static int InitText(CT); static int InitMultiPart(CT); static void reverse_parts(CT); static int InitMessage(CT); static int InitApplication(CT); static int init_encoding(CT, OpenCEFunc); static unsigned long size_encoding(CT); static int InitBase64(CT); static int openBase64(CT, char **); static int InitQuoted(CT); static int openQuoted(CT, char **); static int Init7Bit(CT); struct str2init str2cts[] = { { "application", CT_APPLICATION, InitApplication }, { "audio", CT_AUDIO, InitGeneric }, { "image", CT_IMAGE, InitGeneric }, { "message", CT_MESSAGE, InitMessage }, { "multipart", CT_MULTIPART, InitMultiPart }, { "text", CT_TEXT, InitText }, { "video", CT_VIDEO, InitGeneric }, { NULL, CT_EXTENSION, NULL }, /* these two must be last! */ { NULL, CT_UNKNOWN, NULL }, }; struct str2init str2ces[] = { { "base64", CE_BASE64, InitBase64 }, { "quoted-printable", CE_QUOTED, InitQuoted }, { "8bit", CE_8BIT, Init7Bit }, { "7bit", CE_7BIT, Init7Bit }, { "binary", CE_BINARY, Init7Bit }, { NULL, CE_EXTENSION, NULL }, /* these two must be last! */ { NULL, CE_UNKNOWN, NULL }, }; int pidcheck(int status) { if ((status & 0xff00) == 0xff00 || (status & 0x007f) != SIGQUIT) return status; fflush(stdout); fflush(stderr); exit(EX_SOFTWARE); return 1; } /* ** Main entry point for parsing a MIME message or file. ** It returns the Content structure for the top level ** entity in the file. */ CT parse_mime(char *file) { int is_stdin; char buffer[BUFSIZ]; FILE *fp; CT ct; /* ** Check if file is actually standard input */ if ((is_stdin = (strcmp(file, "-")==0))) { char *tfile = m_mktemp2(NULL, invo_name, NULL, &fp); if (tfile == NULL) { advise("mhparse", "unable to create temporary file"); return NULL; } file = mh_xstrdup(tfile); chmod(file, 0600); while (fgets(buffer, sizeof(buffer), stdin)) fputs(buffer, fp); fflush(fp); if (ferror(stdin)) { unlink(file); advise("stdin", "error reading"); return NULL; } if (ferror(fp)) { unlink(file); advise(file, "error writing"); return NULL; } fseek(fp, 0L, SEEK_SET); } else if ((fp = fopen(file, "r")) == NULL) { advise(file, "unable to read"); return NULL; } if (!(ct = get_content(fp, file, 1))) { if (is_stdin) unlink(file); advise(NULL, "unable to decode %s", file); return NULL; } if (is_stdin) ct->c_unlink = 1; /* temp file to remove */ ct->c_fp = NULL; if (ct->c_end == 0L) { fseek(fp, 0L, SEEK_END); ct->c_end = ftell(fp); } if (ct->c_ctinitfnx && (*ct->c_ctinitfnx) (ct) == NOTOK) { fclose(fp); free_content(ct); return NULL; } fclose(fp); return ct; } /* ** Main routine for reading/parsing the headers ** of a message content. ** ** toplevel = 1 # we are at the top level of the message ** toplevel = 0 # we are inside message type or multipart type ** # other than multipart/digest ** toplevel = -1 # we are inside multipart/digest ** NB: on failure we will fclose(in)! */ static CT get_content(FILE *in, char *file, int toplevel) { enum state state; struct field f = {{0}}; int compnum; char *buf; CT ct; HF hp; /* allocate the content structure */ ct = mh_xcalloc(1, sizeof(*ct)); ct->c_fp = in; ct->c_file = mh_xstrdup(file); ct->c_begin = ftell(ct->c_fp) + 1; /* ** Parse the header fields for this ** content into a linked list. */ for (compnum = 1, state = FLD2;;) { switch (state = m_getfld2(state, &f, in)) { case LENERR2: state = FLD2; /* FALL */ case FLD2: if (compnum == 1) { ct->crlf = f.value[f.valuelen-2] == '\r'; } compnum++; /* decode rfc2047 */ buf = mh_xcalloc(sizeof(char *), f.valuelen); if (!decode_rfc2047(f.value, buf, f.valuelen)) { mh_free0(&buf); buf = mh_xstrdup(f.value); } /* add the header data to the list */ add_header(ct, mh_xstrdup(f.name), buf); buf = NULL; ct->c_begin = ftell(in) + 1; continue; case BODY2: ct->c_begin = ftell(in) - strlen(f.value); break; case FILEEOF2: ct->c_begin = ftell(in); break; case FMTERR2: advise(NULL, "message format error in component #%d", compnum); state = FLD2; continue; case IOERR2: adios(EX_IOERR, "m_getfld2", "io error"); default: adios(EX_SOFTWARE, NULL, "getfld() returned %d", state); } break; } /* ** Read the content headers. We will parse the ** MIME related header fields into their various ** structures and set internal flags related to ** content type/subtype, etc. */ hp = ct->c_first_hf; /* start at first header field */ while (hp) { /* Get MIME-Version field */ if (!mh_strcasecmp(hp->name, VRSN_FIELD)) { int ucmp; char c; unsigned char *cp, *dp; if (ct->c_vrsn) { advise(NULL, "message %s has multiple %s: fields", ct->c_file, VRSN_FIELD); goto next_header; } ct->c_vrsn = mh_xstrdup(hp->value); /* Now, cleanup this field */ cp = ct->c_vrsn; while (isspace(*cp)) cp++; for (dp = strchr(cp, '\n'); dp; dp = strchr(dp, '\n')) *dp++ = ' '; for (dp = cp + strlen(cp) - 1; dp >= cp; dp--) if (!isspace(*dp)) break; *++dp = '\0'; if (debugsw) fprintf(stderr, "%s: %s\n", VRSN_FIELD, cp); if (*cp == '(' && get_comment(ct, &cp, 0) == NOTOK) goto out; for (dp = cp; istoken(*dp); dp++) continue; c = *dp; *dp = '\0'; ucmp = !mh_strcasecmp(cp, VRSN_VALUE); *dp = c; if (!ucmp) { admonish(NULL, "message %s has unknown value for %s: field (%s)", ct->c_file, VRSN_FIELD, cp); } } else if (!mh_strcasecmp(hp->name, TYPE_FIELD)) { /* Get Content-Type field */ struct str2init *s2i; CI ci = &ct->c_ctinfo; /* Check if we've already seen a Content-Type header */ if (ct->c_ctline) { advise(NULL, "message %s has multiple %s: fields", ct->c_file, TYPE_FIELD); goto next_header; } /* Parse the Content-Type field */ if (get_ctinfo(hp->value, ct, 0) == NOTOK) goto out; /* ** Set the Init function and the internal ** flag for this content type. */ for (s2i = str2cts; s2i->si_key; s2i++) if (!mh_strcasecmp(ci->ci_type, s2i->si_key)) break; if (!s2i->si_key && !uprf(ci->ci_type, "X-")) s2i++; ct->c_type = s2i->si_val; ct->c_ctinitfnx = s2i->si_init; } else if (!mh_strcasecmp(hp->name, ENCODING_FIELD)) { /* Get Content-Transfer-Encoding field */ char c; unsigned char *cp, *dp; struct str2init *s2i; /* ** Check if we've already seen the ** Content-Transfer-Encoding field */ if (ct->c_celine) { advise(NULL, "message %s has multiple %s: fields", ct->c_file, ENCODING_FIELD); goto next_header; } /* get copy of this field */ ct->c_celine = cp = mh_xstrdup(hp->value); while (isspace(*cp)) cp++; for (dp = cp; istoken(*dp); dp++) continue; c = *dp; *dp = '\0'; /* ** Find the internal flag and Init function ** for this transfer encoding. */ for (s2i = str2ces; s2i->si_key; s2i++) if (!mh_strcasecmp(cp, s2i->si_key)) break; if (!s2i->si_key && !uprf(cp, "X-")) s2i++; *dp = c; ct->c_encoding = s2i->si_val; /* Call the Init function for this encoding */ if (s2i->si_init && (*s2i->si_init) (ct) == NOTOK) goto out; } else if (!mh_strcasecmp(hp->name, ID_FIELD)) { /* Get Content-ID field */ ct->c_id = add(hp->value, ct->c_id); } else if (!mh_strcasecmp(hp->name, DESCR_FIELD)) { /* Get Content-Description field */ ct->c_descr = add(hp->value, ct->c_descr); } else if (!mh_strcasecmp(hp->name, DISPO_FIELD)) { /* Get Content-Disposition field */ ct->c_dispo = add(hp->value, ct->c_dispo); } next_header: hp = hp->next; /* next header field */ } /* ** Check if we saw a Content-Type field. ** If not, then assign a default value for ** it, and the Init function. */ if (!ct->c_ctline) { /* ** If we are inside a multipart/digest message, ** so default type is message/rfc822 */ if (toplevel < 0) { if (get_ctinfo("message/rfc822", ct, 0) == NOTOK) goto out; ct->c_type = CT_MESSAGE; ct->c_ctinitfnx = InitMessage; } else { /* ** Else default type is text/plain */ if (get_ctinfo("text/plain", ct, 0) == NOTOK) goto out; ct->c_type = CT_TEXT; ct->c_ctinitfnx = InitText; } } /* Use default Transfer-Encoding, if necessary */ if (!ct->c_celine) { ct->c_encoding = CE_7BIT; Init7Bit(ct); } return ct; out: free_content(ct); return NULL; } /* ** small routine to add header field to list */ int add_header(CT ct, char *name, char *value) { HF hp; /* allocate header field structure */ hp = mh_xcalloc(1, sizeof(*hp)); /* link data into header structure */ hp->name = name; hp->value = value; hp->next = NULL; /* link header structure into the list */ if (ct->c_first_hf == NULL) { ct->c_first_hf = hp; /* this is the first */ ct->c_last_hf = hp; } else { ct->c_last_hf->next = hp; /* add it to the end */ ct->c_last_hf = hp; } return 0; } /* ** Make sure that buf contains at least one appearance of name, ** followed by =. If not, insert both name and value, just after ** first semicolon, if any. Note that name should not contain a ** trailing =. And quotes will be added around the value. Typical ** usage: make sure that a Content-Disposition header contains ** filename="foo". If it doesn't and value does, use value from ** that. */ static char * incl_name_value(unsigned char *buf, char *name, char *value) { char *newbuf = buf; /* Assume that name is non-null. */ if (buf && value) { char *name_plus_equal = concat(name, "=", NULL); if (!strstr(buf, name_plus_equal)) { char *insertion; unsigned char *cp; char *prefix, *suffix; /* Trim trailing space, esp. newline. */ for (cp = &buf[strlen(buf) - 1]; cp >= buf && isspace(*cp); --cp) { *cp = '\0'; } insertion = concat("; ", name, "=", "\"", value, "\"", NULL); /* ** Insert at first semicolon, if any. ** If none, append to end. */ prefix = mh_xstrdup(buf); if ((cp = strchr(prefix, ';'))) { suffix = concat(cp, NULL); *cp = '\0'; newbuf = concat(prefix, insertion, suffix, "\n", NULL); mh_free0(&suffix); } else { /* Append to end. */ newbuf = concat(buf, insertion, "\n", NULL); } mh_free0(&prefix); mh_free0(&insertion); mh_free0(&buf); } mh_free0(&name_plus_equal); } return newbuf; } /* ** Extract just name_suffix="foo", if any, from value. If there isn't ** one, return the entire value. Note that, for example, a name_suffix ** of name will match filename="foo", and return foo. */ char * extract_name_value(char *name_suffix, char *value) { char *extracted_name_value; char *name_suffix_plus_quote; char *name_suffix_equals; char *cp; if (!value) { return value; } extracted_name_value = value; name_suffix_plus_quote = concat(name_suffix, "=\"", NULL); name_suffix_equals = strstr(value, name_suffix_plus_quote); mh_free0(&name_suffix_plus_quote); if (name_suffix_equals) { char *name_suffix_begin; /* Find first \". */ for (cp = name_suffix_equals; *cp != '"'; ++cp) ; name_suffix_begin = ++cp; /* Find second \". */ for (; *cp != '"'; ++cp) ; extracted_name_value = mh_xcalloc(cp - name_suffix_begin + 1, sizeof(char)); memcpy(extracted_name_value, name_suffix_begin, cp - name_suffix_begin); extracted_name_value[cp - name_suffix_begin] = '\0'; } return extracted_name_value; } /* ** Parse Content-Type line and (if `magic' is non-zero) mhbuild composition ** directives. Fills in the information of the CTinfo structure. */ int get_ctinfo(unsigned char *cp, CT ct, int magic) { int i; unsigned char *dp; char **ap, **ep; char c; CI ci; ci = &ct->c_ctinfo; i = strlen(invo_name) + 2; /* store copy of Content-Type line */ cp = ct->c_ctline = mh_xstrdup(cp); while (isspace(*cp)) /* trim leading spaces */ cp++; /* change newlines to spaces */ for (dp = strchr(cp, '\n'); dp; dp = strchr(dp, '\n')) *dp++ = ' '; /* trim trailing spaces */ for (dp = cp + strlen(cp) - 1; dp >= cp; dp--) if (!isspace(*dp)) break; *++dp = '\0'; if (debugsw) fprintf(stderr, "%s: %s\n", TYPE_FIELD, cp); if (*cp == '(' && get_comment(ct, &cp, 1) == NOTOK) return NOTOK; for (dp = cp; istoken(*dp); dp++) continue; c = *dp, *dp = '\0'; ci->ci_type = mh_xstrdup(cp); /* store content type */ *dp = c, cp = dp; if (!*ci->ci_type) { advise(NULL, "invalid %s: field in message %s (empty type)", TYPE_FIELD, ct->c_file); return NOTOK; } /* down case the content type string */ for (dp = ci->ci_type; *dp; dp++) if (isalpha(*dp) && isupper(*dp)) *dp = tolower(*dp); while (isspace(*cp)) cp++; if (*cp == '(' && get_comment(ct, &cp, 1) == NOTOK) return NOTOK; if (*cp != '/') { if (!magic) ci->ci_subtype = mh_xstrdup(""); goto magic_skip; } cp++; while (isspace(*cp)) cp++; if (*cp == '(' && get_comment(ct, &cp, 1) == NOTOK) return NOTOK; for (dp = cp; istoken(*dp); dp++) continue; c = *dp, *dp = '\0'; ci->ci_subtype = mh_xstrdup(cp); /* store the content subtype */ *dp = c, cp = dp; if (!*ci->ci_subtype) { advise(NULL, "invalid %s: field in message %s (empty subtype for \"%s\")", TYPE_FIELD, ct->c_file, ci->ci_type); return NOTOK; } /* down case the content subtype string */ for (dp = ci->ci_subtype; *dp; dp++) if (isalpha(*dp) && isupper(*dp)) *dp = tolower(*dp); magic_skip: while (isspace(*cp)) cp++; if (*cp == '(' && get_comment(ct, &cp, 1) == NOTOK) return NOTOK; /* ** Parse attribute/value pairs given with Content-Type */ ep = (ap = ci->ci_attrs) + NPARMS; while (*cp == ';') { char *vp; unsigned char *up; if (ap >= ep) { advise(NULL, "too many parameters in message %s's %s: field (%d max)", ct->c_file, TYPE_FIELD, NPARMS); return NOTOK; } cp++; while (isspace(*cp)) cp++; if (*cp == '(' && get_comment(ct, &cp, 1) == NOTOK) return NOTOK; if (*cp == 0) { advise (NULL, "extraneous trailing ';' in message %s's %s: parameter list", ct->c_file, TYPE_FIELD); return OK; } /* down case the attribute name */ for (dp = cp; istoken(*dp); dp++) if (isalpha(*dp) && isupper(*dp)) *dp = tolower(*dp); for (up = dp; isspace(*dp);) dp++; if (dp == cp || *dp != '=') { advise(NULL, "invalid parameter in message %s's %s: field\n%*.*sparameter %s (error detected at offset %d)", ct->c_file, TYPE_FIELD, i, i, "", cp, dp - cp); return NOTOK; } vp = (*ap = mh_xstrdup(cp)) + (up - cp); *vp = '\0'; for (dp++; isspace(*dp);) dp++; /* now add the attribute value */ ci->ci_values[ap - ci->ci_attrs] = vp = *ap + (dp - cp); if (*dp == '"') { for (cp = ++dp, dp = vp;;) { switch (c = *cp++) { case '\0': bad_quote: advise(NULL, "invalid quoted-string in message %s's %s: field\n%*.*s(parameter %s)", ct->c_file, TYPE_FIELD, i, i, "", *ap); return NOTOK; case '\\': *dp++ = c; if ((c = *cp++) == '\0') goto bad_quote; /* else fall... */ default: *dp++ = c; continue; case '"': *dp = '\0'; break; } break; } } else { for (cp = dp, dp = vp; istoken(*cp); cp++, dp++) continue; *dp = '\0'; } if (!*vp) { advise(NULL, "invalid parameter in message %s's %s: field\n%*.*s(parameter %s)", ct->c_file, TYPE_FIELD, i, i, "", *ap); *ci->ci_values[ap - ci->ci_attrs] = '\0'; *ci->ci_attrs[ap - ci->ci_attrs] = '\0'; continue; } ap++; while (isspace(*cp)) cp++; if (*cp == '(' && get_comment(ct, &cp, 1) == NOTOK) return NOTOK; } /* ** Get any given in buffer */ if (magic && *cp == '<') { if (ct->c_id) { mh_free0(&(ct->c_id)); } if (!(dp = strchr(ct->c_id = ++cp, '>'))) { advise(NULL, "invalid ID in message %s", ct->c_file); return NOTOK; } c = *dp; *dp = '\0'; if (*ct->c_id) ct->c_id = concat("<", ct->c_id, ">\n", NULL); else ct->c_id = NULL; *dp++ = c; cp = dp; while (isspace(*cp)) cp++; } /* ** Get any [Content-Description] given in buffer. */ if (magic && *cp == '[') { ct->c_descr = ++cp; for (dp = cp + strlen(cp) - 1; dp >= cp; dp--) if (*dp == ']') break; if (dp < cp) { advise(NULL, "invalid description in message %s", ct->c_file); ct->c_descr = NULL; return NOTOK; } c = *dp; *dp = '\0'; if (*ct->c_descr) ct->c_descr = concat(ct->c_descr, "\n", NULL); else ct->c_descr = NULL; *dp++ = c; cp = dp; while (isspace(*cp)) cp++; } /* ** Get any {Content-Disposition} given in buffer. */ if (magic && *cp == '{') { ct->c_dispo = ++cp; for (dp = cp + strlen(cp) - 1; dp >= cp; dp--) if (*dp == '}') break; if (dp < cp) { advise(NULL, "invalid disposition in message %s", ct->c_file); ct->c_dispo = NULL; return NOTOK; } c = *dp; *dp = '\0'; if (*ct->c_dispo) ct->c_dispo = concat(ct->c_dispo, "\n", NULL); else ct->c_dispo = NULL; *dp++ = c; cp = dp; while (isspace(*cp)) cp++; } /* ** Check if anything is left over */ if (*cp) { if (magic) { ci->ci_magic = mh_xstrdup(cp); /* ** If there is a Content-Disposition header and ** it doesn't have a *filename=, extract it from ** the magic contents. The mhbasename call skips ** any leading directory components. */ if (ct->c_dispo) ct->c_dispo = incl_name_value(ct->c_dispo, "filename", mhbasename(extract_name_value("name", ci->ci_magic))); } else advise(NULL, "extraneous information in message %s's %s: field\n%*.*s(%s)", ct->c_file, TYPE_FIELD, i, i, "", cp); } return OK; } static int get_comment(CT ct, unsigned char **ap, int istype) { int i; char *bp; unsigned char *cp; char c, buffer[BUFSIZ], *dp; CI ci; ci = &ct->c_ctinfo; cp = *ap; bp = buffer; cp++; for (i = 0;;) { switch (c = *cp++) { case '\0': invalid: advise(NULL, "invalid comment in message %s's %s: field", ct->c_file, istype ? TYPE_FIELD : VRSN_FIELD); return NOTOK; case '\\': *bp++ = c; if ((c = *cp++) == '\0') goto invalid; *bp++ = c; continue; case '(': i++; /* and fall... */ default: *bp++ = c; continue; case ')': if (--i < 0) break; *bp++ = c; continue; } break; } *bp = '\0'; if (istype) { if ((dp = ci->ci_comment)) { ci->ci_comment = concat(dp, " ", buffer, NULL); mh_free0(&dp); } else { ci->ci_comment = mh_xstrdup(buffer); } } while (isspace(*cp)) cp++; *ap = cp; return OK; } /* ** CONTENTS ** ** Handles content types audio, image, and video. ** There's not much to do right here. */ static int InitGeneric(CT ct) { return OK; /* not much to do here */ } /* ** TEXT */ static int InitText(CT ct) { char **ap, **ep; struct k2v *kv; struct text *t; CI ci = &ct->c_ctinfo; /* check for missing subtype */ if (!*ci->ci_subtype) ci->ci_subtype = add("plain", ci->ci_subtype); /* match subtype */ for (kv = SubText; kv->kv_key; kv++) if (!mh_strcasecmp(ci->ci_subtype, kv->kv_key)) break; ct->c_subtype = kv->kv_value; /* allocate text character set structure */ t = mh_xcalloc(1, sizeof(*t)); ct->c_ctparams = (void *) t; /* scan for charset parameter */ for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) if (!mh_strcasecmp(*ap, "charset")) break; /* check if content specified a character set */ if (*ap) { /* store its name */ ct->c_charset = mh_xstrdup(norm_charmap(*ep)); /* match character set or set to CHARSET_UNKNOWN */ for (kv = Charset; kv->kv_key; kv++) { if (!mh_strcasecmp(*ep, kv->kv_key)) { break; } } t->tx_charset = kv->kv_value; } else { t->tx_charset = CHARSET_UNSPECIFIED; } return OK; } /* ** MULTIPART */ static int InitMultiPart(CT ct) { int inout; long last, pos; unsigned char *cp, *dp; char **ap, **ep; char *bp, buffer[BUFSIZ]; struct multipart *m; struct k2v *kv; struct part *part, **next; CI ci = &ct->c_ctinfo; CT p; FILE *fp; /* ** The encoding for multipart messages must be either ** 7bit, 8bit, or binary (per RFC2045). */ if (ct->c_encoding != CE_7BIT && ct->c_encoding != CE_8BIT && ct->c_encoding != CE_BINARY) { admonish(NULL, "\"%s/%s\" type in message %s should be encoded in 7bit, 8bit, or binary", ci->ci_type, ci->ci_subtype, ct->c_file); ct->c_encoding = CE_7BIT; } /* match subtype */ for (kv = SubMultiPart; kv->kv_key; kv++) if (!mh_strcasecmp(ci->ci_subtype, kv->kv_key)) break; ct->c_subtype = kv->kv_value; /* ** Check for "boundary" parameter, which is ** required for multipart messages. */ bp = 0; for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) { if (!mh_strcasecmp(*ap, "boundary")) { bp = *ep; break; } } /* complain if boundary parameter is missing */ if (!*ap) { advise (NULL, "a \"boundary\" parameter is mandatory for \"%s/%s\" type in message %s's %s: field", ci->ci_type, ci->ci_subtype, ct->c_file, TYPE_FIELD); return NOTOK; } /* allocate primary structure for multipart info */ m = mh_xcalloc(1, sizeof(*m)); ct->c_ctparams = (void *) m; /* check if boundary parameter contains only whitespace characters */ for (cp = bp; isspace(*cp); cp++) continue; if (!*cp) { advise(NULL, "invalid \"boundary\" parameter for \"%s/%s\" type in message %s's %s: field", ci->ci_type, ci->ci_subtype, ct->c_file, TYPE_FIELD); return NOTOK; } /* remove trailing whitespace from boundary parameter */ for (cp = bp, dp = cp + strlen(cp) - 1; dp > cp; dp--) if (!isspace(*dp)) break; *++dp = '\0'; /* record boundary separators */ if (!ct->crlf) { m->mp_start = concat(bp, "\n", NULL); m->mp_stop = concat(bp, "--\n", NULL); } else { m->mp_start = concat(bp, "\r\n", NULL); m->mp_stop = concat(bp, "--\r\n", NULL); } if (!ct->c_fp && (ct->c_fp = fopen(ct->c_file, "r")) == NULL) { advise(ct->c_file, "unable to open for reading"); return NOTOK; } fseek(fp = ct->c_fp, pos = ct->c_begin, SEEK_SET); last = ct->c_end; next = &m->mp_parts; part = NULL; inout = 1; while (fgets(buffer, sizeof(buffer) - 1, fp)) { if (pos > last) break; pos += strlen(buffer); if (buffer[0] != '-' || buffer[1] != '-') continue; if (inout) { if (strcmp(buffer + 2, m->mp_start)!=0) continue; next_part: part = mh_xcalloc(1, sizeof(*part)); *next = part; next = &part->mp_next; if (!(p = get_content(fp, ct->c_file, ct->c_subtype == MULTI_DIGEST ? -1 : 0))) { ct->c_fp = NULL; return NOTOK; } p->c_fp = NULL; part->mp_part = p; pos = p->c_begin; fseek(fp, pos, SEEK_SET); inout = 0; } else { if (strcmp(buffer + 2, m->mp_start) == 0) { inout = 1; end_part: p = part->mp_part; p->c_end = ftell(fp) - (strlen(buffer) + 1); if (p->c_end < p->c_begin) p->c_begin = p->c_end; if (inout) goto next_part; goto last_part; } else { if (strcmp(buffer + 2, m->mp_stop) == 0) goto end_part; } } } advise(NULL, "bogus multipart content in message %s", ct->c_file); if (!inout && part) { p = part->mp_part; p->c_end = ct->c_end; if (p->c_begin >= p->c_end) { for (next = &m->mp_parts; *next != part; next = &((*next)->mp_next)) continue; *next = NULL; free_content(p); mh_free0(&part); } } last_part: /* reverse the order of the parts for multipart/alternative */ if (ct->c_subtype == MULTI_ALTERNATE) reverse_parts(ct); /* ** label all subparts with part number, and ** then initialize the content of the subpart. */ { int partnum; char *pp; char partnam[BUFSIZ]; if (ct->c_partno) { snprintf(partnam, sizeof(partnam), "%s.", ct->c_partno); pp = partnam + strlen(partnam); } else { pp = partnam; } for (part = m->mp_parts, partnum = 1; part; part = part->mp_next, partnum++) { p = part->mp_part; sprintf(pp, "%d", partnum); p->c_partno = mh_xstrdup(partnam); /* initialize the content of the subparts */ if (p->c_ctinitfnx && (*p->c_ctinitfnx) (p) == NOTOK) { fclose(ct->c_fp); ct->c_fp = NULL; return NOTOK; } } } fclose(ct->c_fp); ct->c_fp = NULL; return OK; } /* ** reverse the order of the parts of a multipart */ static void reverse_parts(CT ct) { int i; struct multipart *m; struct part **base, **bmp, **next, *part; m = (struct multipart *) ct->c_ctparams; /* if only one part, just return */ if (!m->mp_parts || !m->mp_parts->mp_next) return; /* count number of parts */ i = 0; for (part = m->mp_parts; part; part = part->mp_next) i++; /* allocate array of pointers to the parts */ base = mh_xcalloc(i + 1, sizeof(*base)); bmp = base; /* point at all the parts */ for (part = m->mp_parts; part; part = part->mp_next) *bmp++ = part; *bmp = NULL; /* reverse the order of the parts */ next = &m->mp_parts; for (bmp--; bmp >= base; bmp--) { part = *bmp; *next = part; next = &part->mp_next; } *next = NULL; /* free array of pointers */ mh_free0(&base); } /* ** MESSAGE */ static int InitMessage(CT ct) { struct k2v *kv; CI ci = &ct->c_ctinfo; if ((ct->c_encoding != CE_7BIT) && (ct->c_encoding != CE_8BIT) && (ct->c_encoding != CE_BINARY)) { admonish(NULL, "\"%s/%s\" type in message %s should be encoded in 7bit, 8bit, or binary", ci->ci_type, ci->ci_subtype, ct->c_file); ct->c_encoding = CE_7BIT; } /* check for missing subtype */ if (!*ci->ci_subtype) ci->ci_subtype = add("rfc822", ci->ci_subtype); /* match subtype */ for (kv = SubMessage; kv->kv_key; kv++) if (!mh_strcasecmp(ci->ci_subtype, kv->kv_key)) break; ct->c_subtype = kv->kv_value; switch (ct->c_subtype) { case MESSAGE_RFC822: break; case MESSAGE_PARTIAL: { char **ap, **ep; struct partial *p; p = mh_xcalloc(1, sizeof(*p)); ct->c_ctparams = (void *) p; /* ** scan for parameters "id", "number", ** and "total" */ for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) { if (!mh_strcasecmp(*ap, "id")) { p->pm_partid = mh_xstrdup(*ep); continue; } if (!mh_strcasecmp(*ap, "number")) { if (sscanf(*ep, "%d", &p->pm_partno) != 1 || p->pm_partno < 1) { invalid_param: advise(NULL, "invalid %s parameter for \"%s/%s\" type in message %s's %s field", *ap, ci->ci_type, ci->ci_subtype, ct->c_file, TYPE_FIELD); return NOTOK; } continue; } if (!mh_strcasecmp(*ap, "total")) { if (sscanf(*ep, "%d", &p->pm_maxno) != 1 || p->pm_maxno < 1) goto invalid_param; continue; } } if (!p->pm_partid || !p->pm_partno || (p->pm_maxno && p->pm_partno > p->pm_maxno)) { advise(NULL, "invalid parameters for \"%s/%s\" type in message %s's %s field", ci->ci_type, ci->ci_subtype, ct->c_file, TYPE_FIELD); return NOTOK; } } break; case MESSAGE_EXTERNAL: { CT p; FILE *fp; if (!ct->c_fp && (ct->c_fp = fopen(ct->c_file, "r")) == NULL) { advise(ct->c_file, "unable to open for reading"); return NOTOK; } fseek(fp = ct->c_fp, ct->c_begin, SEEK_SET); if (!(p = get_content(fp, ct->c_file, 0))) { ct->c_fp = NULL; return NOTOK; } p->c_fp = NULL; p->c_end = p->c_begin; fclose(ct->c_fp); ct->c_fp = NULL; switch (p->c_type) { case CT_MULTIPART: break; case CT_MESSAGE: if (p->c_subtype != MESSAGE_RFC822) break; /* else fall... */ default: if (p->c_ctinitfnx) (*p->c_ctinitfnx) (p); break; } } break; default: break; } return OK; } /* ** APPLICATION */ static int InitApplication(CT ct) { struct k2v *kv; CI ci = &ct->c_ctinfo; /* match subtype */ for (kv = SubApplication; kv->kv_key; kv++) if (!mh_strcasecmp(ci->ci_subtype, kv->kv_key)) break; ct->c_subtype = kv->kv_value; return OK; } /* ** TRANSFER ENCODINGS */ static int init_encoding(CT ct, OpenCEFunc openfnx) { CE ce; ce = mh_xcalloc(1, sizeof(*ce)); ct->c_cefile = ce; ct->c_ceopenfnx = openfnx; ct->c_ceclosefnx = close_encoding; ct->c_cesizefnx = size_encoding; return OK; } void close_encoding(CT ct) { CE ce; if (!(ce = ct->c_cefile)) return; if (ce->ce_fp) { fclose(ce->ce_fp); ce->ce_fp = NULL; } } static unsigned long size_encoding(CT ct) { int fd; unsigned long size; char *file; CE ce; struct stat st; if (!(ce = ct->c_cefile)) return (ct->c_end - ct->c_begin); if (ce->ce_fp && fstat(fileno(ce->ce_fp), &st) != NOTOK) return (long) st.st_size; if (ce->ce_file) { if (stat(ce->ce_file, &st) != NOTOK) return (long) st.st_size; else return 0L; } if (ct->c_encoding == CE_EXTERNAL) return (ct->c_end - ct->c_begin); file = NULL; if ((fd = (*ct->c_ceopenfnx) (ct, &file)) == NOTOK) return (ct->c_end - ct->c_begin); if (fstat(fd, &st) != NOTOK) size = (long) st.st_size; else size = 0L; (*ct->c_ceclosefnx) (ct); return size; } /* ** BASE64 */ static unsigned char b642nib[0x80] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff }; static int InitBase64(CT ct) { return init_encoding(ct, openBase64); } static int openBase64(CT ct, char **file) { int bitno, cc; int fd, len, skip, own_ct_fp = 0; unsigned long bits; unsigned char value, *b, *b1, *b2, *b3; unsigned char *cp, *ep; char buffer[BUFSIZ]; /* sbeck -- handle suffixes */ CI ci; CE ce; b = (unsigned char *) &bits; b1 = &b[endian > 0 ? 1 : 2]; b2 = &b[endian > 0 ? 2 : 1]; b3 = &b[endian > 0 ? 3 : 0]; ce = ct->c_cefile; if (ce->ce_fp) { fseek(ce->ce_fp, 0L, SEEK_SET); goto ready_to_go; } if (ce->ce_file) { if ((ce->ce_fp = fopen(ce->ce_file, "r")) == NULL) { content_error(ce->ce_file, ct, "unable to fopen for reading"); return NOTOK; } goto ready_to_go; } if (*file == NULL) { ce->ce_file = mh_xstrdup(m_mktemp(tmp, NULL, NULL)); ce->ce_unlink = 1; } else { ce->ce_file = mh_xstrdup(*file); ce->ce_unlink = 0; } /* sbeck@cise.ufl.edu -- handle suffixes */ ci = &ct->c_ctinfo; snprintf(buffer, sizeof(buffer), "%s-suffix-%s/%s", invo_name, ci->ci_type, ci->ci_subtype); cp = context_find(buffer); if (cp == NULL || *cp == '\0') { snprintf(buffer, sizeof(buffer), "%s-suffix-%s", invo_name, ci->ci_type); cp = context_find(buffer); } if (cp != NULL && *cp != '\0') { if (ce->ce_unlink) { /* ** Temporary file already exists, so we rename to ** version with extension. */ char *file_org = mh_xstrdup(ce->ce_file); ce->ce_file = add(cp, ce->ce_file); if (rename(file_org, ce->ce_file)) { adios(EX_IOERR, ce->ce_file, "unable to rename %s to ", file_org); } mh_free0(&file_org); } else { ce->ce_file = add(cp, ce->ce_file); } } if ((ce->ce_fp = fopen(ce->ce_file, "w+")) == NULL) { content_error(ce->ce_file, ct, "unable to fopen for reading/writing"); return NOTOK; } if ((len = ct->c_end - ct->c_begin) < 0) adios(EX_SOFTWARE, NULL, "internal error(1)"); if (!ct->c_fp) { if ((ct->c_fp = fopen(ct->c_file, "r")) == NULL) { content_error(ct->c_file, ct, "unable to open for reading"); return NOTOK; } own_ct_fp = 1; } bitno = 18; bits = 0L; skip = 0; lseek(fd = fileno(ct->c_fp), (off_t) ct->c_begin, SEEK_SET); while (len > 0) { switch (cc = read(fd, buffer, sizeof(buffer) - 1)) { case NOTOK: content_error(ct->c_file, ct, "error reading from"); goto clean_up; case OK: content_error(NULL, ct, "premature eof"); goto clean_up; default: if (cc > len) cc = len; len -= cc; for (ep = (cp = buffer) + cc; cp < ep; cp++) { switch (*cp) { default: if (isspace(*cp)) break; if (skip || (*cp & 0x80) || (value = b642nib[*cp & 0x7f]) > 0x3f) { if (debugsw) { fprintf(stderr, "*cp=0x%x pos=%ld skip=%d\n", *cp, (long) (lseek(fd, (off_t) 0, SEEK_CUR) - (ep - cp)), skip); } content_error(NULL, ct, "invalid BASE64 encoding -- continuing"); continue; } bits |= value << bitno; test_end: if ((bitno -= 6) < 0) { putc((char) *b1, ce->ce_fp); if (skip < 2) { putc((char) *b2, ce->ce_fp); if (skip < 1) { putc((char) *b3, ce->ce_fp); } } if (ferror(ce->ce_fp)) { content_error(ce->ce_file, ct, "error writing to"); goto clean_up; } bitno = 18, bits = 0L, skip = 0; } break; case '=': if (++skip > 3) goto self_delimiting; goto test_end; } } } } if (bitno != 18) { if (debugsw) fprintf(stderr, "premature ending (bitno %d)\n", bitno); content_error(NULL, ct, "invalid BASE64 encoding"); goto clean_up; } self_delimiting: fseek(ct->c_fp, 0L, SEEK_SET); if (fflush(ce->ce_fp)) { content_error(ce->ce_file, ct, "error writing to"); goto clean_up; } fseek(ce->ce_fp, 0L, SEEK_SET); ready_to_go: *file = ce->ce_file; if (own_ct_fp) { fclose(ct->c_fp); ct->c_fp = NULL; } return fileno(ce->ce_fp); clean_up: free_encoding(ct, 0); if (own_ct_fp) { fclose(ct->c_fp); ct->c_fp = NULL; } return NOTOK; } /* ** QUOTED PRINTABLE */ static char hex2nib[0x80] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; static int InitQuoted(CT ct) { return init_encoding(ct, openQuoted); } static int openQuoted(CT ct, char **file) { int cc, len, quoted, own_ct_fp = 0; unsigned char *cp, *ep; char buffer[BUFSIZ]; unsigned char mask = 0; CE ce; /* sbeck -- handle suffixes */ CI ci; ce = ct->c_cefile; if (ce->ce_fp) { fseek(ce->ce_fp, 0L, SEEK_SET); goto ready_to_go; } if (ce->ce_file) { if ((ce->ce_fp = fopen(ce->ce_file, "r")) == NULL) { content_error(ce->ce_file, ct, "unable to fopen for reading"); return NOTOK; } goto ready_to_go; } if (*file == NULL) { ce->ce_file = mh_xstrdup(m_mktemp(tmp, NULL, NULL)); ce->ce_unlink = 1; } else { ce->ce_file = mh_xstrdup(*file); ce->ce_unlink = 0; } /* sbeck@cise.ufl.edu -- handle suffixes */ ci = &ct->c_ctinfo; snprintf(buffer, sizeof(buffer), "%s-suffix-%s/%s", invo_name, ci->ci_type, ci->ci_subtype); cp = context_find(buffer); if (cp == NULL || *cp == '\0') { snprintf(buffer, sizeof(buffer), "%s-suffix-%s", invo_name, ci->ci_type); cp = context_find(buffer); } if (cp != NULL && *cp != '\0') { if (ce->ce_unlink) { /* ** Temporary file already exists, so we rename to ** version with extension. */ char *file_org = mh_xstrdup(ce->ce_file); ce->ce_file = add(cp, ce->ce_file); if (rename(file_org, ce->ce_file)) { adios(EX_IOERR, ce->ce_file, "unable to rename %s to ", file_org); } mh_free0(&file_org); } else { ce->ce_file = add(cp, ce->ce_file); } } if ((ce->ce_fp = fopen(ce->ce_file, "w+")) == NULL) { content_error(ce->ce_file, ct, "unable to fopen for reading/writing"); return NOTOK; } if ((len = ct->c_end - ct->c_begin) < 0) adios(EX_SOFTWARE, NULL, "internal error(2)"); if (!ct->c_fp) { if ((ct->c_fp = fopen(ct->c_file, "r")) == NULL) { content_error(ct->c_file, ct, "unable to open for reading"); return NOTOK; } own_ct_fp = 1; } quoted = 0; fseek(ct->c_fp, ct->c_begin, SEEK_SET); while (len > 0) { if (fgets(buffer, sizeof(buffer) - 1, ct->c_fp) == NULL) { content_error(NULL, ct, "premature eof"); goto clean_up; } if ((cc = strlen(buffer)) > len) cc = len; len -= cc; for (ep = (cp = buffer) + cc - 1; cp <= ep; ep--) if (!isspace(*ep)) break; *++ep = '\n', ep++; for (; cp < ep; cp++) { if (quoted > 0) { /* in an escape sequence */ if (quoted == 1) { /* at byte 1 of an escape sequence */ mask = hex2nib[*cp & 0x7f]; /* next is byte 2 */ quoted = 2; } else { /* at byte 2 of an escape sequence */ mask <<= 4; mask |= hex2nib[*cp & 0x7f]; putc(mask, ce->ce_fp); if (ferror(ce->ce_fp)) { content_error(ce->ce_file, ct, "error writing to"); goto clean_up; } /* ** finished escape sequence; next may ** be literal or a new escape sequence */ quoted = 0; } /* on to next byte */ continue; } /* not in an escape sequence */ if (*cp == '=') { /* ** starting an escape sequence, ** or invalid '='? */ if (cp + 1 < ep && cp[1] == '\n') { /* "=\n" soft line break, eat the \n */ cp++; continue; } if (cp + 1 >= ep || cp + 2 >= ep) { /* ** We don't have 2 bytes left, ** so this is an invalid escape ** sequence; just show the raw bytes ** (below). */ } else if (isxdigit(cp[1]) && isxdigit(cp[2])) { /* ** Next 2 bytes are hex digits, ** making this a valid escape ** sequence; let's decode it (above). */ quoted = 1; continue; } else { /* ** One or both of the next 2 is ** out of range, making this an ** invalid escape sequence; just ** show the raw bytes (below). */ } } /* Just show the raw byte. */ putc(*cp, ce->ce_fp); if (ferror(ce->ce_fp)) { content_error(ce->ce_file, ct, "error writing to"); goto clean_up; } } } if (quoted) { content_error(NULL, ct, "invalid QUOTED-PRINTABLE encoding -- end-of-content while still quoting"); goto clean_up; } fseek(ct->c_fp, 0L, SEEK_SET); if (fflush(ce->ce_fp)) { content_error(ce->ce_file, ct, "error writing to"); goto clean_up; } fseek(ce->ce_fp, 0L, SEEK_SET); ready_to_go: *file = ce->ce_file; if (own_ct_fp) { fclose(ct->c_fp); ct->c_fp = NULL; } return fileno(ce->ce_fp); clean_up: free_encoding(ct, 0); if (own_ct_fp) { fclose(ct->c_fp); ct->c_fp = NULL; } return NOTOK; } /* ** 7BIT */ static int Init7Bit(CT ct) { if (init_encoding(ct, open7Bit) == NOTOK) return NOTOK; ct->c_cesizefnx = NULL; /* no need to decode for real size */ return OK; } int open7Bit(CT ct, char **file) { int cc, fd, len, own_ct_fp = 0; char buffer[BUFSIZ]; /* sbeck -- handle suffixes */ char *cp; CI ci; CE ce; ce = ct->c_cefile; if (ce->ce_fp) { fseek(ce->ce_fp, 0L, SEEK_SET); goto ready_to_go; } if (ce->ce_file) { if ((ce->ce_fp = fopen(ce->ce_file, "r")) == NULL) { content_error(ce->ce_file, ct, "unable to fopen for reading"); return NOTOK; } goto ready_to_go; } if (*file == NULL) { ce->ce_file = mh_xstrdup(m_mktemp(tmp, NULL, NULL)); ce->ce_unlink = 1; } else { ce->ce_file = mh_xstrdup(*file); ce->ce_unlink = 0; } /* sbeck@cise.ufl.edu -- handle suffixes */ ci = &ct->c_ctinfo; snprintf(buffer, sizeof(buffer), "%s-suffix-%s/%s", invo_name, ci->ci_type, ci->ci_subtype); cp = context_find(buffer); if (cp == NULL || *cp == '\0') { snprintf(buffer, sizeof(buffer), "%s-suffix-%s", invo_name, ci->ci_type); cp = context_find(buffer); } if (cp != NULL && *cp != '\0') { if (ce->ce_unlink) { /* ** Temporary file already exists, so we rename to ** version with extension. */ char *file_org = mh_xstrdup(ce->ce_file); ce->ce_file = add(cp, ce->ce_file); if (rename(file_org, ce->ce_file)) { adios(EX_IOERR, ce->ce_file, "unable to rename %s to ", file_org); } mh_free0(&file_org); } else { ce->ce_file = add(cp, ce->ce_file); } } if ((ce->ce_fp = fopen(ce->ce_file, "w+")) == NULL) { content_error(ce->ce_file, ct, "unable to fopen for reading/writing"); return NOTOK; } if (ct->c_type == CT_MULTIPART) { char **ap, **ep; CI ci = &ct->c_ctinfo; len = 0; fprintf(ce->ce_fp, "%s: %s/%s", TYPE_FIELD, ci->ci_type, ci->ci_subtype); len += strlen(TYPE_FIELD) + 2 + strlen(ci->ci_type) + 1 + strlen(ci->ci_subtype); for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) { putc(';', ce->ce_fp); len++; snprintf(buffer, sizeof(buffer), "%s=\"%s\"", *ap, *ep); if (len + 1 + (cc = strlen(buffer)) >= CPERLIN) { fputs("\n\t", ce->ce_fp); len = 8; } else { putc(' ', ce->ce_fp); len++; } fprintf(ce->ce_fp, "%s", buffer); len += cc; } if (ci->ci_comment) { if (len + 1 + (cc = 2 + strlen(ci->ci_comment)) >= CPERLIN) { fputs("\n\t", ce->ce_fp); len = 8; } else { putc(' ', ce->ce_fp); len++; } fprintf(ce->ce_fp, "(%s)", ci->ci_comment); len += cc; } fprintf(ce->ce_fp, "\n"); if (ct->c_id) fprintf(ce->ce_fp, "%s:%s", ID_FIELD, ct->c_id); if (ct->c_descr) fprintf(ce->ce_fp, "%s:%s", DESCR_FIELD, ct->c_descr); if (ct->c_dispo) fprintf(ce->ce_fp, "%s:%s", DISPO_FIELD, ct->c_dispo); fprintf(ce->ce_fp, "\n"); } if ((len = ct->c_end - ct->c_begin) < 0) adios(EX_SOFTWARE, NULL, "internal error(3)"); if (!ct->c_fp) { if ((ct->c_fp = fopen(ct->c_file, "r")) == NULL) { content_error(ct->c_file, ct, "unable to open for reading"); return NOTOK; } own_ct_fp = 1; } lseek(fd = fileno(ct->c_fp), (off_t) ct->c_begin, SEEK_SET); while (len > 0) switch (cc = read(fd, buffer, sizeof(buffer) - 1)) { case NOTOK: content_error(ct->c_file, ct, "error reading from"); goto clean_up; case OK: content_error(NULL, ct, "premature eof"); goto clean_up; default: if (cc > len) cc = len; len -= cc; fwrite(buffer, sizeof(*buffer), cc, ce->ce_fp); if (ferror(ce->ce_fp)) { content_error(ce->ce_file, ct, "error writing to"); goto clean_up; } } fseek(ct->c_fp, 0L, SEEK_SET); if (fflush(ce->ce_fp)) { content_error(ce->ce_file, ct, "error writing to"); goto clean_up; } fseek(ce->ce_fp, 0L, SEEK_SET); ready_to_go: *file = ce->ce_file; if (own_ct_fp) { fclose(ct->c_fp); ct->c_fp = NULL; } return fileno(ce->ce_fp); clean_up: free_encoding(ct, 0); if (own_ct_fp) { fclose(ct->c_fp); ct->c_fp = NULL; } return NOTOK; } mmh-0.4/uip/rcvstore.c0000644000000000000000000001367213414435726013466 0ustar rootroot/* ** rcvstore.c -- asynchronously add mail to a folder ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include #include static struct swit switches[] = { #define CRETSW 0 { "create", 0 }, #define NCRETSW 1 { "nocreate", 2 }, #define UNSEENSW 2 { "unseen", 0 }, #define NUNSEENSW 3 { "nounseen", 2 }, #define PUBSW 4 { "public", 0 }, #define NPUBSW 5 { "nopublic", 2 }, #define ZEROSW 6 { "zero", 0 }, #define NZEROSW 7 { "nozero", 2 }, #define SEQSW 8 { "sequence name", 0 }, #define VERSIONSW 9 { "Version", 0 }, #define HELPSW 10 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; /* ** name of temporary file to store incoming message */ static char *tmpfilenam = NULL; void unlink_done(); static void fix_mbox(int out, char *ofile); int main(int argc, char **argv) { int publicsw = -1, zerosw = 0; int create = 1, unseensw = 1; int fd, msgnum; size_t seqp = 0; char *cp, *maildir, *folder = NULL, buf[BUFSIZ]; char **argp, **arguments, *seqs[NUMATTRS+1]; struct msgs *mp; struct stat st; if (atexit(unlink_done) != 0) { adios(EX_OSERR, NULL, "atexit failed"); } setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; /* parse arguments */ while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case SEQSW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument name to %s", argp[-2]); /* check if too many sequences specified */ if (seqp >= NUMATTRS) adios(EX_USAGE, NULL, "too many sequences (more than %d) specified", NUMATTRS); seqs[seqp++] = cp; continue; case UNSEENSW: unseensw = 1; continue; case NUNSEENSW: unseensw = 0; continue; case PUBSW: publicsw = 1; continue; case NPUBSW: publicsw = 0; continue; case ZEROSW: zerosw++; continue; case NZEROSW: zerosw = 0; continue; case CRETSW: create++; continue; case NCRETSW: create = 0; continue; } } if (*cp == '+' || *cp == '@') { if (folder) adios(EX_USAGE, NULL, "only one folder at a time!"); else folder = mh_xstrdup(expandfol(cp)); } else { adios(EX_USAGE, NULL, "usage: %s [+folder] [switches]", invo_name); } } seqs[seqp] = NULL; /* NULL terminate list of sequences */ /* if no folder is given, use default folder */ if (!folder) folder = getdeffol(); maildir = toabsdir(folder); /* check if folder exists */ if (stat(maildir, &st) == NOTOK) { if (errno != ENOENT) adios(EX_IOERR, maildir, "error on folder"); if (!create) adios(EX_USAGE, NULL, "folder %s doesn't exist", maildir); if (!makedir(maildir)) adios(EX_CANTCREAT, NULL, "unable to create folder %s", maildir); } if (chdir(maildir) == NOTOK) adios(EX_OSERR, maildir, "unable to change directory to"); /* ignore a few signals */ SIGNAL(SIGHUP, SIG_IGN); SIGNAL(SIGINT, SIG_IGN); SIGNAL(SIGQUIT, SIG_IGN); SIGNAL(SIGTERM, SIG_IGN); /* create a temporary file */ tmpfilenam = m_mktemp(invo_name, &fd, NULL); if (tmpfilenam == NULL) { adios(EX_CANTCREAT, "rcvstore", "unable to create temporary file"); } chmod(tmpfilenam, m_gmprot()); /* check if incoming mail is in mbox-format */ fix_mbox(fd, tmpfilenam); /* copy the message from stdin into temp file */ cpydata(fileno(stdin), fd, "standard input", tmpfilenam); if (fstat(fd, &st) == NOTOK) { unlink(tmpfilenam); adios(EX_IOERR, tmpfilenam, "unable to fstat"); } if (close(fd) == NOTOK) adios(EX_IOERR, tmpfilenam, "error closing"); /* don't add file if it is empty */ if (st.st_size == 0) { unlink(tmpfilenam); advise(NULL, "empty file"); exit(EX_OK); } /* ** read folder and create message structure */ if (!(mp = folder_read(folder))) adios(EX_IOERR, NULL, "unable to read folder %s", folder); /* ** Link message into folder, and possibly add ** to the Unseen-Sequence's. */ if ((msgnum = folder_addmsg(&mp, tmpfilenam, 0, unseensw, 0, 0, NULL)) == -1) exit(EX_SOFTWARE); /* ** Add the message to any extra sequences ** that have been specified. */ for (seqp = 0; seqs[seqp]; seqp++) { if (!seq_addmsg(mp, seqs[seqp], msgnum, publicsw, zerosw)) exit(EX_SOFTWARE); } seq_setunseen(mp, 1); /* add new msgs to unseen sequences */ seq_save(mp); /* synchronize and save message sequences */ folder_free(mp); /* free folder/message structure */ context_save(); /* save the global context file */ unlink(tmpfilenam); /* remove temporary file */ tmpfilenam = NULL; return EX_OK; } static void fix_mbox(int out, char *outfile) { char mbox[5]; int ret; if ((ret = read(fileno(stdin), mbox, sizeof(mbox))) != sizeof(mbox)) { if (ret == -1) { adios(EX_IOERR, "standard input", "error reading"); } return; } if (strncmp(mbox, "From ", sizeof(mbox))==0) { do { if ((ret = read(fileno(stdin), mbox, 1)) != 1) { if (ret == -1) { adios(EX_IOERR, "standard input", "error reading"); } return; } } while (*mbox != '\n'); } else { if (write(out, mbox, sizeof(mbox)) != sizeof(mbox)) { adios(EX_IOERR, outfile, "error writing"); } } } /* ** Clean up and exit */ void unlink_done() { if (tmpfilenam && *tmpfilenam) { unlink(tmpfilenam); } } mmh-0.4/uip/rcvdist.c0000644000000000000000000001171413414435726013270 0ustar rootroot/* ** rcvdist.c -- asynchronously redistribute messages ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include static struct swit switches[] = { #define FORMSW 0 { "form formfile", 0 }, #define VERSIONSW 1 { "Version", 0 }, #define HELPSW 2 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; static char backup[BUFSIZ] = ""; static char drft[BUFSIZ] = ""; static char tmpfil[BUFSIZ] = ""; /* ** prototypes */ static void rcvdistout(FILE *, char *, char *); void unlink_done(); int main(int argc, char **argv) { int vecp = 1; char *addrs = NULL, *cp, *form = NULL, buf[BUFSIZ]; char **argp, **arguments, *vec[MAXARGS]; FILE *fp; char *tfile = NULL; if (atexit(unlink_done) != 0) { adios(EX_OSERR, NULL, "atexit failed"); } setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: vec[vecp++] = --cp; continue; case HELPSW: snprintf(buf, sizeof(buf), "%s [switches] [switches for spost] address ...", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case FORMSW: if (!(form = *argp++) || *form == '-') { adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; } } addrs = addrs ? add(cp, add(", ", addrs)) : mh_xstrdup(cp); } if (!addrs) { adios(EX_USAGE, NULL, "usage: %s [switches] [switches for spost] address ...", invo_name); } umask(~m_gmprot()); tfile = m_mktemp2(NULL, invo_name, NULL, &fp); if (tfile == NULL) adios(EX_CANTCREAT, "rcvdist", "unable to create temporary file"); strncpy(tmpfil, tfile, sizeof(tmpfil)); cpydata(fileno(stdin), fileno(fp), "message", tmpfil); fseek(fp, 0L, SEEK_SET); tfile = m_mktemp2(NULL, invo_name, NULL, NULL); if (tfile == NULL) adios(EX_CANTCREAT, "forw", "unable to create temporary file"); strncpy(drft, tfile, sizeof(tmpfil)); rcvdistout(fp, form, addrs); fclose(fp); if (distout(drft, tmpfil, backup) == NOTOK) { exit(EX_IOERR); } vec[0] = "spost"; vec[vecp++] = "-dist"; vec[vecp++] = drft; vec[vecp] = NULL; execvp(*vec, vec); fprintf(stderr, "unable to exec "); perror(*vec); _exit(EX_OSERR); return 0; /* dead code to satisfy the compiler */ } /* very similar to routine in replsbr.c */ static struct format *fmt; static int ncomps = 0; static int dat[5]; static char *addrcomps[] = { "from", "sender", "reply-to", "to", "cc", "bcc", "resent-from", "resent-sender", "resent-reply-to", "resent-to", "resent-cc", "resent-bcc", NULL }; static void rcvdistout(FILE *inb, char *form, char *addrs) { int char_read = 0, format_len, i; enum state state; struct field f = {{0}}; char **ap; char *cp, *scanl; struct comp *cptr; FILE *out; if (!(out = fopen(drft, "w"))) { adios(EX_CANTCREAT, drft, "unable to create"); } /* get new format string */ cp = new_fs(form ? form : rcvdistcomps, NULL); format_len = strlen(cp); ncomps = fmt_compile(cp, &fmt) + 1; for (ap = addrcomps; *ap; ap++) { FINDCOMP(cptr, *ap); if (cptr) { cptr->c_type |= CT_ADDR; } } FINDCOMP(cptr, "addresses"); if (cptr) { cptr->c_text = addrs; } state = FLD2; while (1) { state = m_getfld2(state, &f, inb); switch (state) { case FLD2: if ((cptr = wantcomp[CHASH(f.name)])) { do { if (mh_strcasecmp(f.name, cptr->c_name)!=0) { continue; } char_read += strlen(f.value); if (!cptr->c_text) { cptr->c_text = mh_xstrdup(f.value); } else { cp = cptr->c_text; i = strlen(cp) - 1; if (cp[i] == '\n') { if (cptr->c_type & CT_ADDR) { cp[i] = 0; cp = add(",\n\t", cp); } else { cp = add("\t", cp); } } cptr->c_text = add(f.value, cp); } break; } while ((cptr = cptr->c_next)); } break; case LENERR2: case FMTERR2: case IOERR2: case BODY2: case FILEEOF2: goto finished; default: adios(EX_SOFTWARE, NULL, "m_getfld() returned %d", state); } } finished: ; i = format_len + char_read + 256; scanl = mh_xcalloc(i + 2, sizeof(char)); dat[0] = dat[1] = dat[2] = dat[4] = 0; dat[3] = OUTPUTLINELEN; fmt_scan(fmt, scanl, i, dat); fputs(scanl, out); if (ferror(out)) { adios(EX_IOERR, drft, "error writing"); } fclose(out); mh_free0(&scanl); } void unlink_done() { if (*backup) { unlink(backup); } if (*drft) { unlink(drft); } if (*tmpfil) { unlink(tmpfil); } } mmh-0.4/uip/Makefile.in0000644000000000000000000002014313414435726013507 0ustar rootroot# # Makefile for uip subdirectory # SHELL = /bin/sh top_srcdir = @top_srcdir@ srcdir = @srcdir@ VPATH = @srcdir@ VERSION = `$(top_srcdir)/version.sh $(top_srcdir)` prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ etcdir = @sysconfdir@ CC = @CC@ CFLAGS = @CFLAGS@ DEFS = @DEFS@ # add include dir .. for config.h when building in different directory INCLUDES = -I$(srcdir) -I$(top_srcdir) -I.. @CPPFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ LOCALLIBS = ../sbr/libmh.a LINKLIBS = $(LOCALLIBS) $(LIBS) LINT = @LINT@ LINTFLAGS = @LINTFLAGS@ TERMLIB = @TERMLIB@ LEXLIB = @LEXLIB@ COMPILE = $(CC) -c $(DEFS) -DVERSION="\"$(VERSION)\"" $(INCLUDES) $(CFLAGS) LINK = $(CC) $(LDFLAGS) -o $@ LN = ln INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ MAIL_SPOOL_GRP = @MAIL_SPOOL_GRP@ SETGID_MAIL = @SETGID_MAIL@ .SUFFIXES: .SUFFIXES: .c .o .c.o: $(COMPILE) $< # commands to build CMDS = ali anno burst comp dist flist folder forw mmh mark \ mhbuild mhl mhsign mhpgp \ mhlist mhmail mhparam mhpath mhstore new packf pick \ print-mimetype prompter rcvdist rcvpack rcvstore refile repl rmf \ rmm send sendfiles show slocal sortm spost whatnow whatnow2 whom # commands that are links to other commands LCMDS = flists folders next prev fnext fprev unseen scan # misc support binaries MISC = ap dp fmtdump mhtest mmhwrap # commands with 'S'pecial installation needs SCMDS = inc # source files SRCS = ali.c aliasbr.c anno.c ap.c burst.c comp.c \ dist.c distsbr.c dp.c dropsbr.c flist.c fmtdump.c \ folder.c forw.c inc.c mark.c mmh.sh mmhwrap.sh mhbuild.c \ mhfree.c mhl.c mhlist.c mhlistsbr.c mhsign.sh mhpgp.sh \ mhmail.c mhmisc.c mhoutsbr.c mhparam.c mhparse.c \ mhpath.c mhshow.c mhshowsbr.c mhstore.c mhtest.c \ new.c packf.c pick.c print-mimetype.sh \ prompter.c rcvdist.c rcvpack.c rcvstore.c \ refile.c repl.c rmf.c rmm.c scansbr.c send.c \ sendfiles.sh slocal.c sortm.c spost.c termsbr.c \ whatnow.c whatnowproc.c whom.c whatnow2.sh # ========== DEFAULT TARGET ========== all: $(CMDS) $(MISC) $(SCMDS) # ========= DEPENDENCIES FOR BUILDING ========== ali: ali.o aliasbr.o $(LOCALLIBS) $(LINK) ali.o aliasbr.o $(LINKLIBS) ap: ap.o $(LOCALLIBS) $(LINK) ap.o $(LINKLIBS) anno: anno.o $(LOCALLIBS) $(LINK) anno.o $(LINKLIBS) burst: burst.o $(LOCALLIBS) $(LINK) burst.o $(LINKLIBS) comp: comp.o whatnowproc.o $(LOCALLIBS) $(LINK) comp.o whatnowproc.o $(LINKLIBS) dist: dist.o whatnowproc.o $(LOCALLIBS) $(LINK) dist.o whatnowproc.o $(LINKLIBS) dp: dp.o $(LOCALLIBS) $(LINK) dp.o $(LINKLIBS) flist: flist.o $(LOCALLIBS) $(LINK) flist.o $(LINKLIBS) fmtdump: fmtdump.o $(LOCALLIBS) $(LINK) fmtdump.o $(LINKLIBS) folder: folder.o $(LOCALLIBS) $(LINK) folder.o $(LINKLIBS) forw: forw.o whatnowproc.o $(LOCALLIBS) $(LINK) forw.o whatnowproc.o $(LINKLIBS) inc: inc.o scansbr.o termsbr.o $(LOCALLIBS) $(LINK) inc.o scansbr.o termsbr.o $(LINKLIBS) $(TERMLIB) mark: mark.o $(LOCALLIBS) $(LINK) mark.o $(LINKLIBS) mmh: mmh.sh cp $(srcdir)/mmh.sh mmh chmod +x mmh mmhwrap: mmhwrap.sh sed "s,%bindir%,"$(bindir)"," $(srcdir)/mmhwrap.sh >mmhwrap chmod +x mmhwrap mhsign: mhsign.sh sed "s,%libdir%,"$(libdir)"," $(srcdir)/mhsign.sh >mhsign chmod +x mhsign mhpgp: mhpgp.sh cp $(srcdir)/mhpgp.sh mhpgp chmod +x mhpgp mhbuild: mhbuild.o mhoutsbr.o mhmisc.o mhfree.o mhparse.o termsbr.o $(LOCALLIBS) $(LINK) mhbuild.o mhoutsbr.o mhmisc.o mhfree.o mhparse.o $(LINKLIBS) $(TERMLIB) mhl: mhl.o termsbr.o $(LOCALLIBS) $(LINK) mhl.o termsbr.o $(LINKLIBS) $(TERMLIB) mhlist: mhlist.o mhparse.o mhlistsbr.o mhmisc.o mhfree.o termsbr.o $(LOCALLIBS) $(LINK) mhlist.o mhparse.o mhlistsbr.o mhmisc.o mhfree.o termsbr.o $(LINKLIBS) $(TERMLIB) mhmail: mhmail.o $(LOCALLIBS) $(LINK) mhmail.o $(LINKLIBS) mhparam: mhparam.o $(LOCALLIBS) $(LINK) mhparam.o $(LINKLIBS) mhpath: mhpath.o $(LOCALLIBS) $(LINK) mhpath.o $(LINKLIBS) show: mhshow.o mhparse.o mhshowsbr.o mhlistsbr.o mhmisc.o mhfree.o termsbr.o $(LOCALLIBS) $(LINK) mhshow.o mhparse.o mhshowsbr.o mhlistsbr.o mhmisc.o mhfree.o termsbr.o $(LINKLIBS) $(TERMLIB) mhstore: mhstore.o mhparse.o mhshowsbr.o mhlistsbr.o mhmisc.o mhfree.o termsbr.o $(LOCALLIBS) $(LINK) mhstore.o mhparse.o mhshowsbr.o mhlistsbr.o mhmisc.o mhfree.o termsbr.o $(LINKLIBS) $(TERMLIB) mhtest: mhtest.o mhparse.o mhoutsbr.o mhmisc.o mhfree.o termsbr.o $(LOCALLIBS) $(LINK) mhtest.o mhparse.o mhoutsbr.o mhmisc.o mhfree.o termsbr.o $(LINKLIBS) $(TERMLIB) new: new.o $(LOCALLIBS) $(LINK) new.o $(LINKLIBS) packf: packf.o dropsbr.o $(LOCALLIBS) $(LINK) packf.o dropsbr.o $(LINKLIBS) pick: pick.o scansbr.o termsbr.o $(LOCALLIBS) $(LINK) pick.o scansbr.o termsbr.o $(LINKLIBS) $(TERMLIB) print-mimetype: print-mimetype.sh cp $(srcdir)/print-mimetype.sh print-mimetype chmod +x print-mimetype prompter: prompter.o $(LOCALLIBS) $(LINK) prompter.o $(LINKLIBS) rcvdist: rcvdist.o distsbr.o $(LOCALLIBS) $(LINK) rcvdist.o distsbr.o $(LINKLIBS) rcvpack: rcvpack.o dropsbr.o $(LOCALLIBS) $(LINK) rcvpack.o dropsbr.o $(LINKLIBS) rcvstore: rcvstore.o $(LOCALLIBS) $(LINK) rcvstore.o $(LINKLIBS) refile: refile.o $(LOCALLIBS) $(LINK) refile.o $(LINKLIBS) repl: repl.o whatnowproc.o $(LOCALLIBS) $(LINK) repl.o whatnowproc.o $(LINKLIBS) rmf: rmf.o $(LOCALLIBS) $(LINK) rmf.o $(LINKLIBS) rmm: rmm.o $(LOCALLIBS) $(LINK) rmm.o $(LINKLIBS) send: send.o distsbr.o $(LOCALLIBS) $(LINK) send.o distsbr.o $(LINKLIBS) sendfiles: sendfiles.sh cp $(srcdir)/sendfiles.sh sendfiles chmod +x sendfiles slocal: slocal.o $(LOCALLIBS) $(LINK) slocal.o $(LINKLIBS) sortm: sortm.o $(LOCALLIBS) $(LINK) sortm.o $(LINKLIBS) spost: spost.o aliasbr.o $(LOCALLIBS) $(LINK) spost.o aliasbr.o $(LINKLIBS) whatnow: whatnow.o $(LOCALLIBS) $(LINK) whatnow.o $(LINKLIBS) whatnow2: whatnow2.sh cp $(srcdir)/whatnow2.sh whatnow2 whom: whom.o $(LOCALLIBS) $(LINK) whom.o $(LINKLIBS) # ========== DEPENDENCIES FOR INSTALLING ========== # install everything install: install-cmds install-misc install-lcmds install-scmds # install commands install-cmds: mkdir -p $(DESTDIR)$(bindir) for cmd in $(CMDS); do \ $(INSTALL_PROGRAM) $$cmd $(DESTDIR)$(bindir)/$$cmd; \ done # install links install-lcmds: install-cmds rm -f $(DESTDIR)$(bindir)/flists rm -f $(DESTDIR)$(bindir)/folders rm -f $(DESTDIR)$(bindir)/fnext rm -f $(DESTDIR)$(bindir)/fprev rm -f $(DESTDIR)$(bindir)/unseen rm -f $(DESTDIR)$(bindir)/prev rm -f $(DESTDIR)$(bindir)/next rm -f $(DESTDIR)$(bindir)/scan $(LN) $(DESTDIR)$(bindir)/flist $(DESTDIR)$(bindir)/flists $(LN) $(DESTDIR)$(bindir)/folder $(DESTDIR)$(bindir)/folders $(LN) $(DESTDIR)$(bindir)/new $(DESTDIR)$(bindir)/fnext $(LN) $(DESTDIR)$(bindir)/new $(DESTDIR)$(bindir)/fprev $(LN) $(DESTDIR)$(bindir)/new $(DESTDIR)$(bindir)/unseen $(LN) $(DESTDIR)$(bindir)/show $(DESTDIR)$(bindir)/prev $(LN) $(DESTDIR)$(bindir)/show $(DESTDIR)$(bindir)/next $(LN) $(DESTDIR)$(bindir)/pick $(DESTDIR)$(bindir)/scan # install misc support binaries install-misc: mkdir -p $(DESTDIR)$(libdir) for misc in $(MISC); do \ $(INSTALL_PROGRAM) $$misc $(DESTDIR)$(libdir)/$$misc; \ done # install commands with special installation needs (thus no $(SCMDS) use here) install-scmds: if test x$(SETGID_MAIL) != x; then \ $(INSTALL_PROGRAM) -g $(MAIL_SPOOL_GRP) -m 2755 inc $(DESTDIR)$(bindir)/$$cmd; \ else \ $(INSTALL_PROGRAM) inc $(DESTDIR)$(bindir)/$$cmd; \ fi uninstall: for cmd in $(CMDS); do \ rm -f $(DESTDIR)$(bindir)/$$cmd; \ done for lcmd in $(LCMDS); do \ rm -f $(DESTDIR)$(bindir)/$$lcmd; \ done for misc in $(MISC); do \ rm -f $(DESTDIR)$(libdir)/$$misc; \ done for cmd in $(SCMDS); do \ rm -f $(DESTDIR)$(bindir)/$$cmd; \ done # ========== DEPENDENCIES FOR CLEANUP ========== mostlyclean: rm -f *.o *~ clean: mostlyclean rm -f $(CMDS) $(MISC) $(SCMDS) distclean: clean rm -f Makefile realclean: distclean superclean: realclean # ========== DEPENDENCIES FOR LINT ================ lint: $(LINT) $(LINTFLAGS) $(INCLUDES) $(DEFS) $(SRCS) # ========== DEPENDENCIES FOR MAINTENANCE ========== subdir = uip Makefile: Makefile.in ../config.status cd .. && ./config.status $(subdir)/$@ mmh-0.4/uip/mmh.sh0000755000000000000000000000504413414435726012565 0ustar rootroot#!/bin/sh # 2011 markus schnalke # # replacement for install-mh(1) # set up mmh for the user # # Uses: folder(1) # # Todo: use chmod or set umask for created files? # Todo: install signal handlers and tell how to abort # the following constants must match the values in config/config.c mmhdir=.mmh profile=profile mailstore=Mail # # process args # while [ $# -ge 1 ] ; do case $1 in -c*) # check if mmh is set up # Note: The mail storage dir gets silently created if # everything else is properly set up. folder -create >/dev/null 2>&1 exit $? ;; -V*) echo "mmh has no own version number, thus this instead:" folder -Version exit 0 ;; -h*|*) echo "Usage: $0 -- set up mmh for you" >&2 echo " $0 -c -- check if mmh is set up for you" >&2 exit 1 esac shift done cat <"$profile" echo 3. folder echo echo "Enjoy ..." exit 0 } # # mmh dir # mmhdir="${MMH:=$mmhdir}" cd # relative to HOME echo 1. if [ -d "$mmhdir" ] ; then echo "--> Using existing mmh directory $mmhdir" else mkdir "$mmhdir" && echo "--> Created mmh directory $mmhdir" fi cd "$mmhdir" mmhpath="`pwd`" # # profile # profile="${MMHP:=$profile}" # relative to $mmhpath if [ -f "$profile" ] ; then echo 2. echo "You already have an mmh profile." printf "Do you want to edit the file now? [Y/n] " read answ case "$answ" in ''|Y*|y*) cd "$mmhpath" ${VISUAL:-${EDITOR:-vi}} "$profile" echo echo "Enjoy ..." exit 0 ;; *) echo "Exiting." exit 1 ;; esac fi # # mail store # echo 2. echo "Mmh needs a mail storage." cd # relative to HOME if [ -d "$mailstore" ] ; then echo "The suggested directory `pwd`/$mailstore already exists." printf "Do you want to use it for mmh? [Y/n] " read answ case "$answ" in ''|Y*|y*) cd "$mailstore" echo "--> Using existing directory $mailstore" finish exit ;; esac fi printf "Where do you want it to be located? [`pwd`/Mail] " read answ if [ -z "$answ" ] ; then answ="`pwd`/Mail" fi mkdir "$answ" && echo "--> Created $answ" cd "$answ" mailstore="`pwd`" finish mmh-0.4/uip/print-mimetype.sh0000755000000000000000000000227013414435726014765 0ustar rootroot#!/bin/sh # # print mime type of file, depending on file name extension if [ $# -eq 0 ] ; then echo "Usage: $0 FILE..." >&2 exit 1 fi for i do case "$i" in *.xls) type=application/excel;; *.ppt) type=application/mspowerpoint;; *.doc) type=application/msword;; *.pdf) type=application/pdf;; *.deb) type=application/x-debian-package;; *.tar) type=application/x-tar;; *.[1-9]) type=application/x-troff-man;; *.zip) type=application/zip;; *.au) type=audio/basic;; *.gif) type=image/gif;; *.jpg|*.jpeg) type=image/jpeg;; *.png) type=image/png;; *.ps) type=application/postscript;; *.eps) type=image/eps;; *.tif|*.tiff) type=image/tiff;; *.ico) type=image/x-icon;; *.bmp) type=image/x-ms-bmp;; *.pnm) type=image/x-portable-anymap;; *.pbm) type=image/x-portable-bitmap;; *.pgm) type=image/x-portable-graymap;; *.ppm) type=image/x-portable-pixmap;; *.xbm) type=image/x-xbitmap;; *.xpm) type=image/x-xpixmap;; *.xwd) type=image/x-xwindowdump;; *.eml) type=message/rfc822;; *.rtf) type=text/richtext;; *.html|*.htm) type=text/html;; *.txt) type=text/plain;; *.mpg|*.mpeg) video/mpeg;; *) if file "$i" | grep -q ' text$' ; then type=text/plain else type=application/octet-stream fi esac echo "$type" done mmh-0.4/uip/mhl.c0000644000000000000000000006166113414435726012400 0ustar rootroot/* ** mhl.c -- the nmh message listing program ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include #include #include /* ** MAJOR BUG: ** for a component containing addresses, ADDRFMT, if COMPRESS is also ** set, then addresses get split wrong (not at the spaces between commas). ** To fix this correctly, putstr() should know about "atomic" strings that ** must NOT be broken across lines. That's too difficult for right now ** (it turns out that there are a number of degernate cases), so in ** oneline(), instead of ** ** (*onelp == '\n' && !onelp[1]) ** ** being a terminating condition, ** ** (*onelp == '\n' && (!onelp[1] || (flags & ADDRFMT))) ** ** is used instead. This cuts the line prematurely, and gives us a much ** better chance of getting things right. */ #define ONECOMP 0 #define TWOCOMP 1 #define BODYCOMP 2 #define QUOTE '\\' static struct swit switches[] = { #define FORMSW 0 { "form formfile", 0 }, #define WIDTHSW 1 { "width columns", 0 }, #define VERSIONSW 2 { "Version", 0 }, #define HELPSW 3 { "help", 0 }, #define FORW1SW 4 { "forward", -7 }, #define FORW2SW 5 { "forwall", -7 }, #define NBODYSW 6 { "nobody", -6 }, { NULL, 0 } }; char *version=VERSION; #define NOCOMPONENT 0x000001 /* don't show component name */ #define UPPERCASE 0x000002 /* display in all upper case */ #define CENTER 0x000004 /* center line */ #define CLEARTEXT 0x000008 /* cleartext */ #define EXTRA 0x000010 /* an "extra" component */ #define HDROUTPUT 0x000020 /* already output */ #define LEFTADJUST 0x000040 /* left justify multiple lines */ #define COMPRESS 0x000080 /* compress text */ #define ADDRFMT 0x000100 /* contains addresses */ #define DATEFMT 0x000200 /* contains dates */ #define FORMAT 0x000400 /* parse address/date/RFC-2047 field */ #define INIT 0x000800 /* initialize component */ #define SPLIT 0x001000 /* split headers (don't concatenate) */ #define NONEWLINE 0x002000 /* don't write trailing newline */ #define RTRIM 0x004000 /* trim trailing whitespace */ #define RAW 0x008000 /* print the raw input */ #define LBITS "\020\01NOCOMPONENT\02UPPERCASE\03CENTER\04CLEARTEXT\05EXTRA\06HDROUTPUT\07LEFTADJUST\010COMPRESS\011ADDRFMT\012DATEFMT\013FORMAT\014INIT\015SPLIT\016NONEWLINE\017RTRIM\020RAW" #define GFLAGS (NOCOMPONENT | UPPERCASE | CENTER | LEFTADJUST | COMPRESS | SPLIT) struct mcomp { char *c_name; /* component name */ char *c_text; /* component text */ char *c_ovtxt; /* text overflow indicator */ char *c_fstr; /* iff FORMAT */ struct format *c_fmt; /* .. */ int c_offset; /* left margin indentation */ int c_ovoff; /* overflow indentation */ int c_width; /* width of field */ int c_cwidth; /* width of component */ long c_flags; struct mcomp *c_next; }; static struct mcomp *msghd = NULL; static struct mcomp *msgtl = NULL; static struct mcomp *fmthd = NULL; static struct mcomp *fmttl = NULL; static struct mcomp global = { NULL, NULL, NULL, NULL, NULL, 0, -1, 80, -1, 0, NULL }; static struct mcomp holder = { NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NOCOMPONENT, NULL }; struct pair { char *p_name; long p_flags; }; static struct pair pairs[] = { { "Date", DATEFMT }, { "From", ADDRFMT }, { "Sender", ADDRFMT }, { "Reply-To", ADDRFMT }, { "To", ADDRFMT }, { "Cc", ADDRFMT }, { "Bcc", ADDRFMT }, { "Resent-Date", DATEFMT }, { "Resent-From", ADDRFMT }, { "Resent-Sender", ADDRFMT }, { "Resent-Reply-To", ADDRFMT }, { "Resent-To", ADDRFMT }, { "Resent-Cc", ADDRFMT }, { "Resent-Bcc", ADDRFMT }, { NULL, 0 } }; struct triple { char *t_name; long t_on; long t_off; }; static struct triple triples[] = { { "nocomponent", NOCOMPONENT, 0 }, { "uppercase", UPPERCASE, RAW }, { "nouppercase", 0, UPPERCASE }, { "center", CENTER, RAW }, { "nocenter", 0, CENTER }, { "leftadjust", LEFTADJUST, RAW }, { "noleftadjust", 0, LEFTADJUST }, { "compress", COMPRESS, RAW }, { "nocompress", 0, COMPRESS }, { "split", SPLIT, 0 }, { "nosplit", 0, SPLIT }, { "rtrim", RTRIM, RAW }, { "nortrim", 0, RTRIM }, { "raw", RAW|SPLIT|NOCOMPONENT|NONEWLINE, UPPERCASE|CENTER|LEFTADJUST|COMPRESS|DATEFMT|ADDRFMT }, { "addrfield", ADDRFMT, DATEFMT|RAW }, { "datefield", DATEFMT, ADDRFMT|RAW }, { "newline", 0, NONEWLINE|RAW }, { "nonewline", NONEWLINE, 0 }, { NULL, 0, 0 } }; static int dobody = 1; static int forwflg = 0; static int forwall = 0; static int exitstat = 0; static int mhldebug = 0; static unsigned int column; static int lm; static int ovoff; static int term; static unsigned int wid; static char *ovtxt; static unsigned char *onelp; static char *parptr; static int num_ignores = 0; static char *ignores[MAXARGS]; volatile sig_atomic_t eflag = 0; /* ** Redefine a couple of functions. ** These are undefined later in the code. */ /* ** prototypes */ static void mhl_format(char *, int); static int evalvar(struct mcomp *); static int ptoi(char *, int *); static int ptos(char *, char **); static char *parse(void); static void process(char *, int, int); static void mhlfile(FILE *, char *, int, int); static int mcomp_flags(char *); static char *mcomp_add(long, char *, char *); static void mcomp_format(struct mcomp *, struct mcomp *); static struct mcomp *add_queue(struct mcomp **, struct mcomp **, char *, char *, int); static void free_queue(struct mcomp **, struct mcomp **); static void putcomp(struct mcomp *, struct mcomp *, int); static char *oneline(char *, long); static void putstr(char *); static void putch(char); static void intrser(int); int sc_width(void); /* from termsbr.c */ int main(int argc, char **argv) { int i, width = 0, vecp = 0; char *cp, *form = NULL; char buf[BUFSIZ], *files[MAXARGS]; char **argp, **arguments; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; if ((cp = getenv("MHLDEBUG")) && *cp) mhldebug++; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown\n", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [switches] [files ...]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case FORMSW: if (!(form = *argp++) || *form == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case WIDTHSW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); if ((width = atoi(cp)) < 1) adios(EX_USAGE, NULL, "bad argument %s %s", argp[-2], cp); continue; case FORW2SW: forwall++; /* fall */ case FORW1SW: forwflg++; continue; case NBODYSW: dobody = 0; continue; } } files[vecp++] = cp; } mhl_format(form ? form : mhlformat, width); if (vecp == 0) { process(NULL, 1, vecp = 1); } else { for (i = 0; i < vecp; i++) process(files[i], i + 1, vecp); } if (forwall) { printf("\n------- End of Forwarded Message%s\n\n", vecp > 1 ? "s" : ""); } fflush(stdout); if (ferror(stdout)) { adios(EX_IOERR, "output", "error writing"); } return exitstat; } static void mhl_format(char *file, int width) { int i; char *bp, *cp; char *ap, buffer[BUFSIZ], name[NAMESZ]; struct mcomp *c1; struct stat st; FILE *fp; static dev_t dev = 0; static ino_t ino = 0; static time_t mtime = 0; if (fmthd != NULL) { if (stat(etcpath(file), &st) != NOTOK && mtime == st.st_mtime && dev == st.st_dev && ino == st.st_ino) goto out; else free_queue(&fmthd, &fmttl); } if ((fp = fopen(etcpath(file), "r")) == NULL) adios(EX_IOERR, file, "unable to open format file"); if (fstat(fileno(fp), &st) != NOTOK) { mtime = st.st_mtime; dev = st.st_dev; ino = st.st_ino; } global.c_ovtxt = global.c_fstr = NULL; global.c_fmt = NULL; global.c_offset = 0; global.c_ovoff = -1; if ((i = sc_width()) > 5) global.c_width = i; global.c_cwidth = -1; global.c_flags = 0; *ignores = NULL; while (vfgets(fp, &ap) == OK) { bp = ap; if (*bp == ';') continue; if ((cp = strchr(bp, '\n'))) *cp = 0; if (*bp == ':') { c1 = add_queue(&fmthd, &fmttl, NULL, bp + 1, CLEARTEXT); continue; } parptr = bp; strncpy(name, parse(), sizeof(name)); switch(*parptr) { case '\0': case ',': case '=': /* ** Split this list of fields to ignore, and copy ** it to the end of the current "ignores" list. */ if (!mh_strcasecmp(name, "ignores")) { char **tmparray; int n = 0; /* split the fields */ tmparray = brkstring(mh_xstrdup(++parptr), ",", NULL); /* ** copy pointers to split fields ** to ignores array */ while (tmparray[n] && num_ignoresc_fstr && global.c_fstr) { if ((c1->c_flags & DATEFMT) && (global.c_flags & DATEFMT)) { c1->c_fstr = mh_xstrdup(global.c_fstr); } else if ((c1->c_flags & ADDRFMT) && (global.c_flags & ADDRFMT)) { c1->c_fstr = mh_xstrdup(global.c_fstr); } } continue; default: adios(EX_CONFIG, NULL, "format file syntax error: %s", bp); } } fclose(fp); if (mhldebug) { for (c1 = fmthd; c1; c1 = c1->c_next) { fprintf(stderr, "c1: name=\"%s\" text=\"%s\" ovtxt=\"%s\"\n", c1->c_name, c1->c_text, c1->c_ovtxt); fprintf(stderr, "\tfstr=0x%x fmt=0x%x\n", (unsigned int)(unsigned long) c1->c_fstr, (unsigned int)(unsigned long) c1->c_fmt); fprintf(stderr, "\toffset=%d ovoff=%d width=%d cwidth=%d\n", c1->c_offset, c1->c_ovoff, c1->c_width, c1->c_cwidth); fprintf (stderr, "\tflags=%s\n", snprintb(buffer, sizeof(buffer), (unsigned) c1->c_flags, LBITS)); } } out: if (width) global.c_width = width; if (global.c_width < 5) global.c_width = 10000; } static int evalvar(struct mcomp *c1) { char *cp, name[NAMESZ]; struct triple *ap; if (!*parptr) return 0; strncpy(name, parse(), sizeof(name)); if (!mh_strcasecmp(name, "component")) { if (ptos(name, &c1->c_text)) return 1; c1->c_flags &= ~NOCOMPONENT; return 0; } if (!mh_strcasecmp(name, "overflowtext")) return ptos(name, &c1->c_ovtxt); if (!mh_strcasecmp(name, "formatfield")) { char *fmtstr; if (ptos(name, &cp)) return 1; cp = concat("=", cp, NULL); fmtstr = new_fs(cp, NULL); mh_free0(&cp); c1->c_fstr = mh_xstrdup(fmtstr); c1->c_flags |= FORMAT; return 0; } if (!mh_strcasecmp(name, "decode")) { char *fmtstr; fmtstr = new_fs("=%(decode{text})", NULL); c1->c_fstr = mh_xstrdup(fmtstr); c1->c_flags |= FORMAT; return 0; } if (!mh_strcasecmp(name, "offset")) return ptoi(name, &c1->c_offset); if (!mh_strcasecmp(name, "overflowoffset")) return ptoi(name, &c1->c_ovoff); if (!mh_strcasecmp(name, "width")) return ptoi(name, &c1->c_width); if (!mh_strcasecmp(name, "compwidth")) return ptoi(name, &c1->c_cwidth); for (ap = triples; ap->t_name; ap++) if (!mh_strcasecmp(ap->t_name, name)) { c1->c_flags |= ap->t_on; c1->c_flags &= ~ap->t_off; return 0; } return 1; } static int ptoi(char *name, int *i) { char *cp; if (*parptr++ != '=' || !*(cp = parse())) { advise(NULL, "missing argument to variable %s", name); return 1; } *i = atoi(cp); return 0; } static int ptos(char *name, char **s) { char c, *cp; if (*parptr++ != '=') { advise(NULL, "missing argument to variable %s", name); return 1; } if (*parptr != '"') { for (cp = parptr; *parptr && *parptr != ':' && *parptr != ','; parptr++) continue; } else { for (cp = ++parptr; *parptr && *parptr != '"'; parptr++) if (*parptr == QUOTE) if (!*++parptr) parptr--; } c = *parptr; *parptr = 0; *s = mh_xstrdup(cp); if ((*parptr = c) == '"') parptr++; return 0; } static char * parse(void) { int c; char *cp; static char result[NAMESZ]; for (cp = result; *parptr && (cp - result < NAMESZ); parptr++) { c = *parptr; if (isalnum(c) || c == '.' || c == '-' || c == '_' || c == '[' || c == ']') *cp++ = c; else break; } *cp = '\0'; return result; } static void process(char *fname, int ofilen, int ofilec) { FILE *fp = NULL; struct mcomp *c1; if (fname) { fp = fopen(fname, "r"); if (fp == NULL) { advise(fname, "unable to open"); exitstat++; return; } } else { fname = "(stdin)"; fp = stdin; } SIGNAL(SIGINT, intrser); mhlfile(fp, fname, ofilen, ofilec); SIGNAL(SIGINT, SIG_IGN); if (fp != stdin) fclose(fp); if (holder.c_text) { mh_free0(&(holder.c_text)); } free_queue(&msghd, &msgtl); for (c1 = fmthd; c1; c1 = c1->c_next) c1->c_flags &= ~HDROUTPUT; } static boolean simplematch(char *pattern, char *b) { char *match = strrchr(pattern, '*'); char repl; boolean ret; /* check if pattern ends with a * and is not escaped witch a \ */ if (!match || match[1] || (match > pattern && match[-1] == '\\')) { if (!match || match[1]) { return mh_strcasecmp(pattern, b) == 0; } match[0] = '\0'; match[-1] = '*'; ret = mh_strcasecmp(pattern, b)==0; match[-1] = '\\'; match[0] = '*'; return ret; } repl = b[match-pattern]; b[match-pattern] = '\0'; *match = '\0'; ret = (mh_strcasecmp(pattern, b) == 0); b[match-pattern] = repl; *match = '*'; return ret; } static void mhlfile(FILE *fp, char *mname, int ofilen, int ofilec) { enum state state; struct field f = {{0}}; struct mcomp *c1, *c2, *c3; char **ip; if (forwall) { printf("\n-------"); if (ofilen == 1) { printf(" Forwarded Message%s", ofilec > 1 ? "s" : ""); } else { printf(" Message %d", ofilen); } printf("\n\n"); } else if (ofilec > 1) { if (ofilen > 1) { printf("\n\n\n"); } printf(">>> %s\n\n", mname); } for (state = FLD2; !eflag; ) { switch (state = m_getfld2(state, &f, fp)) { case FLD2: for (ip = ignores; *ip; ip++) if (simplematch(*ip, f.name)) { break; } if (*ip) { continue; } for (c2 = fmthd; c2; c2 = c2->c_next) if (mh_strcasecmp(c2->c_name, f.name)==0) { break; } c1 = NULL; if (!((c3 = c2 ? c2 : &global)->c_flags & SPLIT)) for (c1 = msghd; c1; c1 = c1->c_next) if (mh_strcasecmp(c1->c_name, c3->c_name)==0) { c1->c_text = mcomp_add(c1->c_flags, f.value, c1->c_text); break; } if (c1 == NULL) { c1 = add_queue(&msghd, &msgtl, f.name, f.value, 0); } if (c2 == NULL) { c1->c_flags |= EXTRA; } continue; case BODY2: case FILEEOF2: column = 0; for (c1 = fmthd; c1; c1 = c1->c_next) { if (c1->c_flags & CLEARTEXT) { putcomp(c1, c1, ONECOMP); continue; } if (mh_strcasecmp(c1->c_name, "messagename")==0) { holder.c_text = concat("(Message ", mname, ")\n", NULL); putcomp(c1, &holder, ONECOMP); mh_free0(&(holder.c_text)); continue; } if (mh_strcasecmp(c1->c_name, "extras")==0) { for (c2 = msghd; c2; c2 = c2->c_next) { if (c2->c_flags & EXTRA) { putcomp(c1, c2, TWOCOMP); } } continue; } if (dobody && mh_strcasecmp(c1->c_name, "body")==0) { holder.c_text = mh_xstrdup(f.value); while (state == BODY2) { putcomp(c1, &holder, BODYCOMP); state = m_getfld2(state, &f, fp); free(holder.c_text); holder.c_text = mh_xstrdup(f.value); } mh_free0(&(holder.c_text)); continue; } for (c2 = msghd; c2; c2 = c2->c_next) { if (mh_strcasecmp(c2->c_name, c1->c_name)==0) { putcomp(c1, c2, ONECOMP); if (!(c1->c_flags & SPLIT)) { break; } } } } return; case LENERR2: case FMTERR2: case IOERR2: advise(NULL, "format error in message %s", mname); exitstat++; return; default: adios(EX_SOFTWARE, NULL, "getfld() returned %d", state); } } } static int mcomp_flags(char *name) { struct pair *ap; for (ap = pairs; ap->p_name; ap++) if (!mh_strcasecmp(ap->p_name, name)) return (ap->p_flags); return 0; } static char * mcomp_add(long flags, char *s1, char *s2) { char *dp; if (!(flags & ADDRFMT)) return add(s1, s2); if (s2 && *(dp = s2 + strlen(s2) - 1) == '\n') *dp = 0; return add(s1, add(",\n", s2)); } struct pqpair { char *pq_text; char *pq_error; struct pqpair *pq_next; }; static void mcomp_format(struct mcomp *c1, struct mcomp *c2) { int dat[5]; char *ap, *cp; char buffer[BUFSIZ], error[BUFSIZ]; struct comp *cptr; struct pqpair *p, *q; struct pqpair pq; struct mailname *mp; ap = c2->c_text; c2->c_text = NULL; dat[0] = 0; dat[1] = 0; dat[2] = 0; dat[3] = sizeof(buffer) - 1; dat[4] = 0; fmt_compile(c1->c_fstr, &c1->c_fmt); if (!(c1->c_flags & ADDRFMT)) { FINDCOMP(cptr, "text"); if (cptr) cptr->c_text = ap; if ((cp = strrchr(ap, '\n'))) /* drop ending newline */ if (!cp[1]) *cp = 0; fmt_scan(c1->c_fmt, buffer, sizeof(buffer) - 1, dat); /* Don't need to append a newline, dctime() already did */ c2->c_text = mh_xstrdup(buffer); mh_free0(&ap); return; } (q = &pq)->pq_next = NULL; while ((cp = getname(ap))) { p = mh_xcalloc(1, sizeof(*p)); if ((mp = getm(cp, NULL, 0, AD_NAME, error)) == NULL) { p->pq_text = mh_xstrdup(cp); p->pq_error = mh_xstrdup(error); } else { p->pq_text = mh_xstrdup(mp->m_text); mnfree(mp); } q = (q->pq_next = p); } for (p = pq.pq_next; p; p = q) { FINDCOMP(cptr, "text"); if (cptr) cptr->c_text = p->pq_text; FINDCOMP(cptr, "error"); if (cptr) cptr->c_text = p->pq_error; fmt_scan(c1->c_fmt, buffer, sizeof(buffer) - 1, dat); if (*buffer) { if (c2->c_text) c2->c_text = add(",\n", c2->c_text); if (*(cp = buffer + strlen(buffer) - 1) == '\n') *cp = 0; c2->c_text = add(buffer, c2->c_text); } mh_free0(&(p->pq_text)); if (p->pq_error) mh_free0(&(p->pq_error)); q = p->pq_next; mh_free0(&p); } c2->c_text = add("\n", c2->c_text); free (ap); } static struct mcomp * add_queue(struct mcomp **head, struct mcomp **tail, char *name, char *text, int flags) { struct mcomp *c1; c1 = mh_xcalloc(1, sizeof(*c1)); c1->c_flags = flags & ~INIT; if ((c1->c_name = name ? mh_xstrdup(name) : NULL)) c1->c_flags |= mcomp_flags(c1->c_name); c1->c_text = text ? mh_xstrdup(text) : NULL; if (flags & INIT) { if (global.c_ovtxt) c1->c_ovtxt = mh_xstrdup(global.c_ovtxt); c1->c_offset = global.c_offset; c1->c_ovoff = global. c_ovoff; c1->c_width = 0; c1->c_cwidth = global.c_cwidth; c1->c_flags |= global.c_flags & GFLAGS; } if (*head == NULL) *head = c1; if (*tail != NULL) (*tail)->c_next = c1; *tail = c1; return c1; } static void free_queue(struct mcomp **head, struct mcomp **tail) { struct mcomp *c1, *c2; for (c1 = *head; c1; c1 = c2) { c2 = c1->c_next; if (c1->c_name) mh_free0(&(c1->c_name)); if (c1->c_text) mh_free0(&(c1->c_text)); if (c1->c_ovtxt) mh_free0(&(c1->c_ovtxt)); if (c1->c_fstr) mh_free0(&(c1->c_fstr)); if (c1->c_fmt) mh_free0(&(c1->c_fmt)); mh_free0(&c1); } *head = *tail = NULL; } static void putcomp(struct mcomp *c1, struct mcomp *c2, int flag) { int count, cchdr; unsigned char *cp; char trimmed_prefix[BUFSIZ]; strncpy(trimmed_prefix, c1->c_text ? c1->c_text : c1->c_name, sizeof(trimmed_prefix) - 1); rtrim(trimmed_prefix); cchdr = 0; lm = 0; wid = c1->c_width ? c1->c_width : global.c_width; ovoff = (c1->c_ovoff >= 0 ? c1->c_ovoff : global.c_ovoff) + c1->c_offset; if ((ovtxt = c1->c_ovtxt ? c1->c_ovtxt : global.c_ovtxt) == NULL) ovtxt = ""; if (wid < ovoff + strlen(ovtxt) + 5) adios(EX_SOFTWARE, NULL, "component: %s width(%d) too small for overflow(%d)", c1->c_name, wid, ovoff + strlen(ovtxt) + 5); onelp = NULL; if (c1->c_flags & CLEARTEXT) { putstr((c1->c_flags & RTRIM) ? rtrim(c1->c_text) : c1->c_text); putstr("\n"); return; } if (c1->c_flags & RAW) { switch (flag) { case ONECOMP: printf("%s:%s", c1->c_name, c1->c_text); break; case TWOCOMP: printf("%s:%s", c2->c_name, c2->c_text); break; case BODYCOMP: fputs(c2->c_text, stdout); break; default: adios(EX_SOFTWARE, NULL, "BUG: putcomp() is called with a unknown flag"); } return; } if (c1->c_fstr && (c1->c_flags & (ADDRFMT | DATEFMT | FORMAT))) mcomp_format(c1, c2); if (c1->c_flags & CENTER) { count = (c1->c_width ? c1->c_width : global.c_width) - c1->c_offset - strlen(c2->c_text); if (!(c1->c_flags & HDROUTPUT) && !(c1->c_flags & NOCOMPONENT)) count -= strlen(c1->c_text ? c1->c_text : c1->c_name) + 2; lm = c1->c_offset + (count / 2); } else { if (c1->c_offset) lm = c1->c_offset; } if (!(c1->c_flags & HDROUTPUT) && !(c1->c_flags & NOCOMPONENT)) { if (c1->c_flags & UPPERCASE) /* uppercase component also */ for (cp = (c1->c_text ? c1->c_text : c1->c_name); *cp; cp++) if (islower(*cp)) *cp = toupper(*cp); if (*c2->c_text && *c2->c_text != '\n' && *c2->c_text != '\r') { putstr(c1->c_text ? c1->c_text : c1->c_name); } else { putstr(trimmed_prefix); } if (flag != BODYCOMP) { putstr(": "); if (!(c1->c_flags & SPLIT)) c1->c_flags |= HDROUTPUT; cchdr++; if ((count = c1->c_cwidth - strlen(c1->c_text ? c1->c_text : c1->c_name) - 2) > 0) while (count--) putstr(" "); } else c1->c_flags |= HDROUTPUT; /* for BODYCOMP */ } if (flag == TWOCOMP && !(c2->c_flags & HDROUTPUT) && !(c2->c_flags & NOCOMPONENT)) { if (c1->c_flags & UPPERCASE) for (cp = c2->c_name; *cp; cp++) if (islower(*cp)) *cp = toupper(*cp); putstr(c2->c_name); putstr(": "); if (!(c1->c_flags & SPLIT)) c2->c_flags |= HDROUTPUT; cchdr++; if ((count = c1->c_cwidth - strlen(c2->c_name) - 2) > 0) while (count--) putstr(" "); } if (c1->c_flags & UPPERCASE) for (cp = c2->c_text; *cp; cp++) if (islower(*cp)) *cp = toupper(*cp); count = 0; if (cchdr) { if (flag == TWOCOMP) count = (c1->c_cwidth >= 0) ? c1->c_cwidth : (int)strlen(c2->c_name) + 2; else count = (c1->c_cwidth >= 0) ? (size_t)c1->c_cwidth : strlen(c1->c_text ? c1->c_text : c1->c_name) + 2; } count += c1->c_offset; if ((cp = oneline(c2->c_text, c1->c_flags))) { putstr((c1->c_flags & RTRIM) ? rtrim(cp) : cp); } if (term == '\n') putstr("\n"); while ((cp = oneline(c2->c_text, c1->c_flags))) { lm = count; if (flag == BODYCOMP && !(c1->c_flags & NOCOMPONENT)) { if (*cp) { putstr(c1->c_text ? c1->c_text : c1->c_name); } else { putstr(trimmed_prefix); } } if (*cp) putstr((c1->c_flags & RTRIM) ? rtrim(cp) : cp); if (term == '\n') putstr("\n"); } if (flag == BODYCOMP && term == '\n') c1->c_flags &= ~HDROUTPUT; /* Buffer ended on a newline */ } static char * oneline(char *stuff, long flags) { int spc; char *cp, *ret; if (onelp == NULL) onelp = stuff; if (*onelp == 0) return (onelp = NULL); ret = onelp; term = 0; if (flags & COMPRESS) { for (spc = 1, cp = ret; *onelp; onelp++) if (isspace(*onelp)) { if (*onelp == '\n' && (!onelp[1] || (flags & ADDRFMT))) { term = '\n'; *onelp++ = 0; break; } else if (!spc) { *cp++ = ' '; spc++; } } else { *cp++ = *onelp; spc = 0; } *cp = 0; } else { while (*onelp && *onelp != '\n') onelp++; if (*onelp == '\n') { term = '\n'; *onelp++ = 0; } if (flags & LEFTADJUST) while (*ret == ' ' || *ret == '\t') ret++; } if (*onelp == 0 && term == '\n' && (flags & NONEWLINE)) term = 0; return ret; } static void putstr(char *string) { if (!column && lm > 0) { while (lm > 0) if (lm >= 8) { putch('\t'); lm -= 8; } else { putch(' '); lm--; } } lm = 0; while (*string) putch(*string++); } static void putch(char ch) { switch (ch) { case '\t': column |= 07; column++; break; case '\b': column--; break; case '\n': case '\r': column = 0; break; default: /* ** If we are forwarding this message, and the first ** column contains a dash, then add a dash and a space. */ if (column == 0 && forwflg && ch == '-') { putchar('-'); putchar(' '); } if (ch >= ' ') column++; break; } if (column >= wid) { putch('\n'); if (ovoff > 0) lm = ovoff; putstr(ovtxt ? ovtxt : ""); putch(ch); return; } putchar(ch); } static void intrser(int i) { eflag = 1; } mmh-0.4/uip/slocal.c0000644000000000000000000006422113414435726013070 0ustar rootroot/* ** slocal.c -- asynchronously filter and deliver new mail ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ /* ** Under sendmail, users should add the line ** ** "| /usr/local/mmh/bin/slocal" ** ** to their $HOME/.forward file. ** */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef INITGROUPS_HEADER #include INITGROUPS_HEADER #else /* ** On AIX 4.1, initgroups() is defined and even documented (giving the ** parameter types as char* and int), but doesn't have a prototype in any ** of the system header files. AIX 4.3, SunOS 4.1.3, and ULTRIX 4.2A have ** the same problem. */ extern int initgroups(char*, int); #endif static struct swit switches[] = { #define ADDRSW 0 { "addr address", 0 }, #define USERSW 1 { "user name", 0 }, #define FILESW 2 { "file file", 0 }, #define SENDERSW 3 { "sender address", 0 }, #define MAILBOXSW 4 { "mailbox file", 0 }, #define HOMESW 5 { "home directory", -4 }, #define INFOSW 6 { "info data", 0 }, #define MAILSW 7 { "maildelivery file", 0 }, #define VERBSW 8 { "verbose", 0 }, #define NVERBSW 9 { "noverbose", 2 }, #define DEBUGSW 10 { "debug", 0 }, #define VERSIONSW 11 { "Version", 0 }, #define HELPSW 12 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; static int globbed = 0; /* have we built "vars" table yet? */ static int parsed = 0; /* have we built header field table yet */ static int verbose = 0; static int debug = 0; static char *addr = NULL; static char *user = NULL; static char *info = NULL; static char *file = NULL; static char *sender = NULL; static char *envelope = NULL; /* envelope information ("From " line) */ static char *mbox = NULL; static char *home = NULL; static struct passwd *pw; /* passwd file entry */ static char ddate[BUFSIZ]; /* record the delivery date */ struct tws *now; volatile sig_atomic_t eflag = 0; /* flag to indecate interrupt */ static volatile pid_t child_id; /* flags for pair->p_flags */ #define P_NIL 0x00 #define P_ADR 0x01 /* field is address */ #define P_HID 0x02 /* special (fake) field */ #define P_CHK 0x04 struct pair { char *p_name; char *p_value; char p_flags; }; #define NVEC 100 /* ** Lookup table for matching fields and patterns ** in messages. The rest of the table is added ** when the message is parsed. */ static struct pair hdrs[NVEC + 1] = { { "source", NULL, P_HID }, { "addr", NULL, P_HID }, { "Return-Path", NULL, P_ADR }, { "Reply-To", NULL, P_ADR }, { "From", NULL, P_ADR }, { "Sender", NULL, P_ADR }, { "To", NULL, P_ADR }, { "cc", NULL, P_ADR }, { "Resent-Reply-To", NULL, P_ADR }, { "Resent-From", NULL, P_ADR }, { "Resent-Sender", NULL, P_ADR }, { "Resent-To", NULL, P_ADR }, { "Resent-Cc", NULL, P_ADR }, { NULL, NULL, 0 } }; /* ** The list of builtin variables to expand in a string ** before it is executed by the "pipe" or "qpipe" action. */ static struct pair vars[] = { { "sender", NULL, P_NIL }, { "address", NULL, P_NIL }, { "size", NULL, P_NIL }, { "reply-to", NULL, P_CHK }, { "info", NULL, P_NIL }, { NULL, NULL, 0 } }; extern char **environ; /* ** static prototypes */ static int localmail(int, char *); static int usr_delivery(int, char *, int); static int split(char *, char **); static int parse(int); static void expand(char *, char *, int); static void glob(int); static struct pair *lookup(struct pair *, char *); static int usr_file(int, char *); static int usr_pipe(int, char *, char *, char **, int); static int usr_folder(int, char *); static void alrmser(int); static void get_sender(char *, char **); static int copy_message(int, char *, int); static void verbose_printf(char *fmt, ...); static void adorn(char *, char *, ...); static void debug_printf(char *fmt, ...); static char *trimstr(char *); int main(int argc, char **argv) { int fd, status; FILE *fp = stdin; char *cp, *mdlvr = NULL, buf[BUFSIZ]; char mailbox[BUFSIZ], tmpfil[BUFSIZ]; char **argp, **arguments; setlocale(LC_ALL, ""); invo_name = mhbasename(*argv); arguments = getarguments(invo_name, argc, argv, 0); argp = arguments; /* Parse arguments */ while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [switches] [address info sender]", invo_name); print_help(buf, switches, 0); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case ADDRSW: if (!(addr = *argp++)) { /* allow -xyz arguments */ adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case INFOSW: if (!(info = *argp++)) { /* allow -xyz arguments */ adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case USERSW: if (!(user = *argp++)) { /* allow -xyz arguments */ adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case FILESW: if (!(file = *argp++) || *file == '-') { adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case SENDERSW: if (!(sender = *argp++)) { /* allow -xyz arguments */ adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case MAILBOXSW: if (!(mbox = *argp++) || *mbox == '-') { adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case HOMESW: if (!(home = *argp++) || *home == '-') { adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } continue; case MAILSW: if (!(cp = *argp++) || *cp == '-') { adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } if (mdlvr) { adios(EX_USAGE, NULL, "only one maildelivery file at a time!"); } mdlvr = cp; continue; case VERBSW: verbose++; continue; case NVERBSW: verbose = 0; continue; case DEBUGSW: debug++; continue; } } switch (argp - (argv + 1)) { case 1: addr = cp; break; case 2: info = cp; break; case 3: sender = cp; break; } } if (!addr) { addr = getusername(); } if (!user) { user = (cp = strchr(addr, '.')) ? ++cp : addr; } if (!(pw = getpwnam(user))) { adios(EX_NOUSER, NULL, "no such local user as %s", user); } if (chdir(pw->pw_dir) == -1) { chdir("/"); } umask(0077); if (geteuid() == 0) { setgid(pw->pw_gid); initgroups(pw->pw_name, pw->pw_gid); setuid(pw->pw_uid); } if (!info) { info = ""; } setbuf(stdin, NULL); /* Record the delivery time */ if (!(now = dlocaltimenow())) { adios(EX_OSERR, NULL, "unable to ascertain local time"); } snprintf(ddate, sizeof(ddate), "Delivery-Date: %s\n", dtimenow()); /* ** Copy the message to a temporary file */ if (file) { int tempfd; /* getting message from file */ if ((tempfd = open(file, O_RDONLY)) == -1) { adios(EX_IOERR, file, "unable to open"); } if (debug) { debug_printf("retrieving message from file \"%s\"\n", file); } if ((fd = copy_message(tempfd, tmpfil, 1)) == -1) { adios(EX_CANTCREAT, NULL, "unable to create temporary file"); } close(tempfd); } else { /* getting message from stdin */ if (debug) { debug_printf("retrieving message from stdin\n"); } if ((fd = copy_message(fileno(stdin), tmpfil, 1)) == -1) { adios(EX_CANTCREAT, NULL, "unable to create temporary file"); } } if (debug) { debug_printf("temporary file=\"%s\"\n", tmpfil); } /* ** Delete the temp file now or a copy of every single message ** passed through slocal will be left in the /tmp directory until ** deleted manually! This unlink() used to be under an 'else' ** of the 'if (debug)' above, but since some people like to ** always run slocal with -debug and log the results, the /tmp ** directory would get choked over time. Of course, now that ** we always delete the temp file, the "temporary file=" message ** above is somewhat pointless -- someone watching debug output ** wouldn't have a chance to 'tail -f' or 'ln' the temp file ** before it's unlinked. The best thing would be to delay this ** unlink() until later if debug == 1, but I'll leave that for ** someone who cares about the temp-file-accessing functionality ** (they'll have to watch out for cases where we adios()). */ unlink(tmpfil); if (!(fp = fdopen(fd, "r+"))) { adios(EX_IOERR, NULL, "unable to access temporary file"); } /* If no sender given, extract it from envelope information. */ if (!sender) { get_sender(envelope, &sender); } if (!mbox) { snprintf(mailbox, sizeof(mailbox), "%s/%s", mailspool, pw->pw_name); mbox = mailbox; } if (!home) { home = pw->pw_dir; } if (debug) { debug_printf("addr=\"%s\"\n", trimstr(addr)); debug_printf("user=\"%s\"\n", trimstr(user)); debug_printf("info=\"%s\"\n", trimstr(info)); debug_printf("sender=\"%s\"\n", trimstr(sender)); debug_printf("envelope=\"%s\"\n", envelope ? trimstr(envelope) : ""); debug_printf("mbox=\"%s\"\n", trimstr(mbox)); debug_printf("home=\"%s\"\n", trimstr(home)); debug_printf("ddate=\"%s\"\n", trimstr(ddate)); debug_printf("now=%02d:%02d\n\n", now->tw_hour, now->tw_min); } /* deliver the message */ status = localmail(fd, mdlvr); return (status != -1 ? RCV_MOK : RCV_MBX); } /* ** Main routine for delivering message. */ static int localmail(int fd, char *mdlvr) { char buf[BUFSIZ]; /* delivery according to personal Maildelivery file */ if (usr_delivery(fd, mdlvr ? mdlvr : ".maildelivery", 0) != -1) { return 0; } /* delivery according to global Maildelivery file */ snprintf(buf, sizeof buf, "%s/%s", mhetcdir, "maildelivery"); if (usr_delivery(fd, buf, 1) != -1) { return 0; } if (verbose) { verbose_printf("(delivering to standard mail spool)\n"); } /* last resort - deliver to standard mail spool */ return usr_file(fd, mbox); } #define matches(a,b) (stringdex(b, a) >= 0) /* ** Parse the delivery file, and process incoming message. */ static int usr_delivery(int fd, char *delivery, int su) { int i, accept, status=1, won, vecp, next; char *field, *pattern, *action, *result, *string; char buffer[BUFSIZ], tmpbuf[BUFSIZ]; char *cp, *vec[NVEC]; struct stat st; struct pair *p; FILE *fp; /* open the delivery file */ if (!(fp = fopen(delivery, "r"))) { return -1; } /* check if delivery file has bad ownership or permissions */ if (fstat(fileno(fp), &st) == -1 || (st.st_uid != 0 && (su || st.st_uid != pw->pw_uid)) || st.st_mode & (S_IWGRP|S_IWOTH)) { if (verbose) { verbose_printf("WARNING: %s has bad ownership/modes (su=%d,uid=%d,owner=%d,mode=0%o)\n", delivery, su, (int) pw->pw_uid, (int) st.st_uid, (int) st.st_mode); } return -1; } won = 0; next = 1; /* read and process delivery file */ while (fgets(buffer, sizeof(buffer), fp)) { /* skip comments and empty lines */ if (*buffer == '#' || *buffer == '\n') { continue; } /* zap trailing newline */ if ((cp = strchr(buffer, '\n'))) { *cp = '\0'; } /* split buffer into fields */ vecp = split(buffer, vec); /* check for too few fields */ if (vecp < 5) { if (debug) debug_printf("WARNING: entry with only %d fields, skipping.\n", vecp); continue; } if (debug) { for (i = 0; vec[i]; i++) { debug_printf("vec[%d]: \"%s\"\n", i, trimstr(vec[i])); } } field = vec[0]; pattern = vec[1]; action = vec[2]; result = vec[3]; string = vec[4]; /* find out how to perform the action */ switch (result[0]) { case 'N': case 'n': /* ** If previous condition failed, don't ** do this - else fall through */ if (!next) { continue; } /* fall */ case '?': /* ** If already delivered, skip this action. ** Else consider delivered if action is ** successful. */ if (won) { continue; } /* fall */ case 'A': case 'a': /* ** Take action, and consider delivered if ** action is successful. */ accept = 1; break; case 'R': case 'r': default: /* ** Take action, but don't consider delivered, ** even if action is successful */ accept = 0; break; } /* check if the field matches */ switch (*field) { case '*': /* always matches */ break; case 'd': /* ** "default" matches only if the message hasn't ** been delivered yet. */ if (mh_strcasecmp(field, "default")==0) { if (won) { continue; } break; } /* fall */ default: /* parse message and build lookup table */ if (!parsed && parse(fd) == -1) { fclose(fp); return -1; } /* ** find header field in lookup table, and ** see if the pattern matches. */ if ((p = lookup(hdrs, field)) && p->p_value && matches(p->p_value, pattern)) { next = 1; } else { next = 0; continue; } break; } /* find out the action to perform */ switch (*action) { case 'q': /* deliver to quoted pipe */ if (mh_strcasecmp(action, "qpipe")) { continue; } /* fall */ case '^': expand(tmpbuf, string, fd); if (split(tmpbuf, vec) < 1) { continue; } status = usr_pipe(fd, tmpbuf, vec[0], vec, 0); break; case 'p': /* deliver to pipe */ if (mh_strcasecmp(action, "pipe")) { continue; } /* fall */ case '|': vec[2] = "sh"; vec[3] = "-c"; expand(tmpbuf, string, fd); vec[4] = tmpbuf; vec[5] = NULL; status = usr_pipe(fd, tmpbuf, "/bin/sh", vec+2, 0); break; case 'f': if (mh_strcasecmp(action, "file")==0) { /* mbox format */ status = usr_file(fd, string); break; } if (mh_strcasecmp(action, "folder")!=0) { continue; } /* fall */ case '+': /* deliver to nmh folder */ status = usr_folder(fd, string); break; case 'm': /* mbox format */ if (mh_strcasecmp(action, "mbox")!=0) { continue; } /* fall */ case '>': /* mbox format */ status = usr_file(fd, string); break; case 'd': /* ignore message */ if (mh_strcasecmp(action, "destroy")!=0) { continue; } status = 0; break; } if (status) { next = 0; /* action failed, mark for 'N' result */ } else if (accept) { won++; } } fclose(fp); return (won ? 0 : -1); } /* ** Split buffer into fields (delimited by whitespace or ** comma's). Return the number of fields found. */ static int split(char *cp, char **vec) { int i; unsigned char *s; s = cp; /* split into a maximum of NVEC fields */ for (i = 0; i <= NVEC;) { vec[i] = NULL; /* zap any whitespace and comma's */ while (isspace(*s) || *s == ',') { *s++ = '\0'; } /* end of buffer, time to leave */ if (!*s) { break; } /* get double quote text as a single field */ if (*s == '"') { for (vec[i++] = ++s; *s && *s != '"'; s++) { /* ** Check for escaped double quote. We need ** to shift the string to remove slash. */ if (*s == '\\') { if (*++s == '"') { strcpy(s - 1, s); } s--; } } if (*s == '"') { /* zap trailing double quote */ *s++ = '\0'; } continue; } if (*s == '\\' && *++s != '"') { s--; } vec[i++] = s++; /* move forward to next field delimiter */ while (*s && !isspace(*s) && *s != ',') { s++; } } vec[i] = NULL; return i; } /* ** Parse the headers of a message, and build the ** lookup table for matching fields and patterns. */ static int parse(int fd) { enum state state; struct field f = {{0}}; int i, fd1; char *cp, *dp, *lp; struct pair *p, *q; FILE *in; if (parsed++) { return 0; } /* get a new FILE pointer to message */ if ((fd1 = dup(fd)) == -1) { return -1; } if (!(in = fdopen(fd1, "r"))) { close(fd1); return -1; } rewind(in); /* add special entries to lookup table */ if ((p = lookup(hdrs, "source"))) { p->p_value = mh_xstrdup(sender); } if ((p = lookup(hdrs, "addr"))) { p->p_value = mh_xstrdup(addr); } /* ** Scan the headers of the message and build a lookup table. */ for (i = 0, state = FLD2;;) { switch (state = m_getfld2(state, &f, in)) { case LENERR2: state = FLD2; /* FALL */ case FLD2: lp = mh_xstrdup(f.value); for (p = hdrs; p->p_name; p++) { if (mh_strcasecmp(p->p_name, f.name) == 0) { if (!(p->p_flags & P_HID)) { if ((cp = p->p_value)) { if (p->p_flags & P_ADR) { dp = cp + strlen(cp) - 1; if (*dp == '\n') { *dp = '\0'; } cp = add(",\n\t", cp); } else { cp = add("\t", cp); } } p->p_value = add(lp, cp); } mh_free0(&lp); break; } } if (!p->p_name && i < NVEC) { p->p_name = mh_xstrdup(f.name); p->p_value = lp; p->p_flags = P_NIL; p++, i++; p->p_name = NULL; } continue; case BODY2: case FILEEOF2: break; case FMTERR2: case IOERR2: advise(NULL, "format error in message"); break; default: advise(NULL, "internal error in m_getfld"); fclose(in); return -1; } break; } fclose(in); if ((p = lookup(vars, "reply-to"))) { if (!(q = lookup(hdrs, "reply-to")) || !q->p_value) { q = lookup(hdrs, "from"); } p->p_value = mh_xstrdup(q ? q->p_value : ""); p->p_flags &= ~P_CHK; if (debug) { debug_printf("vars[%d]: name=\"%s\" value=\"%s\"\n", p - vars, p->p_name, trimstr(p->p_value)); } } if (debug) { for (p = hdrs; p->p_name; p++) { debug_printf("hdrs[%d]: name=\"%s\" value=\"%s\"\n", p - hdrs, p->p_name, p->p_value ? trimstr(p->p_value) : ""); } } return 0; } /* ** Expand any builtin variables such as $(sender), ** $(address), etc., in a string. */ static void expand(char *s1, char *s2, int fd) { char c, *cp; struct pair *p; if (!globbed) { glob(fd); } while ((c = *s2++)) { if (c != '$' || *s2 != '(') { *s1++ = c; } else { for (cp = ++s2; *s2 && *s2 != ')'; s2++) { continue; } if (*s2 != ')') { s2 = --cp; continue; } *s2++ = '\0'; if ((p = lookup(vars, cp))) { if (!parsed && (p->p_flags & P_CHK)) { parse(fd); } strcpy(s1, p->p_value); s1 += strlen(s1); } } } *s1 = '\0'; } /* ** Fill in the information missing from the "vars" ** table, which is necessary to expand any builtin ** variables in the string for a "pipe" or "qpipe" ** action. */ static void glob(int fd) { char buffer[BUFSIZ]; struct stat st; struct pair *p; if (globbed++) { return; } if ((p = lookup(vars, "sender"))) { p->p_value = mh_xstrdup(sender); } if ((p = lookup(vars, "address"))) { p->p_value = mh_xstrdup(addr); } if ((p = lookup(vars, "size"))) { snprintf(buffer, sizeof(buffer), "%d", fstat(fd, &st) != -1 ? (int) st.st_size : 0); p->p_value = mh_xstrdup(buffer); } if ((p = lookup(vars, "info"))) { p->p_value = mh_xstrdup(info); } if (debug) { for (p = vars; p->p_name; p++) { debug_printf("vars[%d]: name=\"%s\" value=\"%s\"\n", p - vars, p->p_name, trimstr(p->p_value)); } } } /* ** Find a matching name in a lookup table. If found, ** return the "pairs" entry, else return NULL. */ static struct pair * lookup(struct pair *pairs, char *key) { for (; pairs->p_name; pairs++) { if (!mh_strcasecmp(pairs->p_name, key)) { return pairs; } } return NULL; } /* ** Deliver message by appending to a file, using rcvpack(1). */ static int usr_file(int fd, char *mailbox) { char *vec[3]; if (verbose) { verbose_printf("delivering to file \"%s\" (mbox style)", mailbox); } vec[0] = "rcvpack"; vec[1] = mailbox; vec[2] = NULL; return usr_pipe(fd, "rcvpack", "rcvpack", vec, 1); } /* ** Deliver message to a nmh folder, using rcvstore(1). */ static int usr_folder(int fd, char *string) { char folder[BUFSIZ], *vec[3]; /* get folder name ready */ if (*string == '+') { strncpy(folder, string, sizeof(folder)); }else { snprintf(folder, sizeof(folder), "+%s", string); } if (verbose) { verbose_printf("delivering to folder \"%s\"", folder + 1); } vec[0] = "rcvstore"; vec[1] = folder; vec[2] = NULL; return usr_pipe(fd, "rcvstore", "rcvstore", vec, 1); } /* ** Deliver message to a process. */ static int usr_pipe(int fd, char *cmd, char *pgm, char **vec, int suppress) { int bytes, seconds, status, n; struct stat st; char *path; if (verbose && !suppress) { verbose_printf("delivering to pipe \"%s\"", cmd); } lseek(fd, (off_t) 0, SEEK_SET); switch ((child_id = fork())) { case -1: /* fork error */ if (verbose) { adorn("fork", "unable to"); } return -1; case 0: /* child process */ if (fd != 0) { dup2(fd, 0); } freopen("/dev/null", "w", stdout); freopen("/dev/null", "w", stderr); if (fd != 3) { dup2(fd, 3); } for (n=4; npw_name); m_putenv("HOME", pw->pw_dir); m_putenv("SHELL", pw->pw_shell); m_putenv("PATH", path); execvp(pgm, vec); _exit(EX_OSERR); default: /* parent process */ SIGNAL(SIGALRM, alrmser); bytes = fstat(fd, &st) != -1 ? (int) st.st_size : 100; /* amount of time to wait depends on message size */ if (bytes <= 100) { /* give at least 5 minutes */ seconds = 300; } else if (bytes >= 90000) { /* a half hour is long enough */ seconds = 1800; } else { seconds = (bytes / 60) + 300; } alarm((unsigned int) seconds); status = pidwait(child_id, 0); alarm(0); if (eflag) { if (verbose) { verbose_printf(", timed-out; terminated\n"); } return -1; } if (verbose) { if (!status) { verbose_printf(", success.\n"); } else if ((status & 0xff00) == 0xff00) { verbose_printf(", system error\n"); } else { pidstatus(status, stdout, ", failed"); } } return (status == 0 ? 0 : -1); } } static void alrmser(int i) { eflag = 1; kill(-child_id, SIGKILL); } /* ** Get the `sender' from the envelope ** information ("From " line). */ static void get_sender(char *envelope, char **sender) { int i; unsigned char *cp; unsigned char buffer[BUFSIZ]; if (!envelope) { *sender = mh_xstrdup(""); return; } i = strlen("From "); strncpy(buffer, envelope + i, sizeof(buffer)); buffer[sizeof buffer -1] = '\0'; /* ensure termination */ if ((cp = strchr(buffer, '\n'))) { *cp = '\0'; cp -= 24; if (cp < buffer) { cp = buffer; } } else { cp = buffer; } *cp = '\0'; for (cp = buffer + strlen(buffer) - 1; cp >= buffer; cp--) if (isspace(*cp)) { *cp = '\0'; } else { break; } *sender = mh_xstrdup(buffer); } /* ** Copy message into a temporary file. ** While copying, it will do some header processing ** including the extraction of the envelope information. */ static int copy_message(int qd, char *tmpfil, int fold) { int i, first = 1, fd1, fd2; char buffer[BUFSIZ]; FILE *qfp, *ffp; char *tfile = NULL; tfile = m_mktemp2("/tmp/", invo_name, &fd1, NULL); if (tfile == NULL) return -1; fchmod(fd1, 0600); strncpy(tmpfil, tfile, BUFSIZ); if (!fold) { while ((i = read(qd, buffer, sizeof(buffer))) > 0) { if (write(fd1, buffer, i) != i) { you_lose: close(fd1); unlink(tmpfil); return -1; } } if (i == -1) { goto you_lose; } lseek(fd1, (off_t) 0, SEEK_SET); return fd1; } /* dup the fd for incoming message */ if ((fd2 = dup(qd)) == -1) { close(fd1); return -1; } /* now create a FILE pointer for it */ if (!(qfp = fdopen(fd2, "r"))) { close(fd1); close(fd2); return -1; } /* dup the fd for temporary file */ if ((fd2 = dup(fd1)) == -1) { close(fd1); fclose(qfp); return -1; } /* now create a FILE pointer for it */ if (!(ffp = fdopen(fd2, "r+"))) { close(fd1); close(fd2); fclose(qfp); return -1; } /* ** copy message into temporary file ** and massage the headers. Save ** a copy of the "From " line for later. */ i = strlen("From "); while (fgets(buffer, sizeof(buffer), qfp)) { if (first) { first = 0; if (strncmp(buffer, "From ", i)==0) { /* ** get copy of envelope information ** ("From " line) */ envelope = mh_xstrdup(buffer); /* Put the delivery date in message */ fputs(ddate, ffp); if (ferror(ffp)) { goto fputs_error; } continue; } } fputs(buffer, ffp); if (ferror(ffp)) { goto fputs_error; } } fclose(ffp); if (ferror(qfp)) { close(fd1); fclose(qfp); return -1; } fclose(qfp); lseek(fd1, (off_t) 0, SEEK_SET); return fd1; fputs_error: close(fd1); fclose(ffp); fclose(qfp); return -1; } /* ** Trim strings for pretty printing of debugging output */ static char * trimstr(char *cp) { char buffer[BUFSIZ*4]; unsigned char *bp, *sp; if (!cp) { return NULL; } /* copy string into temp buffer */ strncpy(buffer, cp, sizeof(buffer)); bp = buffer; /* skip over leading whitespace */ while (isspace(*bp)) { bp++; } /* start at the end and zap trailing whitespace */ for (sp = bp + strlen(bp) - 1; sp >= bp; sp--) { if (isspace(*sp)) { *sp = '\0'; } else { break; } } /* replace remaining whitespace with spaces */ for (sp = bp; *sp; sp++) { if (isspace(*sp)) { *sp = ' '; } } return mh_xstrdup(bp); } /* ** Function for printing `verbose' messages. */ static void verbose_printf(char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stdout, fmt, ap); va_end(ap); fflush(stdout); } /* ** Function for printing `verbose' delivery ** error messages. */ static void adorn(char *what, char *fmt, ...) { va_list ap; int eindex; char *s; eindex = errno; /* save the errno */ fprintf(stdout, ", "); va_start(ap, fmt); vfprintf(stdout, fmt, ap); va_end(ap); if (what) { if (*what) { fprintf(stdout, " %s: ", what); } if ((s = strerror(eindex))) { fprintf(stdout, "%s", s); } else { fprintf(stdout, "Error %d", eindex); } } fputc('\n', stdout); fflush(stdout); } /* ** Function for printing `debug' messages. */ static void debug_printf(char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); } mmh-0.4/uip/whom.c0000644000000000000000000001721613414435726012567 0ustar rootroot/* ** whom.c -- list recipients of message ** ** This code is Copyright (c) 2012, by the authors of mmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include static struct swit switches[] = { #define VERSIONSW 0 { "Version", 0 }, #define HELPSW 1 { "help", 0 }, #define TOCCSW 2 { "tocc", 0 }, #define NTOCCSW 3 { "notocc", 2 }, #define DCCSW 4 { "dcc", 0 }, #define NDCCSW 5 { "nodcc", 2 }, #define BCCSW 6 { "bcc", 0 }, #define NBCCSW 7 { "nobcc", 2 }, #define ALISW 8 { "alias", 0 }, #define NALISW 9 { "noalias", 2 }, { NULL, 0 } }; char *version=VERSION; #define NFILES 32 #define HRESENT (1<<1) #define HTO (1<<2) #define HCC (1<<3) #define HDCC (1<<4) #define HBCC (1<<5) struct mailname head = {0}; struct mailname *mp = &head; static char *cmd; static int resent = 0; /* consider normal or resent headers */ static int toccsw = 1; /* list sighted recipients */ static int dccsw = 1; /* list hidden dcc recipients */ static int bccsw = 1; /* list hidden bcc recipients */ static int alisw = 1; /* expand aliases on rcpt addrs */ static char *dccsep = "\t==DCC=="; static char *bccsep = "\t==BCC=="; /* ** static prototypes */ static int process(char *); static void proc_hdr(char *, char *); static int print(void); static int printdcc(void); static int printbcc(void); static void printone(struct mailname *); int main(int argc, char **argv) { int naddrs=0, n; char *cp; char buf[BUFSIZ], **argp; char **arguments; char *folder = NULL; FILE *in; struct msgs_array msgs = {0}; struct msgs_array files = {0}; size_t filep; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [switches] file ...", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case TOCCSW: toccsw = 1; continue; case NTOCCSW: toccsw = 0; continue; case DCCSW: dccsw = 1; continue; case NDCCSW: dccsw = 0; continue; case BCCSW: bccsw = 1; continue; case NBCCSW: bccsw = 0; continue; case ALISW: alisw = 1; continue; case NALISW: alisw = 0; continue; } } if (*cp == '+' || *cp == '@') { if (folder) { adios(EX_USAGE, NULL, "only one folder at a time!"); } else { folder = mh_xstrdup(expandfol(cp)); } } else { app_msgarg(&msgs, cp); } } if (!msgs.size) { adios(EX_USAGE, NULL, "usage: %s [switches] file ...", invo_name); } if (!toccsw && !dccsw && !bccsw) { adios(EX_USAGE, NULL, "use at least one of: -tocc -dcc -bcc"); } if (parse_msgs(&msgs, folder, &files) < 0) { exit(EX_IOERR); } for (filep = 0; filep < files.size; filep++) { process(files.msgs[filep]); } cmd = add("ali -list", NULL); if ((n=print()) && alisw) { if (!(in = popen(cmd, "r"))) { adios(EX_IOERR, "popen", "unable to"); } while (fgets(buf, sizeof buf, in)) { fputs(buf, stdout); } pclose(in); } mh_free0(&cmd); naddrs += n; cmd = add("ali -list", NULL); if ((n=printdcc()) && alisw) { if (!(in = popen(cmd, "r"))) { adios(EX_IOERR, "popen", "unable to"); } while (fgets(buf, sizeof buf, in)) { fputs(buf, stdout); } pclose(in); } mh_free0(&cmd); naddrs += n; cmd = add("ali -list", NULL); if ((n=printbcc()) && alisw) { if (!(in = popen(cmd, "r"))) { adios(EX_IOERR, "popen", "unable to"); } while (fgets(buf, sizeof buf, in)) { fputs(buf, stdout); } pclose(in); } mh_free0(&cmd); naddrs += n; return naddrs ? 0 : 1; } static int process(char *file) { enum state state; struct field f = {{0}}; int compnum; FILE *in; if ((in = fopen(file, "r")) == NULL) { adios(EX_IOERR, file, "unable to open"); } for (compnum=1, state=FLD2;; compnum++) { switch (state = m_getfld2(state, &f, in)) { case LENERR2: state = FLD2; /* FALL */ case FLD2: proc_hdr(f.name, f.value); continue; case BODY2: case FILEEOF2: break; case FMTERR2: advise(NULL, "message format error in component #%d", compnum); continue; case IOERR2: adios(EX_DATAERR, NULL, "message format error in component #%d", compnum); default: adios(EX_SOFTWARE, NULL, "getfld() returned %d", state); } break; } fclose(in); return 0; } /* ** Check if the header contains addresses we're interested in. ** If so, extract the addresses and add them to the global list. */ static void proc_hdr(char *name, char *val) { char *cp; int type = 0; while (*val==' ' || *val=='\t' || *val=='\n') { val++; } if (strncasecmp(name, "resent-", 7)==0) { resent = HRESENT; } if (mh_strcasecmp(name, "to")==0) { type = HTO; } else if (mh_strcasecmp(name, "cc")==0) { type = HCC; } else if (mh_strcasecmp(name, "dcc")==0) { type = HDCC; } else if (mh_strcasecmp(name, "bcc")==0) { type = HBCC; } else if (mh_strcasecmp(name, "resent-to")==0) { type = (HRESENT | HTO); } else if (mh_strcasecmp(name, "resent-cc")==0) { type = (HRESENT | HCC); } else if (mh_strcasecmp(name, "resent-dcc")==0) { type = (HRESENT | HDCC); } else if (mh_strcasecmp(name, "resent-bcc")==0) { type = (HRESENT | HBCC); } /* ignore non-recpient headers */ if (!type) { return; } /* ignore recipient headers we are not interested in */ if ((type&HTO || type&HCC) && !toccsw) { return; } if ((type&HDCC) && !dccsw) { return; } if ((type&HBCC) && !bccsw) { return; } while ((cp = getname(val))) { if (!(mp->m_next = getm(cp, NULL, 0, AD_NAME, NULL))) { adios(EX_DATAERR, NULL, "illegal address: %s", cp); } mp = mp->m_next; if (mp->m_type == BADHOST) { admonish(NULL, "bad address `%s'", mp->m_text); continue; } mp->m_type = type; } } /* ** Walk through the list of addresses and print the right ones. */ static int print(void) { int naddrs = 0; for (mp=head.m_next; mp; mp=mp->m_next) { /* skip unless both are resent or neither one is */ if (resent != (mp->m_type&HRESENT)) { continue; } if (mp->m_type & (HTO|HCC)) { naddrs++; printone(mp); } } return naddrs; } /* ** Walk through the list of addresses and print the right ones. */ static int printdcc(void) { int naddrs = 0; for (mp=head.m_next; mp; mp=mp->m_next) { /* skip unless both are resent or neither one is */ if (resent != (mp->m_type&HRESENT)) { continue; } if (mp->m_type & HDCC) { if (!naddrs && (toccsw || bccsw)) { puts(dccsep); } naddrs++; printone(mp); } } return naddrs; } /* ** Walk through the list of addresses and print the right ones. */ static int printbcc(void) { int naddrs = 0; for (mp=head.m_next; mp; mp=mp->m_next) { /* skip unless both are resent or neither one is */ if (resent != (mp->m_type&HRESENT)) { continue; } if (mp->m_type & HBCC) { if (!naddrs && (toccsw || dccsw)) { puts(bccsep); } naddrs++; printone(mp); } } return naddrs; } /* ** Print one single address in appropriate form. */ static void printone(struct mailname *mp) { char buf[BUFSIZ]; if (mp->m_host) { snprintf(buf, sizeof buf, " %s@%s", mp->m_mbox, mp->m_host); } else { snprintf(buf, sizeof buf, " %s", mp->m_mbox); } if (alisw) { cmd = add(buf, cmd); } else { puts(buf+1); } } mmh-0.4/uip/whatnowproc.c0000644000000000000000000000441213414435726014162 0ustar rootroot/* ** whatnowproc.c -- exec the "whatnowproc" ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include /* ** This routine is used by comp, repl, forw, and dist to exec ** the "whatnowproc". It first sets up all the environment ** variables that the "whatnowproc" will need to check, and ** then execs the command. */ int what_now(char *ed, int use, char *file, char *altmsg, int dist, struct msgs *mp, char *text, char *cwd) { int found, k, msgnum, vecp; int len, buflen; char *bp; char buffer[BUFSIZ], *vec[MAXARGS]; vecp = 0; vec[vecp++] = mhbasename(whatnowproc); vec[vecp] = NULL; m_putenv("mhdraft", file); if (mp) m_putenv("mhfolder", mp->foldpath); else unputenv("mhfolder"); if (altmsg) { if (mp == NULL || *altmsg == '/' || cwd == NULL) m_putenv("mhaltmsg", altmsg); else { snprintf(buffer, sizeof(buffer), "%s/%s", mp->foldpath, altmsg); m_putenv("mhaltmsg", buffer); } } else { unputenv("mhaltmsg"); } snprintf(buffer, sizeof(buffer), "%d", dist); m_putenv("mhdist", buffer); if (!ed) { m_putenv("mheditor", defaulteditor); } else if (*ed) { m_putenv("mheditor", ed); } else { unputenv("mheditor"); } snprintf(buffer, sizeof(buffer), "%d", use); m_putenv("mhuse", buffer); unputenv("mhmessages"); unputenv("mhannotate"); if (text && mp && !is_readonly(mp)) { found = 0; bp = buffer; buflen = sizeof(buffer); for (msgnum = mp->lowmsg; msgnum <= mp->hghmsg; msgnum++) { if (is_selected(mp, msgnum)) { snprintf(bp, buflen, "%s%s", found ? " " : "", m_name(msgnum)); len = strlen(bp); bp += len; buflen -= len; for (k = msgnum + 1; k <= mp->hghmsg && is_selected(mp, k); k++) continue; if (--k > msgnum) { snprintf(bp, buflen, "-%s", m_name(k)); len = strlen(bp); bp += len; buflen -= len; } msgnum = k + 1; found++; } } if (found) { m_putenv("mhmessages", buffer); m_putenv("mhannotate", text); } } context_save(); /* save the context file */ fflush(stdout); if (cwd) chdir(cwd); execvp(whatnowproc, vec); fprintf(stderr, "unable to exec "); perror(whatnowproc); return 0; } mmh-0.4/uip/fmtdump.c0000644000000000000000000002612413414435726013267 0ustar rootroot/* ** fmtdump.c -- compile format file and dump out instructions ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include static struct swit switches[] = { #define FORMSW 0 { "form formatfile", 0 }, #define VERSIONSW 1 { "Version", 0 }, #define HELPSW 2 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; /* for assignlabel */ static struct format *lvec[128]; static int lused = 0; /* ** static prototypes */ static void fmt_dump(struct format *); static void dumpone(struct format *); static int findlabel(struct format *); static void assignlabel(struct format *); static char *f_typestr(int); static char *c_typestr(int); static char *c_flagsstr(int); static void litputs(char *); static void litputc(char); int main(int argc, char **argv) { char *cp, *form = NULL; char buf[BUFSIZ], *fmtstr, **argp, **arguments; struct format *fmt; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case FORMSW: if (!(form = *argp++) || *form == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; } } if (form) adios(EX_USAGE, NULL, "only one form at a time!"); else form = cp; } /* Set format string. Must be before chdir(). */ fmtstr = new_fs(form, scanformat); fmt_compile(fmtstr, &fmt); fmt_dump(fmt); return EX_OK; } static void fmt_dump(struct format *fmth) { int i; struct format *fmt, *addr; /* Assign labels */ for (fmt = fmth; fmt; ++fmt) { i = fmt->f_type; if (i == FT_IF_S || i == FT_IF_S_NULL || i == FT_IF_V_EQ || i == FT_IF_V_NE || i == FT_IF_V_GT || i == FT_IF_MATCH || i == FT_IF_AMATCH || i == FT_GOTO) { addr = fmt + fmt->f_skip; if (findlabel(addr) < 0) assignlabel(addr); } if (fmt->f_type == FT_DONE && fmt->f_value == 0) break; } /* Dump them out! */ for (fmt = fmth; fmt; ++fmt) { dumpone(fmt); if (fmt->f_type == FT_DONE && fmt->f_value == 0) break; } } static void dumpone(struct format *fmt) { int i; if ((i = findlabel(fmt)) >= 0) printf("L%d:", i); putchar('\t'); fputs(f_typestr((int)fmt->f_type), stdout); switch (fmt->f_type) { case FT_COMP: case FT_LS_COMP: case FT_LV_COMPFLAG: case FT_LV_COMP: printf(", comp "); litputs(fmt->f_comp->c_name); if (fmt->f_comp->c_type) printf(", c_type %s", c_typestr(fmt->f_comp->c_type)); if (fmt->f_comp->c_flags) printf(", c_flags %s", c_flagsstr(fmt->f_comp->c_flags)); break; case FT_LV_SEC: case FT_LV_MIN: case FT_LV_HOUR: case FT_LV_MDAY: case FT_LV_MON: case FT_LS_MONTH: case FT_LS_LMONTH: case FT_LS_ZONE: case FT_LV_YEAR: case FT_LV_WDAY: case FT_LS_DAY: case FT_LS_WEEKDAY: case FT_LV_YDAY: case FT_LV_ZONE: case FT_LV_CLOCK: case FT_LV_RCLOCK: case FT_LV_DAYF: case FT_LV_ZONEF: case FT_LV_DST: case FT_LS_822DATE: case FT_LS_PRETTY: case FT_LOCALDATE: case FT_GMTDATE: case FT_PARSEDATE: printf(", c_name "); litputs(fmt->f_comp->c_name); if (fmt->f_comp->c_type) printf(", c_type %s", c_typestr(fmt->f_comp->c_type)); if (fmt->f_comp->c_flags) printf(", c_flags %s", c_flagsstr(fmt->f_comp->c_flags)); break; case FT_LS_ADDR: case FT_LS_PERS: case FT_LS_MBOX: case FT_LS_HOST: case FT_LS_PATH: case FT_LS_GNAME: case FT_LS_NOTE: case FT_LS_822ADDR: case FT_LV_HOSTTYPE: case FT_LV_INGRPF: case FT_LV_NOHOSTF: case FT_LS_FRIENDLY: case FT_PARSEADDR: case FT_MYMBOX: printf(", c_name "); litputs(fmt->f_comp->c_name); if (fmt->f_comp->c_type) printf(", c_type %s", c_typestr(fmt->f_comp->c_type)); if (fmt->f_comp->c_flags) printf(", c_flags %s", c_flagsstr(fmt->f_comp->c_flags)); break; case FT_COMPF: printf(", width %d, fill '", fmt->f_width); litputc(fmt->f_fill); printf("' name "); litputs(fmt->f_comp->c_name); if (fmt->f_comp->c_type) printf(", c_type %s", c_typestr(fmt->f_comp->c_type)); if (fmt->f_comp->c_flags) printf(", c_flags %s", c_flagsstr(fmt->f_comp->c_flags)); break; case FT_STRF: case FT_NUMF: printf(", width %d, fill '", fmt->f_width); litputc(fmt->f_fill); putchar('\''); break; case FT_LIT: #ifdef FT_LIT_FORCE case FT_LIT_FORCE: #endif putchar(' '); litputs(fmt->f_text); break; case FT_LITF: printf(", width %d, fill '", fmt->f_width); litputc(fmt->f_fill); printf("' "); litputs(fmt->f_text); break; case FT_CHAR: putchar(' '); putchar('\''); litputc(fmt->f_char); putchar('\''); break; case FT_IF_S: case FT_IF_S_NULL: case FT_IF_MATCH: case FT_IF_AMATCH: printf(" continue else goto"); case FT_GOTO: i = findlabel(fmt + fmt->f_skip); printf(" L%d", i); break; case FT_IF_V_EQ: case FT_IF_V_NE: case FT_IF_V_GT: i = findlabel(fmt + fmt->f_skip); printf(" %d continue else goto L%d", fmt->f_value, i); break; case FT_V_EQ: case FT_V_NE: case FT_V_GT: case FT_LV_LIT: case FT_LV_PLUS_L: case FT_LV_MINUS_L: case FT_LV_DIVIDE_L: case FT_LV_MODULO_L: printf(" value %d", fmt->f_value); break; case FT_LS_LIT: printf(" str "); litputs(fmt->f_text); break; case FT_LS_GETENV: printf(" getenv "); litputs(fmt->f_text); break; case FT_LS_DECODECOMP: printf(", comp "); litputs(fmt->f_comp->c_name); break; case FT_LS_DECODE: break; case FT_LS_TRIM: printf(", width %d", fmt->f_width); break; case FT_LV_DAT: printf(", value dat[%d]", fmt->f_value); break; case FT_LS_UNMAILTO: break; } putchar('\n'); } static int findlabel(struct format *addr) { int i; for (i = 0; i < lused; ++i) if (addr == lvec[i]) return(i); return(-1); } static void assignlabel(struct format *addr) { lvec[lused++] = addr; } static char * f_typestr(int t) { static char buf[32]; switch (t) { case FT_COMP: return("COMP"); case FT_COMPF: return("COMPF"); case FT_LIT: return("LIT"); case FT_LITF: return("LITF"); #ifdef FT_LIT_FORCE case FT_LIT_FORCE: return("LIT_FORCE"); #endif case FT_CHAR: return("CHAR"); case FT_NUM: return("NUM"); case FT_NUMF: return("NUMF"); case FT_STR: return("STR"); case FT_STRF: return("STRF"); case FT_STRFW: return("STRFW"); case FT_PUTADDR: return("PUTADDR"); case FT_LS_COMP: return("LS_COMP"); case FT_LS_LIT: return("LS_LIT"); case FT_LS_GETENV: return("LS_GETENV"); case FT_LS_DECODECOMP: return("FT_LS_DECODECOMP"); case FT_LS_DECODE: return("FT_LS_DECODE"); case FT_LS_TRIM: return("LS_TRIM"); case FT_LV_COMP: return("LV_COMP"); case FT_LV_COMPFLAG: return("LV_COMPFLAG"); case FT_LV_LIT: return("LV_LIT"); case FT_LV_DAT: return("LV_DAT"); case FT_LV_STRLEN: return("LV_STRLEN"); case FT_LV_PLUS_L: return("LV_PLUS_L"); case FT_LV_MINUS_L: return("LV_MINUS_L"); case FT_LV_DIVIDE_L: return("LV_DIVIDE_L"); case FT_LV_MODULO_L: return("LV_MODULO_L"); case FT_LV_CHAR_LEFT: return("LV_CHAR_LEFT"); case FT_LS_MONTH: return("LS_MONTH"); case FT_LS_LMONTH: return("LS_LMONTH"); case FT_LS_ZONE: return("LS_ZONE"); case FT_LS_DAY: return("LS_DAY"); case FT_LS_WEEKDAY: return("LS_WEEKDAY"); case FT_LS_822DATE: return("LS_822DATE"); case FT_LS_PRETTY: return("LS_PRETTY"); case FT_LV_SEC: return("LV_SEC"); case FT_LV_MIN: return("LV_MIN"); case FT_LV_HOUR: return("LV_HOUR"); case FT_LV_MDAY: return("LV_MDAY"); case FT_LV_MON: return("LV_MON"); case FT_LV_YEAR: return("LV_YEAR"); case FT_LV_YDAY: return("LV_YDAY"); case FT_LV_WDAY: return("LV_WDAY"); case FT_LV_ZONE: return("LV_ZONE"); case FT_LV_CLOCK: return("LV_CLOCK"); case FT_LV_RCLOCK: return("LV_RCLOCK"); case FT_LV_DAYF: return("LV_DAYF"); case FT_LV_DST: return("LV_DST"); case FT_LV_ZONEF: return("LV_ZONEF"); case FT_LS_ADDR: return("LS_ADDR"); case FT_LS_PERS: return("LS_PERS"); case FT_LS_MBOX: return("LS_MBOX"); case FT_LS_HOST: return("LS_HOST"); case FT_LS_PATH: return("LS_PATH"); case FT_LS_GNAME: return("LS_GNAME"); case FT_LS_NOTE: return("LS_NOTE"); case FT_LS_822ADDR: return("LS_822ADDR"); case FT_LS_FRIENDLY: return("LS_FRIENDLY"); case FT_LV_HOSTTYPE: return("LV_HOSTTYPE"); case FT_LV_INGRPF: return("LV_INGRPF"); case FT_LV_NOHOSTF: return("LV_NOHOSTF"); case FT_LOCALDATE: return("LOCALDATE"); case FT_GMTDATE: return("GMTDATE"); case FT_PARSEDATE: return("PARSEDATE"); case FT_PARSEADDR: return("PARSEADDR"); case FT_FORMATADDR: return("FORMATADDR"); case FT_MYMBOX: return("MYMBOX"); case FT_SAVESTR: return("SAVESTR"); #ifdef FT_PAUSE case FT_PAUSE: return ("PAUSE"); #endif case FT_DONE: return("DONE"); case FT_NOP: return("NOP"); case FT_GOTO: return("GOTO"); case FT_IF_S_NULL: return("IF_S_NULL"); case FT_IF_S: return("IF_S"); case FT_IF_V_EQ: return("IF_V_EQ"); case FT_IF_V_NE: return("IF_V_NE"); case FT_IF_V_GT: return("IF_V_GT"); case FT_IF_MATCH: return("IF_MATCH"); case FT_IF_AMATCH: return("IF_AMATCH"); case FT_S_NULL: return("S_NULL"); case FT_S_NONNULL: return("S_NONNULL"); case FT_V_EQ: return("V_EQ"); case FT_V_NE: return("V_NE"); case FT_V_GT: return("V_GT"); case FT_V_MATCH: return("V_MATCH"); case FT_V_AMATCH: return("V_AMATCH"); case FT_LS_UNMAILTO: return("LS_UNMAILTO"); default: printf(buf, "/* ??? #%d */", t); return(buf); } } #define FNORD(v, s) if (t & (v)) { \ if (i++ > 0) \ strcat(buf, "|"); \ strcat(buf, s); } static char * c_typestr(int t) { int i; static char buf[64]; buf[0] = '\0'; if (t & ~(CT_ADDR|CT_DATE)) printf(buf, "0x%x ", t); strcat(buf, "<"); i = 0; FNORD(CT_ADDR, "ADDR"); FNORD(CT_DATE, "DATE"); strcat(buf, ">"); return(buf); } static char * c_flagsstr(int t) { int i; static char buf[64]; buf[0] = '\0'; if (t & ~(CF_TRUE|CF_PARSED|CF_DATEFAB)) printf(buf, "0x%x ", t); strcat(buf, "<"); i = 0; FNORD(CF_TRUE, "TRUE"); FNORD(CF_PARSED, "PARSED"); FNORD(CF_DATEFAB, "DATEFAB"); strcat(buf, ">"); return(buf); } #undef FNORD static void litputs(char *s) { if (s) { putc('"', stdout); while (*s) litputc(*s++); putc('"', stdout); } else fputs("", stdout); } static void litputc(char c) { if (c & ~ 0177) { putc('M', stdout); putc('-', stdout); c &= 0177; } if (c < 0x20 || c == 0177) { if (c == '\b') { putc('\\', stdout); putc('b', stdout); } else if (c == '\f') { putc('\\', stdout); putc('f', stdout); } else if (c == '\n') { putc('\\', stdout); putc('n', stdout); } else if (c == '\r') { putc('\\', stdout); putc('r', stdout); } else if (c == '\t') { putc('\\', stdout); putc('t', stdout); } else { putc('^', stdout); putc(c ^ 0x40, stdout); /* DEL to ?, others to alpha */ } } else putc(c, stdout); } mmh-0.4/uip/mhlistsbr.c0000644000000000000000000001665313414435726013630 0ustar rootroot/* ** mhlistsbr.c -- routines to list information about the ** -- contents of MIME messages ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include /* mhmisc.c */ int part_ok(CT, int); int type_ok(CT, int); void flush_errors(void); /* ** prototypes */ void list_all_messages(CT *, int, int); int list_switch(CT, int, int, int); int list_content(CT, int, int, int); /* ** static prototypes */ static void list_single_message(CT, int, int); static int list_debug(CT); static int list_multi(CT, int, int, int); static int list_partial(CT, int, int, int); static int list_encoding(CT); /* ** various formats for -list option */ #define LSTFMT1 "%4s %-5s %-24s %5s %-36s\n" #define LSTFMT2a "%4d " #define LSTFMT2b "%-5s %-24.24s " #define LSTFMT2c1 "%5lu" #define LSTFMT2c2 "%4lu%c" #define LSTFMT2c3 "huge " #define LSTFMT2c4 " " #define LSTFMT2d1 " %-36.36s" #define LSTFMT2d2 "\t %-65.65s\n" /* ** Top level entry point to list group of messages */ void list_all_messages(CT *cts, int verbose, int debug) { CT ct, *ctp; printf(LSTFMT1, "msg", "part", "type/subtype", "size", "description"); for (ctp = cts; *ctp; ctp++) { ct = *ctp; list_single_message(ct, verbose, debug); } flush_errors(); } /* ** Entry point to list a single message */ static void list_single_message(CT ct, int verbose, int debug) { if (type_ok(ct, 1)) { umask(ct->c_umask); list_switch(ct, 1, verbose, debug); if (ct->c_fp) { fclose(ct->c_fp); ct->c_fp = NULL; } if (ct->c_ceclosefnx) (*ct->c_ceclosefnx) (ct); } } /* ** Primary switching routine to list information about a content */ int list_switch(CT ct, int toplevel, int verbose, int debug) { switch (ct->c_type) { case CT_MULTIPART: return list_multi(ct, toplevel, verbose, debug); break; case CT_MESSAGE: if (ct->c_subtype == MESSAGE_PARTIAL) { return list_partial(ct, toplevel, verbose, debug); } else { return list_content(ct, toplevel, verbose, debug); } break; case CT_TEXT: case CT_AUDIO: case CT_IMAGE: case CT_VIDEO: case CT_APPLICATION: return list_content(ct, toplevel, verbose, debug); break; default: /* list_debug (ct); */ adios(EX_DATAERR, NULL, "unknown content type %d", ct->c_type); break; } return 0; /* NOT REACHED */ } #define empty(s) ((s) ? (s) : "") /* ** Method for listing information about a simple/generic content */ int list_content(CT ct, int toplevel, int verbose, int debug) { unsigned long size; char *cp, buffer[BUFSIZ]; CI ci = &ct->c_ctinfo; printf(toplevel > 0 ? LSTFMT2a : toplevel < 0 ? "part " : " ", atoi(mhbasename(empty(ct->c_file)))); snprintf(buffer, sizeof(buffer), "%s/%s", empty(ci->ci_type), empty(ci->ci_subtype)); printf(LSTFMT2b, empty(ct->c_partno), buffer); if (ct->c_cesizefnx) size = (*ct->c_cesizefnx) (ct); else size = ct->c_end - ct->c_begin; /* find correct scale for size (Kilo/Mega/Giga/Tera) */ for (cp = " KMGT"; size > 9999; size >>= 10) if (!*++cp) break; /* print size of this body part */ switch (*cp) { case ' ': if (size > 0 || ct->c_encoding != CE_EXTERNAL) printf(LSTFMT2c1, size); else printf(LSTFMT2c4); break; default: printf(LSTFMT2c2, size, *cp); break; case '\0': printf(LSTFMT2c3); } /* print Content-Description */ if (ct->c_descr) { char *dp; dp = trimcpy(cp = mh_xstrdup(ct->c_descr)); mh_free0(&cp); printf(LSTFMT2d1, dp); mh_free0(&dp); } printf("\n"); if (verbose) { char **ap, **ep; CI ci = &ct->c_ctinfo; for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) { printf("\t\t%s=\"%s\"\n", *ap, *ep); } /* ** If verbose, print any RFC-822 comments in the ** Content-Type line. */ if (ci->ci_comment) { char *dp; dp = trimcpy(cp = add(ci->ci_comment, NULL)); free (cp); snprintf(buffer, sizeof(buffer), "(%s)", dp); mh_free0(&dp); printf(LSTFMT2d2, buffer); } } if (debug) list_debug(ct); return OK; } /* ** Print debugging information about a content */ static int list_debug(CT ct) { char **ap, **ep; CI ci = &ct->c_ctinfo; fflush(stdout); fprintf(stderr, " partno \"%s\"\n", empty(ct->c_partno)); /* print MIME-Version line */ if (ct->c_vrsn) fprintf(stderr, " %s:%s\n", VRSN_FIELD, ct->c_vrsn); /* print Content-Type line */ if (ct->c_ctline) fprintf(stderr, " %s:%s\n", TYPE_FIELD, ct->c_ctline); /* print parsed elements of content type */ fprintf(stderr, " type \"%s\"\n", empty(ci->ci_type)); fprintf(stderr, " subtype \"%s\"\n", empty(ci->ci_subtype)); fprintf(stderr, " comment \"%s\"\n", empty(ci->ci_comment)); fprintf(stderr, " magic \"%s\"\n", empty(ci->ci_magic)); /* print parsed parameters attached to content type */ fprintf(stderr, " parameters\n"); for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) fprintf(stderr, " %s=\"%s\"\n", *ap, *ep); /* print internal flags for type/subtype */ fprintf(stderr, " type 0x%x subtype 0x%x params 0x%x\n", ct->c_type, ct->c_subtype, (unsigned int)(unsigned long) ct->c_ctparams); fprintf(stderr, " charset \"%s\"\n", empty(ct->c_charset)); fprintf(stderr, " showproc \"%s\"\n", empty(ct->c_showproc)); fprintf(stderr, " storeproc \"%s\"\n", empty(ct->c_storeproc)); /* print transfer encoding information */ if (ct->c_celine) fprintf(stderr, " %s:%s", ENCODING_FIELD, ct->c_celine); /* print internal flags for transfer encoding */ fprintf(stderr, " transfer encoding 0x%x params 0x%x\n", ct->c_encoding, (unsigned int)(unsigned long) ct->c_cefile); /* print Content-ID */ if (ct->c_id) fprintf(stderr, " %s:%s", ID_FIELD, ct->c_id); /* print Content-Description */ if (ct->c_descr) fprintf(stderr, " %s:%s", DESCR_FIELD, ct->c_descr); fprintf(stderr, " read fp 0x%x file \"%s\" begin %ld end %ld\n", (unsigned int)(unsigned long) ct->c_fp, empty(ct->c_file), ct->c_begin, ct->c_end); /* print more information about transfer encoding */ list_encoding(ct); return OK; } #undef empty /* ** list content information for type "multipart" */ static int list_multi(CT ct, int toplevel, int verbose, int debug) { struct multipart *m = (struct multipart *) ct->c_ctparams; struct part *part; /* list the content for toplevel of this multipart */ list_content(ct, toplevel, verbose, debug); /* now list for all the subparts */ for (part = m->mp_parts; part; part = part->mp_next) { CT p = part->mp_part; if (part_ok(p, 1) && type_ok(p, 1)) list_switch(p, 0, verbose, debug); } return OK; } /* ** list content information for type "message/partial" */ static int list_partial(CT ct, int toplevel, int verbose, int debug) { struct partial *p = (struct partial *) ct->c_ctparams; list_content(ct, toplevel, verbose, debug); if (verbose) { printf("\t [message %s, part %d", p->pm_partid, p->pm_partno); if (p->pm_maxno) printf(" of %d", p->pm_maxno); printf("]\n"); } return OK; } /* ** list information about the Content-Transfer-Encoding ** used by a content. */ static int list_encoding(CT ct) { CE ce; if ((ce = ct->c_cefile)) fprintf(stderr, " decoded fp 0x%x file \"%s\"\n", (unsigned int)(unsigned long) ce->ce_fp, ce->ce_file ? ce->ce_file : ""); return OK; } mmh-0.4/uip/whatnow2.sh0000755000000000000000000001126513414435726013557 0ustar rootroot#!/bin/sh printhelp() { echo "Usage: $0 command" echo " commands are:" echo " edit [editor]" echo " list" echo " send [sendargs]" echo " delete" echo " display" echo " attach files" echo " alist" echo " detach anum" echo " refile +folder" echo " -help" echo " -Version" } version() { if [ $1 -eq 0 ] then echo "$0 has no own version number, thus this instead:" folder -Version exit 0 fi echo "$0 has no own version number, thus this instead:" 1>&2 folder -Version 1>&2 exit 1 } usage() { if [ $1 -eq 0 ] then printhelp exit 0 fi printhelp 1>&2 exit 1 } get_editor() { if [ -f "$mhmetafile" ] then lasteditor=`anno -list -component 'mmh-last-editor' "$mhmetafile"` if [ -n "$lasteditor" ] then editor=`echo $lasteditor | cut -d ' ' -f 1` mheditor=`mhparam "$editor-next"` [ -n "$mheditor" ] && return mheditor=$lasteditor return fi fi if [ -n "$MMHEDITOR" ] then mheditor=$MMHEDITOR return fi mheditor=`mhparam 'Editor'` } save_config() { component="$1" newtext="$2" anno -delete -number all -component "$component" "$mhmetafile" anno -nodate -component "$component" -text "$newtext" "$mhmetafile" } get_showproc() { mhshowproc=`mhparam 'listproc'` return } get_realpath() { reldir=`dirname "$1"` filename=`basename "$1"` cd "$reldir" echo "$PWD/$filename" cd "$OLDPWD" } create() { if [ -z "$mhdraft" ] then usage 1 fi mhext=`mhparam Metafile-Extension` mhmetafile="$mhdraft""$mhext" touch "$mhmetafile" if [ -z "$mheditor" ] then get_editor fi if [ "$mhuse" -eq 1 ] then exec $mheditor $mhdraft return fi save_config mmh-mhaltmsg "$mhaltmsg" save_config mmh-mhdist "$mhdist" save_config mmh-mhfolder "$mhfolder" save_config mmh-mhmessages "$mhmessages" save_config mmh-mhannotate "$mhannotate" save_config mmh-last-editor "$mheditor" exec $mheditor "$mhdraft" } edit() { if [ $# -eq 0 ] then get_editor else mheditor="$@" fi save_config mmh-last-editor "$mheditor" exec $mheditor "$mhdraft" } list() { get_showproc exec $mhshowproc -file $mhdraft } sendfunktion() { export mhaltmsg=`anno -list -component 'mmh-mhaltmsg' "$mhmetafile"` export mhdist=`anno -list -component 'mmh-mhdist' "$mhmetafile"` export mhfolder=`anno -list -component 'mmh-mhfolder' "$mhmetafile"` export mhmessages=`anno -list -component 'mmh-mhmessages' "$mhmetafile"` export mhannotate=`anno -list -component 'mmh-mhannotate' "$mhmetafile"` tmp=`mktemp` cp "$mhdraft" "$tmp" mhl -form mhl.whatnow2 "$tmp" > "$mhdraft" mhle="$?" if [ "$mhle" -ne 0 ] then mv "$tmp" "$mhdraft" exit "$mhle" fi send "$@" "$mhdraft" || exit $? rm -f "$mhmetafile" rm -f "$tmp" exit 0 } delete() { folder -push "$draftfolder" >/dev/null 2>&1 rmm "$draftfolder" c folder -pop >/dev/null 2>&1 rm "$mhmetafile" } attach() { header=`mhparam 'Attachment-Header'` while [ -n "$1" ] do if [ ! -f "$1" ] then echo "file not found: $1" 1>&2 shift echo -n "folloing files are not attached: " 1>&2 echo -n "$1" 1>&2 echo "$@" 1>&2 exit 1 fi file=`get_realpath "$1"` anno -nodate -append -component "$header" -text "$file" "$mhdraft" shift done } alist() { header=`mhparam 'Attachment-Header'` anno -list -number -component "$header" "$mhdraft" } detach() { header=`mhparam 'Attachment-Header'` while [ -n "$1" ] do anno -delete -component "$header" -number "$1" "$mhdraft" if [ $? -ne 0 ] then echo "can't delet attachment $1" 1>&2 exit 1 fi shift done } display() { mhaltmsg=`anno -list -component 'mmh-mhaltmsg' "$mhmetafile"` get_showproc if [ -z "$mhaltmsg" ] then echo "no altmsg" 1>&2 exit 1 fi exec $mhshowproc -file "$mhaltmsg" } if [ $# -eq 0 ] then create exit fi command="$1" shift draftfolder=`mhparam draftfolder` mhdraft=`mhpath "$draftfolder" c 2>/dev/null` if [ -z "$mhdraft" ] then case "$command" in -h|-he|-hel|-help) usage $# ;; -V|-Ve|-Ver|-Vers|-Versi|-Versio|-Version) version $# ;; *) echo "no current message in $draftfolder" 1>&2 usage 1 ;; esac fi mhext=`mhparam Metafile-Extension` mhmetafile="$mhdraft""$mhext" touch "$mhmetafile" case "$command" in e|ed|edi|edit) edit "$@" ;; l|li|lis|list) [ $# -eq 0 ] || usage 1 list ;; s|se|sen|send) sendfunktion "$@" ;; del|dele|delet|delete) [ $# -eq 0 ] || usage 1 delete ;; di|dis|disp|displ|displa|display) [ $# -eq 0 ] || usage 1 display ;; at|att|atta|attac|attach) attach "$@" ;; al|ali|alis|alist) [ $# -eq 0 ] || usage 1 alist ;; det|deta|detac|detach) detach "$@" ;; r|re|ref|refi|refil|refile) refile -file "$mhdraft" "$@" ;; w|wh|who|whom) whom "$@" "$mhdraft" ;; -h|-he|-hel|-help) usage $# ;; -V|-Ve|-Ver|-Vers|-Versi|-Versio|-Version) version $# ;; *) usage 1 ;; esac mmh-0.4/uip/packf.c0000644000000000000000000000552113414435726012675 0ustar rootroot/* ** packf.c -- pack a nmh folder into a file ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include static struct swit switches[] = { #define VERSIONSW 0 { "Version", 0 }, #define HELPSW 1 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; int main(int argc, char **argv) { int fd, msgnum; char *cp, *maildir, *msgnam, *folder = NULL, buf[BUFSIZ]; char **argp, **arguments; struct msgs_array msgs = { 0, 0, NULL }; struct msgs *mp; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; /* ** Parse arguments */ while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); } } if (*cp == '+' || *cp == '@') { if (folder) adios(EX_USAGE, NULL, "only one folder at a time!"); folder = mh_xstrdup(expandfol(cp)); } else app_msgarg(&msgs, cp); } /* default is to pack whole folder */ if (!msgs.size) app_msgarg(&msgs, seq_all); if (!folder) folder = getcurfol(); maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) adios(EX_OSERR, maildir, "unable to change directory to "); /* read folder and create message structure */ if (!(mp = folder_read(folder))) adios(EX_IOERR, NULL, "unable to read folder %s", folder); /* check for empty folder */ if (mp->nummsg == 0) adios(EX_DATAERR, NULL, "no messages in %s", folder); /* parse all the message ranges/sequences and set SELECTED */ for (msgnum = 0; msgnum < msgs.size; msgnum++) if (!m_convert(mp, msgs.msgs[msgnum])) exit(EX_USAGE); seq_setprev(mp); /* set the previous-sequence */ /* copy all the SELECTED messages to stdout */ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (is_selected(mp, msgnum)) { if ((fd = open(msgnam = m_name(msgnum), O_RDONLY)) == NOTOK) { admonish(msgnam, "unable to read message"); break; } if (mbox_copy(fileno(stdout), fd) == NOTOK) { adios(EX_IOERR, NULL, "error writing to stdout"); } close(fd); } } context_replace(curfolder, folder); if (mp->hghsel != mp->curmsg) seq_setcur(mp, mp->lowsel); seq_save(mp); context_save(); folder_free(mp); return 0; } mmh-0.4/uip/whatnow.c0000644000000000000000000003245313414435726013304 0ustar rootroot/* ** whatnow.c -- the WhatNow shell ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_PARAM_H # include #endif static struct swit switches[] = { #define EDITRSW 0 { "editor editor", 0 }, #define PRMPTSW 1 { "prompt string", 0 }, #define VERSIONSW 2 { "Version", 0 }, #define HELPSW 3 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; /* ** Options at the "whatnow" prompt */ static struct swit aleqs[] = { #define EDITSW 0 { "edit [editor [switches]]", 0 }, #define LISTSW 1 { "list", 0 }, #define DISPSW 2 { "display", 0 }, #define WHOMSW 3 { "whom", 0 }, #define SENDSW 4 { "send", 0 }, #define REFILEOPT 5 { "refile +folder", 0 }, #define DELETESW 6 { "delete", 0 }, #define QUITSW 7 { "quit", 0 }, #define CDCMDSW 8 { "cd [directory]", 0 }, #define PWDCMDSW 9 { "pwd", 0 }, #define LSCMDSW 10 { "ls", 0 }, #define ALISTCMDSW 11 { "alist", 0 }, #define ATTACHCMDSW 12 { "attach files", 0 }, #define DETACHCMDSW 13 { "detach numbers", 0 }, { NULL, 0 } }; static char *myprompt = "\nWhat now? "; /* ** static prototypes */ static int editfile(char **, char **, char *); static int sendfile(char **, char *); static int refile(char **, char *); static int removefile(char *); static void writelscmd(char *, int, char **); static void writesomecmd(char *, int, char *, char *, char **); static FILE* popen_in_dir(const char *, const char *, const char *); static int system_in_dir(const char *, const char *); int main(int argc, char **argv) { int use = NOUSE; char *cp; char *ed = NULL, *drft = NULL; char buf[BUFSIZ], prompt[BUFSIZ]; char **argp, **arguments; struct stat st; char cwd[MAXPATHLEN + 1]; /* current working directory */ char file[MAXPATHLEN + 1]; /* file name buffer */ char shell[MAXPATHLEN + 1]; /* shell response buffer */ FILE *f; /* read pointer for bgnd proc */ setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); advise(NULL, "whatnow is deprecated. Consider switching to whatnow2."); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; /* ** Get the initial current working directory. */ if (!getcwd(cwd, sizeof (cwd))) { adios(EX_USAGE, "getcwd", "could not get working directory"); } while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [switches] [file]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case EDITRSW: if (!(ed = *argp++) || *ed == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case PRMPTSW: if (!(myprompt = *argp++) || *myprompt == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; } } if (drft) adios(EX_USAGE, NULL, "only one draft at a time!"); else drft = cp; } if ((!drft && !(drft = getenv("mhdraft"))) || !*drft) drft = mh_xstrdup(m_draft(seq_cur)); if ((cp = getenv("mhuse")) && *cp) use = atoi(cp); if (!ed && !(ed = getenv("mheditor"))) { ed = ""; /* Don't initially edit the draft */ } /* start editing the draft, unless editor is the empty string */ if (*ed) { if (editfile(&ed, NULL, drft) <0) { if (!use) { unlink(drft); } adios(EX_SOFTWARE, NULL, "Try again."); } } snprintf(prompt, sizeof(prompt), myprompt, invo_name); while ((argp = getans(prompt, aleqs))) { switch (smatch(*argp, aleqs)) { case DISPSW: /* display the msg being replied to or distributed */ if ((cp = getenv("mhaltmsg")) && *cp) { execprogl(listproc, listproc, "-file", cp, (char *)NULL); } else { advise(NULL, "no alternate message to display"); } break; case EDITSW: /* Call an editor on the draft file */ if (*++argp) ed = *argp++; editfile(&ed, argp, drft); break; case LISTSW: /* display the draft file */ execprogl(listproc, listproc, "-file", drft, (char *)NULL); break; case QUITSW: /* quit */ if (stat(drft, &st) != NOTOK) { advise(NULL, "draft left on %s", drft); } exit(EX_OK); case DELETESW: /* Delete draft and exit */ removefile(drft); exit(EX_OK); case SENDSW: /* Send draft */ sendfile(++argp, drft); break; case REFILEOPT: /* Refile the draft */ if (refile(++argp, drft) == 0) { exit(EX_OK); } break; case CDCMDSW: /* ** Change the working directory for attachments ** ** Run the directory through the user's shell ** so that we can take advantage of any syntax ** that the user is accustomed to. Read back ** the absolute path. */ if (*(argp+1) == NULL) { sprintf(buf, "$SHELL -c \"cd;pwd\""); } else { writesomecmd(buf, BUFSIZ, "cd", "pwd", argp); } if ((f = popen_in_dir(cwd, buf, "r"))) { fgets(cwd, sizeof (cwd), f); if (strchr(cwd, '\n')) *strchr(cwd, '\n') = '\0'; pclose(f); } else { advise("popen", "could not get directory"); } break; case PWDCMDSW: /* Print the working directory for attachments */ printf("%s\n", cwd); break; case LSCMDSW: /* ** List files in the current attachment working ** directory ** ** Use the user's shell so that we can take ** advantage of any syntax that the user is ** accustomed to. */ writelscmd(buf, sizeof(buf), argp); system_in_dir(cwd, buf); break; case ALISTCMDSW: /* ** List attachments on current draft. */ if (execprogl("anno", "anno", "-list", "-comp", attach_hdr, "-number", drft, (char *)NULL) != 0) { advise(NULL, "Could not list attachment headers."); } break; case ATTACHCMDSW: /* ** Attach files to current draft. */ if (*(argp+1) == NULL) { advise(NULL, "attach command requires file argument(s)."); break; } /* ** Build a command line that causes the user's ** shell to list the file name arguments. ** This handles and wildcard expansion, tilde ** expansion, etc. */ writelscmd(buf, sizeof(buf), argp); /* ** Read back the response from the shell, ** which contains a number of lines with one ** file name per line. Remove off the newline. ** Determine whether we have an absolute or ** relative path name. Prepend the current ** working directory to relative path names. ** Add the attachment annotation to the draft. */ if (!(f = popen_in_dir(cwd, buf, "r"))) { advise("popen", "could not get file from shell"); break; } while (fgets(shell, sizeof(shell), f)) { *(strchr(shell, '\n')) = '\0'; if (*shell == '/') sprintf(file, "%s", shell); else { sprintf(file, "%s/%s", cwd, shell); } if (execprogl("anno", "anno", "-nodate", "-append", "-comp", attach_hdr, "-text", file, drft, (char *)NULL) != 0) { advise(NULL, "Could not add attachment header."); } } pclose(f); break; case DETACHCMDSW: /* ** Detach files from current draft. ** ** Interpret the arguments as ** attachment numbers. Decrement any remaining ** argument number that is greater than the one ** just processed after processing each one so ** that the numbering stays correct. */ for (arguments=argp+1; *arguments; arguments++) { int n; if (**arguments == '\0') { continue; } if (execprogl("anno", "anno", "-delete", "-comp", attach_hdr, "-number", *arguments, drft, (char *)NULL) != 0) { advise(NULL, "Could not delete attachment header."); } n = atoi(*arguments); for (argp=arguments+1; *argp; argp++) { if (atoi(*argp) > n) { if (atoi(*argp) == 1) { *argp = ""; } else { sprintf(*argp, "%d", atoi(*argp) - 1); } } } } break; case WHOMSW: /* list recipients */ execprogl("whom", "whom", drft, (char *)NULL); break; default: /* Unknown command */ advise(NULL, "say what?"); break; } } exit(EX_IOERR); } /* ** Build a command line of the form $SHELL -c "cd 'cwd'; cmd argp ... ; ** trailcmd". */ static void writesomecmd(char *buf, int bufsz, char *cmd, char *trailcmd, char **argp) { char *cp; /* ** Note that we do not quote -- the argp from the user ** is assumed to be quoted as they desire. (We can't treat ** it as pure literal as that would prevent them using ~, ** wildcards, etc.) The buffer produced by this function ** should be given to popen_in_dir() or system_in_dir() so ** that the current working directory is set correctly. */ int ln = snprintf(buf, bufsz, "$SHELL -c \"%s", cmd); /* ** NB that some snprintf() return -1 on overflow rather than the ** new C99 mandated 'number of chars that would have been written' */ /* ** length checks here and inside the loop allow for the ** trailing ';', trailcmd, '"' and NUL */ int trailln = strlen(trailcmd) + 3; if (ln < 0 || ln + trailln > bufsz) adios(EX_USAGE, NULL, "arguments too long"); cp = buf + ln; while (*++argp) { ln = strlen(*argp); /* +1 for leading space */ if (ln + trailln + 1 > bufsz - (cp-buf)) adios(EX_USAGE, NULL, "arguments too long"); *cp++ = ' '; memcpy(cp, *argp, ln+1); cp += ln; } if (*trailcmd) { *cp++ = ';'; strcpy(cp, trailcmd); cp += trailln - 3; } *cp++ = '"'; *cp = 0; } /* ** Build a command line that causes the user's shell to list the file name ** arguments. This handles and wildcard expansion, tilde expansion, etc. */ static void writelscmd(char *buf, int bufsz, char **argp) { writesomecmd(buf, bufsz, "ls", "", argp); } /* ** Like system(), but run the command in directory dir. ** This assumes the program is single-threaded! */ static int system_in_dir(const char *dir, const char *cmd) { char olddir[BUFSIZ]; int r; if (getcwd(olddir, sizeof(olddir)) == 0) adios(EX_OSERR, "getcwd", "could not get working directory"); if (chdir(dir) != 0) adios(EX_OSERR, "chdir", "could not change working directory"); r = system(cmd); if (chdir(olddir) != 0) adios(EX_OSERR, "chdir", "could not change working directory"); return r; } /* ditto for popen() */ static FILE* popen_in_dir(const char *dir, const char *cmd, const char *type) { char olddir[BUFSIZ]; FILE *f; if (getcwd(olddir, sizeof(olddir)) == 0) adios(EX_OSERR, "getcwd", "could not get working directory"); if (chdir(dir) != 0) adios(EX_OSERR, "chdir", "could not change working directory"); f = popen(cmd, type); if (chdir(olddir) != 0) adios(EX_OSERR, "chdir", "could not change working directory"); return f; } /* ** EDIT */ static char *edsave = NULL; /* the editor we used previously */ static int editfile(char **ed, char **arg, char *file) { int pid, status, vecp; char *cp, *vec[MAXARGS]; if (!*ed || !**ed) { /* We have no explicit editor. */ if (edsave) { /* Use the previous editor ... */ *ed = edsave; if (!(cp = mhbasename(*ed))) cp = *ed; /* but prefer one specified via "editor-next" */ cp = concat(cp, "-next", NULL); if ((cp = context_find(cp))) *ed = cp; } else { /* set initial editor */ *ed = defaulteditor; } } context_save(); fflush(stdout); switch (pid = fork()) { case NOTOK: advise("fork", "unable to"); status = EX_OSERR; break; case OK: vecp = 0; vec[vecp++] = mhbasename(*ed); while (arg && *arg) { vec[vecp++] = *arg++; } vec[vecp++] = file; vec[vecp] = NULL; execvp(*ed, vec); fprintf(stderr, "%s: unable to exec ", invo_name); perror(*ed); _exit(EX_OSERR); default: if ((status = pidwait(pid, NOTOK))) { if ((status & 0xff00) == 0xff00) { /* cmd not found or pidwait() failed */ status = EX_SOFTWARE; break; } if (status & 0x00ff) { /* terminated by signal */ advise(NULL, "%s terminated by signal %d", *ed, status & 0x7f); } else { /* failure exit */ advise(NULL, "%s exited with return code %d", *ed, (status & 0xff00) >> 8); } status = -1; break; } } /* remember which editor we used */ edsave = mh_xstrdup(*ed); *ed = NULL; return status; } /* ** SEND */ static int sendfile(char **arg, char *file) { int vecp = 0; char *vec[MAXARGS]; context_save(); fflush(stdout); vec[vecp++] = "send"; while (arg && *arg) { vec[vecp++] = *arg++; } vec[vecp++] = file; vec[vecp] = NULL; execvp(*vec, vec); fprintf(stderr, "%s: unable to exec ", invo_name); perror("send"); _exit(EX_OSERR); } /* ** refile msg into another folder */ static int refile(char **arg, char *file) { int vecp = 0; char *vec[MAXARGS]; vec[vecp++] = "refile"; vec[vecp++] = "-nolink"; /* override bad .mh_profile defaults */ vec[vecp++] = "-file"; vec[vecp++] = file; while (arg && *arg) { vec[vecp++] = *arg++; } vec[vecp] = NULL; context_save(); fflush(stdout); return execprog(*vec, vec); } /* ** Remove the draft file */ static int removefile(char *drft) { if (unlink(drft) == NOTOK) adios(EX_IOERR, drft, "unable to unlink"); return OK; } mmh-0.4/uip/mhshow.c0000644000000000000000000002236013414435726013116 0ustar rootroot/* ** mhshow.c -- display the contents of MIME messages ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include #include #include #include #include static struct swit switches[] = { #define VERBSW 0 { "verbose", 0 }, #define NVERBSW 1 { "noverbose", 2 }, #define FILESW 2 /* interface from show */ { "file file", 0 }, #define FORMSW 3 { "form formfile", 0 }, #define PARTSW 4 { "part number", 0 }, #define TYPESW 5 { "type content", 0 }, #define VERSIONSW 6 { "Version", 0 }, #define HELPSW 7 { "help", 0 }, #define DEBUGSW 8 { "debug", -5 }, { NULL, 0 } }; char *version=VERSION; /* mhparse.c */ extern char *tmp; /* directory to place temp files */ /* mhshowsbr.c */ extern int nolist; extern char *formsw; /* mhmisc.c */ extern int npart; extern int ntype; extern char *parts[NPARTS + 1]; extern char *types[NTYPES + 1]; extern int userrs; static enum { SHOW, NEXT, PREV } mode = SHOW; int debugsw = 0; int verbosw = 0; #define quitser pipeser /* mhparse.c */ CT parse_mime(char *); /* mhmisc.c */ int part_ok(CT, int); int type_ok(CT, int); void set_endian(void); void flush_errors(void); /* mhshowsbr.c */ void show_all_messages(CT *); /* mhfree.c */ void free_content(CT); extern CT *cts; void freects_done(); /* ** static prototypes */ static void pipeser(int); static void m_popen(char *); static void m_pclose(void); int main(int argc, char **argv) { int msgnum; char *cp, *file = NULL, *folder = NULL; char *maildir, buf[100], **argp; char **arguments; struct msgs_array msgs = { 0, 0, NULL }; struct msgs *mp = NULL; CT ct, *ctp; FILE *fp; int ontty = 0; if (atexit(freects_done) != 0) { adios(EX_OSERR, NULL, "atexit failed"); } setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); if (mh_strcasecmp(invo_name, "next")==0) { mode = NEXT; } else if (mh_strcasecmp(invo_name, "prev")==0) { mode = PREV; } /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; /* ** Parse arguments */ while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] %s[switches]", invo_name, mode==SHOW ? "[msgs] " : ""); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case PARTSW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); if (npart >= NPARTS) adios(EX_USAGE, NULL, "too many parts (starting with %s), %d max", cp, NPARTS); parts[npart++] = cp; continue; case TYPESW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); if (ntype >= NTYPES) adios(EX_USAGE, NULL, "too many types (starting with %s), %d max", cp, NTYPES); types[ntype++] = cp; continue; case FILESW: if (mode != SHOW) { adios(EX_USAGE, NULL, "Either call show as `%s' or use -file", invo_name); } if (!(cp = *argp++) || (*cp == '-' && cp[1])) adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); file = *cp == '-' ? cp : mh_xstrdup(expanddir(cp)); continue; case FORMSW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); if (formsw) mh_free0(&formsw); formsw = mh_xstrdup(etcpath(cp)); continue; case VERBSW: verbosw = 1; continue; case NVERBSW: verbosw = 0; continue; case DEBUGSW: debugsw = 1; continue; } } if (*cp == '+' || *cp == '@') { if (folder) adios(EX_USAGE, NULL, "only one folder at a time!"); else folder = mh_xstrdup(expandfol(cp)); } else if (mode != SHOW) { adios(EX_USAGE, NULL, "Either call show as `%s' or give message arguments", invo_name); } else { app_msgarg(&msgs, cp); } } /* null terminate the list of acceptable parts/types */ parts[npart] = NULL; types[ntype] = NULL; set_endian(); if ((cp = getenv("MM_NOASK")) && strcmp(cp, "1")==0) { nolist = 1; } /* ** Check if we've specified an additional profile */ if ((cp = getenv("MHSHOW"))) { if ((fp = fopen(cp, "r"))) { readconfig((struct node **) 0, fp, cp, 0); fclose(fp); } else { admonish("", "unable to read $MHSHOW profile (%s)", cp); } } /* ** Read the standard profile setup */ if ((fp = fopen(cp = etcpath("mhn.defaults"), "r"))) { readconfig((struct node **) 0, fp, cp, 0); fclose(fp); } /* ** Check for storage directory. If specified, ** then store temporary files there. Else we ** store them in standard nmh directory. */ if ((cp = context_find(nmhstorage)) && *cp) tmp = concat(cp, "/", invo_name, NULL); else tmp = mh_xstrdup(toabsdir(invo_name)); if (file && msgs.size) adios(EX_USAGE, NULL, "cannot specify msg and file at same time!"); /* ** check if message is coming from file */ if (file) { cts = mh_xcalloc(2, sizeof(*cts)); ctp = cts; if ((ct = parse_mime(file))) *ctp++ = ct; } else { /* ** message(s) are coming from a folder */ if (!msgs.size) { switch (mode) { case NEXT: app_msgarg(&msgs, seq_next); break; case PREV: app_msgarg(&msgs, seq_prev); break; default: app_msgarg(&msgs, seq_cur); break; } } if (!folder) folder = getcurfol(); maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) adios(EX_OSERR, maildir, "unable to change directory to"); /* read folder and create message structure */ if (!(mp = folder_read(folder))) adios(EX_IOERR, NULL, "unable to read folder %s", folder); /* check for empty folder */ if (mp->nummsg == 0) adios(EX_DATAERR, NULL, "no messages in %s", folder); /* parse all the message ranges/sequences and set SELECTED */ for (msgnum = 0; msgnum < msgs.size; msgnum++) if (!m_convert(mp, msgs.msgs[msgnum])) exit(EX_USAGE); /* ** Set the SELECT_UNSEEN bit for all the SELECTED messages, ** since we will use that as a tag to know which messages ** to remove from the "unseen" sequence. */ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) if (is_selected(mp, msgnum)) set_unseen(mp, msgnum); seq_setprev(mp); /* set the Previous-Sequence */ seq_setunseen(mp, 0); /* unset unseen seqs for shown msgs */ cts = mh_xcalloc(mp->numsel + 1, sizeof(*cts)); ctp = cts; /* ** Parse all the SELECTED messages. */ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (is_selected(mp, msgnum)) { char *msgnam; msgnam = m_name(msgnum); if ((ct = parse_mime(msgnam))) *ctp++ = ct; } } } if (!*cts) exit(EX_SOFTWARE); userrs = 1; SIGNAL(SIGQUIT, quitser); SIGNAL(SIGPIPE, pipeser); /* ** Get the associated umask for the relevant contents. */ for (ctp = cts; *ctp; ctp++) { struct stat st; ct = *ctp; if (type_ok(ct, 1) && !ct->c_umask) { if (stat(ct->c_file, &st) != NOTOK) ct->c_umask = ~(st.st_mode & 0777); else ct->c_umask = ~m_gmprot(); } } if ((ontty = isatty(fileno(stdout)))) { m_popen(defaultpager); } /* ** Show the message content */ show_all_messages(cts); if (ontty) { m_pclose(); } /* Now free all the structures for the content */ for (ctp = cts; *ctp; ctp++) free_content(*ctp); mh_free0(&cts); /* If reading from a folder, do some updating */ if (mp) { context_replace(curfolder, folder); /* update current folder */ seq_setcur(mp, mp->hghsel); /* update current message */ seq_save(mp); /* synchronize sequences */ context_save(); /* save the context file */ } return 0; } static void pipeser(int i) { if (i == SIGQUIT) { unlink("core"); fflush(stdout); fprintf(stderr, "\n"); fflush(stderr); } _exit(EX_IOERR); /* NOTREACHED */ } static int m_pid = NOTOK; static int sd = NOTOK; static void m_popen(char *name) { int pd[2]; if ((sd = dup(fileno(stdout))) == NOTOK) adios(EX_OSERR, "standard output", "unable to dup()"); if (pipe(pd) == NOTOK) adios(EX_OSERR, "pipe", "unable to"); switch (m_pid = fork()) { case NOTOK: adios(EX_OSERR, "fork", "unable to"); case OK: SIGNAL(SIGINT, SIG_DFL); SIGNAL(SIGQUIT, SIG_DFL); close(pd[1]); if (pd[0] != fileno(stdin)) { dup2(pd[0], fileno(stdin)); close(pd[0]); } execlp(name, mhbasename(name), NULL); fprintf(stderr, "unable to exec "); perror(name); _exit(EX_OSERR); default: close(pd[0]); if (pd[1] != fileno(stdout)) { dup2(pd[1], fileno(stdout)); close(pd[1]); } } } void m_pclose(void) { if (m_pid == NOTOK) return; if (sd != NOTOK) { fflush(stdout); if (dup2(sd, fileno(stdout)) == NOTOK) adios(EX_OSERR, "standard output", "unable to dup2()"); clearerr(stdout); close(sd); sd = NOTOK; } else fclose(stdout); pidwait(m_pid, OK); m_pid = NOTOK; } mmh-0.4/uip/mark.c0000644000000000000000000001452313414435726012545 0ustar rootroot/* ** mark.c -- add message(s) to sequences in given folder ** -- delete messages (s) from sequences in given folder ** -- list sequences in given folder ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include static struct swit switches[] = { #define ADDSW 0 { "add", 0 }, #define DELSW 1 { "delete", 0 }, #define LSTSW 2 { "list", 0 }, #define SEQSW 3 { "sequence name", 0 }, #define PUBLSW 4 { "public", 0 }, #define NPUBLSW 5 { "nopublic", 2 }, #define ZEROSW 6 { "zero", 0 }, #define NZEROSW 7 { "nozero", 2 }, #define VERSIONSW 8 { "Version", 0 }, #define HELPSW 9 { "help", 0 }, #define DEBUGSW 10 { "debug", -5 }, { NULL, 0 } }; char *version=VERSION; /* ** static prototypes */ static void print_debug(struct msgs *); static void seq_printdebug(struct msgs *); int main(int argc, char **argv) { int addsw = 0, deletesw = 0, debugsw = 0; int listsw = 0, publicsw = -1, zerosw = 0, msgnum; unsigned int seqp = 0; char *cp, *maildir, *folder = NULL, buf[BUFSIZ]; char **argp, **arguments; char *seqs[NUMATTRS + 1]; struct msgs_array msgs = { 0, 0, NULL }; struct msgs *mp; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; /* ** Parse arguments */ while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown\n", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case ADDSW: addsw++; deletesw = listsw = 0; continue; case DELSW: deletesw++; addsw = listsw = 0; continue; case LSTSW: listsw++; addsw = deletesw = 0; continue; case SEQSW: if (!(cp = *argp++) || *cp == '-') { adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); } /* check if too many sequences specified */ if (seqp >= NUMATTRS) { adios(EX_USAGE, NULL, "too many sequences (more than %d) specified", NUMATTRS); } seqs[seqp++] = cp; continue; case PUBLSW: publicsw = 1; continue; case NPUBLSW: publicsw = 0; continue; case DEBUGSW: debugsw++; continue; case ZEROSW: zerosw++; continue; case NZEROSW: zerosw = 0; continue; } } if (*cp == '+' || *cp == '@') { if (folder) { adios(EX_USAGE, NULL, "only one folder at a time!"); } else { folder = mh_xstrdup(expandfol(cp)); } } else { app_msgarg(&msgs, cp); } } /* ** If we haven't specified -add, -delete, or -list, ** then use -add if a sequence was specified, else ** use -list. */ if (!addsw && !deletesw && !listsw) { if (seqp) addsw++; else listsw++; } if (!msgs.size) app_msgarg(&msgs, listsw ? seq_all : seq_cur); if (!folder) folder = getcurfol(); maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) { adios(EX_OSERR, maildir, "unable to change directory to"); } /* read folder and create message structure */ if (!(mp = folder_read(folder))) { adios(EX_IOERR, NULL, "unable to read folder %s", folder); } /* print some general debugging info */ if (debugsw) print_debug(mp); /* check for empty folder */ if (mp->nummsg == 0) { adios(EX_DATAERR, NULL, "no messages in %s", folder); } /* parse all the message ranges/sequences and set SELECTED */ for (msgnum = 0; msgnum < msgs.size; msgnum++) { if (!m_convert(mp, msgs.msgs[msgnum])) { exit(EX_USAGE); } } if (publicsw == 1 && is_readonly(mp)) { adios(EX_NOPERM, NULL, "folder %s is read-only, so -public not allowed", folder); } /* ** Make sure at least one sequence has been ** specified if we are adding or deleting. */ if (seqp == 0 && (addsw || deletesw)) { adios(EX_USAGE, NULL, "-%s requires at least one -sequence argument", addsw ? "add" : "delete"); } seqs[seqp] = NULL; /* Adding messages to sequences */ if (addsw) { for (seqp = 0; seqs[seqp]; seqp++) { if (!seq_addsel(mp, seqs[seqp], publicsw, zerosw)) { exit(EX_SOFTWARE); } } } /* Deleting messages from sequences */ if (deletesw) { for (seqp = 0; seqs[seqp]; seqp++) { if (!seq_delsel(mp, seqs[seqp], publicsw, zerosw)) { exit(EX_SOFTWARE); } } } /* Listing messages in sequences */ if (listsw) { if (seqp) { /* print the sequences given */ for (seqp = 0; seqs[seqp]; seqp++) seq_print(mp, seqs[seqp]); } else { /* else print them all */ seq_printall(mp); } /* print debugging info about SELECTED messages */ if (debugsw) seq_printdebug(mp); } seq_save(mp); /* synchronize message sequences */ context_replace(curfolder, folder); /* update current folder */ context_save(); /* save the context file */ folder_free(mp); /* free folder/message structure */ return EX_OK; } /* ** Print general debugging info */ static void print_debug(struct msgs *mp) { char buf[100]; printf("invo_name = %s\n", invo_name); printf("mypath = %s\n", mypath); printf("defpath = %s\n", defpath); printf("ctxpath = %s\n", ctxpath); printf("context flags = %s\n", snprintb(buf, sizeof(buf), (unsigned) ctxflags, DBITS)); printf("foldpath = %s\n", mp->foldpath); printf("folder flags = %s\n\n", snprintb(buf, sizeof(buf), (unsigned) mp->msgflags, FBITS)); printf("lowmsg=%d hghmsg=%d nummsg=%d curmsg=%d\n", mp->lowmsg, mp->hghmsg, mp->nummsg, mp->curmsg); printf("lowsel=%d hghsel=%d numsel=%d\n", mp->lowsel, mp->hghsel, mp->numsel); printf("lowoff=%d hghoff=%d\n\n", mp->lowoff, mp->hghoff); } /* ** Print debugging info about all the SELECTED ** messages and the sequences they are in. */ static void seq_printdebug(struct msgs *mp) { int msgnum; char buf[100]; printf("\n"); for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (is_selected(mp, msgnum)) printf("%*d: %s\n", DMAXFOLDER, msgnum, snprintb(buf, sizeof(buf), (unsigned) mp->msgstats[msgnum - mp->lowoff], seq_bits(mp))); } } mmh-0.4/uip/repl.c0000644000000000000000000003752613414435726012565 0ustar rootroot/* ** repl.c -- reply to a message ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include /* L_SET */ #include #include #include #include #include #include static struct swit switches[] = { #define GROUPSW 0 { "group", 0 }, #define NGROUPSW 1 { "nogroup", 2 }, #define ANNOSW 2 { "annotate", 0 }, #define NANNOSW 3 { "noannotate", 2 }, #define CCSW 4 { "cc all|to|cc|me", 0 }, #define NCCSW 5 { "nocc type", 2 }, #define EDITRSW 6 { "editor editor", 0 }, #define FILTSW 7 { "filter filterfile", 0 }, #define NFILTSW 8 { "nofilter", 2 }, #define FORMSW 9 { "form formfile", 0 }, #define MIMESW 10 { "mime", 0 }, #define NMIMESW 11 { "nomime", 2 }, #define QURYSW 12 { "query", 0 }, #define NQURYSW 13 { "noquery", 2 }, #define WHATSW 14 { "whatnowproc program", 0 }, #define VERSIONSW 15 { "Version", 0 }, #define HELPSW 16 { "help", 0 }, #define FILESW 17 { "file file", 4 }, /* interface from msh */ #define BILDSW 18 { "build", 5 }, /* interface from mhe */ { NULL, 0 } }; char *version=VERSION; static struct swit ccswitches[] = { #define CTOSW 0 { "to", 0 }, #define CCCSW 1 { "cc", 0 }, #define CMESW 2 { "me", 0 }, #define CALSW 3 { "all", 0 }, { NULL, 0 } }; static short ccto = -1; static short cccc = -1; static short ccme = -1; static short querysw = 0; static short groupreply = 0; /* Is this a group reply? */ static int mime = 0; /* include original as MIME part */ static char *form = NULL; /* form (components) file */ static char *filter = NULL; /* message filter file */ static int dftype=0; static char *badaddrs = NULL; static char *dfhost = NULL; static struct mailname mq; static struct format *fmt; static int ncomps = 0; /* # of interesting components */ static int dat[5]; /* aux. data for format routine */ static char *addrcomps[] = { "from", "sender", "reply-to", "to", "cc", "bcc", "resent-from", "resent-sender", "resent-reply-to", "resent-to", "resent-cc", "resent-bcc", NULL }; /* ** static prototypes */ static void docc(char *, int); static int insert(struct mailname *); static void replfilter(FILE *, FILE *, char *); static void replout(FILE *, char *, struct msgs *, int, char *, char *); int main(int argc, char **argv) { int anot = 0; char *cp, *cwd, *maildir, *file = NULL; char *folder = NULL, *msg = NULL; char *ed = NULL, drft[BUFSIZ], buf[BUFSIZ]; char **argp, **arguments; struct msgs *mp = NULL; FILE *in; int buildsw = 0; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); filter = mh_xstrdup(etcpath(mhlreply)); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s: [+folder] [msg] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case GROUPSW: groupreply++; continue; case NGROUPSW: groupreply = 0; continue; case ANNOSW: anot++; continue; case NANNOSW: anot = 0; continue; case CCSW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); docc(cp, 1); continue; case NCCSW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); docc(cp, 0); continue; case EDITRSW: if (!(ed = *argp++) || *ed == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case WHATSW: if (!(whatnowproc = *argp++) || *whatnowproc == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case BILDSW: buildsw++; continue; case FILESW: if (file) adios(EX_USAGE, NULL, "only one file at a time!"); if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); file = mh_xstrdup(expanddir(cp)); continue; case FORMSW: if (!(form = *argp++) || *form == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case FILTSW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); filter = mh_xstrdup(etcpath(cp)); continue; case NFILTSW: filter = NULL; continue; case MIMESW: mime++; continue; case NMIMESW: mime = 0; continue; case QURYSW: querysw++; continue; case NQURYSW: querysw = 0; continue; } } if (*cp == '+' || *cp == '@') { if (folder) adios(EX_USAGE, NULL, "only one folder at a time!"); else folder = mh_xstrdup(expandfol(cp)); } else { if (msg) adios(EX_USAGE, NULL, "only one message at a time!"); else msg = cp; } } if (ccto == -1) ccto = groupreply; if (cccc == -1) cccc = groupreply; if (ccme == -1) ccme = groupreply; cwd = mh_xstrdup(pwd()); if (file && (msg || folder)) adios(EX_USAGE, NULL, "can't mix files and folders/msgs"); strncpy(drft, buildsw ? toabsdir("reply") : m_draft(seq_beyond), sizeof(drft)); /* ** FIXME: (concerning MHE support (buildsw) only) ** There's no check if the draft already exists. mmh has removed ** this case by having the draft folder. I won't add code only to ** handle this legacy issue for MHE. -- meillo@marmaro.de 2012-05 */ if (file) { /* ** We are replying to a file. */ anot = 0; /* we don't want to annotate a file */ } else { /* ** We are replying to a message. */ if (!msg) msg = seq_cur; if (!folder) folder = getcurfol(); maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) adios(EX_OSERR, maildir, "unable to change directory to"); /* read folder and create message structure */ if (!(mp = folder_read(folder))) adios(EX_IOERR, NULL, "unable to read folder %s", folder); /* check for empty folder */ if (mp->nummsg == 0) adios(EX_DATAERR, NULL, "no messages in %s", folder); /* parse the message range/sequence/name and set SELECTED */ if (!m_convert(mp, msg)) exit(EX_SOFTWARE); seq_setprev(mp); /* set the previous-sequence */ if (mp->numsel > 1) adios(EX_USAGE, NULL, "only one message at a time!"); context_replace(curfolder, folder); /* update current folder */ seq_setcur(mp, mp->lowsel); /* update current message */ seq_save(mp); /* synchronize sequences */ context_save(); /* save the context file */ } msg = file ? file : mh_xstrdup(m_name(mp->lowsel)); if ((in = fopen(msg, "r")) == NULL) adios(EX_IOERR, msg, "unable to open"); /* find form (components) file */ if (!form) { if (groupreply) form = etcpath(replgroupcomps); else form = etcpath(replcomps); } replout(in, drft, mp, mime, form, filter); fclose(in); if (buildsw) exit(EX_OK); what_now(ed, NOUSE, drft, msg, 0, mp, anot ? "Replied" : NULL, cwd); return EX_OSERR; } static void docc(char *cp, int ccflag) { switch (smatch(cp, ccswitches)) { case AMBIGSW: ambigsw(cp, ccswitches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%scc %s unknown", ccflag ? "" : "no", cp); case CTOSW: ccto = ccflag; break; case CCCSW: cccc = ccflag; break; case CMESW: ccme = ccflag; break; case CALSW: ccto = cccc = ccme = ccflag; break; } } static void replout(FILE *inb, char *drft, struct msgs *mp, int mime, char *form, char *filter) { enum state state; struct field f = {{0}}; int i; struct comp *cptr; char **ap; int char_read = 0, format_len, mask; char *scanl; unsigned char *cp; FILE *out; mask = umask(~m_gmprot()); if ((out = fopen(drft, "w")) == NULL) adios(EX_CANTCREAT, drft, "unable to create"); umask(mask); /* get new format string */ cp = new_fs(form, NULL); format_len = strlen(cp); /* compile format string */ ncomps = fmt_compile(cp, &fmt) + 1; for (ap = addrcomps; *ap; ap++) { FINDCOMP(cptr, *ap); if (cptr) cptr->c_type |= CT_ADDR; } /* ** ignore any components killed by command line switches */ if (!ccto) { FINDCOMP(cptr, "to"); if (cptr) cptr->c_name = ""; } if (!cccc) { FINDCOMP(cptr, "cc"); if (cptr) cptr->c_name = ""; } if ((cp = getenv("USER"))) { FINDCOMP(cptr, "user"); if (cptr) cptr->c_text = mh_xstrdup(cp); } if (!ccme) ismymbox(NULL); /* ** pick any interesting stuff out of msg "inb" */ for (state = FLD2;;) { state = m_getfld2(state, &f, inb); switch (state) { case FLD2: /* ** if we're interested in this component, save ** a pointer to the component text, then start ** using our next free buffer as the component ** temp buffer (buffer switching saves an extra ** copy of the component text). */ if ((cptr = wantcomp[CHASH(f.name)])) { do { if (mh_strcasecmp(f.name, cptr->c_name)!=0) { continue; } char_read += strlen(f.value); if (!cptr->c_text) { cptr->c_text = mh_xstrdup(f.value); i = strlen(cptr->c_text) - 1; if (cptr->c_text[i] == '\n') { cptr->c_text[i] = '\0'; } } else { cp = cptr->c_text; i = strlen(cp) - 1; if (cp[i] == '\n') { if (cptr->c_type & CT_ADDR) { cp[i] = '\0'; cp = add(",\n\t", cp); } else { cp = add("\t", cp); } } cptr->c_text = add(f.value, cp); } break; } while ((cptr = cptr->c_next)); } break; case LENERR2: case FMTERR2: case IOERR2: case BODY2: case FILEEOF2: goto finished; default: adios(EX_SOFTWARE, NULL, "m_getfld() returned %d", state); } } /* ** format and output the header lines. */ finished: /* ** if there's a "Subject" component, strip any "Re:"s off it */ FINDCOMP(cptr, "subject") if (cptr && (cp = cptr->c_text)) { char *sp = cp; for (;;) { while (isspace(*cp)) cp++; if(uprf(cp, "re:")) cp += 3; else break; sp = cp; } if (sp != cptr->c_text) { cp = cptr->c_text; cptr->c_text = mh_xstrdup(sp); mh_free0(&cp); } } i = format_len + char_read + 256; scanl = mh_xcalloc(i + 2, sizeof(char)); dat[0] = 0; dat[1] = 0; dat[2] = 0; dat[3] = OUTPUTLINELEN; dat[4] = 0; fmt_scan(fmt, scanl, i, dat); fputs(scanl, out); if (badaddrs) { fputs("\nrepl: bad addresses:\n", out); fputs( badaddrs, out); } /* Check if we should filter the message */ if (filter) { fflush(out); if (ferror(out)) adios(EX_IOERR, drft, "error writing"); replfilter(inb, out, filter); } fflush(out); if (ferror(out)) adios(EX_IOERR, drft, "error writing"); fclose(out); if (mime && mp) { /* add an attachment header */ char buffer[BUFSIZ]; snprintf(buffer, sizeof buffer, "+%s %s", mp->foldpath, m_name(mp->lowsel)); if (execprogl("anno", "anno", "-append", "-nodate", drft, "-comp", attach_hdr, "-text", buffer, (char *)NULL) != 0) { advise(NULL, "unable to add attachment header"); } } /* return dynamically allocated buffers */ mh_free0(&scanl); } static char *buf; /* our current working buffer */ static char *bufend; /* end of working buffer */ static char *last_dst; /* buf ptr at end of last call */ static unsigned int bufsiz=0; /* current size of buf */ #define BUFINCR 512 /* how much to expand buf when if fills */ #define CPY(s) { cp = (s); while ((*dst++ = *cp++)) ; --dst; } /* ** check if there's enough room in buf for str. ** add more mem if needed */ #define CHECKMEM(str) \ if ((len = strlen(str)) >= bufend - dst) {\ int i = dst - buf;\ int n = last_dst - buf;\ bufsiz += ((dst + len - bufend) / BUFINCR + 1) * BUFINCR;\ buf = mh_xrealloc(buf, bufsiz);\ dst = buf + i;\ last_dst = buf + n;\ bufend = buf + bufsiz;\ } /* ** fmt_scan will call this routine if the user includes the function ** "(formataddr {component})" in a format string. "orig" is the ** original contents of the string register. "str" is the address ** string to be formatted and concatenated onto orig. This routine ** returns a pointer to the concatenated address string. ** ** We try to not do a lot of malloc/copy/free's (which is why we ** don't call "mh_xstrdup") but still place no upper limit on the ** length of the result string. ** ** This routine is an override for the equally named one in sbr/fmt_addr.c. ** Don't delete it! */ char * formataddr(char *orig, char *str) { int len; char baddr[BUFSIZ], error[BUFSIZ]; int isgroup; char *dst; char *cp; char *sp; struct mailname *mp = NULL; /* if we don't have a buffer yet, get one */ if (bufsiz == 0) { buf = mh_xcalloc(BUFINCR, sizeof(char)); last_dst = buf; /* XXX */ bufsiz = BUFINCR - 6; /* leave some slop */ bufend = buf + bufsiz; } /* ** If "orig" points to our buffer we can just pick up where we ** left off. Otherwise we have to copy orig into our buffer. */ if (orig == buf) dst = last_dst; else if (!orig || !*orig) { dst = buf; *dst = '\0'; } else { dst = last_dst; /* XXX */ CHECKMEM(orig); CPY(orig); } /* concatenate all the new addresses onto 'buf' */ for (isgroup = 0; (cp = getname(str)); ) { if ((mp = getm(cp, dfhost, dftype, AD_NAME, error)) == NULL) { snprintf(baddr, sizeof(baddr), "\t%s -- %s\n", cp, error); badaddrs = add(baddr, badaddrs); continue; } if (isgroup && (mp->m_gname || !mp->m_ingrp)) { *dst++ = ';'; isgroup = 0; } if (insert(mp)) { /* if we get here we're going to add an address */ if (dst != buf) { *dst++ = ','; *dst++ = ' '; } if (mp->m_gname) { CHECKMEM(mp->m_gname); CPY(mp->m_gname); isgroup++; } sp = adrformat(mp); CHECKMEM(sp); CPY(sp); } } if (isgroup) *dst++ = ';'; *dst = '\0'; last_dst = dst; return (buf); } static int insert(struct mailname *np) { char buffer[BUFSIZ]; struct mailname *mp; if (np->m_mbox == NULL) return 0; for (mp = &mq; mp->m_next; mp = mp->m_next) { if (!mh_strcasecmp(np->m_host, mp->m_next->m_host) && !mh_strcasecmp(np->m_mbox, mp->m_next->m_mbox)) return 0; } if (!ccme && ismymbox(np)) return 0; if (querysw) { snprintf(buffer, sizeof(buffer), "Reply to %s? ", adrformat(np)); if (!gans(buffer, anoyes)) return 0; } mp->m_next = np; return 1; } /* ** Call mhl ** ** This function expects that argument out has been fflushed by the caller. */ static void replfilter(FILE *in, FILE *out, char *filter) { int pid, pid_show, n; int mailpipe[2]; if (filter == NULL) return; if (access(filter, R_OK) == NOTOK) adios(EX_IOERR, filter, "unable to read"); rewind(in); lseek(fileno(in), (off_t) 0, SEEK_SET); switch (pid = fork()) { case NOTOK: adios(EX_OSERR, "fork", "unable to"); case OK: if (pipe(mailpipe) == -1) { adios(EX_OSERR, "pipe", "can't create pipe"); } switch (pid_show = fork()) { case NOTOK: adios(EX_OSERR, "fork", "unable to"); case OK: dup2(fileno(in), STDIN_FILENO); dup2(mailpipe[1], STDOUT_FILENO); close(fileno(in)); close(fileno(out)); close(mailpipe[0]); close(mailpipe[1]); for (n=3; n #include #include #include #include #define NDATES 100 #define FORMAT "=%<(nodate{text})error: %{text}%|%(putstr(pretty{text}))%>" static struct swit switches[] = { #define FORMSW 0 { "form formatfile", 0 }, #define VERSIONSW 1 { "Version", 0 }, #define HELPSW 2 { "help", 0 }, { NULL, 0 } }; char *version=VERSION; static struct format *fmt; static int dat[5]; /* ** static prototypes */ static int process(char *); int main(int argc, char **argv) { int datep = 0, status = 0; char *cp, *form = NULL, *fmtstr; char buf[BUFSIZ], **argp, **arguments; char *dates[NDATES]; setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [switches] dates ...", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case FORMSW: if (!(form = *argp++) || *form == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; } } if (datep > NDATES) adios(EX_USAGE, NULL, "more than %d dates", NDATES); else dates[datep++] = cp; } dates[datep] = NULL; if (datep == 0) adios(EX_USAGE, NULL, "usage: %s [switches] dates ...", invo_name); /* get new format string */ fmtstr = new_fs(form, FORMAT); fmt_compile(fmtstr, &fmt); dat[0] = 0; dat[1] = 0; dat[2] = 0; dat[3] = BUFSIZ; dat[4] = 0; for (datep = 0; dates[datep]; datep++) status += process(dates[datep]); context_save(); /* save the context file */ return status; } static int process(char *date) { int status = 0; char buffer[BUFSIZ + 1]; struct comp *cptr; FINDCOMP(cptr, "text"); if (cptr) cptr->c_text = date; fmt_scan(fmt, buffer, BUFSIZ, dat); fputs(buffer, stdout); return status; } mmh-0.4/uip/mhshowsbr.c0000644000000000000000000004436313414435726013634 0ustar rootroot/* ** mhshowsbr.c -- routines to display the contents of MIME messages ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include #include #include #include #include extern int debugsw; int nolist = 0; char *formsw = NULL; /* mhparse.c */ int pidcheck(int); /* mhmisc.c */ int part_ok(CT, int); int type_ok(CT, int); void content_error(char *, CT, char *, ...); void flush_errors(void); /* mhlistsbr.c */ int list_switch(CT, int, int, int); int list_content(CT, int, int, int); /* ** prototypes */ void show_all_messages(CT *); int show_content_aux(CT, int, char *, char *); /* ** static prototypes */ static void show_single_message(CT, char *); static void DisplayMsgHeader(CT, char *); static int show_switch(CT, int); static int show_content(CT, int); static int show_content_aux2(CT, int, char *, char *, int, int, int); static int show_text(CT, int); static int show_multi(CT, int); static int show_multi_internal(CT, int); static int show_multi_aux(CT, int, char *); static int show_message_rfc822(CT, int); static int show_partial(CT, int); static int show_external(CT, int); /* ** Top level entry point to show/display a group of messages */ void show_all_messages(CT *cts) { CT ct, *ctp; /* ** If form is not specified, then get default form ** for showing headers of MIME messages. */ if (!formsw) formsw = mh_xstrdup(etcpath("mhl.headers")); /* ** If form is "mhl.null", suppress display of header. */ if (strcmp(formsw, "mhl.null")==0) formsw = NULL; for (ctp = cts; *ctp; ctp++) { ct = *ctp; if (!type_ok(ct, 1)) { /* top-level type */ continue; } if (cts[1]) { if (ctp != cts) { printf("\n\n"); } printf(">>> Message %s\n\n", ct->c_file); } show_single_message(ct, formsw); } } /* ** Entry point to show/display a single message */ static void show_single_message(CT ct, char *form) { /* ** Allow user executable bit so that temporary directories created by ** the viewer (e.g., lynx) are going to be accessible */ umask(ct->c_umask & ~(0100)); /* ** If you have a format file, then display ** the message headers. */ if (form) DisplayMsgHeader(ct, form); /* Show the body of the message */ show_switch(ct, 0); if (ct->c_fp) { fclose(ct->c_fp); ct->c_fp = NULL; } if (ct->c_ceclosefnx) (*ct->c_ceclosefnx) (ct); flush_errors(); } /* ** Use mhl to show the header fields */ static void DisplayMsgHeader(CT ct, char *form) { pid_t child_id; int vecp; char *vec[8]; vecp = 0; vec[vecp++] = "mhl"; vec[vecp++] = "-form"; vec[vecp++] = form; vec[vecp++] = "-nobody"; vec[vecp++] = ct->c_file; vec[vecp] = NULL; fflush(stdout); switch (child_id = fork()) { case NOTOK: adios(EX_OSERR, "fork", "unable to"); /* NOTREACHED */ case OK: execvp("mhl", vec); fprintf(stderr, "unable to exec "); perror("mhl"); _exit(EX_OSERR); /* NOTREACHED */ default: pidcheck(pidwait(child_id, NOTOK)); break; } } /* ** Switching routine. Call the correct routine ** based on content type. */ static int show_switch(CT ct, int alternate) { switch (ct->c_type) { case CT_MULTIPART: return show_multi(ct, alternate); break; case CT_MESSAGE: switch (ct->c_subtype) { case MESSAGE_PARTIAL: return show_partial(ct, alternate); break; case MESSAGE_EXTERNAL: return show_external(ct, alternate); break; case MESSAGE_RFC822: default: return show_message_rfc822(ct, alternate); break; } break; case CT_TEXT: return show_text(ct, alternate); break; case CT_AUDIO: case CT_IMAGE: case CT_VIDEO: case CT_APPLICATION: return show_content(ct, alternate); break; default: adios(EX_DATAERR, NULL, "unknown content type %d", ct->c_type); break; } return 0; /* NOT REACHED */ } /* ** Generic method for displaying content */ static int show_content(CT ct, int alternate) { char *cp, buffer[BUFSIZ]; CI ci = &ct->c_ctinfo; /* Check for mhshow-show-type/subtype */ snprintf(buffer, sizeof(buffer), "mhshow-show-%s/%s", ci->ci_type, ci->ci_subtype); if ((cp = context_find(buffer)) && *cp != '\0') return show_content_aux(ct, alternate, cp, NULL); /* Check for mhshow-show-type */ snprintf(buffer, sizeof(buffer), "mhshow-show-%s", ci->ci_type); if ((cp = context_find(buffer)) && *cp != '\0') return show_content_aux(ct, alternate, cp, NULL); if ((cp = ct->c_showproc)) return show_content_aux(ct, alternate, cp, NULL); /* complain if we are not a part of a multipart/alternative */ if (!alternate) return show_content_aux(ct, alternate, "%l", NULL); return NOTOK; } /* ** Parse the display string for displaying generic content */ int show_content_aux(CT ct, int alternate, char *cp, char *cracked) { int fd, len, buflen, quoted; int xstdin, xlist; char *bp, *pp, *file, buffer[BUFSIZ]; CI ci = &ct->c_ctinfo; if (!ct->c_ceopenfnx) { if (!alternate) content_error(NULL, ct, "don't know how to decode content"); return NOTOK; } file = NULL; if ((fd = (*ct->c_ceopenfnx) (ct, &file)) == NOTOK) return NOTOK; if (ct->c_showproc && strcmp(ct->c_showproc, "true")==0) return (alternate ? DONE : OK); xlist = 0; xstdin = 0; if (cracked) { strncpy(buffer, cp, sizeof(buffer)); goto got_command; } /* get buffer ready to go */ bp = buffer; buflen = sizeof(buffer) - 1; bp[0] = bp[buflen] = '\0'; quoted = 0; /* Now parse display string */ for ( ; *cp && buflen > 0; cp++) { if (*cp == '%') { pp = bp; switch (*++cp) { case 'a': /* insert parameters from Content-Type field */ { char **ap, **ep; char *s = ""; for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) { snprintf(bp, buflen, "%s%s=\"%s\"", s, *ap, *ep); len = strlen(bp); bp += len; buflen -= len; s = " "; } } break; case 'c': /* insert charset */ strncpy(bp, ct->c_charset ? ct->c_charset : "US-ASCII", buflen); break; case 'd': /* insert content description */ if (ct->c_descr) { char *s; s = trimcpy(ct->c_descr); strncpy(bp, s, buflen); mh_free0(&s); } break; case 'F': /* %f, and stdin is terminal not content */ xstdin = 1; /* and fall... */ case 'f': /* insert filename containing content */ snprintf(bp, buflen, "'%s'", file); /* ** since we've quoted the file argument, ** set things up to look past it, to avoid ** problems with the quoting logic below. ** (I know, I should figure out what's ** broken with the quoting logic, but..) */ len = strlen(bp); buflen -= len; bp += len; pp = bp; break; case 'l': /* ** display listing prior to displaying content */ xlist = !nolist; break; case 's': /* insert subtype of content */ strncpy(bp, ci->ci_subtype, buflen); break; case '%': /* insert character % */ goto raw; default: *bp++ = *--cp; *bp = '\0'; buflen--; continue; } len = strlen(bp); bp += len; buflen -= len; /* Did we actually insert something? */ if (bp != pp) { /* ** Insert single quote if not inside quotes ** already */ if (!quoted && buflen) { len = strlen(pp); memmove(pp + 1, pp, len); *pp++ = '\''; buflen--; bp++; } /* Escape existing quotes */ while ((pp = strchr(pp, '\'')) && buflen > 3) { len = strlen(pp++); memmove(pp + 3, pp, len); *pp++ = '\\'; *pp++ = '\''; *pp++ = '\''; buflen -= 3; bp += 3; } /* ** If pp is still set, that means we ran ** out of space. */ if (pp) buflen = 0; if (!quoted && buflen) { *bp++ = '\''; *bp = '\0'; buflen--; } } } else { raw: *bp++ = *cp; *bp = '\0'; buflen--; if (*cp == '\'') quoted = !quoted; } } got_command: return show_content_aux2(ct, alternate, cracked, buffer, fd, xlist, xstdin); } /* ** Routine to actually display the content */ static int show_content_aux2(CT ct, int alternate, char *cracked, char *buffer, int fd, int xlist, int xstdin) { pid_t child_id; if (debugsw || cracked) { fflush(stdout); fprintf(stderr, "%s msg %s", cracked ? "storing" : "show", ct->c_file); if (ct->c_partno) fprintf(stderr, " part %s", ct->c_partno); if (cracked) fprintf(stderr, " using command (cd %s; %s)\n", cracked, buffer); else fprintf(stderr, " using command %s\n", buffer); } if (xlist) { if (ct->c_type == CT_MULTIPART) list_content(ct, -1, 0, 0); else list_switch(ct, -1, 0, 0); } fflush(stdout); switch (child_id = fork()) { case NOTOK: advise("fork", "unable to"); (*ct->c_ceclosefnx) (ct); return NOTOK; case OK: if (cracked) chdir(cracked); if (!xstdin) dup2(fd, 0); close(fd); execlp("/bin/sh", "/bin/sh", "-c", buffer, NULL); fprintf(stderr, "unable to exec "); perror("/bin/sh"); _exit(EX_OSERR); /* NOTREACHED */ default: pidcheck(pidXwait(child_id, NULL)); if (fd != NOTOK) (*ct->c_ceclosefnx) (ct); return (alternate ? DONE : OK); } } /* ** show content of type "text" */ static int show_text(CT ct, int alternate) { char *cp, buffer[BUFSIZ]; CI ci = &ct->c_ctinfo; /* Check for mhshow-show-type/subtype */ snprintf(buffer, sizeof(buffer), "mhshow-show-%s/%s", ci->ci_type, ci->ci_subtype); if ((cp = context_find(buffer)) && *cp != '\0') return show_content_aux(ct, alternate, cp, NULL); /* Check for mhshow-show-type */ snprintf(buffer, sizeof(buffer), "mhshow-show-%s", ci->ci_type); if ((cp = context_find(buffer)) && *cp != '\0') return show_content_aux(ct, alternate, cp, NULL); /* ** Use default method if content is text/plain, or if ** if it is not a text part of a multipart/alternative */ if (!alternate || ct->c_subtype == TEXT_PLAIN) { if (ct->c_charset && !is_native_charset(ct->c_charset)) { snprintf(buffer, sizeof(buffer), "%%liconv -f '%s'", ct->c_charset); } else { snprintf(buffer, sizeof(buffer), "%%lcat"); } ct->c_showproc = mh_xstrdup(buffer); return show_content_aux(ct, alternate, ct->c_showproc, NULL); } return NOTOK; } /* ** show message body of type "multipart" */ static int show_multi(CT ct, int alternate) { char *cp, buffer[BUFSIZ]; CI ci = &ct->c_ctinfo; /* Check for mhshow-show-type/subtype */ snprintf(buffer, sizeof(buffer), "mhshow-show-%s/%s", ci->ci_type, ci->ci_subtype); if ((cp = context_find(buffer)) && *cp != '\0') return show_multi_aux(ct, alternate, cp); /* Check for mhshow-show-type */ snprintf(buffer, sizeof(buffer), "mhshow-show-%s", ci->ci_type); if ((cp = context_find(buffer)) && *cp != '\0') return show_multi_aux(ct, alternate, cp); if ((cp = ct->c_showproc)) return show_multi_aux(ct, alternate, cp); /* ** Use default method to display this multipart content ** if it is not a (nested) part of a multipart/alternative, ** or if it is one of the known subtypes of multipart. */ if (!alternate || ct->c_subtype != MULTI_UNKNOWN) return show_multi_internal(ct, alternate); return NOTOK; } /* ** show message body of subtypes of multipart that ** we understand directly (mixed, alternate, etc...) */ static int show_multi_internal(CT ct, int alternate) { int alternating, nowalternate, result; struct multipart *m = (struct multipart *) ct->c_ctparams; struct part *part; CT p; alternating = 0; nowalternate = alternate; if (ct->c_subtype == MULTI_ALTERNATE) { nowalternate = 1; alternating = 1; } /* ** Other possible multipart types are: ** - multipart/parallel ** - multipart/mixed ** - multipart/digest ** - unknown subtypes of multipart (treat as mixed per rfc2046) */ /* ** alternate -> we are a part inside an multipart/alternative ** alternating -> we are a multipart/alternative */ result = alternate ? NOTOK : OK; for (part = m->mp_parts; part; part = part->mp_next) { p = part->mp_part; if (part_ok(p, 1) && type_ok(p, 1)) { int inneresult; inneresult = show_switch(p, nowalternate); switch (inneresult) { case NOTOK: if (alternate && !alternating) { result = NOTOK; goto out; } continue; case OK: case DONE: if (alternating) { result = DONE; break; } if (alternate) { alternate = nowalternate = 0; if (result == NOTOK) result = inneresult; } continue; } break; } } if (alternating && !part) { if (!alternate) content_error(NULL, ct, "don't know how to display any of the contents"); result = NOTOK; goto out; } out: return result; } /* ** Parse display string for multipart content ** and use external program to display it. */ static int show_multi_aux(CT ct, int alternate, char *cp) { int len, buflen, quoted; int xlist; char *bp, *pp, *file, buffer[BUFSIZ]; struct multipart *m = (struct multipart *) ct->c_ctparams; struct part *part; CI ci = &ct->c_ctinfo; CT p; for (part = m->mp_parts; part; part = part->mp_next) { p = part->mp_part; if (!p->c_ceopenfnx) { if (!alternate) content_error(NULL, p, "don't know how to decode content"); return NOTOK; } if (p->c_storage == NULL) { file = NULL; if ((*p->c_ceopenfnx) (p, &file) == NOTOK) return NOTOK; /* I'm not sure if this is necessary? */ p->c_storage = mh_xstrdup(file); if (p->c_showproc && strcmp(p->c_showproc, "true")==0) return (alternate ? DONE : OK); (*p->c_ceclosefnx) (p); } } xlist = 0; /* get buffer ready to go */ bp = buffer; buflen = sizeof(buffer) - 1; bp[0] = bp[buflen] = '\0'; quoted = 0; /* Now parse display string */ for ( ; *cp && buflen > 0; cp++) { if (*cp == '%') { pp = bp; switch (*++cp) { case 'a': /* insert parameters from Content-Type field */ { char **ap, **ep; char *s = ""; for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) { snprintf(bp, buflen, "%s%s=\"%s\"", s, *ap, *ep); len = strlen(bp); bp += len; buflen -= len; s = " "; } } break; case 'c': /* insert charset */ strncpy(bp, ct->c_charset ? ct->c_charset : "US-ASCII", buflen); break; case 'd': /* insert content description */ if (ct->c_descr) { char *s; s = trimcpy(ct->c_descr); strncpy(bp, s, buflen); mh_free0(&s); } break; case 'F': case 'f': /* insert filename(s) containing content */ { char *s = ""; for (part = m->mp_parts; part; part = part->mp_next) { p = part->mp_part; snprintf(bp, buflen, "%s'%s'", s, p->c_storage); len = strlen(bp); bp += len; buflen -= len; s = " "; } /* ** set our starting pointer back to bp, ** to avoid requoting the filenames we ** just added */ pp = bp; } break; case 'l': /* ** display listing prior to displaying content */ xlist = !nolist; break; case 's': /* insert subtype of content */ strncpy(bp, ci->ci_subtype, buflen); break; case '%': /* insert character % */ goto raw; default: *bp++ = *--cp; *bp = '\0'; buflen--; continue; } len = strlen(bp); bp += len; buflen -= len; /* Did we actually insert something? */ if (bp != pp) { /* ** Insert single quote if not inside quotes ** already */ if (!quoted && buflen) { len = strlen(pp); memmove(pp + 1, pp, len); *pp++ = '\''; buflen--; bp++; } /* Escape existing quotes */ while ((pp = strchr(pp, '\'')) && buflen > 3) { len = strlen(pp++); memmove(pp + 3, pp, len); *pp++ = '\\'; *pp++ = '\''; *pp++ = '\''; buflen -= 3; bp += 3; } /* ** If pp is still set, that means we ran ** out of space. */ if (pp) buflen = 0; if (!quoted && buflen) { *bp++ = '\''; *bp = '\0'; buflen--; } } } else { raw: *bp++ = *cp; *bp = '\0'; buflen--; if (*cp == '\'') quoted = !quoted; } } return show_content_aux2(ct, alternate, NULL, buffer, NOTOK, xlist, 0); } /* ** show content of type "message/rfc822" */ static int show_message_rfc822(CT ct, int alternate) { char *cp, buffer[BUFSIZ]; CI ci = &ct->c_ctinfo; /* Check for mhshow-show-type/subtype */ snprintf(buffer, sizeof(buffer), "mhshow-show-%s/%s", ci->ci_type, ci->ci_subtype); if ((cp = context_find(buffer)) && *cp != '\0') return show_content_aux(ct, alternate, cp, NULL); /* Check for mhshow-show-type */ snprintf(buffer, sizeof(buffer), "mhshow-show-%s", ci->ci_type); if ((cp = context_find(buffer)) && *cp != '\0') return show_content_aux(ct, alternate, cp, NULL); if ((cp = ct->c_showproc)) return show_content_aux(ct, alternate, cp, NULL); /* default method for message/rfc822 */ if (ct->c_subtype == MESSAGE_RFC822) { cp = (ct->c_showproc = mh_xstrdup("%lshow -file %F")); return show_content_aux(ct, alternate, cp, NULL); } /* complain if we are not a part of a multipart/alternative */ if (!alternate) return show_content_aux(ct, alternate, "%l", NULL); return NOTOK; } /* ** Show content of type "message/partial". */ static int show_partial(CT ct, int alternate) { show_content_aux(ct, alternate, "%l", NULL); puts("in order to display this message, you must reassemble it"); return NOTOK; } /* ** Show how to retrieve content of type "message/external". */ static int show_external(CT ct, int alternate) { char **ap, **ep; char *msg; FILE *fp; char buf[BUFSIZ]; msg = add("You need to fetch the contents yourself:\n", NULL); ap = ct->c_ctinfo.ci_attrs; ep = ct->c_ctinfo.ci_values; for (; *ap; ap++, ep++) { msg = add(concat("\t", *ap, ": ", *ep, NULL), msg); } if (!(fp = fopen(ct->c_file, "r"))) { adios(EX_IOERR, ct->c_file, "unable to open"); } fseek(fp, ct->c_begin, SEEK_SET); while (!feof(fp) && ftell(fp) < ct->c_end) { if (!fgets(buf, sizeof buf, fp)) { adios(EX_IOERR, ct->c_file, "unable to read"); } *strchr(buf, '\n') = '\0'; if (!*buf) { continue; /* skip empty lines */ } msg = add(concat("\t", buf, "\n", NULL), msg); } fclose(fp); show_content_aux(ct, alternate, "%l", NULL); fputs(msg, stdout); return OK; } mmh-0.4/uip/dropsbr.c0000644000000000000000000000752013414435726013265 0ustar rootroot/* ** dropsbr.c -- append to mbox files ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #include #include #include #include #include #include #include #include #include /* ** Main entry point to open/create and lock ** a file or maildrop. */ int mbox_open(char *file, uid_t uid, gid_t gid, mode_t mode) { int i, count, fd; struct stat st; i = 0; /* attempt to open and lock file */ for (count = 4; count > 0; count--) { if ((fd = lkopen(file, O_RDWR | O_CREAT | O_NONBLOCK, mode)) == NOTOK) { switch (errno) { #if defined(FCNTL_LOCKING) || defined(LOCKF_LOCKING) case EACCES: case EAGAIN: #endif #ifdef FLOCK_LOCKING case EWOULDBLOCK: #endif case ETXTBSY: i = errno; sleep(1); continue; default: /* just return error */ return NOTOK; } } /* good file descriptor */ break; } errno = i; /* ** Return if we still failed after 4 attempts, ** or we just want to skip the sanity checks. */ if (fd == NOTOK) return fd; /* Do sanity checks on maildrop. */ if (fstat(fd, &st) == NOTOK) { /* ** The stat failed. So we make sure file ** has right ownership/modes */ chown(file, uid, gid); chmod(file, mode); } else if (st.st_size > (off_t) 0) { int status; /* Check/prepare MBOX style maildrop for appending. */ if (lseek(fd, (off_t) 0, SEEK_END) == (off_t) NOTOK) { status = NOTOK; } else { status = OK; } /* if error, attempt to close it */ if (status == NOTOK) { close(fd); return NOTOK; } } return fd; } /* ** Append message to end of mbox. */ int mbox_copy(int to, int from) { int i; char buffer[BUFSIZ]; FILE *fp; if ((i = dup(from)) == NOTOK) return NOTOK; if ((fp = fdopen(i, "r")) == NULL) { close(i); return NOTOK; } for (i = 0; fgets(buffer, sizeof(buffer), fp) != NULL; i++) { /* ** Check the first line, and make some changes. */ if (i == 0) { /* ** Change the "Return-Path:" field ** (if in first line) back to "From ". */ if (strncmp(buffer, "Return-Path:", 12)==0) { char tmpbuffer[BUFSIZ]; char *tp, *ep, *fp; strncpy(tmpbuffer, buffer, sizeof(tmpbuffer)); ep = tmpbuffer + 13; if (!(fp = strchr(ep + 1, ' '))) fp = strchr(ep + 1, '\n'); tp = dctime(dlocaltimenow()); snprintf(buffer, sizeof(buffer), "From %.*s %s", (int)(fp-ep), ep, tp); } else if (strncmp(buffer, "X-Envelope-From:", 16)==0) { /* ** Change the "X-Envelope-From:" field ** (if first line) back to "From ". */ char tmpbuffer[BUFSIZ]; char *ep; strncpy(tmpbuffer, buffer, sizeof(tmpbuffer)); ep = tmpbuffer + 17; snprintf(buffer, sizeof(buffer), "From %s", ep); } else if (strncmp(buffer, "From ", 5)!=0) { /* ** If there is already a "From " line, ** then leave it alone. Else we add one. */ char tmpbuffer[BUFSIZ]; char *tp, *ep; strncpy(tmpbuffer, buffer, sizeof(tmpbuffer)); ep = "nobody@nowhere"; tp = dctime(dlocaltimenow()); snprintf(buffer, sizeof(buffer), "From %s %s%s", ep, tp, tmpbuffer); } } /* ** If this is not first line, and begins with "From ", ** then prepend line with ">". (`mboxo' format is used.) */ if (i != 0 && strncmp(buffer, "From ", 5) == 0) { write(to, ">", 1); } if (write(to, buffer, strlen(buffer)) != (int)strlen(buffer)) { fclose(fp); return NOTOK; } } if (write(to, "\n", 1) != 1) { fclose(fp); return NOTOK; } fclose(fp); lseek(from, (off_t) 0, SEEK_END); return OK; } /* ** Close and unlock file/maildrop. */ int mbox_close(char *mailbox, int md) { if (lkclose(md, mailbox) == 0) return OK; return NOTOK; } mmh-0.4/uip/anno.c0000644000000000000000000003641713414435726012554 0ustar rootroot/* ** anno.c -- annotate messages ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. ** ** Three new options have been added: delete, list, and number. Adding ** features to generalize the anno command seemed to be a better approach ** than the creation of a new command whose features would overlap with ** those of the anno command. */ #include #include #include #include #include #include #include #include #include #include #include static enum { MODE_ADD, MODE_DEL, MODE_LIST } mode = MODE_ADD; static struct swit switches[] = { #define COMPSW 0 { "component field", 0 }, #define DATESW 1 { "date", 0 }, #define NDATESW 2 { "nodate", 2 }, #define TEXTSW 3 { "text body", 0 }, #define VERSIONSW 4 { "Version", 0 }, #define HELPSW 5 { "help", 0 }, #define LISTSW 6 { "list", 0 }, #define DELETESW 7 { "delete", 0 }, #define NUMBERSW 8 { "number", 0 }, #define APPENDSW 9 { "append", 0 }, #define PRESERVESW 10 { "preserve", 0 }, #define NOPRESERVESW 11 { "nopreserve", 2 }, { NULL, 0 } }; char *version=VERSION; /* ** static prototypes */ static void make_comp(unsigned char **); static int annotate(char *, unsigned char *, char *, int, int, int, int); static void annolist(char *, unsigned char *, int); static void dodel(int, unsigned char *, char *, FILE *, int); static void doadd(int, unsigned char *, char *, FILE *, int, int); int main(int argc, char **argv) { int datesw = 1; int preserve = 0; int msgnum; char *cp, *maildir; unsigned char *comp = NULL; char *text = NULL, *folder = NULL, buf[BUFSIZ]; char *file = NULL; char **argp, **arguments; struct msgs_array msgs = { 0, 0, NULL }; struct msgs *mp; int append = 0; /* append annotations instead of default prepend */ int number = 0; /* delete specific number of like elements if set */ setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case DELETESW: /* delete annotations */ mode = MODE_DEL; continue; case LISTSW: /* produce a listing */ mode = MODE_LIST; continue; case COMPSW: if (comp) adios(EX_USAGE, NULL, "only one component at a time!"); if (!(comp = *argp++) || *comp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case TEXTSW: if (text) adios(EX_USAGE, NULL, "only one body at a time!"); if (!(text = *argp++) || *text == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case NUMBERSW: /* number listing or delete by number */ if (mode == MODE_ADD) { adios(EX_USAGE, NULL, "-number switch must appear after -list or -delete, only."); } if (mode == MODE_LIST) { number = 1; continue; } /* MODE_DEL */ if (number) { adios(EX_USAGE, NULL, "only one number at a time!"); } if (*argp && strcmp(*argp, "all")==0) { number = -1; argp++; continue; } if (!*argp || !(number = atoi(*argp))) { adios(EX_USAGE, NULL, "missing argument to %s", argp[-1]); } if (number < 0) { adios(EX_USAGE, NULL, "invalid number (%d).", number); } argp++; continue; case DATESW: datesw++; continue; case NDATESW: datesw = 0; continue; case APPENDSW: append = 1; continue; case PRESERVESW: preserve = 1; continue; case NOPRESERVESW: preserve = 0; continue; } } if (*cp == '+' || *cp == '@') { if (folder) adios(EX_USAGE, NULL, "only one folder at a time!"); else folder = mh_xstrdup(expandfol(cp)); } else if (*cp == '/' || *cp == '.') { if (file) adios(EX_USAGE, NULL, "only one file at a time!"); file = cp; } else { app_msgarg(&msgs, cp); } } if (file && (folder || msgs.size)) { adios(EX_USAGE, NULL, "Don't intermix files and messages."); } if (!datesw && !text) { adios(EX_USAGE, NULL, "-nodate without -text is a no-op."); } if (number && text) { adios(EX_USAGE, NULL, "Don't combine -number with -text."); } if (file) { if (mode == MODE_LIST) annolist(file, comp, number); else annotate(file, comp, text, datesw, number, append, preserve); exit(EX_OK); } if (!msgs.size) app_msgarg(&msgs, seq_cur); if (!folder) folder = getcurfol(); maildir = toabsdir(folder); if (chdir(maildir) == NOTOK) adios(EX_OSERR, maildir, "unable to change directory to"); /* read folder and create message structure */ if (!(mp = folder_read(folder))) adios(EX_IOERR, NULL, "unable to read folder %s", folder); /* check for empty folder */ if (mp->nummsg == 0) adios(EX_DATAERR, NULL, "no messages in %s", folder); /* parse all the message ranges/sequences and set SELECTED */ for (msgnum = 0; msgnum < msgs.size; msgnum++) { if (!m_convert(mp, msgs.msgs[msgnum])) { exit(EX_SOFTWARE); } } /* annotate all the SELECTED messages */ for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { if (is_selected(mp, msgnum)) { if (mode == MODE_LIST) annolist(m_name(msgnum), comp, number); else annotate(m_name(msgnum), comp, text, datesw, number, append, preserve); } } context_replace(curfolder, folder); seq_setcur(mp, mp->lowsel); seq_save(mp); folder_free(mp); context_save(); return 0; } static void make_comp(unsigned char **ap) { unsigned char *cp; char buffer[BUFSIZ]; if (!*ap) { printf("Enter component name: "); fflush(stdout); if (!fgets(buffer, sizeof buffer, stdin)) { exit(EX_IOERR); } *ap = trimcpy(buffer); } if ((cp = *ap + strlen(*ap) - 1) > *ap && *cp == ':') *cp = '\0'; if (strlen(*ap) == 0) adios(EX_SOFTWARE, NULL, "null component name"); if (**ap == '-') adios(EX_CONFIG, NULL, "invalid component name %s", *ap); if (strlen(*ap) >= NAMESZ) adios(EX_SOFTWARE, NULL, "too large component name %s", *ap); for (cp = *ap; *cp; cp++) if (!isalnum(*cp) && *cp != '-') adios(EX_CONFIG, NULL, "invalid component name %s", *ap); } /* ** Produce a listing of all header fields (annotations) whose field ** name matches comp. Number the listing if number is set. */ static void annolist(char *file, unsigned char *comp, int number) { int c; int count = 1; /* header field (annotation) counter */ char *cp; char *field; int field_size; FILE *fp; int length; int n; /* number of bytes written */ if ((fp = fopen(file, "r")) == NULL) { adios(EX_IOERR, file, "unable to open"); } /* We'll grow this buffer as needed. */ field = mh_xcalloc(field_size = 256, sizeof(char)); make_comp(&comp); length = strlen(comp); /* Convenience copy. */ do { /* ** Get a line from the input file, growing the field buffer ** as needed. We do this so that we can fit an entire line ** in the buffer making it easy to do a string comparison ** on both the field name and the field body which might be ** a long path name. */ for (n = 0, cp = field; (c = getc(fp)) != EOF; *cp++ = c) { if (c == '\n' && (c = getc(fp)) != ' ' && c != '\t') { ungetc(c, fp); c = '\n'; break; } if (++n >= field_size - 1) { field = mh_xrealloc(field, field_size += 256); cp = field + n - 1; } } *cp = '\0'; if (strncasecmp(field, comp, length)==0 && field[length] == ':') { cp = trim(field + length + 1); if (number) { printf("%d\t", count++); } printf("%s\n", cp); } } while (*field && *field != '-'); mh_free0(&field); fclose(fp); return; } static int annotate(char *file, unsigned char *comp, char *text, int datesw, int number, int append, int preserve) { int fd; struct utimbuf b; int perms, tmpfd; char tmpfil[BUFSIZ]; struct stat st; FILE *tmp; /* open and lock the file to be annotated */ if ((fd = lkopen(file, O_RDWR, 0)) == NOTOK) { switch (errno) { case ENOENT: break; default: admonish(file, "unable to lock and open"); break; } return 1; } if (stat(file, &st) == -1) { advise("can't get access and modification times for %s", file); preserve = 0; } b.actime = st.st_atime; b.modtime = st.st_mtime; perms = fstat(fd, &st) != NOTOK ? (int)(st.st_mode & 0777) : m_gmprot(); strncpy(tmpfil, m_mktemp2(file, "annotate", NULL, &tmp), sizeof(tmpfil)); chmod(tmpfil, perms); make_comp(&comp); if (mode == MODE_DEL) { dodel(fd, comp, text, tmp, number); } if (mode == MODE_ADD) { doadd(fd, comp, text, tmp, datesw, append); } cpydata(fd, fileno(tmp), file, tmpfil); fclose(tmp); if ((tmpfd = open(tmpfil, O_RDONLY)) == NOTOK) { adios(EX_IOERR, tmpfil, "unable to open for re-reading"); } lseek(fd, (off_t) 0, SEEK_SET); /* ** We're making the file shorter if we're deleting a header field ** so the file has to be truncated or it will contain garbage. */ if (mode == MODE_DEL && ftruncate(fd, 0) == -1) { adios(EX_IOERR, tmpfil, "unable to truncate."); } cpydata(tmpfd, fd, tmpfil, file); close(tmpfd); unlink(tmpfil); if (preserve && utime(file, &b) == -1) { advise("can't set access and modification times for %s", file); } lkclose(fd, file); return 0; } /* ** We're trying to delete a header field (annotation). ** ** - If number is greater than zero, ** we're deleting the nth header field that matches ** the field (component) name. ** - If number is zero and text is NULL, ** we're deleting the first field in which the field name ** matches the component name. ** - If number is zero and text is set, ** we're deleting the first field in which both the field name ** matches the component name and the field body matches the text. ** - If number is -1, ** we delete all matching fields. */ static void dodel(int fd, unsigned char *comp, char *text, FILE *tmp, int number) { int length = strlen(comp); /* convenience copy */ int count = 1; /* Number of matching header line. */ int c, n; char *cp; char *field = NULL; int field_size = 256; FILE *fp; /* ** We're going to need to copy some of the message file to the ** temporary file while examining the contents. Convert the ** message file descriptor to a file pointer since it's a lot ** easier and more efficient to use stdio for this. Also allocate ** a buffer to hold the header components as they're read in. ** This buffer is grown as needed later. */ if ((fp = fdopen(fd, "r")) == NULL) { adios(EX_IOERR, NULL, "unable to fdopen file."); } field = mh_xcalloc(field_size, sizeof(char)); /* ** Copy lines from the input file to the temporary file ** until we either find the one that we're looking ** for (which we don't copy) or we reach the end of ** the headers. Both a blank line and a line beginning ** with a - terminate the headers so that we can handle ** both drafts and RFC-2822 format messages. */ do { /* ** Get a line from the input file, growing the ** field buffer as needed. We do this so that ** we can fit an entire line in the buffer making ** it easy to do a string comparison on both the ** field name and the field body which might be ** a long path name. */ for (n=0, cp=field; (c=getc(fp)) != EOF; *cp++ = c) { if (c == '\n') { ungetc((c = getc(fp)), fp); if (c != ' ' && c != '\t') { c = '\n'; break; } c = '\n'; } if (++n >= field_size - 1) { field = mh_xrealloc(field, field_size *= 2); cp = field + n - 1; } } *cp = '\0'; if (strncasecmp(field, comp, length)==0 && field[length] == ':') { /* ** This component matches and thus is a candidate. ** We delete the line by not copying it to the ** temporary file. Thus: ** - Break if we've found the one to delete. ** - Continue if this is one to delete, but ** there'll be further ones. */ if (!number && !text) { /* this first one is it */ break; } if (number == -1) { /* delete all of them */ continue; } else if (number == count++) { /* delete this specific one */ break; } if (text) { /* delete the first matching one */ cp = field+length+1; while (*cp==' ' || *cp=='\t') { cp++; /* eat leading whitespace */ } if (*text == '/' && strcmp(text, cp)==0) { break; /* full path matches */ } else if (strcmp(text, mhbasename(cp))==0) { break; /* basename matches */ } } /* ** Although the compoment name mached, it ** wasn't the right one. */ } /* Copy it. */ if ((n = fputs(field, tmp)) == EOF || (c=='\n' && fputc('\n', tmp)==EOF)) { adios(EX_CANTCREAT, NULL, "unable to write temporary file."); } } while (*field && *field != '-'); mh_free0(&field); fflush(tmp); fflush(fp); /* The underlying fd will be closed by lkclose() */ /* ** We've been messing with the input file position. Move the ** input file descriptor to the current place in the file ** because the stock data copying routine uses the descriptor, ** not the pointer. */ if (lseek(fd, (off_t)ftell(fp), SEEK_SET) == (off_t)-1) { adios(EX_IOERR, NULL, "can't seek."); } } static void doadd(int fd, unsigned char *comp, char *text, FILE *tmp, int datesw, int append) { char *cp, *sp; int c; FILE *fp = NULL; if (append) { /* ** We're going to need to copy some of the message ** file to the temporary file while examining the ** contents. Convert the message file descriptor to ** a file pointer since it's a lot easier and more ** efficient to use stdio for this. Also allocate ** a buffer to hold the header components as they're ** read in. This buffer is grown as needed later. */ if ((fp = fdopen(fd, "r")) == NULL) { adios(EX_IOERR, NULL, "unable to fdopen file."); } /* Find the end of the headers. */ if ((c = getc(fp)) == '\n') { /* Special check for no headers is needed. */ rewind(fp); } else { /* ** Copy lines from the input file to the ** temporary file until we reach the end ** of the headers. */ putc(c, tmp); while ((c = getc(fp)) != EOF) { putc(c, tmp); if (c == '\n') { ungetc(c = getc(fp), fp); if (c == '\n' || c == '-') { break; } } } } } if (datesw) { fprintf(tmp, "%s: %s\n", comp, dtimenow()); } if ((cp = text)) { /* Add body text header */ do { while (*cp == ' ' || *cp == '\t') { cp++; } sp = cp; while (*cp && *cp++ != '\n') { continue; } if (cp - sp) { fprintf(tmp, "%s: %*.*s", comp, (int)(cp - sp), (int)(cp - sp), sp); } } while (*cp); if (cp[-1] != '\n' && cp != text) { putc('\n', tmp); } } fflush(tmp); /* ** We've been messing with the input file position. Move the ** input file descriptor to the current place in the file ** because the stock data copying routine uses the descriptor, ** not the pointer. */ if (append) { if (lseek(fd, (off_t)ftell(fp), SEEK_SET) == (off_t)-1) { adios(EX_IOERR, NULL, "can't seek."); } } } mmh-0.4/uip/inc.c0000644000000000000000000003076413414435726012371 0ustar rootroot/* ** inc.c -- incorporate messages from a maildrop into a folder ** ** This code is Copyright (c) 2002, by the authors of nmh. See the ** COPYRIGHT file in the root directory of the nmh distribution for ** complete copyright information. */ #ifdef MAILGROUP /* ** Revised: Sat Apr 14 17:08:17 PDT 1990 (marvit@hplabs) ** Added hpux hacks to set and reset gid to be "mail" as needed. The reset ** is necessary so inc'ed mail is the group of the inc'er, rather than ** "mail". We setgid to egid only when [un]locking the mail file. This ** is also a major security precaution which will not be explained here. ** ** Fri Feb 7 16:04:57 PST 1992 John Romine ** NB: I'm not 100% sure that this setgid stuff is secure even now. ** ** See the *GROUPPRIVS() macros later. I'm reasonably happy with the setgid ** attribute. Running setuid root is probably not a terribly good idea, though. ** -- Peter Maydell , 04/1998 ** ** Peter Maydell's patch slightly modified for nmh 0.28-pre2. ** Ruud de Rooij Wed, 22 Jul 1998 13:24:22 +0200 */ #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYS_PARAM_H # include #endif static struct swit switches[] = { #define AUDSW 0 { "audit audit-file", 0 }, #define NAUDSW 1 { "noaudit", 2 }, #define CHGSW 2 { "changecur", 0 }, #define NCHGSW 3 { "nochangecur", 2 }, #define FILESW 4 { "file name", 0 }, #define FORMSW 5 { "form formatfile", 0 }, #define SILSW 6 { "silent", 0 }, #define NSILSW 7 { "nosilent", 2 }, #define TRNCSW 8 { "truncate", 0 }, #define NTRNCSW 9 { "notruncate", 2 }, #define WIDTHSW 10 { "width columns", 0 }, #define VERSIONSW 11 { "Version", 0 }, #define HELPSW 12 { "help", 0 }, { NULL, 0 }, }; char *version=VERSION; /* ** This is an attempt to simplify things by putting all the ** privilege ops into macros. ** *GROUPPRIVS() is related to handling the setgid MAIL property, ** and only applies if MAILGROUP is defined. ** Basically, SAVEGROUPPRIVS() is called right at the top of main() ** to initialise things, and then DROPGROUPPRIVS() and GETGROUPPRIVS() ** do the obvious thing. TRYDROPGROUPPRIVS() has to be safe to call ** before DROPUSERPRIVS() is called [this is needed because setgid() ** sets both effective and real uids if euid is root.] ** ** There's probably a better implementation if we're allowed to use ** BSD-style setreuid() rather than using POSIX saved-ids. ** Anyway, if you're euid root it's a bit pointless to drop the group ** permissions... ** ** I'm pretty happy that the security is good provided we aren't setuid root. ** The only things we trust with group=mail privilege are lkfopen() ** and lkfclose(). */ /* ** For setting and returning to "mail" gid */ #ifdef MAILGROUP static int return_gid; /* ** easy case; we're not setuid root, so can drop group privs immediately. */ #define TRYDROPGROUPPRIVS() DROPGROUPPRIVS() #define DROPGROUPPRIVS() \ if (setegid(getgid()) != 0) { \ advise ("setegid", "unable to set group to %ld", (long) getgid()); \ _exit (EX_OSERR); \ } #define GETGROUPPRIVS() \ if (setegid(return_gid) != 0) { \ advise ("setegid", "unable to set group to %ld", (long) return_gid); \ _exit (EX_OSERR); \ } #define SAVEGROUPPRIVS() return_gid = getegid() #else /* define *GROUPPRIVS() as null; this avoids having lots of "#ifdef MAILGROUP"s */ #define TRYDROPGROUPPRIVS() #define DROPGROUPPRIVS() #define GETGROUPPRIVS() #define SAVEGROUPPRIVS() #endif /* not MAILGROUP */ /* ** these variables have to be globals so that done() can correctly clean ** up the lockfile */ static int locked = 0; static char *newmail; static FILE *in; /* ** prototypes */ void inc_done(); int main(int argc, char **argv) { int chgflag = 1, trnflag = 1; int noisy = 1, width = 0; int hghnum = 0, msgnum = 0; int incerr = 0; /* ** <0 if inc hits an error which means it should ** not truncate mailspool */ char *cp, *maildir = NULL, *folder = NULL; char *form = NULL; char *audfile = NULL, *from = NULL; char buf[BUFSIZ], **argp, *fmtstr, **arguments; struct msgs *mp = NULL; struct stat st, s1; FILE *aud = NULL; char b[MAXPATHLEN + 1]; /* copy of mail directory because the static gets overwritten */ char *maildir_copy = NULL; if (atexit(inc_done) != 0) { adios(EX_OSERR, NULL, "atexit failed"); } /* ** absolutely the first thing we do is save our privileges, ** and drop them if we can. */ SAVEGROUPPRIVS(); TRYDROPGROUPPRIVS(); setlocale(LC_ALL, ""); invo_name = mhbasename(argv[0]); context_read(); arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); exit(EX_USAGE); case UNKWNSW: adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(buf, sizeof(buf), "%s [+folder] [switches]", invo_name); print_help(buf, switches, 1); exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); exit(argc == 2 ? EX_OK : EX_USAGE); case AUDSW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); audfile = mh_xstrdup(expanddir(cp)); continue; case NAUDSW: audfile = NULL; continue; case CHGSW: chgflag++; continue; case NCHGSW: chgflag = 0; continue; /* ** The flag `trnflag' has the value: ** ** 2 if -truncate is given ** 1 by default (truncating is default) ** 0 if -notruncate is given */ case TRNCSW: trnflag = 2; continue; case NTRNCSW: trnflag = 0; continue; case FILESW: if (!(cp = *argp++)) adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); from = (strcmp(cp, "-")==0) ? "-" : mh_xstrdup(expanddir(cp)); /* ** If the truncate file is in default state, ** change to not truncate. */ if (trnflag == 1) trnflag = 0; continue; case SILSW: noisy = 0; continue; case NSILSW: noisy++; continue; case FORMSW: if (!(form = *argp++) || *form == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case WIDTHSW: if (!(cp = *argp++) || *cp == '-') adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); width = atoi(cp); continue; } } if (*cp == '+' || *cp == '@') { if (folder) adios(EX_USAGE, NULL, "only one folder at a time!"); else folder = mh_xstrdup(expandfol(cp)); } else { adios(EX_USAGE, NULL, "usage: %s [+folder] [switches]", invo_name); } } /* ** NOTE: above this point you should use TRYDROPGROUPPRIVS(), ** not DROPGROUPPRIVS(). */ /* guarantee dropping group privileges; we might not have done so earlier */ DROPGROUPPRIVS(); if (from && strcmp(from, "-")==0) { /* We'll read mail from stdin. */ newmail = NULL; } else { /* We'll read mail from a file. */ if (from) newmail = from; else if ((newmail = getenv("MAILDROP")) && *newmail) newmail = toabsdir(newmail); else if ((newmail = context_find("maildrop")) && *newmail) newmail = toabsdir(newmail); else { newmail = concat(mailspool, "/", getusername(), NULL); } if (stat(newmail, &s1) == NOTOK || s1.st_size == 0) adios(EX_DATAERR, NULL, "no mail to incorporate"); if ((cp = strdup(newmail)) == NULL) adios(EX_OSERR, NULL, "error allocating memory to copy newmail"); newmail = cp; } if (!folder) folder = getdeffol(); maildir = toabsdir(folder); if ((maildir_copy = strdup(maildir)) == NULL) adios(EX_OSERR, maildir, "error allocating memory to copy maildir"); create_folder(maildir, noisy ? 0 : 1, exit); if (chdir(maildir) == NOTOK) adios(EX_OSERR, maildir, "unable to change directory to"); if (!(mp = folder_read(folder))) adios(EX_IOERR, NULL, "unable to read folder %s", folder); if (!newmail) { trnflag = 0; in = stdin; } else if (access(newmail, W_OK) != NOTOK) { locked++; if (trnflag) { SIGNAL(SIGHUP, SIG_IGN); SIGNAL(SIGINT, SIG_IGN); SIGNAL(SIGQUIT, SIG_IGN); SIGNAL(SIGTERM, SIG_IGN); } GETGROUPPRIVS(); /* Reset gid to lock mail file */ in = lkfopen(newmail, "r"); DROPGROUPPRIVS(); if (in == NULL) adios(EX_IOERR, NULL, "unable to lock and fopen %s", newmail); fstat(fileno(in), &s1); } else { trnflag = 0; if ((in = fopen(newmail, "r")) == NULL) adios(EX_IOERR, newmail, "unable to read"); } /* This shouldn't be necessary but it can't hurt. */ DROPGROUPPRIVS(); if (audfile) { int i; if ((i = stat(audfile, &st)) == NOTOK) advise(NULL, "Creating Receive-Audit: %s", audfile); if ((aud = fopen(audfile, "a")) == NULL) adios(EX_IOERR, audfile, "unable to append to"); else if (i == NOTOK) chmod(audfile, m_gmprot()); fprintf(aud, from ? "<> %s -ms %s\n" : "<> %s\n", dtimenow(), from); } /* Set format string */ fmtstr = new_fs(form, scanformat); if (noisy) { printf("Incorporating new mail into %s...\n\n", folder); fflush(stdout); } /* check if readable and nonempty */ if (!fgets(buf, sizeof(buf), in)) { if (ferror(in)) { advise("read", "unable to"); incerr = SCNFAT; } else { incerr = SCNEOF; } goto giveup; } if (strncmp("From ", buf, 5)!=0) { advise(NULL, "not in mbox format"); incerr = SCNFAT; goto giveup; } /* ** Get the mail from file (usually mail spool) */ hghnum = msgnum = mp->hghmsg; for (;;) { /* ** Check if we need to allocate more space for message status. ** If so, then add space for an additional 100 messages. */ if (msgnum >= mp->hghoff && !(mp = folder_realloc(mp, mp->lowoff, mp->hghoff + 100))) { advise(NULL, "unable to allocate folder storage"); incerr = NOTOK; break; } /* create scanline for new message */ switch (incerr = scan(in, msgnum + 1, msgnum + 1, noisy ? fmtstr : NULL, width, msgnum == hghnum && chgflag, 1)) { case SCNFAT: case SCNEOF: break; case SCNERR: if (aud) fputs("inc aborted!\n", aud); /* doesn't clean up locks! */ advise(NULL, "aborted!"); break; case SCNNUM: advise(NULL, "BUG in %s, number out of range", invo_name); break; default: advise(NULL, "BUG in %s, scan() botch (%d)", invo_name, incerr); break; case SCNMSG: /* ** Run the external program hook on the message. */ snprintf(b, sizeof (b), "%s/%d", maildir_copy, msgnum + 1); ext_hook("add-hook", b, NULL); if (aud) fputs(scanl, aud); if (noisy) fflush(stdout); msgnum++; mp->hghmsg++; mp->nummsg++; if (mp->lowmsg == 0) mp->lowmsg = 1; clear_msg_flags(mp, msgnum); set_exists(mp, msgnum); set_unseen(mp, msgnum); mp->msgflags |= SEQMOD; continue; } /* ** If we get here there was some sort of error from scan(), ** so stop processing anything more from the spool. */ break; } giveup:; mh_free0(&maildir_copy); if (incerr < 0) { /* error */ if (locked) { GETGROUPPRIVS(); /* Be sure we can unlock mail file */ lkfclose(in, newmail); in = NULL; DROPGROUPPRIVS(); /* ** And then return us to normal ** privileges */ } else { fclose(in); in = NULL; } adios(EX_SOFTWARE, NULL, "failed"); } if (aud) fclose(aud); if (noisy) fflush(stdout); /* ** truncate file we are incorporating from */ if (trnflag) { if (stat(newmail, &st) != NOTOK && s1.st_mtime != st.st_mtime) advise(NULL, "new messages have arrived!\007"); else { int newfd; if ((newfd = creat(newmail, 0600)) != NOTOK) close(newfd); else admonish(newmail, "error zero'ing"); } } else if (noisy && newmail) { printf("%s not zero'd\n", newmail); } if (msgnum == hghnum) { admonish(NULL, "no messages incorporated"); } else { context_replace(curfolder, folder); /* update current folder */ if (chgflag) mp->curmsg = hghnum + 1; mp->hghmsg = msgnum; if (mp->lowmsg == 0) mp->lowmsg = 1; if (chgflag) /* sigh... */ seq_setcur(mp, mp->curmsg); } /* ** unlock the mail spool */ if (locked) { GETGROUPPRIVS(); /* Be sure we can unlock mail file */ lkfclose(in, newmail); in = NULL; DROPGROUPPRIVS(); /* And then return us to normal privileges */ } else { fclose(in); in = NULL; } seq_setunseen(mp, 1); seq_save(mp); context_save(); return 0; } void inc_done() { if (locked) { GETGROUPPRIVS(); lkfclose(in, newmail); DROPGROUPPRIVS(); } } mmh-0.4/COPYRIGHT0000644000000000000000000000324213414435726012141 0ustar rootrootCopyright (c) 2002, the authors of nmh All rights reserved. Definition: The "authors of nmh" includes anyone, past or present, who has worked on the nmh source code. The "nmh source code" includes the source code of mmh (meillo's mail handler). Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name "the authors of nmh", nor variations such as "The nmh Developers", nor the names of the individual contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY ITS AUTHORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OF NMH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mmh-0.4/NEWS0000644000000000000000000001776213414435726011361 0ustar rootrootNEWS This file summarizes the important changes from version to version. (For a more detailed list of changes see the VCS log; the release tarball includes a static copy of it in the ChangeLog file.) ==================== mmh-0.4 (2018-01-06) ==================== Features -------- - pick -thread allows to select a whole message thread - mhstore use "filename" attr of Content-Disposition - repl -form repllistcomps uses mailinglist header field - support for simplified ISO 8601/RFC 3339 dates - whom supports message argument - mhpgp use trusted header field copies to replace original header fields - mhl trailing withspace handling - mhl implement simple globbing - mhl raw option - whatnow2 save metainformation in the draft itself Bug fixes --------- - inc fix out-of-bounds error when reading from stdin - spelling errors - Accept binary encoding for messages/* - mhparse add support for CRLF - dateparsing case insensitive - mhsign gpg2 Expiry date format - whatnow2 don't add an extra attachment header - m_getfld2 accept lines with 998 chars and crlf lineending - Ignore folders with an empty sequence in new - Fix blind list alias expansion - whatnow2 handle mhuse - whatnow2 remove metainformation befor adding new Technical changes ----------------- - Fix unreproducible build - remove msg-hook config option - redesign version string - remove unused code - decode rfc2047 header in mhparse - scan and pick merged to one tool - rewrite pick matching - fmt_scan support multibyte characters in putstr decoding - Fix parallel `make install' - %(unmailto) format function for List-Post headers Documentation ------------- - Generate the command list in mmh-intro - Grammer and layout fixes anno.man1 - Grammer and layout fixes in ali.man1 - mhsign mention hostname bug - Better wording in README concerning compatibility - whatnow is now depricated ==================== mmh-0.3 (2016-08-15) ==================== Features -------- - whatnow2 as a replacement for whatnow, whatnow still is the default - repl now pipe mail through to decode MIME messages - RFC 2047 decoding default in replcomp and replgroupcomp - Enable inc(1) to read from stdin - Allow send(1) to send from folder other than +drafts Bug fixes --------- - repl use .mmh/mhl.reply, if it exist - simple mbox support for rcvstore - mhsign encrypton works with aliases - Fix header lookup table setup in slocal(1) - Fix of by one in decode_rfc2047() Technical changes ----------------- - m_getfld() is replaced by m_getfld2() - send calls mhbuild every time except for dist - intern sequence system are more independent - use only mh_calloc to avoid bugs - use mh_free0 to avoid bugs Documentation ------------- - Better description of the Sender header - Cleanup manpage mh-format(5) - mhsign/mhpgp: Clarify the manpages and usage lines ==================== mmh-0.2 (2015-11-02) ==================== Features -------- - non-ASCII header fields get automatically encoded using RFC 2047 - pick(1) works on decoded RFC 2047 header fields - new profile option Default-From, which defines just what it says - the Dcc header field is available again - a Sender header gets inserted as appropriate - spost(1) can handle address groups now - the Date header is now shown in local time in the default scan listing - various minor improvements in mhsign(1) - mhparam(1) knows about more values now Bug fixes --------- - dist(1) works again - `folder -recurse' is fixed - tar files are now encoded using base64 - building in different build directory works now Documentation ------------- - many smaller improvements to the man pages and documentation Technical changes ----------------- - pass recipients as command line arguments to sendmail - don't create messages with a dot alone on a line - make libmh self-containing - use sysexits.h for better error codes - re-activated the test framework - changes in the build framework Coding ------ - rmm uses refile now - converted several macros to functions - replaced MH specific functions with standard library ones - use execprogl() as a safer alternatives to system(3) now - remove longjmp(3) and done() in favor for atexit(3) - we now have mh_xcalloc() ==================== mmh-0.1 (2012-12-08) ==================== (The references are made to docs/schnalke-mmh.pdf. Explanations can be found there.) General ------- - All network transfer facilities have been removed. There is no MTS (SMTP client) anymore and no POP client. An MSA/MTA is required to send mail. An MRA is required to retrieve mail via POP/IMAP. (Sec. 2.1.1) - ~/.mh_profile was moved to ~/.mmh/profile. All configuration files in the mail storage location (~/Mail) were moved to ~/.mmh. The environment variables to change these locations were renamed. (Sec. 2.3.5) - Many configure options were removed. (Sec. 2.1.4) - A bunch of recent changes in nmh were pulled into mmh. - The man page mmh-intro(7) was added. Features -------- - Jon Steinhart's attachment system is made the default and is combined smoothly with automatic MIMEification, as needed. The `mime' command at the WhatNow prompt is therefore no longer needed and thus removed. Use of Mime-Type-Query command (usually file(1)) to determine the MIME type of an attachment. No more writing of mhbuild directives, although it is still possible to do so. (Sec. 2.2.2) - The draft folder facility is always used. All support for a single draft message is removed. The commands, especially comp(1), were adjusted to this change. (Sec. 2.2.4) - A trash folder facility is added. Backup prefixes are no longer used. (Sec. 2.2.4) - By default, messages are always displayed serially in a single pager session without pausing. Foreign charsets are transcoded automatically (with iconv(1)). (Sec. 2.2.2) - Attachments are stored under their filename, instead of the message number and MIME part number, by default. Tar files are no longer extracted automatically. (Sec. 2.2.2) - scan(1) listings do no longer show body contents. - MMDF maildrop format support is removed. (Sec. 2.2.1) Support for UUCP bang paths is gone, too. - There is no more support for automatic message/external-body retrieval. The internal FTP client was dropped as well. - Removed the internal pager. - There is no more hardcopy terminal support. (Sec. 2.2.1) Programs -------- - The old show(1) was dropped and mhshow(1) was renamed to show(1). (2.1.3) - Digital typography is added by including Neil Rickert's scripts: mhsign(1) is invoked automatically by send(1) if the draft message contains `Enc:' or `Sign:' header fields. Up to now, the user needs to run mhpgp(1) manually, still. (Sec. 2.2.3) - conflict, rcvtty, viamail, msgchk, and msh were removed. (Sec. 2.1.2) - Replaced install-mh(1) with the shell script mmh(1). - slocal(1) lost its suppress duplicates feature and mmh thus lost the dependency on dbm. - packf(1) prints to stdout. - Added mmhwrap(1). - whom(1) is rewritten from scratch. - Many command line switches were removed. (Sec. 2.1.5) - anno(1)'s command line switches were structurally reworked. Check the man page for details. (Sec. 2.3.2) - Replaced the command line option `-format foo' with `-form =foo'. (Sec. 2.1.5) - Path notations (with +, @, /, .) can now be used more interchangeable. (Sec. 2.3.2) - All tools read the profile now. (Sec. 2.3.3) - Renamed the -version switch to -Version. Sequences --------- - The standard sequences `first', `prev', `cur', `next', `last', `all', `new' were renamed to `f', `p', `c', `n', `l', `a', `b', respectively. - The unseen sequence and the sequence negation are set by default. repl(1) quotes the original message by default and forw(1) uses MIME encapsulation by default. (Sec. 2.2.5) Code ---- - The indent style was changed -- sorry for that. (Sec. 2.3.1) - Standard library functions have replaced local replacements, when possible. (Sec. 2.3.4) - The programs are more separated now. Instead of sharing source code, the programs invoke each other. (Sec. 2.3.6) - Mmh comprises only about half as much code as nmh-1.3. The starting point of mmh is: nmh-1.3-dev (as of 2011-04-13)