From 8a8923889768f46e9efad1cb428fd22df53f6fe5 Mon Sep 17 00:00:00 2001 From: Olusesan Ameye Date: Tue, 1 Sep 2020 01:15:02 -0400 Subject: [PATCH] New mailsend --- coregrade/src/core/smtp.cc | 16 +- coregrade/src/mailsend/COPYRIGHT | 25 + coregrade/src/mailsend/ChangeLog.mediawiki | 259 + coregrade/src/mailsend/Makefile | 87 +- coregrade/src/mailsend/Makefile.in | 106 + coregrade/src/mailsend/Makefile.nmake | 58 + coregrade/src/mailsend/NOTES.txt | 96 + coregrade/src/mailsend/README.asc | 253 + coregrade/src/mailsend/TODO | 4 + coregrade/src/mailsend/aclocal.m4 | 5370 +++++++++++++ coregrade/src/mailsend/changelog.debian | 5 + coregrade/src/mailsend/configure | 6982 +++++++++++++++++ coregrade/src/mailsend/configure.in | 121 + coregrade/src/mailsend/copyright.h | 37 + coregrade/src/mailsend/doc/examples.mediawiki | 94 + .../src/mailsend/doc/mailsend-FAQ.mediawiki | 298 + coregrade/src/mailsend/doc/mailsend.1 | 359 + coregrade/src/mailsend/doc/mailsend.pod | 226 + coregrade/src/mailsend/examples.c | 102 + coregrade/src/mailsend/images/embed1.png | Bin 0 -> 92360 bytes coregrade/src/mailsend/images/embed2.png | Bin 0 -> 108341 bytes coregrade/src/mailsend/images/embed3.png | Bin 0 -> 10413 bytes coregrade/src/mailsend/init_vs.bat | 5 + coregrade/src/mailsend/install-sh | 250 + coregrade/src/mailsend/libs/libmsock/Makefile | 10 +- .../src/mailsend/libs/libmsock/Makefile.in | 43 + .../src/mailsend/libs/libmsock/Makefile.nmake | 22 + .../src/mailsend/libs/libmsock/ecode.txt | 35 + .../src/mailsend/libs/libmsock/makefile.wnt | 32 + .../src/mailsend/libs/libmsock/mkecode.rb | 36 + coregrade/src/mailsend/libs/libmsock/msock.c | 465 +- coregrade/src/mailsend/libs/libmsock/msock.h | 36 +- coregrade/src/mailsend/libs/libmsock/werrno.h | 118 + .../src/mailsend/libs/libmutils/Makefile | 19 +- .../src/mailsend/libs/libmutils/Makefile.in | 35 + .../mailsend/libs/libmutils/Makefile.nmake | 32 + coregrade/src/mailsend/libs/libmutils/README | 0 .../src/mailsend/libs/libmutils/makefile.wnt | 32 + .../src/mailsend/libs/libmutils/md5test.c | 0 .../src/mailsend/libs/libmutils/mkey.c.in | 76 + .../src/mailsend/libs/libmutils/mutils.c | 762 +- .../src/mailsend/libs/libmutils/mutils.h | 165 +- .../src/mailsend/libs/libmutils/mutils_blob.c | 692 ++ .../mailsend/libs/libmutils/mutils_error.c | 232 + .../src/mailsend/libs/libmutils/mutils_mime.c | 119 + .../src/mailsend/libs/libmutils/mutils_temp.c | 205 + .../src/mailsend/libs/libmutils/mutils_time.c | 101 + .../src/mailsend/libs/libmutils/string.c | 4 +- coregrade/src/mailsend/libs/libmutils/test.c | 0 .../src/mailsend/libs/libmutils/testb64.c | 0 coregrade/src/mailsend/libs/libsll/Makefile | 4 +- .../src/mailsend/libs/libsll/Makefile.in | 43 + .../src/mailsend/libs/libsll/Makefile.nmake | 27 + coregrade/src/mailsend/libs/libsll/README | 9 + coregrade/src/mailsend/libs/libsll/VERSION | 2 + coregrade/src/mailsend/libs/libsll/configure | 1722 ++++ .../src/mailsend/libs/libsll/configure.in | 40 + .../libs/libsll/examples/append/Makefile.in | 31 + .../libs/libsll/examples/append/append.c | 187 + .../libs/libsll/examples/append/makefile.wnt | 34 + .../libsll/examples/append_sorted/Makefile.in | 31 + .../examples/append_sorted/append_sorted.c | 204 + .../examples/append_sorted/makefile.wnt | 34 + .../libs/libsll/examples/delete/Makefile.in | 31 + .../libs/libsll/examples/delete/delete.c | 200 + .../libs/libsll/examples/delete/makefile.wnt | 34 + .../libs/libsll/examples/insert/Makefile.in | 31 + .../libs/libsll/examples/insert/insert.c | 186 + .../libs/libsll/examples/insert/makefile.wnt | 35 + coregrade/src/mailsend/libs/libsll/func.txt | 79 + .../src/mailsend/libs/libsll/makefile.wnt | 30 + coregrade/src/mailsend/libs/libsll/mktar.sh | 46 + coregrade/src/mailsend/libs/libsll/muquit.css | 27 + coregrade/src/mailsend/libs/libsll/sll.c | 0 coregrade/src/mailsend/libs/libsll/sll.h | 0 coregrade/src/mailsend/mailsend | Bin 185752 -> 0 bytes coregrade/src/mailsend/mailsend.h | 144 +- coregrade/src/mailsend/main.c | 865 +- coregrade/src/mailsend/mime.types | 831 ++ coregrade/src/mailsend/mime_types.h | 542 ++ coregrade/src/mailsend/misc/addr.txt | 12 + coregrade/src/mailsend/misc/body.txt | 5 + coregrade/src/mailsend/misc/examples.txt | 95 + coregrade/src/mailsend/misc/msg.txt | 14 + coregrade/src/mailsend/misc/nf.jpg | Bin 0 -> 2306 bytes coregrade/src/mailsend/misc/x.gif | Bin 0 -> 584 bytes coregrade/src/mailsend/mkinstalldirs | 40 + .../src/mailsend/scripts/changelog2wiki.rb | 89 + .../scripts/copyright2arrayofp2chars.rb | 46 + coregrade/src/mailsend/scripts/cp_to_bins.rb | 44 + coregrade/src/mailsend/scripts/ex2wiki.rb | 135 + .../src/mailsend/scripts/mk_debian_package.rb | 193 + coregrade/src/mailsend/scripts/mk_doc.rb | 108 + coregrade/src/mailsend/scripts/mk_examples.rb | 59 + .../src/mailsend/scripts/mk_mime_types_h.rb | 57 + coregrade/src/mailsend/scripts/print_date.rb | 13 + .../src/mailsend/scripts/run_configure.rb | 33 + coregrade/src/mailsend/scripts/ss.sh | 1 + coregrade/src/mailsend/scripts/t.sh | 12 + .../mailsend/scripts/update_deb_changelog.rb | 32 + coregrade/src/mailsend/scripts/upload.rb | 40 + coregrade/src/mailsend/setget.c | 417 +- coregrade/src/mailsend/smtp.c | 1262 ++- coregrade/src/mailsend/test/blue.png | Bin 0 -> 3166 bytes coregrade/src/mailsend/test/embed_image1.html | 51 + coregrade/src/mailsend/test/embed_image2.html | 69 + coregrade/src/mailsend/test/green.png | Bin 0 -> 4227 bytes coregrade/src/mailsend/test/red.png | Bin 0 -> 3172 bytes coregrade/src/mailsend/test/test.gif | Bin 0 -> 7711 bytes coregrade/src/mailsend/test/test.png | Bin 0 -> 545 bytes coregrade/src/mailsend/test/test.txt | 14 + coregrade/src/mailsend/test/test_emded1.rb | 110 + coregrade/src/mailsend/test/test_emded2.sh | 35 + coregrade/src/mailsend/test/test_emded3.sh | 29 + coregrade/src/mailsend/test/test_gmail.bat | 1 + coregrade/src/mailsend/test/test_gmail.sh | 81 + coregrade/src/mailsend/test/test_gmail3.bat | 1 + coregrade/src/mailsend/test/test_gmail4.bat | 1 + .../src/mailsend/test/test_gmail_html.sh | 58 + .../src/mailsend/test/test_gmail_list.sh | 86 + .../src/mailsend/test/test_gmail_quiet.sh | 72 + coregrade/src/mailsend/test/test_issue108.sh | 64 + coregrade/src/mailsend/test/test_onelines1.sh | 29 + .../src/mailsend/test/test_readtimeout.sh | 38 + coregrade/src/mailsend/test/testimage.svg | 114 + coregrade/src/mailsend/utils.c | 316 +- 126 files changed, 26685 insertions(+), 664 deletions(-) create mode 100644 coregrade/src/mailsend/COPYRIGHT create mode 100755 coregrade/src/mailsend/ChangeLog.mediawiki create mode 100755 coregrade/src/mailsend/Makefile.in create mode 100755 coregrade/src/mailsend/Makefile.nmake create mode 100644 coregrade/src/mailsend/NOTES.txt create mode 100755 coregrade/src/mailsend/README.asc create mode 100644 coregrade/src/mailsend/TODO create mode 100755 coregrade/src/mailsend/aclocal.m4 create mode 100644 coregrade/src/mailsend/changelog.debian create mode 100755 coregrade/src/mailsend/configure create mode 100755 coregrade/src/mailsend/configure.in create mode 100644 coregrade/src/mailsend/copyright.h create mode 100644 coregrade/src/mailsend/doc/examples.mediawiki create mode 100644 coregrade/src/mailsend/doc/mailsend-FAQ.mediawiki create mode 100644 coregrade/src/mailsend/doc/mailsend.1 create mode 100644 coregrade/src/mailsend/doc/mailsend.pod create mode 100644 coregrade/src/mailsend/examples.c create mode 100644 coregrade/src/mailsend/images/embed1.png create mode 100644 coregrade/src/mailsend/images/embed2.png create mode 100644 coregrade/src/mailsend/images/embed3.png create mode 100755 coregrade/src/mailsend/init_vs.bat create mode 100755 coregrade/src/mailsend/install-sh create mode 100755 coregrade/src/mailsend/libs/libmsock/Makefile.in create mode 100755 coregrade/src/mailsend/libs/libmsock/Makefile.nmake create mode 100644 coregrade/src/mailsend/libs/libmsock/ecode.txt create mode 100755 coregrade/src/mailsend/libs/libmsock/makefile.wnt create mode 100755 coregrade/src/mailsend/libs/libmsock/mkecode.rb mode change 100644 => 100755 coregrade/src/mailsend/libs/libmsock/msock.c mode change 100644 => 100755 coregrade/src/mailsend/libs/libmsock/msock.h create mode 100644 coregrade/src/mailsend/libs/libmsock/werrno.h create mode 100755 coregrade/src/mailsend/libs/libmutils/Makefile.in create mode 100755 coregrade/src/mailsend/libs/libmutils/Makefile.nmake mode change 100644 => 100755 coregrade/src/mailsend/libs/libmutils/README create mode 100755 coregrade/src/mailsend/libs/libmutils/makefile.wnt mode change 100644 => 100755 coregrade/src/mailsend/libs/libmutils/md5test.c create mode 100644 coregrade/src/mailsend/libs/libmutils/mkey.c.in mode change 100644 => 100755 coregrade/src/mailsend/libs/libmutils/mutils.c mode change 100644 => 100755 coregrade/src/mailsend/libs/libmutils/mutils.h create mode 100755 coregrade/src/mailsend/libs/libmutils/mutils_blob.c create mode 100755 coregrade/src/mailsend/libs/libmutils/mutils_error.c create mode 100755 coregrade/src/mailsend/libs/libmutils/mutils_mime.c create mode 100644 coregrade/src/mailsend/libs/libmutils/mutils_temp.c create mode 100755 coregrade/src/mailsend/libs/libmutils/mutils_time.c mode change 100644 => 100755 coregrade/src/mailsend/libs/libmutils/string.c mode change 100644 => 100755 coregrade/src/mailsend/libs/libmutils/test.c mode change 100644 => 100755 coregrade/src/mailsend/libs/libmutils/testb64.c create mode 100755 coregrade/src/mailsend/libs/libsll/Makefile.in create mode 100755 coregrade/src/mailsend/libs/libsll/Makefile.nmake create mode 100755 coregrade/src/mailsend/libs/libsll/README create mode 100755 coregrade/src/mailsend/libs/libsll/VERSION create mode 100755 coregrade/src/mailsend/libs/libsll/configure create mode 100755 coregrade/src/mailsend/libs/libsll/configure.in create mode 100755 coregrade/src/mailsend/libs/libsll/examples/append/Makefile.in create mode 100755 coregrade/src/mailsend/libs/libsll/examples/append/append.c create mode 100755 coregrade/src/mailsend/libs/libsll/examples/append/makefile.wnt create mode 100755 coregrade/src/mailsend/libs/libsll/examples/append_sorted/Makefile.in create mode 100755 coregrade/src/mailsend/libs/libsll/examples/append_sorted/append_sorted.c create mode 100755 coregrade/src/mailsend/libs/libsll/examples/append_sorted/makefile.wnt create mode 100755 coregrade/src/mailsend/libs/libsll/examples/delete/Makefile.in create mode 100755 coregrade/src/mailsend/libs/libsll/examples/delete/delete.c create mode 100755 coregrade/src/mailsend/libs/libsll/examples/delete/makefile.wnt create mode 100755 coregrade/src/mailsend/libs/libsll/examples/insert/Makefile.in create mode 100755 coregrade/src/mailsend/libs/libsll/examples/insert/insert.c create mode 100755 coregrade/src/mailsend/libs/libsll/examples/insert/makefile.wnt create mode 100755 coregrade/src/mailsend/libs/libsll/func.txt create mode 100755 coregrade/src/mailsend/libs/libsll/makefile.wnt create mode 100755 coregrade/src/mailsend/libs/libsll/mktar.sh create mode 100755 coregrade/src/mailsend/libs/libsll/muquit.css mode change 100644 => 100755 coregrade/src/mailsend/libs/libsll/sll.c mode change 100644 => 100755 coregrade/src/mailsend/libs/libsll/sll.h delete mode 100755 coregrade/src/mailsend/mailsend mode change 100644 => 100755 coregrade/src/mailsend/mailsend.h mode change 100644 => 100755 coregrade/src/mailsend/main.c create mode 100755 coregrade/src/mailsend/mime.types create mode 100644 coregrade/src/mailsend/mime_types.h create mode 100755 coregrade/src/mailsend/misc/addr.txt create mode 100755 coregrade/src/mailsend/misc/body.txt create mode 100644 coregrade/src/mailsend/misc/examples.txt create mode 100755 coregrade/src/mailsend/misc/msg.txt create mode 100755 coregrade/src/mailsend/misc/nf.jpg create mode 100644 coregrade/src/mailsend/misc/x.gif create mode 100755 coregrade/src/mailsend/mkinstalldirs create mode 100755 coregrade/src/mailsend/scripts/changelog2wiki.rb create mode 100755 coregrade/src/mailsend/scripts/copyright2arrayofp2chars.rb create mode 100755 coregrade/src/mailsend/scripts/cp_to_bins.rb create mode 100755 coregrade/src/mailsend/scripts/ex2wiki.rb create mode 100755 coregrade/src/mailsend/scripts/mk_debian_package.rb create mode 100755 coregrade/src/mailsend/scripts/mk_doc.rb create mode 100755 coregrade/src/mailsend/scripts/mk_examples.rb create mode 100755 coregrade/src/mailsend/scripts/mk_mime_types_h.rb create mode 100755 coregrade/src/mailsend/scripts/print_date.rb create mode 100755 coregrade/src/mailsend/scripts/run_configure.rb create mode 100644 coregrade/src/mailsend/scripts/ss.sh create mode 100755 coregrade/src/mailsend/scripts/t.sh create mode 100755 coregrade/src/mailsend/scripts/update_deb_changelog.rb create mode 100755 coregrade/src/mailsend/scripts/upload.rb mode change 100644 => 100755 coregrade/src/mailsend/setget.c mode change 100644 => 100755 coregrade/src/mailsend/smtp.c create mode 100644 coregrade/src/mailsend/test/blue.png create mode 100644 coregrade/src/mailsend/test/embed_image1.html create mode 100644 coregrade/src/mailsend/test/embed_image2.html create mode 100644 coregrade/src/mailsend/test/green.png create mode 100644 coregrade/src/mailsend/test/red.png create mode 100644 coregrade/src/mailsend/test/test.gif create mode 100644 coregrade/src/mailsend/test/test.png create mode 100644 coregrade/src/mailsend/test/test.txt create mode 100755 coregrade/src/mailsend/test/test_emded1.rb create mode 100755 coregrade/src/mailsend/test/test_emded2.sh create mode 100755 coregrade/src/mailsend/test/test_emded3.sh create mode 100755 coregrade/src/mailsend/test/test_gmail.bat create mode 100755 coregrade/src/mailsend/test/test_gmail.sh create mode 100644 coregrade/src/mailsend/test/test_gmail3.bat create mode 100644 coregrade/src/mailsend/test/test_gmail4.bat create mode 100755 coregrade/src/mailsend/test/test_gmail_html.sh create mode 100755 coregrade/src/mailsend/test/test_gmail_list.sh create mode 100755 coregrade/src/mailsend/test/test_gmail_quiet.sh create mode 100755 coregrade/src/mailsend/test/test_issue108.sh create mode 100755 coregrade/src/mailsend/test/test_onelines1.sh create mode 100755 coregrade/src/mailsend/test/test_readtimeout.sh create mode 100644 coregrade/src/mailsend/test/testimage.svg mode change 100644 => 100755 coregrade/src/mailsend/utils.c diff --git a/coregrade/src/core/smtp.cc b/coregrade/src/core/smtp.cc index 3291f2e..92ec481 100644 --- a/coregrade/src/core/smtp.cc +++ b/coregrade/src/core/smtp.cc @@ -112,21 +112,25 @@ int SMTP2( const char * _server, const char * _from, char * _to, char * _body, c if (subject == NULL) { subject = new char[15]; - strcpy(subject,"PayLid Support"); + strcpy(subject,"Wrenchboard Support"); logfmt( FLOG_MAX, "Subject is not found - defaulting to: %s", subject ); } // Google - snprintf( name, BUF_SIZE, EMAIL_PREFIX"/../src/modules/mailsend -smtp %s -f %s -t %s -d %s -name '%s' +cc +bcc -v -starttls -auth-plain -user %s -pass %s -sub '%s' -M '%s'", + snprintf( name, BUF_SIZE, EMAIL_PREFIX"/../src/modules/mailsend -smtp %s -f %s -t %s -domain %s -name '%s' +cc +bcc -v -starttls -port 587 -auth-plain -user %s -pass %s -sub '%s' -content-type 'text/html' -mime-type 'text/html' -M '%s'", _server, _from, _to, _domain, _name, _user, _pass, subject, body != NULL ? body : _body ); - +/* // Virtualmail - snprintf( name, BUF_SIZE, EMAIL_PREFIX"/../src/modules/mailsend -smtp %s -f %s -t %s -d %s -name '%s' +cc +bcc -v -port 25 -auth-plain -user %s -pass %s -sub '%s' -M '%s'", + snprintf( name, BUF_SIZE, EMAIL_PREFIX"/../src/modules/mailsend -smtp %s -f %s -t %s -domain %s -name '%s' +cc +bcc -v -port 25 -auth-plain -user %s -pass %s -sub '%s' -content-type 'text/html' -mime-type 'text/html' -M '%s'", _server, _from, _to, _domain, _name, _user, _pass, subject, body != NULL ? body : _body ); - +*//* + // GoDaddy + snprintf( name, BUF_SIZE, EMAIL_PREFIX"/../src/modules/mailsend -smtp %s -f %s -t %s -domain %s -name '%s' +cc +bcc -v -port 80 -auth-plain -user %s -pass %s -sub '%s' -content-type 'text/html' -mime-type 'text/html' -M '%s'", + _server, _from, _to, _domain, _name, _user, _pass, subject, body != NULL ? body : _body ); +*/ logfmt( FLOG_MAX, "Calling MAILSEND: %s", name); - FILE * p = popen( name, "r" ); + FILE * p = popen( name, "r" ); int c = 0; do diff --git a/coregrade/src/mailsend/COPYRIGHT b/coregrade/src/mailsend/COPYRIGHT new file mode 100644 index 0000000..2f996be --- /dev/null +++ b/coregrade/src/mailsend/COPYRIGHT @@ -0,0 +1,25 @@ +Copyright (C) 2001-2017 Muhammad Muquit (http://www.muquit.com/) + + o Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + + o 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. + + o Neither the name of the author MUHAMMAD MUQUIT (http://www.muquit.com/) +nor the names of its contributors may be used to endorse or promote +products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT HOLDER OR CONTRIBUTORS 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. diff --git a/coregrade/src/mailsend/ChangeLog.mediawiki b/coregrade/src/mailsend/ChangeLog.mediawiki new file mode 100755 index 0000000..4ef031c --- /dev/null +++ b/coregrade/src/mailsend/ChangeLog.mediawiki @@ -0,0 +1,259 @@ +__TOC__ +===1.20b2=== +* Change Content-type to Content-Type. According to RFC, mail headers are not case sensitive. However, some servers wrongly think they are. MailHog thinks Content-type is not valid and fails to detect MIME parts. +'''Jan-10-2019''' +===1.20b1=== +* File path was covnerted to lower case when calculating MIME-TYPE from +file extension. Fixes #140 +'''(Aug-29-2018)''' +* Merge develop branch. Fixes #108 #111 +'''(May-08-2017)''' +===1.19=== +* New option -rp to specify the return path of the sent email which can be used where the bounced mails will be sent. Thanks to kullmanp for adding this feature. +'''(Mar-17-2016)''' + +* In quiet mode (-q), list of one line attachments were still printed on stdout. +* Windows binary linked with OpenSSl 1.0.2h +'''(May-17-2016)''' + +===1.18=== +* Added -read-timeout flag. Default timeout is 5 seconds. When -starttls flag was used with ssl port 465 at gmail, recv() was blocked for a long time. Fixes #61. +'''(Jun-20-2015)''' + +===1.17b15=== +* Released for testing. +'''(May-25-2014)''' + +* When the mail is sent in interactive mode, add a CRLF after the last header. Fixes #58 +'''(May-24-2014)''' + +* Read multi line SMTP response messages. Before if the status code was not what was expected, read was stopped after reading the first line. Sometimes it is useful to see all the lines as the messages could tell what is wrong. Fixes #57 +'''(May-24-2014)''' + +* If no encoding type was specified for a one line message, it was NULL and a debug message tried to print it causing a seg fault. Fixes Issue #45. +'''(Feb-01-2014)''' + +* The flag -emdbed-image img1 -embed-image imd2 etc to embed image in HTML. +'''(Dec-27-2013)''' + +* The flag -d is changed to -domain. Added new option -disposition to specify the type of content disposition. +'''(Dec-22-2013)''' + +* -enc flag is changed to -enc-type which is used for encoding type of one line messages. This option can be used with -M or -attach. +'''(Dec-08-2013)''' + +* Major changes on how things work. Now each of one line message can have its own character set, mime type and encoding type. Before there was not way to distinguish the messages. The optiopn -attach option also behaves the same way. + +* Fixes Issue 29. A file can be included as body of the mail with the flag -msg-body file. The character set and mime type can be specified with -cs and -mime-type flags but files can not be encoded. + +* Fixes Issue 37. A new flags -mime-type "type" can be used to specify the MIME type. Default is text/plain. It can be used with -M or -attach. +'''(Dec-08-2013)''' + +* Fixes Issue 36. Only specify filename with -attach. Specify other MIME * parameters with appropriate flags. +'''(Dec-07-2013)''' + +* Fixes Issue 35. The default encoding type is base64. If no encoding should be used, specify encoding type with -enc-type "none". +'''(Dec-07-2013)''' + +* Fixess Issue 34. Try the current addrinfo in connect(), mistakenly the first one was used. If getaddrinfo() returned multiple results and if connect() to first address failed, the rest of the addresses were not tried. Patch sent by Peter Liu. +'''(Nov-27-2013)''' + +* Fixes Issue 30. Support custom Content-type header and to support Conent-ID. The custom Conent-type can be specified with the option -conent-type and the Conent-ID of the attachment can be specified as fifth value of the -attach option. Thanks to skalogryz for supplying the patch. +'''(Nov-06-2013)'''. + +* Fixes Issue 26. Added options -4 and -6 to force using IPv4 or IPv6 address of the SMTP server. +'''(Oct-20-2013)''' + +=== 1.17b14=== +* Multiline input with -M was completely broken. + '''(Oct-20-2013)''' + +===1.17b13=== +* Changed Copyright to more flexible BSD from GNU GPL. Added -copyright flag. +'''(Oct-12-2013)''' + +* SMTP authentication was broken if the username and passwords are long enough to create longer than 60 characters base64 encoded string. A newline was added after 60 characters causing authentication to fail. +Fixes Issue 20. Fixes Issue 22. +'''(Oct-12-2013)''' + +* Support DESTDIR during installation. Fixes Issue 5. + +* Don't show SSL info in quiet mode. Fixes Issue 21. +'''(Oct-12-2013)''' + +* New ommand line option -enc for Content-Transfer-Encoding. If your one line text message with -M is non-ascii, you should use -enc base64. Note: non-ascii input from windows cmd does not work at this time, + however it works fine in linux and mac. +'''(Jul-01-2013)''' + +===1.17b12=== +* Add \r\n to multiple one line messages specified by -M. Possible Fix for Issue 12. + +* Do not show attachments in verbose mode. The option -show_attach will enable it. Fixes Issue 13. +'''(Jun-16-2013)''' + +===1.17b11=== +* mailsend writes "Mail sent successfully" message on stdout in interactive mode even if -quiet flag is used. Fixes Issue 6. +'''(May-05-2013)''' + +===1.17b10=== +* If there are some kind of socket error, print the error message. If a log file is specified with -log, the error will be written there. +'''(Mar-23-2013)''' + +* modified Makefile.in to support make -j. Fixes Issue 4. + +* fixed several warnings +'''(Apr-27-2013)''' + +===1.17b9=== +* There was a bug if multiple attachments were specified. The temp file was + created only once and was removed. The bug shows up in Windows. + +* The flag -l is changed to -list. + +* A new flag -log is added for logging status messages to a file. It is very alpha at the moment. User -v to see anything useful. The log messages are time stamped. +'''(Mar-16-2013)''' + +===1.17b8=== +* Print more error messages. +'''(Mar-06-2013)''' + +===1.17b7=== +* Print some error message with errno. +'''(Mar-06-2013)''' + +===1.17b6=== +* MIME temp file was created on current working directory. Now go through some huristics to determine the path. +'''(Mar-05-2013)''' + +===1.17b5=== +* getaddrinfo() was not found in ws2_32 dll in Windows 2000. included Wspiapi.h header in msock library as per Microsoft . Thanks to Bob R for reporting the issue. It's a Windows only change. +'''(Feb-21-2013)''' + +===1.17b4=== +* Added flag -H "header" to add custom headers. For example: -H "X-Priority: 1" -H "Importance: high". Requested by David Young. +'''(Feb-12-2013)''' + +===1.17b3=== +* Individual auth flags were not working. +'''(Jan-21-2013)''' + +===1.17b2=== +* IPv6 address was printed wrong. +'''(Aug-26-2012)''' + +===1.17b1=== +* IPv6 support for all platforms. +'''(Aug-25-2012)''' + +* Multiple one line message can be added with -M, for example: -M "message line 1" -M message line 2" +'''(Aug-26-2012)''' + +* First cut of debian package. + +* After sending SMTP EOM, the status code was not checked. It is possible that the server has rejected the mail due to message too large etc. Thanks to Peter Soppe for reporting it. +'''(Aug-24-2012)''' + +* Do not enforce authentication just because server supports it. Do it only if the user wants it. +'''(Jun-29-2012)''' + +* Added flag -ct for connect timeout with SMTP server. The default default timeout is 5 seconds. + +* Exit with 0 if everything went well otherwise exit with 1 in case of error. + +* created man page. Added install target to Makefile. +'''(July-05-2012)''' + +===1.16=== +* Added support for SMTP over SSL with -ssl. It is different than STARTTLS in the sense that it is not part of SMTP protocol, the entire connection is encrypted from start to end. Note: No checking is performed on certificate. At this time, smtp.gmail.com does SMTP over SSL on port 465. +'''(Feb-27-2012)''' + +* Cleaned up examples. Examples can be seen with -ex, before at least -exa was needed. +'''(Feb-27-2012)''' + +* Created Makefile.nmake for MS Visual Studio 10. +'''(Feb-28-2012)''' + +===1.15b5=== +* New flag '-name "Your Name"' can be used to add your name in the From header, e.g. -f jdoe@example.com -name "John Doe" will create the From header as: From: John Doe +'''(Apr-24-2007)''' + +* Changed >> to [C] and << to [S] in debug output to represent Client and Server respectively. +'''(Apr-25-2007)''' + +* The flags '-d domain' is not mandatory anymore. If not specified "localhost" will be used as domain in HELO or EHLO. +'''(Apr-25-2007)''' + +===1.15b4=== +* When using -info and -smtp, message was wrong. + +* Greetings can be multi line. Thanks to Keith B Smith. + +* Some server don't say ESMTP in the greetings, but still supports it. In that case force EHLO with -esmtp. Again Thanks to Keith B Smith. + +* The flag -ex is now -example. +'''(Mar-18-2007)''' + +===1.15b3=== +* Compiled on Windows with openssl 0.9.7l. +* If addresses are specified in a file with -l, do not ask for To. Addresses int he file not not validated howerver. + +===1.15b2=== +* New flag -ex show examples. + +* New flag -info to show SMTP server info. + +* Few bug fixes +'''(Feb-18-2007)''' + +===1.15a=== +* Added support for AUTH CRAM-MD5, AUTH PLAIN and AUTH LOGIN autentication. +'''(Feb-17-2007)''' + +* Added support for AUTH PLAIN +'''(Feb-11-2007)''' + +* The flag "-a" is changed to "-attach" +'''(Feb-11-2007)''' + +* The flags "-m" is gone. There is no need for it anymore, as attachment type can be changed with i or a with the flag -a. If you want a "body" text, specify it with -a "file.txt,text/plain,i" as the first attachment. +'''(Feb-11-2007)''' + +* STARTTLS support. If the SMTP server supports it, enable it in mailsend with flag "-starttls". +'''(Feb-11-2007)''' + +===1.14=== +* Content-disposition can be changed to attachment or inline. Example: -a * "file.gif,image/gif,i". The default is attachment. -a * "file.gif,image.gif,a" is same as a "file.gif,image/gif" +'''(Feb-06-2007)''' + +* Bcc was broken +'''(Nov-03-2006)''' + +===1.13=== +* If no subject is specified with -sub, it'll be empty. Before the default subject was "hello!" +'''(Jun-25-2006)''' + +* The flag -M was broken. Thanks to Amnon S for reporting it. +'''(Jun-25-2006)''' + +* For text attachments, Content-Disposition was always inline. Now it'll be attachment. Thanks to Danny Casier. +'''(May-21-2006)''' + +===1.12=== +* mailsend was not adding Date header. Some SMTP servers does not add it either. Now by default it'll add the Date header (make sure your clock is set properly). If you don't want mailsend to add Date header, use the flag +D. Thanks to Mr S J Hannan for the bug report. +'''(May-20-2006)''' + +===1.11=== +* Attachment seperator character is changed to a , from :. Because in Windows drive is specified with :. Thanks to Jeppe Teglgaard Mohr for pointing it out. Example: -a "c:\file.gif,image/gif" +'''(Apr-23-2006)''' + +* The flag -m is back. This option can be used to attach a text or html file as a blody (inline). Example: -m "file.html,text/html". It is the caller's responsibily to make sure file type is correct. mailsend will not verify if the file is binary or text. +'''(Apr-23-2006)''' + +* New flag -rrr to request read receipts. Suggested by marc hubaut. +'''(May-14-2006)''' + +* New flag -rt to add Reply-To header. +'''(May-14-2006)''' + +===1.10=== +* If the attachment type was text/plain, was not added after Content-Disposition line which caused attachment to be ignored by some mail readers. diff --git a/coregrade/src/mailsend/Makefile b/coregrade/src/mailsend/Makefile index 2f468d3..1133cf3 100644 --- a/coregrade/src/mailsend/Makefile +++ b/coregrade/src/mailsend/Makefile @@ -2,9 +2,30 @@ # Makefile automatically generated by genmake 1.0, May-03-00 # genmake 1.0 by muquit@muquit.com, http://www.muquit.com/ ## +srcdir = . + +top_srcdir = . CC= gcc -DEFS= -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DHAVE_STRINGS_H=1 -DHAVE_MEMORY_H=1 -DHAVE_MALLOC_H=1 -DHAVE_UNISTD_H=1 -DHAVE_CTYPE_H=1 -DHAVE_STDINT_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_STDLIB_H=1 -DHAVE_FCNTL_H=1 -DHAVE_SYS_FILE_H=1 -DHAVE_FLOCK=1 -DHAVE_SOCKET=1 -DHAVE_HTONL=1 -DHAVE_GETHOSTNAME=1 -DHAVE_GETHOSTBYADDR=1 -DHAVE_YP_GET_DEFAULT_DOMAIN=1 -DHAVE_LIBNSL=1 -DHAVE_RES_SEARCH=1 -DHAVE_LIBRESOLV=1 -DHAVE_INET_ATON=1 -DHAVE_DN_SKIPNAME=1 -DHAVE_MKSTEMP=1 -DHAVE_OPENSSL=1 -DUNIX +DEFS= -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DHAVE_STRINGS_H=1 -DHAVE_MEMORY_H=1 -DHAVE_MALLOC_H=1 -DHAVE_UNISTD_H=1 -DHAVE_CTYPE_H=1 -DHAVE_STDINT_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_STDLIB_H=1 -DHAVE_FCNTL_H=1 -DHAVE_SYS_FILE_H=1 -DHAVE_LIMITS_H=1 -DHAVE_FLOCK=1 -DHAVE_SOCKET=1 -DHAVE_HTONL=1 -DHAVE_GETHOSTNAME=1 -DHAVE_GETHOSTBYADDR=1 -DHAVE_RES_SEARCH=1 -DHAVE_LIBRESOLV=1 -DHAVE_INET_ATON=1 -DHAVE_DN_SKIPNAME=1 -DHAVE_MKSTEMP=1 -DHAVE_GETADDRINFO=1 -DUNIX PROGNAME= mailsend +INSTALL = /usr/bin/install -c +INSTALL_PROGRAM = ${INSTALL} +INSTALL_DATA = ${INSTALL} -m 644 + +DESTDIR = +prefix = /usr/local +exec_prefix = ${prefix} +datarootdir = ${prefix}/share +datadir = ${datarootdir} +bindir = ${exec_prefix}/bin +mandir = ${datarootdir}/man +man1dir = $(mandir)/man1 +BINDIR = $(DESTDIR)$(bindir) +MAN1DIR = $(DESTDIR)$(man1dir) + +#BINDIR= /usr/bin +MANPAGE= doc/mailsend.1.gz +#MANDIR= /usr/share/man/man1 MUTILS_INCLUDE= -I./libs/libmutils MSOCK_INCLUDE= -I./libs/libmsock @@ -14,38 +35,72 @@ MUTILS_LIB= ./libs/libmutils/libmutils.a MSOCK_LIB=./libs/libmsock/libmsock.a SLL_LIB= ./libs/libsll/libsll.a -OPENSSL_DIR=/usr/ -OPENSSL_INC=-I/usr/include -#OPENSSL_LIBS=-L/usr/lib -lssl -lcrypto -ldl +OPENSSL_DIR= +OPENSSL_INC= +OPENSSL_LIBS= -INCLUDES= -I. -I/usr/include/malloc $(MUTILS_INCLUDE) $(MSOCK_INCLUDE) $(SLL_INCLUDE) $(OPENSSL_INC) +STRIP=/usr/bin/strip + +INCLUDES= -I. $(MUTILS_INCLUDE) $(MSOCK_INCLUDE) $(SLL_INCLUDE) $(OPENSSL_INC) DEFINES= $(INCLUDES) $(DEFS) -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 \ -DHAVE_MATH_H=1 CFLAGS= -g -O2 -Wall $(DEFINES) -LIBS=$(MSOCK_LIB) $(SLL_LIB) $(MUTILS_LIB) -L/usr/lib -lssl -lcrypto -ldl +LIBS=$(MSOCK_LIB) $(SLL_LIB) $(MUTILS_LIB) $(OPENSSL_LIBS) -lresolv -SRCS = main.c smtp.c utils.c setget.c -OBJS = main.o smtp.o utils.o setget.o +SRCS = main.c smtp.c utils.c setget.c examples.c +OBJS = main.o smtp.o utils.o setget.o examples.o .c.o: rm -f $@ $(CC) $(CFLAGS) -c $*.c -all: mlibs $(PROGNAME) +all: $(PROGNAME) -$(PROGNAME) : $(OBJS) + +$(PROGNAME) : mlibs $(OBJS) $(CC) $(CFLAGS) $(OBJS) -o $(PROGNAME) $(LIBS) - cp -f $(PROGNAME) ../modules/ -mlibs: +install: installdirs install-bin install-man + +install-bin: $(BINDIR) $(PROGNAME) + $(INSTALL_PROGRAM) $(PROGNAME) $(BINDIR)/$(PROGNAME) + +install-man: + $(INSTALL_DATA) $(MANPAGE) $(MAN1DIR) + +installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${bindir} + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man1 + +deb: + @ruby ./mk_debian_package.rb + +help: + @echo "make - to compile" + @echo "make install - to install" + @echo "make docs - generate document" + @echo "make deb - create debian package" + +docs: + @ruby scripts/mk_doc.rb +ex: + @ruby scripts/mk_examples.rb > examples.c + +libmsock: libmutils (cd libs/libmsock && make) + +libmutils: (cd libs/libmutils && make) - (cd libs/libsll && make) + +libsll: + (cd libs/libsll && make) + +mlibs: libmsock libsll clean: - (cd libs/libmsock && make clean) - (cd libs/libmutils && make clean) - (cd libs/libsll && make clean) + +(cd libs/libmsock && make clean) + +(cd libs/libmutils && make clean) + +(cd libs/libsll && make clean) rm -f *.o *~ core $(PROGNAME) diff --git a/coregrade/src/mailsend/Makefile.in b/coregrade/src/mailsend/Makefile.in new file mode 100755 index 0000000..0af6103 --- /dev/null +++ b/coregrade/src/mailsend/Makefile.in @@ -0,0 +1,106 @@ +## +# Makefile automatically generated by genmake 1.0, May-03-00 +# genmake 1.0 by muquit@muquit.com, http://www.muquit.com/ +## +srcdir = @srcdir@ +VPATH = @srcdir@ +top_srcdir = @top_srcdir@ +CC= @CC@ +DEFS= @DEFS@ -DUNIX +PROGNAME= mailsend +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ + +DESTDIR = +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ +datadir = @datadir@ +bindir = @bindir@ +mandir = @mandir@ +man1dir = $(mandir)/man1 +BINDIR = $(DESTDIR)$(bindir) +MAN1DIR = $(DESTDIR)$(man1dir) + +#BINDIR= /usr/bin +MANPAGE= doc/mailsend.1.gz +#MANDIR= /usr/share/man/man1 + +MUTILS_INCLUDE= -I./libs/libmutils +MSOCK_INCLUDE= -I./libs/libmsock +SLL_INCLUDE= -I./libs/libsll + +MUTILS_LIB= ./libs/libmutils/libmutils.a +MSOCK_LIB=./libs/libmsock/libmsock.a +SLL_LIB= ./libs/libsll/libsll.a + +OPENSSL_DIR=@OPENSSL_DIR@ +OPENSSL_INC=@OPENSSL_INC@ +OPENSSL_LIBS=@OPENSSL_LIBS@ @DL_LIB@ + +STRIP=@STRIP@ + +INCLUDES= -I. $(MUTILS_INCLUDE) $(MSOCK_INCLUDE) $(SLL_INCLUDE) $(OPENSSL_INC) + +DEFINES= $(INCLUDES) $(DEFS) -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 \ + -DHAVE_MATH_H=1 + +CFLAGS= @CFLAGS@ $(DEFINES) +LIBS=$(MSOCK_LIB) $(SLL_LIB) $(MUTILS_LIB) $(OPENSSL_LIBS) @LIBS@ + +SRCS = main.c smtp.c utils.c setget.c examples.c +OBJS = main.o smtp.o utils.o setget.o examples.o + +.c.o: + rm -f $@ + $(CC) $(CFLAGS) -c $*.c + +all: $(PROGNAME) + + +$(PROGNAME) : mlibs $(OBJS) + $(CC) $(CFLAGS) $(OBJS) -o $(PROGNAME) $(LIBS) + +install: installdirs install-bin install-man + +install-bin: $(BINDIR) $(PROGNAME) + $(INSTALL_PROGRAM) $(PROGNAME) $(BINDIR)/$(PROGNAME) + +install-man: + $(INSTALL_DATA) $(MANPAGE) $(MAN1DIR) + +installdirs: + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${bindir} + $(SHELL) ${top_srcdir}/mkinstalldirs ${DESTDIR}${mandir}/man1 + +deb: + @ruby ./mk_debian_package.rb + +help: + @echo "make - to compile" + @echo "make install - to install" + @echo "make docs - generate document" + @echo "make deb - create debian package" + +docs: + @ruby scripts/mk_doc.rb +ex: + @ruby scripts/mk_examples.rb > examples.c + +libmsock: libmutils + (cd libs/libmsock && make) + +libmutils: + (cd libs/libmutils && make) + +libsll: + (cd libs/libsll && make) + +mlibs: libmsock libsll + +clean: + +(cd libs/libmsock && make clean) + +(cd libs/libmutils && make clean) + +(cd libs/libsll && make clean) + rm -f *.o *~ core $(PROGNAME) diff --git a/coregrade/src/mailsend/Makefile.nmake b/coregrade/src/mailsend/Makefile.nmake new file mode 100755 index 0000000..ac875ce --- /dev/null +++ b/coregrade/src/mailsend/Makefile.nmake @@ -0,0 +1,58 @@ +## +# Makefile automatically generated by genmake 1.0, May-03-00 +# genmake 1.0 by muquit@muquit.com, http://www.muquit.com/ +# updated for MS Visutal Studio 10 Feb-27-2012 +## +PROGNAME= mailsend.exe +LINKER=link -nologo + +OPENSSL_DIR=c:/openssl +OPENSSL_INC=-I$(OPENSSL_DIR)/include +OPENSSL_LIBS=$(OPENSSL_DIR)/lib/libeay32.lib $(OPENSSL_DIR)/lib/ssleay32.lib + + +MUTILS_INCLUDE= -I./libs/libmutils +MSOCK_INCLUDE= -I./libs/libmsock +SLL_INCLUDE= -I./libs/libsll +INCLUDES= -I. $(MUTILS_INCLUDE) $(MSOCK_INCLUDE) $(SLL_INCLUDE) $(OPENSSL_INC) + +MUTILS_LIB= ./libs/libmutils/mutils.lib +MSOCK_LIB=./libs/libmsock/msock.lib +SLL_LIB= ./libs/libsll/sll.lib + +# don't define -DSYS_WIN32.. win2k complains +DEFINES= $(INCLUDES) $(DEFS) -DWINNT=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MATH_H=1 -DHAVE_OPENSSL=1 -DHAVE_GETADDRINFO=1 +CFLAGS= $(DEFINES) /Ox /W3 /wd4996 /nologo +WINDOWS_LIBS=ws2_32.lib shell32.lib advapi32.lib user32.lib gdi32.lib winmm.lib comdlg32.lib comctl32.lib +LIBS=$(MSOCK_LIB) $(SLL_LIB) $(MUTILS_LIB) $(OPENSSL_LIBS) $(WINDOWS_LIBS) + +SRCS = main.c smtp.c utils.c setget.c examples.c +OBJS = main.obj smtp.obj utils.obj setget.obj examples.obj + +all: $(PROGNAME) + +$(PROGNAME) : LIBRARIES $(OBJS) + $(CC) $(CFLAGS) $(LIBS) $(OBJS) /Fe$(PROGNAME) + +LIBRARIES: + cd libs\libsll + nmake -f Makefile.nmake + cd ..\.. + cd libs\libmsock + nmake -f Makefile.nmake + cd ..\.. + cd libs\libmutils + nmake -f Makefile.nmake + cd ..\.. + +clean: + del $(OBJS) $(PROGNAME) + cd libs\libsll + nmake -f Makefile.nmake clean + cd ..\.. + cd libs\libmsock + nmake -f Makefile.nmake clean + cd ..\.. + cd libs\libmutils + nmake -f Makefile.nmake clean + cd ..\.. diff --git a/coregrade/src/mailsend/NOTES.txt b/coregrade/src/mailsend/NOTES.txt new file mode 100644 index 0000000..ca661db --- /dev/null +++ b/coregrade/src/mailsend/NOTES.txt @@ -0,0 +1,96 @@ +My Personal notes +================= +How to release +-------------- +* pixel + - compile windows binary + - test by running test_gmail.sh + +* t105 + - compile. run make docs + - ldd mailsend to make sure libs are ok. + - test by running test_gmail.sh + - cp mailsend.exe mailsendV.exe + - zip mailsendV.zip mailsendV.exe + - update issues if needed. + +-- +Apr-28-2013 + +Notes on mixing and embedding attachment +======================================== +* Just embed images, say 2 images + +Content-Type: multipart/related: boundary=relate + +--relate +Content-Type: multipart/alternative; boundary=alt + +--alt +Content-Type: text/html; charset=ISO-8859-1 + +image 1 +
+image 2 + +--alt-- +--relate +Content-Type: image/jpeg; name="test1.jpg" +Content-Transfer-Encoding: base64 +Content-ID: +X-Attachment-Id: img1_deadbeef + +base64........ +base64........ +--start +Content-Type: image/png; name="test.png" +Content-Transfer-Encoding: base64 +Content-ID: +X-Attachment-Id: img2_deadbeef + +base64........ +base64........ +--relate-- + +* embedded images and a pdf attachment +-------------------------------------------- + +Content-Type: multipart/mixed: boundary=mixed + +--mixed +Content-Type: multipart/related: boundary=relate + +--relate +Content-Type: multipart/alternative; boundary=alt + +--alt +Content-Type: text/html; charset=ISO-8859-1 + +image 1 +
+image 2 + +--alt-- +--relate +Content-Type: image/jpeg; name="test1.jpg" +Content-Transfer-Encoding: base64 +Content-ID: +X-Attachment-Id: img1_deadbeef + +base64........ +base64........ +--start +Content-Type: image/png; name="test.png" +Content-Transfer-Encoding: base64 +Content-ID: +X-Attachment-Id: img2_deadbeef + +base64........ +base64........ +--relate-- +--mixed +Content-Type: application/pdf; name="mailsend.pdf" +Content-Disposition: attachment; filename="mailsend.pdf" +Content-Transfer-Encoding: base64 +X-Attachment-Id: f_hppv4bio1 +--mixed diff --git a/coregrade/src/mailsend/README.asc b/coregrade/src/mailsend/README.asc new file mode 100755 index 0000000..4399160 --- /dev/null +++ b/coregrade/src/mailsend/README.asc @@ -0,0 +1,253 @@ += Announcement (Feb-11-2019) + +If you use mailsend, please try https://github.com/muquit/mailsend-go[mailsend-go]. Your feedback will be appreciated. + +mailsend will still be maintained (critical security fixes) but no new features will be added. + +Thanks! + += mailsend v1.19 +:experimental: +:toc: +:toc-placement: preamble + +*mailsend* is a simple command line program to send mail via http://www.ietf.org/rfc/rfc0821.txt?number=821[SMTP] protocol. Long time ago, I needed to send a piece of alert mail from a program in a networked Windows machine, but could not find a simple program like this installed. So I wrote one. You might find it useful as well. The program does not use any config file and I plan to keep it that way. *From version 1.17b1+, IPv6 is supported in all platforms.* Suggestions, bug reports are always welcome. If you have any question, request or suggestion, please enter it in the https://github.com/muquit/mailsend/issues/[Issues] with appropriate label. + +[[download-sourcebinary]] +== Download source/binary + +To download source/binaries, please go to the https://github.com/muquit/mailsend/releases/[releases] page. + +Bug fixes and stable features are merged from dev branch to master branch every now and then. Clone the repo if you want the latest code. + +[[supported-platforms]] +== Supported Platforms + +* Microsoft Windows +* Linux/Unix +* Mac OS X + +It should compile on any POSIX compliant system. Works on 64 bit systems. + +== Features +Few main features: + +* ESMTP Authentication +* IPv6 transport +* Attachments +* Embed images in HTML +* Send mail to a list of users + +[[versions]] +== Versions +=== Latest stable version is 1.19 + +Released on May-17-2016. Please look at: link:ChangeLog.mediawiki[ChangeLog]. + + +== Synopsis + +---- + Version: @(#) mailsend v1.19 + + Copyright: BSD. It is illegal to use this software for Spamming + + (Compiled with OpenSSL version: OpenSSL 1.0.2f 28 Jan 2016) + usage: mailsend [options] + Where the options are: + -copyright - show copyright information + -4 - Force to use IPv4 address of SMTP server + -6 - Force to use IPv6 address of SMTP server + -smtp hostname/IP* - Hostname/IP address of the SMTP server + -port SMTP port - SMTP port + -domain domain - domain name for SMTP HELO/EHLO + -t to,to..* - email address/es of the recipient/s + -cc cc,cc.. - carbon copy address/es + +cc - do not ask for Carbon Copy + -ct seconds - Connect timeout. Default is 5 seconds + -read-timeout seconds - Read timeout. Default is 5 seconds + -bc bcc,bcc.. - blind carbon copy address/es + +bc - do not ask for Blind carbon copy + +D - do not add Date header + -f address* - email address of the sender + -sub subject - subject + -list_address file - a file containing a list of email addresses + -log file - write log messages to this file + -cs character set - for text/plain attachments (default is us-ascii) + -separator character - separator used with -attach. Default is comma (,) + If used must be specified before -attach + -enc-type type - encoding type. base64, 8bit, 7bit etc. + Default is base64. Special type is "none" + -aname name - name of the attachment. Default is filename + -content-id id - content-id in the attachment + -mime-type type - MIME type + -dispostion val - "attachment" or "inline". Default is "attachment" + -attach file,mime_type,[i/a] (i=inline,a=attachment) + - attach this file as attachment or inline + -show-attach - show attachment in verbose mode, default is no + -show-mime-types - show the compiled in MIME types + -M "one line msg" - attach this one line text message + -content-type type - Content type. Default: multipart/mixed + -msg-body path - Path of the file to include as body of mail + -embed-image image - Path of image to embed in HTML + -H "header" - Add custom Header + -name "Full Name" - add name in the From header + -v - verbose mode + -V - show version info + -w - wait for a CR after sending the mail + -rt email_address - add Reply-To header + -rrr email_address - request read receipts to this address + -rp - return-path address + -ssl - SMTP over SSL + -starttls - use STARTTLS if the server supports it + -auth - try CRAM-MD5,LOGIN,PLAIN in that order + -auth-cram-md5 - use AUTH CRAM-MD5 authentication + -auth-plain - use AUTH PLAIN authentication + -auth-login - use AUTH LOGIN authentication + -user username - username for ESMTP authentication + -pass password - password for ESMTP authentication + -example - show examples + -ehlo - force EHLO + -info - show SMTP server information + -help - shows this help + -q - quiet + + The options with * must be specified + Environment variables: + SMTP_USER_PASS for plain text password (-pass) +---- + +The options with asterisk must be specified. Environment variable *SMTP_USER_PASS* can be used to set the SMTP authentication password instead of the option +-pass+ + +[[how-to-compileinstall]] +== How to compile/install + + +[[linuxunixmac-os-x]] +=== Linux/Unix/Mac OS X + +Specify the path of OpenSSL with +--with-openssl+. In most Linux systems, it is installed in +/usr+. If OpenSSL is installed in non-standard places, type +./configure --help+ for options. + +---- + $ /bin/sh ./configure --with-openssl=/usr +---- + + +Default installation location is +/usr/local+. If you want to change that: + +---- + $ /bin/sh ./configure --with-openssl=/usr --prefix=/usr/local/mailsend + $ make clean + $ make + # make install + Or + $ sudo make install + Or + $ make install DESTDIR=/foo +---- + +The name of the binary will be mailsend. If compiled with OpenSSL, the +support for STARTTLS and SMTP over SSL will be available. + +[[linux-debian-package]] +=== Linux Debian package + +Starting from mailsend v1.18, Debian package is no longer supplied. If you want to build the Debian package yourself, after compiling mailsend, type: + +---- + $ ruby scripts/mk_debian_package.rb +---- + +To install the package, type: + +[source,java] +---- + $ sudo dpkg -i mailsend_1.19-ubuntu_i386.deb +---- + +To uninstall, type: + +[source,java] +---- + $ sudo dpkg -r mailsend +---- + +[[microsoft-windows]] +=== Microsoft Windows + + +A compiled binary with SMTP authentication support for MS Windows is already supplied. However, if you need to modify something or want to compile it yourself, you will need freely available Visual Studio from Microsoft. For Visual Studio 2015 community edition, start *Developer Command Prompt for VS2015*. + +OpenSSL is required, if you need to compile with SMTP authentication support. Look at +INSTALL.32+ that comes with OpenSSL on how to compile and install OpenSSL. mailsend's +Makefile.nmake+ expects it to be installed at +c:\openssl+ + +To compile mailsend, open a command shell and type: + +---- + c:\> nmake -f Makefile.nmake clean + c:\> nmake -f Makefile.nmake +---- + +It compiles cleanly with cygwin as well. The name of the binary will be +mailsend.exe+ + +[[known-issues]] +== Known Issues + + +* For text or html attachments, \r\n is not added at the end of lines. Some SMTP servers (e.g. qmail) does not like that. It will be fixed in some future release. + +* For non ascii characters, MIME headers are not converted as per RFC2047 + +* In Windows, non ascii characters can not be entered in subject or with +-M+ from +command line (Works fine in Linux and Mac). *mailsend* uses standard C +string functions and Windows versions do not know about multibyte input +from command line (https://github.com/muquit/mailsend/issues/14[Issue# 14]). If anyone is familiar with it, you are welcome to implement the support, unfortunately I do not have time at this time. + +[[faq]] +== FAQ + + +Please look at link:doc/mailsend-FAQ.mediawiki[mailsend FAQ] + +[[examples]] +== Examples + + +Please type: +mailsend -example+ or look at link:doc/examples.mediawiki[examples] + +[[license]] +== License + +BSD + +To display license, please type: `mailsend -copyright` + +---- +Copyright (C) 2001-2019 Muhammad Muquit (http://www.muquit.com/) + + o Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + + o 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. + + o Neither the name of the author MUHAMMAD MUQUIT (http://www.muquit.com/) +nor the names of its contributors may be used to endorse or promote +products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT HOLDER OR CONTRIBUTORS 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. +---- + +''' +This document is created with https://github.com/asciidocfx/AsciidocFX[AsciidocFX] diff --git a/coregrade/src/mailsend/TODO b/coregrade/src/mailsend/TODO new file mode 100644 index 0000000..08613dd --- /dev/null +++ b/coregrade/src/mailsend/TODO @@ -0,0 +1,4 @@ +- add \r\n at the end of each lines for text and html attachments. +- encode non-ascii headers as per RFC2047 +- implement encoding type to one line message. command line -enc added +(Jun-30-2013) diff --git a/coregrade/src/mailsend/aclocal.m4 b/coregrade/src/mailsend/aclocal.m4 new file mode 100755 index 0000000..59db081 --- /dev/null +++ b/coregrade/src/mailsend/aclocal.m4 @@ -0,0 +1,5370 @@ +dnl aclocal.m4 generated automatically by aclocal 1.4-p5 + +dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. + +dnl $Id: acinclude.m4,v 1.218.2.2 2002/11/17 19:28:57 wez Exp $ +dnl +dnl This file contains local autoconf functions. + +dnl PHP_ADD_MAKEFILE_FRAGMENT([srcfile[, ext_srcdir[, ext_builddir]]]) +dnl +dnl Processes a file called Makefile.frag in the source directory +dnl of the most recently added extension. $(srcdir) and $(builddir) +dnl are substituted with the proper paths. Can be used to supply +dnl custom rules and/or additional targets. +dnl +AC_DEFUN([PHP_ADD_MAKEFILE_FRAGMENT],[ + ifelse($1,,src=$ext_srcdir/Makefile.frag,src=$1) + ifelse($2,,ac_srcdir=$ext_srcdir,ac_srcdir=$2) + ifelse($3,,ac_builddir=$ext_builddir,ac_builddir=$3) + sed -e "s#\$(srcdir)#$ac_srcdir#g" -e "s#\$(builddir)#$ac_builddir#g" $src >> Makefile.fragments +]) + + +dnl PHP_DEFINE(WHAT[, value]) +dnl +dnl Creates builddir/include/what.h and in there #define WHAT value +dnl +AC_DEFUN([PHP_DEFINE],[ + [echo "#define ]$1[]ifelse([$2],,[ 1],[ $2])[" > include/php_]translit($1,A-Z,a-z)[.h] +]) + +dnl PHP_INIT_BUILD_SYSTEM +dnl +AC_DEFUN([PHP_INIT_BUILD_SYSTEM],[ +mkdir include >/dev/null 2>&1 +> Makefile.objects +> Makefile.fragments +dnl We need to play tricks here to avoid matching the egrep line itself +pattern=define +egrep $pattern'.*include/php' $srcdir/configure|sed 's/.*>//'|xargs touch 2>/dev/null +]) + +dnl PHP_GEN_GLOBAL_MAKEFILE +dnl +dnl Generates the global makefile. +dnl +AC_DEFUN([PHP_GEN_GLOBAL_MAKEFILE],[ + cat >Makefile <> Makefile + done + + cat $abs_srcdir/Makefile.global Makefile.fragments Makefile.objects >> Makefile +]) + +dnl PHP_ADD_SOURCES(source-path, sources[, special-flags[, type]]) +dnl +dnl Adds sources which are located relative to source-path to the +dnl array of type type. Sources are processed with optional +dnl special-flags which are passed to the compiler. Sources +dnl can be either written in C or C++ (filenames shall end in .c +dnl or .cpp, respectively). +dnl +dnl Note: If source-path begins with a "/", the "/" is removed and +dnl the path is interpreted relative to the top build-directory. +dnl +dnl which array to append to? +AC_DEFUN([PHP_ADD_SOURCES],[ + PHP_ADD_SOURCES_X($1, $2, $3, ifelse($4,cli,PHP_CLI_OBJS,ifelse($4,sapi,PHP_SAPI_OBJS,PHP_GLOBAL_OBJS))) +]) +dnl +dnl _PHP_ASSIGN_BUILD_VARS(type) +dnl internal, don't use +AC_DEFUN([_PHP_ASSIGN_BUILD_VARS],[ +ifelse($1,shared,[ + b_c_pre=$shared_c_pre + b_cxx_pre=$shared_cxx_pre + b_c_meta=$shared_c_meta + b_cxx_meta=$shared_cxx_meta + b_c_post=$shared_c_post + b_cxx_post=$shared_cxx_post +],[ + b_c_pre=$php_c_pre + b_cxx_pre=$php_cxx_pre + b_c_meta=$php_c_meta + b_cxx_meta=$php_cxx_meta + b_c_post=$php_c_post + b_cxx_post=$php_cxx_post +])dnl + b_lo=[$]$1_lo +]) + +dnl PHP_ADD_SOURCES_X(source-path, sources[, special-flags[, target-var[, shared[, special-post-flags]]]]) +dnl +dnl Additional to PHP_ADD_SOURCES (see above), this lets you set the +dnl name of the array target-var directly, as well as whether +dnl shared objects will be built from the sources. Should not be +dnl used directly. +dnl +AC_DEFUN([PHP_ADD_SOURCES_X],[ +dnl relative to source- or build-directory? +dnl ac_srcdir/ac_bdir include trailing slash + case $1 in + ""[)] ac_srcdir="$abs_srcdir/"; unset ac_bdir; ac_inc="-I. -I$abs_srcdir" ;; + /*[)] ac_srcdir=`echo "$1"|cut -c 2-`"/"; ac_bdir=$ac_srcdir; ac_inc="-I$ac_bdir -I$abs_srcdir/$ac_bdir" ;; + *[)] ac_srcdir="$abs_srcdir/$1/"; ac_bdir="$1/"; ac_inc="-I$ac_bdir -I$ac_srcdir" ;; + esac + +dnl how to build .. shared or static? + ifelse($5,yes,_PHP_ASSIGN_BUILD_VARS(shared),_PHP_ASSIGN_BUILD_VARS(php)) + +dnl iterate over the sources + old_IFS=[$]IFS + for ac_src in $2; do + +dnl remove the suffix + IFS=. + set $ac_src + ac_obj=[$]1 + IFS=$old_IFS + +dnl append to the array which has been dynamically chosen at m4 time + $4="[$]$4 [$]ac_bdir[$]ac_obj.lo" + +dnl choose the right compiler/flags/etc. for the source-file + case $ac_src in + *.c[)] ac_comp="$b_c_pre $3 $ac_inc $b_c_meta -c $ac_srcdir$ac_src -o $ac_bdir$ac_obj.$b_lo $6$b_c_post" ;; + *.cpp[)] ac_comp="$b_cxx_pre $3 $ac_inc $b_cxx_meta -c $ac_srcdir$ac_src -o $ac_bdir$ac_obj.$b_lo $6$b_cxx_post" ;; + esac + +dnl create a rule for the object/source combo + cat >>Makefile.objects<]) + fi + + if test -z "$OPENSSL_LIBDIR"; then + AC_MSG_ERROR([Cannot find OpenSSL's libraries]) + fi + + old_CPPFLAGS=$CPPFLAGS + CPPFLAGS=-I$OPENSSL_INCDIR + AC_MSG_CHECKING([for OpenSSL version]) + AC_EGREP_CPP(yes,[ +#include +#if OPENSSL_VERSION_NUMBER >= 0x0090500fL + yes +#endif + ],[ + AC_MSG_RESULT([>= 0.9.5]) + ],[ + AC_MSG_ERROR([OpenSSL version 0.9.5 or greater required.]) + ]) + CPPFLAGS=$old_CPPFLAGS + + PHP_ADD_INCLUDE($OPENSSL_INCDIR) + PHP_ADD_LIBPATH($OPENSSL_LIBDIR) + + PHP_CHECK_LIBRARY(crypto, CRYPTO_free, [ + PHP_ADD_LIBRARY(crypto) + ],[ + AC_MSG_ERROR([libcrypto not found!]) + ],[ + -L$OPENSSL_LIBDIR + ]) + + PHP_CHECK_LIBRARY(ssl, SSL_CTX_set_ssl_version, [ + PHP_ADD_LIBRARY(ssl) + ],[ + AC_MSG_ERROR([libssl not found!]) + ],[ + -L$OPENSSL_LIBDIR + ]) + + OPENSSL_INCDIR_OPT=-I$OPENSSL_INCDIR + AC_SUBST(OPENSSL_INCDIR_OPT) +]) + +dnl +OPENSSL_INC= +OPENSSL_LIB= +AC_DEFUN(OPENSSL_DO_IT_ALL, +[ + dnl Please leave this alone. I use this file in + dnl oprofile. + FATAL=1 + + AC_ARG_WITH(openssl, [ --with-openssl=PATH where the root of OpenSSL is installed ], + [ openssl_cv_dir=`eval echo "$withval"/` ]) + + AC_ARG_WITH(openssl-includes, [ --with-openssl-includes where the OpenSSL includes are. ], + [ openssl_cv_includes=`eval echo "$withval"` ]) + + + AC_ARG_WITH(openssl-libraries, [ --with-openssl-libraris where the OpenSSL library is installed.], + [ openssl_cv_libraries=`eval echo "$withval"` ]) + + dnl derive inc/lib if needed + if test -n "$openssl_cv_dir"; then + OPENSSL_DIR="$openssl_cv_dir" + if test -z "$openssl_cv_includes"; then + openssl_cv_includes=$openssl_cv_dir/include + if test -f "$openssl_cv_includes/openssl/md5.h"; then + OPENSSL_INC="-I$openssl_cv_includes" + fi + fi + if test -z "$openssl_cv_libraries"; then + openssl_cv_libraries=$openssl_cv_dir/lib + if test -d "$openssl_cv_libraries"; then + OPENSSL_LIBS="-L$openssl_cv_libraries -lssl -lcrypto" + fi + fi + else + if test -n "$openssl_cv_includes"; then + if test -f "$openssl_cv_includes/openssl/md5.h"; then + OPENSSL_INC="-I$openssl_cv_includes" + fi + fi + if test -n "$openssl_cv_libraries"; then + if test -d "$openssl_cv_libraries"; then + OPENSSL_LIBS="-L$openssl_cv_libraries -lssl -lcrypto" + fi + fi + + + fi +]) +AC_SUBST(OPENSSL_DIR) +AC_SUBST(OPENSSL_INC) +AC_SUBST(OPENSSL_LIBS) + + +dnl PHP_EVAL_LIBLINE(LINE, SHARED-LIBADD) +dnl +dnl Use this macro, if you need to add libraries and or library search +dnl paths to the PHP build system which are only given in compiler +dnl notation. +dnl +AC_DEFUN([PHP_EVAL_LIBLINE],[ + for ac_i in $1; do + case $ac_i in + -l*) + ac_ii=`echo $ac_i|cut -c 3-` + PHP_ADD_LIBRARY($ac_ii,1,$2) + ;; + -L*) + ac_ii=`echo $ac_i|cut -c 3-` + PHP_ADD_LIBPATH($ac_ii,$2) + ;; + esac + done +]) + +dnl PHP_EVAL_INCLINE(LINE) +dnl +dnl Use this macro, if you need to add header search paths to the PHP +dnl build system which are only given in compiler notation. +dnl +AC_DEFUN([PHP_EVAL_INCLINE],[ + for ac_i in $1; do + case $ac_i in + -I*) + ac_ii=`echo $ac_i|cut -c 3-` + PHP_ADD_INCLUDE($ac_ii) + ;; + esac + done +]) + +AC_DEFUN([PHP_READDIR_R_TYPE],[ + dnl HAVE_READDIR_R is also defined by libmysql + AC_CHECK_FUNC(readdir_r,ac_cv_func_readdir_r=yes,ac_cv_func_readdir=no) + if test "$ac_cv_func_readdir_r" = "yes"; then + AC_CACHE_CHECK(for type of readdir_r, ac_cv_what_readdir_r,[ + AC_TRY_RUN([ +#define _REENTRANT +#include +#include + +#ifndef PATH_MAX +#define PATH_MAX 1024 +#endif + +main() { + DIR *dir; + char entry[sizeof(struct dirent)+PATH_MAX]; + struct dirent *pentry = (struct dirent *) &entry; + + dir = opendir("/"); + if (!dir) + exit(1); + if (readdir_r(dir, (struct dirent *) entry, &pentry) == 0) + exit(0); + exit(1); +} + ],[ + ac_cv_what_readdir_r=POSIX + ],[ + AC_TRY_CPP([ +#define _REENTRANT +#include +#include +int readdir_r(DIR *, struct dirent *); + ],[ + ac_cv_what_readdir_r=old-style + ],[ + ac_cv_what_readdir_r=none + ]) + ],[ + ac_cv_what_readdir_r=none + ]) + ]) + case $ac_cv_what_readdir_r in + POSIX) + AC_DEFINE(HAVE_POSIX_READDIR_R,1,[whether you have POSIX readdir_r]);; + old-style) + AC_DEFINE(HAVE_OLD_READDIR_R,1,[whether you have old-style readdir_r]);; + esac + fi +]) + +AC_DEFUN([PHP_SHLIB_SUFFIX_NAME],[ + PHP_SUBST(SHLIB_SUFFIX_NAME) + SHLIB_SUFFIX_NAME=so + case $host_alias in + *hpux*) + SHLIB_SUFFIX_NAME=sl + ;; + *darwin*) + SHLIB_SUFFIX_NAME=dylib + ;; + esac +]) + +AC_DEFUN([PHP_DEBUG_MACRO],[ + DEBUG_LOG=$1 + cat >$1 <conftest.$ac_ext <>$1 2>&1 + rm -fr conftest* +]) + +AC_DEFUN([PHP_DOES_PWRITE_WORK],[ + AC_TRY_RUN([ +#include +#include +#include +#include +#include +$1 + main() { + int fd = open("conftest_in", O_WRONLY|O_CREAT, 0600); + + if (fd < 0) exit(1); + if (pwrite(fd, "text", 4, 0) != 4) exit(1); + /* Linux glibc breakage until 2.2.5 */ + if (pwrite(fd, "text", 4, -1) != -1 || errno != EINVAL) exit(1); + exit(0); + } + + ],[ + ac_cv_pwrite=yes + ],[ + ac_cv_pwrite=no + ],[ + ac_cv_pwrite=no + ]) +]) + +AC_DEFUN([PHP_DOES_PREAD_WORK],[ + echo test > conftest_in + AC_TRY_RUN([ +#include +#include +#include +#include +#include +$1 + main() { + char buf[3]; + int fd = open("conftest_in", O_RDONLY); + if (fd < 0) exit(1); + if (pread(fd, buf, 2, 0) != 2) exit(1); + /* Linux glibc breakage until 2.2.5 */ + if (pread(fd, buf, 2, -1) != -1 || errno != EINVAL) exit(1); + exit(0); + } + ],[ + ac_cv_pread=yes + ],[ + ac_cv_pread=no + ],[ + ac_cv_pread=no + ]) + rm -f conftest_in +]) + +AC_DEFUN([PHP_PWRITE_TEST],[ + AC_CACHE_CHECK(whether pwrite works,ac_cv_pwrite,[ + PHP_DOES_PWRITE_WORK + if test "$ac_cv_pwrite" = "no"; then + PHP_DOES_PWRITE_WORK([ssize_t pwrite(int, void *, size_t, off64_t);]) + if test "$ac_cv_pwrite" = "yes"; then + ac_cv_pwrite=64 + fi + fi + ]) + + if test "$ac_cv_pwrite" != "no"; then + AC_DEFINE(HAVE_PWRITE, 1, [ ]) + if test "$ac_cv_pwrite" = "64"; then + AC_DEFINE(PHP_PWRITE_64, 1, [whether pwrite64 is default]) + fi + fi +]) + +AC_DEFUN([PHP_PREAD_TEST],[ + AC_CACHE_CHECK(whether pread works,ac_cv_pread,[ + PHP_DOES_PREAD_WORK + if test "$ac_cv_pread" = "no"; then + PHP_DOES_PREAD_WORK([ssize_t pread(int, void *, size_t, off64_t);]) + if test "$ac_cv_pread" = "yes"; then + ac_cv_pread=64 + fi + fi + ]) + + if test "$ac_cv_pread" != "no"; then + AC_DEFINE(HAVE_PREAD, 1, [ ]) + if test "$ac_cv_pread" = "64"; then + AC_DEFINE(PHP_PREAD_64, 1, [whether pread64 is default]) + fi + fi +]) + +AC_DEFUN([PHP_MISSING_TIME_R_DECL],[ + AC_MSG_CHECKING([for missing declarations of reentrant functions]) + AC_TRY_COMPILE([#include ],[struct tm *(*func)() = localtime_r],[ + : + ],[ + AC_DEFINE(MISSING_LOCALTIME_R_DECL,1,[Whether localtime_r is declared]) + ]) + AC_TRY_COMPILE([#include ],[struct tm *(*func)() = gmtime_r],[ + : + ],[ + AC_DEFINE(MISSING_GMTIME_R_DECL,1,[Whether gmtime_r is declared]) + ]) + AC_TRY_COMPILE([#include ],[char *(*func)() = asctime_r],[ + : + ],[ + AC_DEFINE(MISSING_ASCTIME_R_DECL,1,[Whether asctime_r is declared]) + ]) + AC_TRY_COMPILE([#include ],[char *(*func)() = ctime_r],[ + : + ],[ + AC_DEFINE(MISSING_CTIME_R_DECL,1,[Whether ctime_r is declared]) + ]) + AC_TRY_COMPILE([#include ],[char *(*func)() = strtok_r],[ + : + ],[ + AC_DEFINE(MISSING_STRTOK_R_DECL,1,[Whether strtok_r is declared]) + ]) + AC_MSG_RESULT([done]) +]) + +dnl +dnl PHP_LIBGCC_LIBPATH(gcc) +dnl Stores the location of libgcc in libgcc_libpath +dnl +AC_DEFUN([PHP_LIBGCC_LIBPATH],[ + changequote({,}) + libgcc_libpath=`$1 --print-libgcc-file-name|sed 's%/*[^/][^/]*$%%'` + changequote([,]) +]) + +AC_DEFUN([PHP_ARG_ANALYZE_EX],[ +ext_output="yes, shared" +ext_shared=yes +case [$]$1 in +shared,*) + $1=`echo "[$]$1"|sed 's/^shared,//'` + ;; +shared) + $1=yes + ;; +no) + ext_output=no + ext_shared=no + ;; +*) + ext_output=yes + ext_shared=no + ;; +esac + +PHP_ALWAYS_SHARED([$1]) +]) + +AC_DEFUN([PHP_ARG_ANALYZE],[ +ifelse([$3],yes,[PHP_ARG_ANALYZE_EX([$1])]) +ifelse([$2],,,[AC_MSG_RESULT([$ext_output])]) +]) + +dnl +dnl PHP_ARG_WITH(arg-name, check message, help text[, default-val[, extension-or-not]]) +dnl Sets PHP_ARG_NAME either to the user value or to the default value. +dnl default-val defaults to no. This will also set the variable ext_shared, +dnl and will overwrite any previous variable of that name. +dnl If extension-or-not is yes (default), then do the ENABLE_ALL check and run +dnl the PHP_ARG_ANALYZE_EX. +dnl +AC_DEFUN([PHP_ARG_WITH],[ +PHP_REAL_ARG_WITH([$1],[$2],[$3],[$4],PHP_[]translit($1,a-z0-9-,A-Z0-9_),[ifelse($5,,yes,$5)]) +]) + +AC_DEFUN([PHP_REAL_ARG_WITH],[ +ifelse([$2],,,[AC_MSG_CHECKING([$2])]) +AC_ARG_WITH($1,[$3],$5=[$]withval, +[ + $5=ifelse($4,,no,$4) + + if test "$PHP_ENABLE_ALL" && test "$6" = "yes"; then + $5=$PHP_ENABLE_ALL + fi +]) +PHP_ARG_ANALYZE($5,[$2],$6) +]) + +dnl +dnl PHP_ARG_ENABLE(arg-name, check message, help text[, default-val[, extension-or-not]]) +dnl Sets PHP_ARG_NAME either to the user value or to the default value. +dnl default-val defaults to no. This will also set the variable ext_shared, +dnl and will overwrite any previous variable of that name. +dnl If extension-or-not is yes (default), then do the ENABLE_ALL check and run +dnl the PHP_ARG_ANALYZE_EX. +dnl +AC_DEFUN([PHP_ARG_ENABLE],[ +PHP_REAL_ARG_ENABLE([$1],[$2],[$3],[$4],PHP_[]translit($1,a-z-,A-Z_),[ifelse($5,,yes,$5)]) +]) + +AC_DEFUN([PHP_REAL_ARG_ENABLE],[ +ifelse([$2],,,[AC_MSG_CHECKING([$2])]) +AC_ARG_ENABLE($1,[$3],$5=[$]enableval, +[ + $5=ifelse($4,,no,$4) + + if test "$PHP_ENABLE_ALL" && test "$6" = "yes"; then + $5=$PHP_ENABLE_ALL + fi +]) +PHP_ARG_ANALYZE($5,[$2],$6) +]) + +AC_DEFUN([PHP_MODULE_PTR],[ + EXTRA_MODULE_PTRS="$EXTRA_MODULE_PTRS $1," +]) + +AC_DEFUN([PHP_CONFIG_NICE],[ + rm -f $1 + cat >$1<> $1 + fi + done + + for arg in [$]0 "[$]@"; do + echo "'[$]arg' \\" >> $1 + done + echo '"[$]@"' >> $1 + chmod +x $1 +]) + +AC_DEFUN([PHP_TIME_R_TYPE],[ +AC_CACHE_CHECK(for type of reentrant time-related functions, ac_cv_time_r_type,[ +AC_TRY_RUN([ +#include + +main() { +char buf[27]; +struct tm t; +time_t old = 0; +int r, s; + +s = gmtime_r(&old, &t); +r = (int) asctime_r(&t, buf, 26); +if (r == s && s == 0) return (0); +return (1); +} +],[ + ac_cv_time_r_type=hpux +],[ + AC_TRY_RUN([ +#include +main() { + struct tm t, *s; + time_t old = 0; + char buf[27], *p; + + s = gmtime_r(&old, &t); + p = asctime_r(&t, buf, 26); + if (p == buf && s == &t) return (0); + return (1); +} + ],[ + ac_cv_time_r_type=irix + ],[ + ac_cv_time_r_type=POSIX + ]) +],[ + ac_cv_time_r_type=POSIX +]) +]) + case $ac_cv_time_r_type in + hpux) AC_DEFINE(PHP_HPUX_TIME_R,1,[Whether you have HP-UX 10.x]) ;; + irix) AC_DEFINE(PHP_IRIX_TIME_R,1,[Whether you have IRIX-style functions]) ;; + esac +]) + +AC_DEFUN([PHP_SUBST],[ + PHP_VAR_SUBST="$PHP_VAR_SUBST $1" +]) + +AC_DEFUN([PHP_SUBST_OLD],[ + PHP_SUBST($1) + AC_SUBST($1) +]) + +AC_DEFUN([PHP_MKDIR_P_CHECK],[ + AC_CACHE_CHECK(for working mkdir -p, ac_cv_mkdir_p,[ + test -d conftestdir && rm -rf conftestdir + mkdir -p conftestdir/somedir >/dev/null 2>&1 +dnl `mkdir -p' must be quiet about creating existing directories + mkdir -p conftestdir/somedir >/dev/null 2>&1 + if test "$?" = "0" && test -d conftestdir/somedir; then + ac_cv_mkdir_p=yes + else + ac_cv_mkdir_p=no + fi + rm -rf conftestdir + ]) +]) + +AC_DEFUN([PHP_TM_GMTOFF],[ +AC_CACHE_CHECK([for tm_gmtoff in struct tm], ac_cv_struct_tm_gmtoff, +[AC_TRY_COMPILE([#include +#include <$ac_cv_struct_tm>], [struct tm tm; tm.tm_gmtoff;], + ac_cv_struct_tm_gmtoff=yes, ac_cv_struct_tm_gmtoff=no)]) + +if test "$ac_cv_struct_tm_gmtoff" = yes; then + AC_DEFINE(HAVE_TM_GMTOFF,1,[whether you have tm_gmtoff in struct tm]) +fi +]) + +dnl PHP_CONFIGURE_PART(MESSAGE) +dnl Idea borrowed from mm +AC_DEFUN([PHP_CONFIGURE_PART],[ + AC_MSG_RESULT() + AC_MSG_RESULT([${T_MD}$1${T_ME}]) +]) + +AC_DEFUN([PHP_PROG_SENDMAIL],[ +AC_PATH_PROG(PROG_SENDMAIL, sendmail,[], $PATH:/usr/bin:/usr/sbin:/usr/etc:/etc:/usr/ucblib:/usr/lib) +if test -n "$PROG_SENDMAIL"; then + AC_DEFINE(HAVE_SENDMAIL,1,[whether you have sendmail]) +fi +]) + +AC_DEFUN([PHP_RUNPATH_SWITCH],[ +dnl check for -R, etc. switch +AC_MSG_CHECKING([if compiler supports -R]) +AC_CACHE_VAL(php_cv_cc_dashr,[ + SAVE_LIBS=$LIBS + LIBS="-R /usr/lib $LIBS" + AC_TRY_LINK([], [], php_cv_cc_dashr=yes, php_cv_cc_dashr=no) + LIBS=$SAVE_LIBS]) +AC_MSG_RESULT([$php_cv_cc_dashr]) +if test $php_cv_cc_dashr = "yes"; then + ld_runpath_switch=-R +else + AC_MSG_CHECKING([if compiler supports -Wl,-rpath,]) + AC_CACHE_VAL(php_cv_cc_rpath,[ + SAVE_LIBS=$LIBS + LIBS="-Wl,-rpath,/usr/lib $LIBS" + AC_TRY_LINK([], [], php_cv_cc_rpath=yes, php_cv_cc_rpath=no) + LIBS=$SAVE_LIBS]) + AC_MSG_RESULT([$php_cv_cc_rpath]) + if test $php_cv_cc_rpath = "yes"; then + ld_runpath_switch=-Wl,-rpath, + else + dnl something innocuous + ld_runpath_switch=-L + fi +fi +]) + +AC_DEFUN([PHP_STRUCT_FLOCK],[ +AC_CACHE_CHECK(for struct flock,ac_cv_struct_flock, + AC_TRY_COMPILE([ +#include +#include + ], + [struct flock x;], + [ + ac_cv_struct_flock=yes + ],[ + ac_cv_struct_flock=no + ]) +) +if test "$ac_cv_struct_flock" = "yes" ; then + AC_DEFINE(HAVE_STRUCT_FLOCK, 1,[whether you have struct flock]) +fi +]) + +AC_DEFUN([PHP_SOCKLEN_T],[ +AC_CACHE_CHECK(for socklen_t,ac_cv_socklen_t, + AC_TRY_COMPILE([ +#include +#include +],[ +socklen_t x; +],[ + ac_cv_socklen_t=yes +],[ + ac_cv_socklen_t=no +])) +if test "$ac_cv_socklen_t" = "yes"; then + AC_DEFINE(HAVE_SOCKLEN_T, 1, [Whether you have socklen_t]) +fi +]) + +dnl +dnl PHP_SET_SYM_FILE(path) +dnl +dnl set the path of the file which contains the symbol export list +dnl +AC_DEFUN([PHP_SET_SYM_FILE], +[ + PHP_SYM_FILE=$1 +]) + +dnl +dnl PHP_BUILD_THREAD_SAFE +dnl +AC_DEFUN([PHP_BUILD_THREAD_SAFE],[ + enable_experimental_zts=yes + if test "$pthreads_working" != "yes"; then + AC_MSG_ERROR([ZTS currently requires working POSIX threads. We were unable to verify that your system supports Pthreads.]) + fi +]) + +AC_DEFUN([PHP_REQUIRE_CXX],[ + if test -z "$php_cxx_done"; then + AC_PROG_CXX + AC_PROG_CXXCPP + php_cxx_done=yes + fi +]) + +dnl +dnl PHP_BUILD_SHARED +dnl +AC_DEFUN([PHP_BUILD_SHARED],[ + PHP_BUILD_PROGRAM + OVERALL_TARGET=libphp4.la + php_build_target=shared + + php_c_pre=$shared_c_pre + php_c_meta=$shared_c_meta + php_c_post=$shared_c_post + php_cxx_pre=$shared_cxx_pre + php_cxx_meta=$shared_cxx_meta + php_cxx_post=$shared_cxx_post + php_lo=$shared_lo +]) + +dnl +dnl PHP_BUILD_STATIC +dnl +AC_DEFUN([PHP_BUILD_STATIC],[ + PHP_BUILD_PROGRAM + OVERALL_TARGET=libphp4.la + php_build_target=static +]) + +dnl +dnl PHP_BUILD_BUNDLE +dnl +AC_DEFUN([PHP_BUILD_BUNDLE],[ + PHP_BUILD_PROGRAM + OVERALL_TARGET=libs/libphp4.bundle + php_build_target=static +]) + +dnl +dnl PHP_BUILD_PROGRAM +dnl +AC_DEFUN([PHP_BUILD_PROGRAM],[ + OVERALL_TARGET=[]ifelse($1,,php,$1) + php_c_pre='$(CC)' + php_c_meta='$(COMMON_FLAGS) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS)' + php_c_post=' && echo > $[@]' + php_cxx_pre='$(CXX)' + php_cxx_meta='$(COMMON_FLAGS) $(CXXFLAGS_CLEAN) $(EXTRA_CXXFLAGS)' + php_cxx_post=' && echo > $[@]' + php_lo=o + + shared_c_pre='$(LIBTOOL) --mode=compile $(CC)' + shared_c_meta='$(COMMON_FLAGS) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) -prefer-pic' + shared_c_post= + shared_cxx_pre='$(LIBTOOL) --mode=compile $(CXX)' + shared_cxx_meta='$(COMMON_FLAGS) $(CXXFLAGS_CLEAN) $(EXTRA_CXXFLAGS) -prefer-pic' + shared_cxx_post= + shared_lo=lo + + php_build_target=program +]) + +dnl +dnl PHP_RUN_ONCE(namespace, variable, code) +dnl +dnl execute code, if variable is not set in namespace +dnl +AC_DEFUN([PHP_RUN_ONCE],[ + changequote({,}) + unique=`echo $2|sed 's/[^a-zA-Z0-9]/_/g'` + changequote([,]) + cmd="echo $ac_n \"\$$1$unique$ac_c\"" + if test -n "$unique" && test "`eval $cmd`" = "" ; then + eval "$1$unique=set" + $3 + fi +]) + +dnl +dnl PHP_EXPAND_PATH(path, variable) +dnl +dnl expands path to an absolute path and assigns it to variable +dnl +AC_DEFUN([PHP_EXPAND_PATH],[ + if test -z "$1" || echo "$1" | grep '^/' >/dev/null ; then + $2=$1 + else + changequote({,}) + ep_dir="`echo $1|sed 's%/*[^/][^/]*/*$%%'`" + changequote([,]) + ep_realdir="`(cd \"$ep_dir\" && pwd)`" + $2="$ep_realdir/`basename \"$1\"`" + fi +]) +dnl +dnl internal, don't use +AC_DEFUN([_PHP_ADD_LIBPATH_GLOBAL],[ + PHP_RUN_ONCE(LIBPATH, $1, [ + test -n "$ld_runpath_switch" && LDFLAGS="$LDFLAGS $ld_runpath_switch$1" + LDFLAGS="$LDFLAGS -L$1" + PHP_RPATHS="$PHP_RPATHS $1" + ]) +])dnl +dnl +dnl +dnl +dnl PHP_ADD_LIBPATH(path[, shared-libadd]) +dnl +dnl add a library to linkpath/runpath +dnl +AC_DEFUN([PHP_ADD_LIBPATH],[ + if test "$1" != "/usr/lib"; then + PHP_EXPAND_PATH($1, ai_p) + ifelse([$2],,[ + _PHP_ADD_LIBPATH_GLOBAL([$ai_p]) + ],[ + if test "$ext_shared" = "yes"; then + $2="$ld_runpath_switch$ai_p -L$ai_p [$]$2" + else + _PHP_ADD_LIBPATH_GLOBAL([$ai_p]) + fi + ]) + fi +]) + +dnl +dnl PHP_UTILIZE_RPATHS() +dnl +dnl builds RPATHS/LDFLAGS from PHP_RPATHS +dnl +AC_DEFUN([PHP_UTILIZE_RPATHS],[ + OLD_RPATHS=$PHP_RPATHS + unset PHP_RPATHS + + for i in $OLD_RPATHS; do +dnl Can be passed to native cc/libtool + PHP_LDFLAGS="$PHP_LDFLAGS -L$i" +dnl Libtool-specific + PHP_RPATHS="$PHP_RPATHS -R $i" +dnl cc-specific + NATIVE_RPATHS="$NATIVE_RPATHS $ld_runpath_switch$i" + done + + if test "$PHP_RPATH" = "no"; then + unset PHP_RPATHS + unset NATIVE_RPATHS + fi +]) + +dnl +dnl PHP_ADD_INCLUDE(path [,before]) +dnl +dnl add an include path. +dnl if before is 1, add in the beginning of INCLUDES. +dnl +AC_DEFUN([PHP_ADD_INCLUDE],[ + if test "$1" != "/usr/include"; then + PHP_EXPAND_PATH($1, ai_p) + PHP_RUN_ONCE(INCLUDEPATH, $ai_p, [ + if test "$2"; then + INCLUDES="-I$ai_p $INCLUDES" + else + INCLUDES="$INCLUDES -I$ai_p" + fi + ]) + fi +]) +dnl +dnl internal, don't use +AC_DEFUN([_PHP_X_ADD_LIBRARY],[dnl + ifelse([$2],,$3="-l$1 [$]$3", $3="[$]$3 -l$1") dnl +])dnl +dnl +dnl internal, don't use +AC_DEFUN([_PHP_ADD_LIBRARY_SKELETON],[ + case $1 in + c|c_r|pthread*[)] ;; + *[)] ifelse($3,,[ + _PHP_X_ADD_LIBRARY($1,$2,$5) + ],[ + if test "$ext_shared" = "yes"; then + _PHP_X_ADD_LIBRARY($1,$2,$3) + else + $4($1,$2) + fi + ]) ;; + esac +])dnl +dnl +dnl +dnl +dnl PHP_ADD_LIBRARY(library[, append[, shared-libadd]]) +dnl +dnl add a library to the link line +dnl +AC_DEFUN([PHP_ADD_LIBRARY],[ + _PHP_ADD_LIBRARY_SKELETON([$1],[$2],[$3],[PHP_ADD_LIBRARY],[LIBS]) +]) + +dnl +dnl PHP_ADD_LIBRARY_DEFER(library[, append[, shared-libadd]]) +dnl +dnl add a library to the link line (deferred) +dnl +AC_DEFUN([PHP_ADD_LIBRARY_DEFER],[ + _PHP_ADD_LIBRARY_SKELETON([$1],[$2],[$3],[PHP_ADD_LIBRARY_DEFER],[DLIBS]) +]) + +dnl +dnl PHP_ADD_LIBRARY_WITH_PATH(library, path[, shared-libadd]) +dnl +dnl add a library to the link line and path to linkpath/runpath. +dnl if shared-libadd is not empty and $ext_shared is yes, +dnl shared-libadd will be assigned the library information +dnl +AC_DEFUN([PHP_ADD_LIBRARY_WITH_PATH],[ +ifelse($3,,[ + if test -n "$2"; then + PHP_ADD_LIBPATH($2) + fi + PHP_ADD_LIBRARY($1) +],[ + if test "$ext_shared" = "yes"; then + $3="-l$1 [$]$3" + if test -n "$2"; then + PHP_ADD_LIBPATH($2,$3) + fi + else + PHP_ADD_LIBRARY_WITH_PATH($1,$2) + fi +]) +]) + +dnl +dnl PHP_ADD_LIBRARY_DEFER_WITH_PATH(library, path[, shared-libadd]) +dnl +dnl add a library to the link line (deferred) +dnl and path to linkpath/runpath (not deferred) +dnl if shared-libadd is not empty and $ext_shared is yes, +dnl shared-libadd will be assigned the library information +dnl +AC_DEFUN([PHP_ADD_LIBRARY_DEFER_WITH_PATH],[ +ifelse($3,,[ + if test -n "$2"; then + PHP_ADD_LIBPATH($2) + fi + PHP_ADD_LIBRARY_DEFER($1) +],[ + if test "$ext_shared" = "yes"; then + $3="-l$1 [$]$3" + if test -n "$2"; then + PHP_ADD_LIBPATH($2,$3) + fi + else + PHP_ADD_LIBRARY_DEFER_WITH_PATH($1,$2) + fi +]) +]) + +dnl +dnl PHP_ADD_FRAMEWORK(framework [,before]) +dnl +dnl add a (Darwin / Mac OS X) framework to the link +dnl line. if before is 1, the framework is added +dnl to the beginning of the line. + +AC_DEFUN([PHP_ADD_FRAMEWORK], [ + PHP_RUN_ONCE(FRAMEWORKS, $1, [ + if test "$2"; then + PHP_FRAMEWORKS="-framework $1 $PHP_FRAMEWORKS" + else + PHP_FRAMEWORKS="$PHP_FRAMEWORKS -framework $1" + fi + ]) +]) + +dnl +dnl PHP_ADD_FRAMEWORKPATH(path [,before]) +dnl +dnl add a (Darwin / Mac OS X) framework path to the link +dnl and include lines. default paths include (but are +dnl not limited to) /Local/Library/Frameworks and +dnl /System/Library/Frameworks, so these don't need +dnl to be specifically added. if before is 1, the +dnl framework path is added to the beginning of the +dnl relevant lines. + +AC_DEFUN([PHP_ADD_FRAMEWORKPATH], [ + PHP_EXPAND_PATH($1, ai_p) + PHP_RUN_ONCE(FRAMEWORKPATH, $ai_p, [ + if test "$2"; then + PHP_FRAMEWORKPATH="-F$ai_p $PHP_FRAMEWORKPATH" + else + PHP_FRAMEWORKPATH="$PHP_FRAMEWORKPATH -F$ai_p" + fi + ]) +]) + +dnl +dnl PHP_ADD_FRAMEWORK_WITH_PATH(framework, path) +dnl +dnl add a (Darwin / Mac OS X) framework path and the +dnl framework itself to the link and include lines. +AC_DEFUN([PHP_ADD_FRAMEWORK_WITH_PATH], [ + PHP_ADD_FRAMEWORKPATH($2) + PHP_ADD_FRAMEWORK($1) +]) + +dnl +dnl Set libtool variable +dnl +AC_DEFUN([PHP_SET_LIBTOOL_VARIABLE],[ + LIBTOOL='$(SHELL) libtool $1' +]) + +dnl +dnl Check for cc option +dnl +AC_DEFUN([PHP_CHECK_CC_OPTION],[ + echo "main(){return 0;}" > conftest.$ac_ext + opt=$1 + changequote({,}) + var=`echo $opt|sed 's/[^a-zA-Z0-9]/_/g'` + changequote([,]) + AC_MSG_CHECKING([if compiler supports -$1 really]) + ac_php_compile="${CC-cc} -$opt -o conftest $CFLAGS $CPPFLAGS conftest.$ac_ext 2>&1" + if eval $ac_php_compile 2>&1 | egrep "$opt" > /dev/null 2>&1 ; then + eval php_cc_$var=no + AC_MSG_RESULT([no]) + else + if eval ./conftest 2>/dev/null ; then + eval php_cc_$var=yes + AC_MSG_RESULT([yes]) + else + eval php_cc_$var=no + AC_MSG_RESULT([no]) + fi + fi +]) + +AC_DEFUN([PHP_REGEX],[ + +if test "$REGEX_TYPE" = "php"; then + AC_DEFINE(HSREGEX,1,[ ]) + AC_DEFINE(REGEX,1,[ ]) + PHP_ADD_SOURCES(regex, regcomp.c regexec.c regerror.c regfree.c) +elif test "$REGEX_TYPE" = "system"; then + AC_DEFINE(REGEX,0,[ ]) +fi + +AC_MSG_CHECKING([which regex library to use]) +AC_MSG_RESULT([$REGEX_TYPE]) +]) + +dnl +dnl See if we have broken header files like SunOS has. +dnl +AC_DEFUN([PHP_MISSING_FCLOSE_DECL],[ + AC_MSG_CHECKING([for fclose declaration]) + AC_TRY_COMPILE([#include ],[int (*func)() = fclose],[ + AC_DEFINE(MISSING_FCLOSE_DECL,0,[ ]) + AC_MSG_RESULT([ok]) + ],[ + AC_DEFINE(MISSING_FCLOSE_DECL,1,[ ]) + AC_MSG_RESULT([missing]) + ]) +]) + +dnl +dnl Check for broken sprintf(), C99 conformance +dnl +AC_DEFUN([PHP_AC_BROKEN_SPRINTF],[ + AC_CACHE_CHECK(whether sprintf is broken, ac_cv_broken_sprintf,[ + AC_TRY_RUN([main() {char buf[20];exit(sprintf(buf,"testing 123")!=11); }],[ + ac_cv_broken_sprintf=no + ],[ + ac_cv_broken_sprintf=yes + ],[ + ac_cv_broken_sprintf=no + ]) + ]) + if test "$ac_cv_broken_sprintf" = "yes"; then + AC_DEFINE(PHP_BROKEN_SPRINTF, 1, [Whether sprintf is C99 conform]) + else + AC_DEFINE(PHP_BROKEN_SPRINTF, 0, [Whether sprintf is C99 conform]) + fi +]) + +dnl +dnl Check for broken snprintf(), C99 conformance +dnl +AC_DEFUN([PHP_AC_BROKEN_SNPRINTF],[ + AC_CACHE_CHECK(whether snprintf is broken, ac_cv_broken_snprintf,[ + AC_TRY_RUN([ +#define NULL (0L) +main() { + char buf[20]; + int res = 0; + res = res || (snprintf(buf, 2, "marcus") != 6); + res = res || (buf[1] != '\0'); + res = res || (snprintf(buf, 0, "boerger") != 7); + res = res || (buf[0] != 'm'); + res = res || (snprintf(NULL, 0, "boerger") != 7); + res = res || (snprintf(buf, sizeof(buf), "%f", 0.12345678) != 8); + exit(res); +} + ],[ + ac_cv_broken_snprintf=no + ],[ + ac_cv_broken_snprintf=yes + ],[ + ac_cv_broken_snprintf=no + ]) + ]) + if test "$ac_cv_broken_snprintf" = "yes"; then + AC_DEFINE(PHP_BROKEN_SNPRINTF, 1, [Whether snprintf is C99 conform]) + else + AC_DEFINE(PHP_BROKEN_SNPRINTF, 0, [Whether snprintf is C99 conform]) + fi +]) + +dnl PHP_SHARED_MODULE(module-name, object-var, build-dir) +dnl +dnl Basically sets up the link-stage for building module-name +dnl from object_var in build-dir. +dnl +AC_DEFUN([PHP_SHARED_MODULE],[ + PHP_MODULES="$PHP_MODULES \$(phplibdir)/$1.la" + PHP_SUBST($2) + cat >>Makefile.objects</dev/null` + case $os in + "SunOS 5.6"|"SunOS 5.7") + case $CC in + gcc*|egcs*) CFLAGS="$CFLAGS -fPIC";; + *) CFLAGS="$CFLAGS -fpic";; + esac + AC_MSG_RESULT([yes]);; + *) + AC_MSG_RESULT([no]);; + esac + else + AC_MSG_RESULT([no]) + fi +]) + +dnl +dnl Checks whether $withval is "shared" or starts with "shared,XXX" +dnl and sets $shared to "yes" or "no", and removes "shared,?" stuff +dnl from $withval. +dnl +AC_DEFUN([PHP_WITH_SHARED],[ + PHP_ARG_ANALYZE_EX(withval) + shared=$ext_shared + unset ext_shared ext_output +]) + +dnl The problem is that the default compilation flags in Solaris 2.6 won't +dnl let programs access large files; you need to tell the compiler that +dnl you actually want your programs to work on large files. For more +dnl details about this brain damage please see: +dnl http://www.sas.com/standards/large.file/x_open.20Mar96.html + +dnl Written by Paul Eggert . + +AC_DEFUN([PHP_SYS_LFS], +[dnl + # If available, prefer support for large files unless the user specified + # one of the CPPFLAGS, LDFLAGS, or LIBS variables. + AC_MSG_CHECKING([whether large file support needs explicit enabling]) + ac_getconfs='' + ac_result=yes + ac_set='' + ac_shellvars='CPPFLAGS LDFLAGS LIBS' + for ac_shellvar in $ac_shellvars; do + case $ac_shellvar in + CPPFLAGS) ac_lfsvar=LFS_CFLAGS ;; + *) ac_lfsvar=LFS_$ac_shellvar ;; + esac + eval test '"${'$ac_shellvar'+set}"' = set && ac_set=$ac_shellvar + (getconf $ac_lfsvar) >/dev/null 2>&1 || { ac_result=no; break; } + ac_getconf=`getconf $ac_lfsvar` + ac_getconfs=$ac_getconfs$ac_getconf + eval ac_test_$ac_shellvar=\$ac_getconf + done + case "$ac_result$ac_getconfs" in + yes) ac_result=no ;; + esac + case "$ac_result$ac_set" in + yes?*) ac_result="yes, but $ac_set is already set, so use its settings" + esac + AC_MSG_RESULT([$ac_result]) + case $ac_result in + yes) + for ac_shellvar in $ac_shellvars; do + eval $ac_shellvar=\$ac_test_$ac_shellvar + done ;; + esac +]) + +AC_DEFUN([PHP_SOCKADDR_SA_LEN],[ + AC_CACHE_CHECK([for field sa_len in struct sockaddr],ac_cv_sockaddr_sa_len,[ + AC_TRY_COMPILE([#include +#include ], + [struct sockaddr s; s.sa_len;], + [ac_cv_sockaddr_sa_len=yes + AC_DEFINE(HAVE_SOCKADDR_SA_LEN,1,[ ])], + [ac_cv_sockaddr_sa_len=no]) + ]) +]) + + +dnl ## PHP_OUTPUT(file) +dnl ## adds "file" to the list of files generated by AC_OUTPUT +dnl ## This macro can be used several times. +AC_DEFUN([PHP_OUTPUT],[ + PHP_OUTPUT_FILES="$PHP_OUTPUT_FILES $1" +]) + +AC_DEFUN([PHP_DECLARED_TIMEZONE],[ + AC_CACHE_CHECK(for declared timezone, ac_cv_declared_timezone,[ + AC_TRY_COMPILE([ +#include +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif +],[ + time_t foo = (time_t) timezone; +],[ + ac_cv_declared_timezone=yes +],[ + ac_cv_declared_timezone=no +])]) + if test "$ac_cv_declared_timezone" = "yes"; then + AC_DEFINE(HAVE_DECLARED_TIMEZONE, 1, [Whether system headers declare timezone]) + fi +]) + +AC_DEFUN([PHP_EBCDIC],[ + AC_CACHE_CHECK([whether system uses EBCDIC],ac_cv_ebcdic,[ + AC_TRY_RUN( [ +int main(void) { + return (unsigned char)'A' != (unsigned char)0xC1; +} +],[ + ac_cv_ebcdic=yes +],[ + ac_cv_ebcdic=no +],[ + ac_cv_ebcdic=no +])]) + if test "$ac_cv_ebcdic" = "yes"; then + AC_DEFINE(CHARSET_EBCDIC,1, [Define if system uses EBCDIC]) + fi +]) + +AC_DEFUN([PHP_FOPENCOOKIE],[ + AC_CHECK_FUNC(fopencookie, [ have_glibc_fopencookie=yes ]) + + if test "$have_glibc_fopencookie" = "yes" ; then + dnl this comes in two flavors: + dnl newer glibcs (since 2.1.2 ? ) + dnl have a type called cookie_io_functions_t + AC_TRY_COMPILE([ #define _GNU_SOURCE + #include + ], + [ cookie_io_functions_t cookie; ], + [ have_cookie_io_functions_t=yes ], + [] ) + + if test "$have_cookie_io_functions_t" = "yes" ; then + cookie_io_functions_t=cookie_io_functions_t + have_fopen_cookie=yes + + dnl even newer glibcs have a different seeker definition... + + AC_TRY_RUN([ +#define _GNU_SOURCE +#include + +struct cookiedata { + __off64_t pos; +}; + +__ssize_t reader(void *cookie, char *buffer, size_t size) +{ return size; } +__ssize_t writer(void *cookie, const char *buffer, size_t size) +{ return size; } +int closer(void *cookie) +{ return 0; } +int seeker(void *cookie, __off64_t *position, int whence) +{ ((struct cookiedata*)cookie)->pos = *position; return 0; } + +cookie_io_functions_t funcs = {reader, writer, seeker, closer}; + +main() { + struct cookiedata g = { 0 }; + FILE *fp = fopencookie(&g, "r", funcs); + + if (fp && fseek(fp, 8192, SEEK_SET) == 0 && g.pos == 8192) + exit(0); + exit(1); +} + + ], + [ cookie_io_functions_use_off64_t=yes ], + [ ] ) + + else + dnl older glibc versions (up to 2.1.2 ?) + dnl call it _IO_cookie_io_functions_t + AC_TRY_COMPILE([ #define _GNU_SOURCE + #include + ], + [ _IO_cookie_io_functions_t cookie; ], + [ have_IO_cookie_io_functions_t=yes ], + [] ) + if test "$have_cookie_io_functions_t" = "yes" ; then + cookie_io_functions_t=_IO_cookie_io_functions_t + have_fopen_cookie=yes + fi + fi + + if test "$have_fopen_cookie" = "yes" ; then + AC_DEFINE(HAVE_FOPENCOOKIE, 1, [ ]) + AC_DEFINE_UNQUOTED(COOKIE_IO_FUNCTIONS_T, $cookie_io_functions_t, [ ]) + if test "$cookie_io_functions_use_off64_t" = "yes" ; then + AC_DEFINE(COOKIE_SEEKER_USES_OFF64_T, 1, [ ]) + fi + fi + + fi +]) + + +dnl +dnl PHP_CHECK_LIBRARY(library, function [, action-found [, action-not-found [, extra-libs]]]) +dnl +dnl Wrapper for AC_CHECK_LIB +dnl +AC_DEFUN([PHP_CHECK_LIBRARY], [ + save_old_LDFLAGS=$LDFLAGS + LDFLAGS="$5 $LDFLAGS" + AC_CHECK_LIB([$1],[$2],[ + LDFLAGS=$save_old_LDFLAGS + $3 + ],[ + LDFLAGS=$save_old_LDFLAGS + $4 + ])dnl +]) + +dnl +dnl PHP_CHECK_FRAMEWORK(framework, function [, action-found [, action-not-found ]]) +dnl +dnl El cheapo wrapper for AC_CHECK_LIB +dnl +AC_DEFUN([PHP_CHECK_FRAMEWORK], [ + save_old_LDFLAGS=$LDFLAGS + LDFLAGS="-framework $1 $LDFLAGS" + dnl supplying "c" to AC_CHECK_LIB is technically cheating, but + dnl rewriting AC_CHECK_LIB is overkill and this only affects + dnl the "checking.." output anyway. + AC_CHECK_LIB(c,[$2],[ + LDFLAGS=$save_old_LDFLAGS + $3 + ],[ + LDFLAGS=$save_old_LDFLAGS + $4 + ]) +]) + +dnl +dnl PHP_SETUP_ICONV(shared-add [, action-found [, action-not-found]]) +dnl +dnl Common setup macro for iconv +dnl +AC_DEFUN([PHP_SETUP_ICONV], [ + found_iconv=no + unset ICONV_DIR + + dnl + dnl Check libc first if no path is provided in --with-iconv + dnl + if test "$PHP_ICONV" = "yes"; then + AC_CHECK_FUNC(iconv, [ + PHP_DEFINE(HAVE_ICONV) + found_iconv=yes + ],[ + AC_CHECK_FUNC(libiconv,[ + PHP_DEFINE(HAVE_LIBICONV) + found_iconv=yes + ]) + ]) + fi + + dnl + dnl Check external libs for iconv funcs + dnl + if test "$found_iconv" = "no"; then + + for i in $PHP_ICONV /usr/local /usr; do + if test -r $i/include/giconv.h; then + AC_DEFINE(HAVE_GICONV_H, 1, [ ]) + ICONV_DIR=$i + iconv_lib_name=giconv + break + elif test -r $i/include/iconv.h; then + ICONV_DIR=$i + iconv_lib_name=iconv + break + fi + done + + if test -z "$ICONV_DIR"; then + AC_MSG_ERROR([Please specify the install prefix of iconv with --with-iconv=]) + fi + + if test -f $ICONV_DIR/lib/lib$iconv_lib_name.a || + test -f $ICONV_DIR/lib/lib$iconv_lib_name.$SHLIB_SUFFIX_NAME + then + PHP_CHECK_LIBRARY($iconv_lib_name, libiconv, [ + found_iconv=yes + PHP_DEFINE(HAVE_LIBICONV) + ], [ + PHP_CHECK_LIBRARY($iconv_lib_name, iconv, [ + found_iconv=yes + PHP_DEFINE(HAVE_ICONV) + ], [], [ + -L$ICONV_DIR/lib + ]) + ], [ + -L$ICONV_DIR/lib + ]) + fi + fi + + if test "$found_iconv" = "yes"; then + if test -n "$ICONV_DIR"; then + AC_DEFINE(HAVE_ICONV, 1, [ ]) + PHP_ADD_LIBRARY_WITH_PATH($iconv_lib_name, $ICONV_DIR/lib, $1) + PHP_ADD_INCLUDE($ICONV_DIR/include) + fi + $2 +ifelse([$3],[],,[else $3]) + fi +]) + +AC_DEFUN([PHP_DEF_HAVE],[AC_DEFINE([HAVE_]translit($1,a-z_-,A-Z__), 1, [ ])]) + +dnl +dnl PHP_CHECK_FUNC_LIB(func, libs) +dnl This macro checks whether 'func' or '__func' exists +dnl in the specified library. +dnl Defines HAVE_func and HAVE_library if found and adds the library to LIBS. +dnl This should be called in the ACTION-IF-NOT-FOUND part of PHP_CHECK_FUNC +dnl + +dnl autoconf undefines the builtin "shift" :-( +dnl If possible, we use the builtin shift anyway, otherwise we use +dnl the ubercool definition I have tested so far with FreeBSD/GNU m4 +ifdef([builtin],[builtin(define, phpshift, [builtin(shift, $@)])],[ +define([phpshift],[ifelse(index([$@],[,]),-1,,[substr([$@],incr(index([$@],[,])))])]) +]) + +AC_DEFUN([PHP_CHECK_FUNC_LIB],[ + ifelse($2,,:,[ + unset ac_cv_lib_$2[]_$1 + unset ac_cv_lib_$2[]___$1 + unset found + AC_CHECK_LIB($2, $1, [found=yes], [ + AC_CHECK_LIB($2, __$1, [found=yes], [found=no]) + ]) + + if test "$found" = "yes"; then + ac_libs=$LIBS + LIBS="$LIBS -l$2" + AC_TRY_RUN([main() { return (0); }],[found=yes],[found=no],[found=no]) + LIBS=$ac_libs + fi + + if test "$found" = "yes"; then + PHP_ADD_LIBRARY($2) + PHP_DEF_HAVE($1) + PHP_DEF_HAVE(lib$2) + ac_cv_func_$1=yes + else + PHP_CHECK_FUNC_LIB($1,phpshift(phpshift($@))) + fi + ]) +]) + +dnl +dnl PHP_CHECK_FUNC(func, ...) +dnl This macro checks whether 'func' or '__func' exists +dnl in the default libraries and as a fall back in the specified library. +dnl Defines HAVE_func and HAVE_library if found and adds the library to LIBS. +dnl +AC_DEFUN([PHP_CHECK_FUNC],[ + unset ac_cv_func_$1 + unset ac_cv_func___$1 + unset found + + AC_CHECK_FUNC($1, [found=yes],[ AC_CHECK_FUNC(__$1,[found=yes],[found=no]) ]) + + case $found in + yes) + PHP_DEF_HAVE($1) + ac_cv_func_$1=yes + ;; + ifelse($#,1,,[ + *) PHP_CHECK_FUNC_LIB($@) ;; + ]) + esac +]) + +dnl +dnl PHP_AP_EXTRACT_VERSION(/path/httpd) +dnl This macro is used to get a comparable +dnl version for apache1/2. +dnl +AC_DEFUN([PHP_AP_EXTRACT_VERSION],[ + ac_output=`$1 -v 2>&1` + ac_IFS=$IFS +IFS="- /. +" + set $ac_output + IFS=$ac_IFS + + APACHE_VERSION=`expr [$]4 \* 1000000 + [$]5 \* 1000 + [$]6` +]) + +dnl PHP_PROG_SED +dnl ------------ +dnl Check for a fully-functional sed program, that truncates +dnl as few characters as possible. Prefer GNU sed if found. +dnl +dnl Based on LT_AC_PROG_SED (libtool CVS) +dnl +AC_DEFUN([PHP_PROG_SED], +[AC_MSG_CHECKING([for working sed]) +AC_CACHE_VAL(ac_cv_path_sed, +[ + +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/sedXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/sed$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + _max=0 + _count=0 + + # Use the sed found in PATH, skip the rest + _sed=sed + + # Check for GNU sed and select it if it is found. + if "${_sed}" --version 2>&1 < /dev/null | egrep '(GNU)' > /dev/null; then + ac_cv_path_sed=${_sed} + else + cat /dev/null > "$tmp/sed.in" + _count=0 + echo -n "0123456789" >"$tmp/sed.in" + while true; do + cat "$tmp/sed.in" "$tmp/sed.in" >"$tmp/sed.tmp" + mv "$tmp/sed.tmp" "$tmp/sed.in" + cp "$tmp/sed.in" "$tmp/sed.nl" + echo >>"$tmp/sed.nl" + ${_sed} -e 's/a$//' < "$tmp/sed.nl" >"$tmp/sed.out" || break + cmp -s "$tmp/sed.out" "$tmp/sed.nl" || break + # 10000 chars as input seems more than enough + test $_count -gt 10 && break + _count=`expr $_count + 1` + if test $_count -gt $_max; then + _max=$_count + ac_cv_path_sed=${_sed} + fi + done + fi + rm -rf "$tmp" +]) +if test -z "$ac_cv_path_sed"; then + AC_MSG_ERROR([Could not find working sed on this system. Please install GNU sed.]) +else + SED=$ac_cv_path_sed + PHP_SUBST(SED) + AC_MSG_RESULT([$SED]) +fi +]) + +# libtool.m4 - Configure libtool for the host system. -*-Shell-script-*- + +# serial 46 AC_PROG_LIBTOOL + +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +]) + +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.13)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +_LT_AC_PROG_ECHO_BACKSLASH +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE(libtool-lock, + [ --disable-libtool-lock avoid locking (might break parallel builds)]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_SAVE + AC_LANG_C + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_RESTORE]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one + AC_CACHE_CHECK([if libtool should supply DllMain function], lt_cv_need_dllmain, + [AC_TRY_LINK([], + [extern int __attribute__((__stdcall__)) DllMain(void*, int, void*); + DllMain (0, 0, 0);], + [lt_cv_need_dllmain=no],[lt_cv_need_dllmain=yes])]) + + case $host/$CC in + *-*-cygwin*/gcc*-mno-cygwin*|*-*-mingw*) + # old mingw systems require "-dll" to link a DLL, while more recent ones + # require "-mdll" + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -mdll" + AC_CACHE_CHECK([how to link DLLs], lt_cv_cc_dll_switch, + [AC_TRY_LINK([], [], [lt_cv_cc_dll_switch=-mdll],[lt_cv_cc_dll_switch=-dll])]) + CFLAGS="$SAVE_CFLAGS" ;; + *-*-cygwin* | *-*-pw32*) + # cygwin systems need to pass --dll to the linker, and not link + # crt.o which will require a WinMain@16 definition. + lt_cv_cc_dll_switch="-Wl,--dll -nostartfiles" ;; + esac + ;; + ]) +esac + +_LT_AC_LTCONFIG_HACK + +]) + +# AC_LIBTOOL_HEADER_ASSERT +# ------------------------ +AC_DEFUN([AC_LIBTOOL_HEADER_ASSERT], +[AC_CACHE_CHECK([whether $CC supports assert without backlinking], + [lt_cv_func_assert_works], + [case $host in + *-*-solaris*) + if test "$GCC" = yes && test "$with_gnu_ld" != yes; then + case `$CC --version 2>/dev/null` in + [[12]].*) lt_cv_func_assert_works=no ;; + *) lt_cv_func_assert_works=yes ;; + esac + fi + ;; + esac]) + +if test "x$lt_cv_func_assert_works" = xyes; then + AC_CHECK_HEADERS(assert.h) +fi +])# AC_LIBTOOL_HEADER_ASSERT + +# _LT_AC_CHECK_DLFCN +# -------------------- +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h) +])# _LT_AC_CHECK_DLFCN + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [dnl + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix*) + symcode='[[BCDEGRST]]' + ;; +solaris* | sysv5*) + symcode='[[BDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $host_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then + symcode='[[ABCDGISTW]]' +fi + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. +lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if egrep ' nm_test_var$' "$nlist" >/dev/null; then + if egrep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[[]] = +{ +EOF + sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$no_builtin_flag" + if AC_TRY_EVAL(ac_link) && test -s conftest; then + pipe_works=yes + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AC_FD_CC + fi + else + echo "cannot find nm_test_var in $nlist" >&AC_FD_CC + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AC_FD_CC + fi + else + echo "$progname: failed program was:" >&AC_FD_CC + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +global_symbol_pipe="$lt_cv_sys_global_symbol_pipe" +if test -z "$lt_cv_sys_global_symbol_pipe"; then + global_symbol_to_cdecl= + global_symbol_to_c_name_address= +else + global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl" + global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address" +fi +if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address"; +then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + +# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR +# --------------------------------- +AC_DEFUN([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR], +[# Find the correct PATH separator. Usually this is `:', but +# DJGPP uses `;' like DOS. +if test "X${PATH_SEPARATOR+set}" != Xset; then + UNAME=${UNAME-`uname 2>/dev/null`} + case X$UNAME in + *-DOS) lt_cv_sys_path_separator=';' ;; + *) lt_cv_sys_path_separator=':' ;; + esac + PATH_SEPARATOR=$lt_cv_sys_path_separator +fi +])# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + IFS="${IFS= }"; save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +AC_DIVERT_POP +])# _LT_AC_PROG_ECHO_BACKSLASH + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ------------------------------------------------------------------ +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[if test "$cross_compiling" = yes; then : + [$4] +else + AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_unknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + +# AC_LIBTOOL_DLOPEN_SELF +# ------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + cygwin* | mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + +AC_DEFUN([_LT_AC_LTCONFIG_HACK], +[AC_REQUIRE([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])dnl +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([[\\"\\`$\\\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([[\\"\\`\\\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" +need_locks="$enable_libtool_lock" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +if test x"$host" != x"$build"; then + ac_tool_prefix=${host_alias}- +else + ac_tool_prefix= +fi + +# Transform linux* to *-*-linux-gnu*, to support old configure scripts. +case $host_os in +linux-gnu*) ;; +linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` +esac + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Allow CC to be a program name with arguments. +set dummy $CC +compiler="[$]2" + +AC_MSG_CHECKING([for objdir]) +rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + objdir=_libs +fi +rmdir .libs 2>/dev/null +AC_MSG_RESULT($objdir) + + +AC_ARG_WITH(pic, +[ --with-pic try to use only PIC/non-PIC objects [default=use both]], +pic_mode="$withval", pic_mode=default) +test -z "$pic_mode" && pic_mode=default + +# We assume here that the value for lt_cv_prog_cc_pic will not be cached +# in isolation, and that seeing it set (from the cache) indicates that +# the associated values are set (in the cache) correctly too. +AC_MSG_CHECKING([for $compiler option to produce PIC]) +AC_CACHE_VAL(lt_cv_prog_cc_pic, +[ lt_cv_prog_cc_pic= + lt_cv_prog_cc_shlib= + lt_cv_prog_cc_wl= + lt_cv_prog_cc_static= + lt_cv_prog_cc_no_builtin= + lt_cv_prog_cc_can_build_shared=$can_build_shared + + if test "$GCC" = yes; then + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-static' + + case $host_os in + aix*) + # Below there is a dirty hack to force normal static linking with -ldl + # The problem is because libdl dynamically linked with both libc and + # libC (AIX C++ library), which obviously doesn't included in libraries + # list by gcc. This cause undefined symbols with -static flags. + # This hack allows C programs to be linked with "-static -ldl", but + # not sure about C++ programs. + lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC" + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | irix5* | irix6* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_cv_prog_cc_pic='-fno-common' + ;; + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_cv_prog_cc_pic='-DDLL_EXPORT' + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_cv_prog_cc_pic=-Kconform_pic + fi + ;; + *) + lt_cv_prog_cc_pic='-fPIC' + ;; + esac + else + # PORTME Check for PIC flags for the system compiler. + case $host_os in + aix3* | aix4* | aix5*) + lt_cv_prog_cc_wl='-Wl,' + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_cv_prog_cc_static='-Bstatic' + else + lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + hpux9* | hpux10* | hpux11*) + # Is there a better lt_cv_prog_cc_static that works with the bundled CC? + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive" + lt_cv_prog_cc_pic='+Z' + ;; + + irix5* | irix6*) + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' + # PIC (with -KPIC) is the default. + ;; + + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_cv_prog_cc_pic='-DDLL_EXPORT' + ;; + + newsos6) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + ;; + + osf3* | osf4* | osf5*) + # All OSF/1 code is PIC. + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' + ;; + + sco3.2v5*) + lt_cv_prog_cc_pic='-Kpic' + lt_cv_prog_cc_static='-dn' + lt_cv_prog_cc_shlib='-belf' + ;; + + solaris*) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Wl,' + ;; + + sunos4*) + lt_cv_prog_cc_pic='-PIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Qoption ld ' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + if test "x$host_vendor" = xsni; then + lt_cv_prog_cc_wl='-LD' + else + lt_cv_prog_cc_wl='-Wl,' + fi + ;; + + uts4*) + lt_cv_prog_cc_pic='-pic' + lt_cv_prog_cc_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_cv_prog_cc_pic='-Kconform_pic' + lt_cv_prog_cc_static='-Bstatic' + fi + ;; + + *) + lt_cv_prog_cc_can_build_shared=no + ;; + esac + fi +]) +if test -z "$lt_cv_prog_cc_pic"; then + AC_MSG_RESULT([none]) +else + AC_MSG_RESULT([$lt_cv_prog_cc_pic]) + + # Check to make sure the pic_flag actually works. + AC_MSG_CHECKING([if $compiler PIC flag $lt_cv_prog_cc_pic works]) + AC_CACHE_VAL(lt_cv_prog_cc_pic_works, [dnl + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC" + AC_TRY_COMPILE([], [], [dnl + case $host_os in + hpux9* | hpux10* | hpux11*) + # On HP-UX, both CC and GCC only warn that PIC is supported... then + # they create non-PIC objects. So, if there were any warnings, we + # assume that PIC is not supported. + if test -s conftest.err; then + lt_cv_prog_cc_pic_works=no + else + lt_cv_prog_cc_pic_works=yes + fi + ;; + *) + lt_cv_prog_cc_pic_works=yes + ;; + esac + ], [dnl + lt_cv_prog_cc_pic_works=no + ]) + CFLAGS="$save_CFLAGS" + ]) + + if test "X$lt_cv_prog_cc_pic_works" = Xno; then + lt_cv_prog_cc_pic= + lt_cv_prog_cc_can_build_shared=no + else + lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic" + fi + + AC_MSG_RESULT([$lt_cv_prog_cc_pic_works]) +fi + +# Check for any special shared library compilation flags. +if test -n "$lt_cv_prog_cc_shlib"; then + AC_MSG_WARN([\`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | egrep -e "[[ ]]$lt_cv_prog_cc_shlib[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure]) + lt_cv_prog_cc_can_build_shared=no + fi +fi + +AC_MSG_CHECKING([if $compiler static flag $lt_cv_prog_cc_static works]) +AC_CACHE_VAL([lt_cv_prog_cc_static_works], [dnl + lt_cv_prog_cc_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static" + AC_TRY_LINK([], [], [lt_cv_prog_cc_static_works=yes]) + LDFLAGS="$save_LDFLAGS" +]) + +# Belt *and* braces to stop my trousers falling down: +test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static= +AC_MSG_RESULT([$lt_cv_prog_cc_static_works]) + +pic_flag="$lt_cv_prog_cc_pic" +special_shlib_compile_flags="$lt_cv_prog_cc_shlib" +wl="$lt_cv_prog_cc_wl" +link_static_flag="$lt_cv_prog_cc_static" +no_builtin_flag="$lt_cv_prog_cc_no_builtin" +can_build_shared="$lt_cv_prog_cc_can_build_shared" + + +# Check to see if options -o and -c are simultaneously supported by compiler +AC_MSG_CHECKING([if $compiler supports -c -o file.$ac_objext]) +AC_CACHE_VAL([lt_cv_compiler_c_o], [ +$rm -r conftest 2>/dev/null +mkdir conftest +cd conftest +echo "int some_variable = 0;" > conftest.$ac_ext +mkdir out +# According to Tom Tromey, Ian Lance Taylor reported there are C compilers +# that will create temporary files in the current directory regardless of +# the output directory. Thus, making CWD read-only will cause this test +# to fail, enabling locking or at least warning the user not to do parallel +# builds. +chmod -w . +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -o out/conftest2.$ac_objext" +compiler_c_o=no +if { (eval echo configure:__oline__: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s out/conftest.err; then + lt_cv_compiler_c_o=no + else + lt_cv_compiler_c_o=yes + fi +else + # Append any errors to the config.log. + cat out/conftest.err 1>&AC_FD_CC + lt_cv_compiler_c_o=no +fi +CFLAGS="$save_CFLAGS" +chmod u+w . +$rm conftest* out/* +rmdir out +cd .. +rmdir conftest +$rm -r conftest 2>/dev/null +]) +compiler_c_o=$lt_cv_compiler_c_o +AC_MSG_RESULT([$compiler_c_o]) + +if test x"$compiler_c_o" = x"yes"; then + # Check to see if we can write to a .lo + AC_MSG_CHECKING([if $compiler supports -c -o file.lo]) + AC_CACHE_VAL([lt_cv_compiler_o_lo], [ + lt_cv_compiler_o_lo=no + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -c -o conftest.lo" + save_objext="$ac_objext" + ac_objext=lo + AC_TRY_COMPILE([], [int some_variable = 0;], [dnl + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + lt_cv_compiler_o_lo=no + else + lt_cv_compiler_o_lo=yes + fi + ]) + ac_objext="$save_objext" + CFLAGS="$save_CFLAGS" + ]) + compiler_o_lo=$lt_cv_compiler_o_lo + AC_MSG_RESULT([$compiler_o_lo]) +else + compiler_o_lo=no +fi + +# Check to see if we can do hard links to lock some files if needed +hard_links="nottested" +if test "$compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([\`$CC' does not support \`-c -o', so \`make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi + +if test "$GCC" = yes; then + # Check to see if options -fno-rtti -fno-exceptions are supported by compiler + AC_MSG_CHECKING([if $compiler supports -fno-rtti -fno-exceptions]) + echo "int some_variable = 0;" > conftest.$ac_ext + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext" + compiler_rtti_exceptions=no + AC_TRY_COMPILE([], [int some_variable = 0;], [dnl + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + compiler_rtti_exceptions=no + else + compiler_rtti_exceptions=yes + fi + ]) + CFLAGS="$save_CFLAGS" + AC_MSG_RESULT([$compiler_rtti_exceptions]) + + if test "$compiler_rtti_exceptions" = "yes"; then + no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' + else + no_builtin_flag=' -fno-builtin' + fi +fi + +# See if the linker supports building shared libraries. +AC_MSG_CHECKING([whether the linker ($LD) supports shared libraries]) + +allow_undefined_flag= +no_undefined_flag= +need_lib_prefix=unknown +need_version=unknown +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +archive_cmds= +archive_expsym_cmds= +old_archive_from_new_cmds= +old_archive_from_expsyms_cmds= +export_dynamic_flag_spec= +whole_archive_flag_spec= +thread_safe_flag_spec= +hardcode_into_libs=no +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no +hardcode_shlibpath_var=unsupported +runpath_var= +link_all_deplibs=unknown +always_export_symbols=no +export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' +# include_expsyms should be a list of space-separated symbols to be *always* +# included in the symbol list +include_expsyms= +# exclude_expsyms can be an egrep regular expression of symbols to exclude +# it will be wrapped by ` (' and `)$', so one must not match beginning or +# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', +# as well as any symbol that contains `d'. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_" +# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out +# platforms (ab)use it in PIC code, but their linkers get confused if +# the symbol is explicitly referenced. Since portable code cannot +# rely on this symbol name, it's probably fine to never include it in +# preloaded symbol tables. +extract_expsyms_cmds= + +case $host_os in +cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; +openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX, the GNU linker is very broken + # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available. + ld_shlibs=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=yes + + extract_expsyms_cmds='test -f $output_objdir/impgen.c || \ + sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~ + test -f $output_objdir/impgen.exe || (cd $output_objdir && \ + if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \ + else $CC -o impgen impgen.c ; fi)~ + $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def' + + old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib' + + # cygwin and mingw dlls have different entry points and sets of symbols + # to exclude. + # FIXME: what about values for MSVC? + dll_entry=__cygwin_dll_entry@12 + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~ + case $host_os in + mingw*) + # mingw values + dll_entry=_DllMainCRTStartup@12 + dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~ + ;; + esac + + # mingw and cygwin differ, and it's simplest to just exclude the union + # of the two symbol sets. + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12 + + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one (in ltdll.c) + if test "x$lt_cv_need_dllmain" = "xyes"; then + ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext " + ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~ + test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~' + else + ltdll_obj= + ltdll_cmds= + fi + + # Extract the symbol export list from an `--export-all' def file, + # then regenerate the def file from the symbol export list, so that + # the compiled dll only exports the symbol export list. + # Be careful not to strip the DATA tag left be newer dlltools. + export_symbols_cmds="$ltdll_cmds"' + $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~ + sed -e "1,/EXPORTS/d" -e "s/ @ [[0-9]]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols' + + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is. + # If DATA tags from a recent dlltool are present, honour them! + archive_expsym_cmds='if test "x`head -1 $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname-def; + else + echo EXPORTS > $output_objdir/$soname-def; + _lt_hint=1; + cat $export_symbols | while read symbol; do + set dummy \$symbol; + case \[$]# in + 2) echo " \[$]2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;; + *) echo " \[$]2 @ \$_lt_hint \[$]3 ; " >> $output_objdir/$soname-def;; + esac; + _lt_hint=`expr 1 + \$_lt_hint`; + done; + fi~ + '"$ltdll_cmds"' + $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~ + $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~ + $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags' + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + case $host_os in + cygwin* | mingw* | pw32*) + # dlltool doesn't understand --whole-archive et. al. + whole_archive_flag_spec= + ;; + *) + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + ;; + esac + fi +else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + hardcode_direct=yes + archive_cmds='' + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + shared_flag='${wl}-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall can do strange things, so it is better to + # generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib' + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib' + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='${wl}-berok' + # This is a bit strange, but is similar to how AIX traditionally builds + # it's shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[[012]]) + allow_undefined_flag='-undefined suppress' + ;; + *) # Darwin 1.3 on + allow_undefined_flag='-flat_namespace -undefined suppress' + ;; + esac + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. + archive_cmds='$nonopt $(test "x$module" = xyes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring' + # We need to add '_' to the symbols in $export_symbols first + #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols' + hardcode_direct=yes + hardcode_shlibpath_var=no + whole_archive_flag_spec='-all_load $convenience' + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9* | hpux10* | hpux11*) + case $host_os in + hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;; + *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; + esac + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_minus_L=yes # Not in the search PATH, but as the default + # location of the library. + export_dynamic_flag_spec='${wl}-E' + ;; + + irix5* | irix6*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + openbsd*) + hardcode_direct=yes + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case "$host_os" in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + #Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + export_dynamic_flag_spec='${wl}-Bexport' + ;; + + solaris*) + # gcc --version < 3.0 without binutils cannot create self contained + # shared libraries reliably, requiring libgcc.a to resolve some of + # the object symbols generated in some cases. Libraries that use + # assert need libgcc.a to resolve __eprintf, for example. Linking + # a copy of libgcc.a into every shared library to guarantee resolving + # such symbols causes other problems: According to Tim Van Holder + # , C++ libraries end up with a separate + # (to the application) exception stack for one thing. + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + case `$CC --version 2>/dev/null` in + [[12]].*) + cat <&2 + +*** Warning: Releases of GCC earlier than version 3.0 cannot reliably +*** create self contained shared libraries on Solaris systems, without +*** introducing a dependency on libgcc.a. Therefore, libtool is disabling +*** -no-undefined support, which will at least allow you to build shared +*** libraries. However, you may find that when you link such libraries +*** into an application without using GCC, you have to manually add +*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to +*** upgrade to a newer version of GCC. Another option is to rebuild your +*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer. + +EOF + no_undefined_flag= + ;; + esac + fi + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + if test "x$host_vendor" = xsno; then + archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + else + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5uw7* | unixware7*) + no_undefined_flag='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac +fi +AC_MSG_RESULT([$ld_shlibs]) +test "$ld_shlibs" = no && can_build_shared=no + +# Check hardcoding attributes. +AC_MSG_CHECKING([how to hardcode library paths into programs]) +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var"; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$hardcode_shlibpath_var" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +AC_MSG_RESULT([$hardcode_action]) + +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) +fi + +reload_cmds='$LD$reload_flag -o $output$reload_objs' +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +# PORTME Fill in your ld.so characteristics +AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}.so$major' + ;; + +aix4* | aix5*) + version_type=linux + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can + # not hardcode correct soname into executable. Probably we can + # add versioning support to collect2, so additional links can + # be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}.so$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}.so' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + export_dynamic_flag_spec=-rdynamic + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + need_version=no + need_lib_prefix=no + case $GCC,$host_os in + yes,cygwin*) + library_names_spec='$libname.dll.a' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' + postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog .libs/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + ;; + yes,mingw*) + library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"` + ;; + yes,pw32*) + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' + ;; + *) + library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. + library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)' + soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + *) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + dynamic_linker="$host_os dld.sl" + version_type=sunos + need_lib_prefix=no + need_version=no + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' + soname_spec='${libname}${release}.sl$major' + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6*) + version_type=irix + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so' + case $host_os in + irix5*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux-gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' + soname_spec='${libname}${release}.so$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case "$host_os" in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + ;; + +os2*) + libname_spec='$name' + need_lib_prefix=no + library_names_spec='$libname.dll $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_version=no + soname_spec='${libname}${release}.so' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' + soname_spec='$libname.so.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +# Report the final consequences. +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +AC_LIBTOOL_DLOPEN_SELF + +if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + AC_CACHE_VAL([lt_cv_archive_cmds_need_lc], + [$rm conftest* + echo 'static int dummy;' > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile); then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_cv_prog_cc_wl + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if AC_TRY_EVAL(archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi]) + AC_MSG_RESULT([$lt_cv_archive_cmds_need_lc]) + ;; + esac +fi +need_lc=${lt_cv_archive_cmds_need_lc-yes} + +# The second clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + : +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + test -f Makefile && make "$ltmain" +fi + +if test -f "$ltmain"; then + trap "$rm \"${ofile}T\"; exit 1" 1 2 15 + $rm -f "${ofile}T" + + echo creating $ofile + + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS \ + AR AR_FLAGS CC LD LN_S NM SHELL \ + reload_flag reload_cmds wl \ + pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ + thread_safe_flag_spec whole_archive_flag_spec libname_spec \ + library_names_spec soname_spec \ + RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ + old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \ + postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \ + old_striplib striplib file_magic_cmd export_symbols_cmds \ + deplibs_check_method allow_undefined_flag no_undefined_flag \ + finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ + global_symbol_to_c_name_address \ + hardcode_libdir_flag_spec hardcode_libdir_separator \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do + + case $var in + reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ + extract_expsyms_cmds | old_archive_from_expsyms_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + cat <<__EOF__ > "${ofile}T" +#! $SHELL + +# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996-2000 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# 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. + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="sed -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$need_lc + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# The default C compiler. +CC=$lt_CC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC + +# The linker used to build libraries. +LD=$lt_LD + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_wl + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_pic_flag +pic_mode=$pic_mode + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_compiler_c_o + +# Can we write directly to a .lo ? +compiler_o_lo=$lt_compiler_o_lo + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_link_static_flag + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# ### END LIBTOOL CONFIG + +__EOF__ + + case $host_os in + aix3*) + cat <<\EOF >> "${ofile}T" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + case $host_os in + cygwin* | mingw* | pw32* | os2*) + cat <<'EOF' >> "${ofile}T" + # This is a source program that is used to create dlls on Windows + # Don't remove nor modify the starting and closing comments +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ + # This is a source program that is used to create import libraries + # on Windows for dlls which lack them. Don't remove nor modify the + # starting and closing comments +# /* impgen.c starts here */ +# /* Copyright (C) 1999-2000 Free Software Foundation, Inc. +# +# This file is part of GNU libtool. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# */ +# +# #include /* for printf() */ +# #include /* for open(), lseek(), read() */ +# #include /* for O_RDONLY, O_BINARY */ +# #include /* for strdup() */ +# +# /* O_BINARY isn't required (or even defined sometimes) under Unix */ +# #ifndef O_BINARY +# #define O_BINARY 0 +# #endif +# +# static unsigned int +# pe_get16 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[2]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 2); +# return b[0] + (b[1]<<8); +# } +# +# static unsigned int +# pe_get32 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[4]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 4); +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# static unsigned int +# pe_as32 (ptr) +# void *ptr; +# { +# unsigned char *b = ptr; +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# int +# main (argc, argv) +# int argc; +# char *argv[]; +# { +# int dll; +# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; +# unsigned long export_rva, export_size, nsections, secptr, expptr; +# unsigned long name_rvas, nexp; +# unsigned char *expdata, *erva; +# char *filename, *dll_name; +# +# filename = argv[1]; +# +# dll = open(filename, O_RDONLY|O_BINARY); +# if (dll < 1) +# return 1; +# +# dll_name = filename; +# +# for (i=0; filename[i]; i++) +# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') +# dll_name = filename + i +1; +# +# pe_header_offset = pe_get32 (dll, 0x3c); +# opthdr_ofs = pe_header_offset + 4 + 20; +# num_entries = pe_get32 (dll, opthdr_ofs + 92); +# +# if (num_entries < 1) /* no exports */ +# return 1; +# +# export_rva = pe_get32 (dll, opthdr_ofs + 96); +# export_size = pe_get32 (dll, opthdr_ofs + 100); +# nsections = pe_get16 (dll, pe_header_offset + 4 +2); +# secptr = (pe_header_offset + 4 + 20 + +# pe_get16 (dll, pe_header_offset + 4 + 16)); +# +# expptr = 0; +# for (i = 0; i < nsections; i++) +# { +# char sname[8]; +# unsigned long secptr1 = secptr + 40 * i; +# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); +# unsigned long vsize = pe_get32 (dll, secptr1 + 16); +# unsigned long fptr = pe_get32 (dll, secptr1 + 20); +# lseek(dll, secptr1, SEEK_SET); +# read(dll, sname, 8); +# if (vaddr <= export_rva && vaddr+vsize > export_rva) +# { +# expptr = fptr + (export_rva - vaddr); +# if (export_rva + export_size > vaddr + vsize) +# export_size = vsize - (export_rva - vaddr); +# break; +# } +# } +# +# expdata = (unsigned char*)malloc(export_size); +# lseek (dll, expptr, SEEK_SET); +# read (dll, expdata, export_size); +# erva = expdata - export_rva; +# +# nexp = pe_as32 (expdata+24); +# name_rvas = pe_as32 (expdata+32); +# +# printf ("EXPORTS\n"); +# for (i = 0; i> "${ofile}T" || (rm -f "${ofile}T"; exit 1) + + mv -f "${ofile}T" "$ofile" || \ + (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T") + chmod +x "$ofile" +fi + +])# _LT_AC_LTCONFIG_HACK + +# AC_LIBTOOL_DLOPEN - enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])]) + +# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) + +# AC_ENABLE_SHARED - implement the --enable-shared flag +# Usage: AC_ENABLE_SHARED[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(shared, +changequote(<<, >>)dnl +<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case $enableval in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl +]) + +# AC_DISABLE_SHARED - set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no)]) + +# AC_ENABLE_STATIC - implement the --enable-static flag +# Usage: AC_ENABLE_STATIC[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(static, +changequote(<<, >>)dnl +<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case $enableval in +yes) enable_static=yes ;; +no) enable_static=no ;; +*) + enable_static=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_static=AC_ENABLE_STATIC_DEFAULT)dnl +]) + +# AC_DISABLE_STATIC - set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no)]) + + +# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag +# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(fast-install, +changequote(<<, >>)dnl +<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case $enableval in +yes) enable_fast_install=yes ;; +no) enable_fast_install=no ;; +*) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl +]) + +# AC_DISABLE_FAST_INSTALL - set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no)]) + +# AC_LIBTOOL_PICMODE - implement the --with-pic flag +# Usage: AC_LIBTOOL_PICMODE[(MODE)] +# Where MODE is either `yes' or `no'. If omitted, it defaults to +# `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default)]) + + +# AC_PATH_TOOL_PREFIX - find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in + /*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; + ?:/*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. + ;; + *) + ac_save_MAGIC_CMD="$MAGIC_CMD" + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + egrep "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$ac_save_ifs" + MAGIC_CMD="$ac_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +]) + + +# AC_PATH_MAGIC - find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_REQUIRE([AC_CHECK_TOOL_PREFIX])dnl +AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin:$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin:$PATH) + else + MAGIC_CMD=: + fi +fi +]) + + +# AC_PROG_LD - find the path to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH(gnu-ld, +[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], +test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | [[A-Za-z]]:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$lt_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_PROG_LD_GNU +]) + +# AC_PROG_LD_GNU - +AC_DEFUN([AC_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + lt_cv_prog_gnu_ld=yes +else + lt_cv_prog_gnu_ld=no +fi]) +with_gnu_ld=$lt_cv_prog_gnu_ld +]) + +# AC_PROG_LD_RELOAD_FLAG - find reload flag for linker +# -- PORTME Some linkers may need a different reload flag. +AC_DEFUN([AC_PROG_LD_RELOAD_FLAG], +[AC_CACHE_CHECK([for $LD option to reload object files], lt_cv_ld_reload_flag, +[lt_cv_ld_reload_flag='-r']) +reload_flag=$lt_cv_ld_reload_flag +test -n "$reload_flag" && reload_flag=" $reload_flag" +]) + +# AC_DEPLIBS_CHECK_METHOD - how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +AC_DEFUN([AC_DEPLIBS_CHECK_METHOD], +[AC_CACHE_CHECK([how to recognise dependant libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given egrep regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix4* | aix5*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi4*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin* | mingw* | pw32*) + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library' + lt_cv_file_magic_cmd='/usr/bin/file -L' + case "$host_os" in + rhapsody* | darwin1.[[012]]) + lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1` + ;; + *) # Darwin 1.3 on + lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib' + ;; + esac + ;; + +freebsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20*|hpux11*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + +irix5* | irix6*) + case $host_os in + irix5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1" + ;; + esac + lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux-gnu*) + case $host_cpu in + alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | s390* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so\.[[0-9]]+\.[[0-9]]+$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' + lt_cv_file_magic_test_file=/shlib/libc.so + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_test_file=/lib/libc.so + ;; + +sysv5uw[[78]]* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + esac + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +]) + + +# AC_PROG_NM - find the path to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl +AC_MSG_CHECKING([for BSD-compatible nm]) +AC_CACHE_VAL(lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/${ac_tool_prefix}nm + if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then + lt_cv_path_NM="$tmp_nm -B" + break + elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + lt_cv_path_NM="$tmp_nm -p" + break + else + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +AC_MSG_RESULT([$NM]) +]) + +# AC_CHECK_LIBM - check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32*) + # These system don't have libm + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, main, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, main, LIBM="-lm") + ;; +esac +]) + +# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl convenience library and INCLTDL to the include flags for +# the libltdl header and adds --enable-ltdl-convenience to the +# configure arguments. Note that LIBLTDL and INCLTDL are not +# AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If DIR is not +# provided, it is assumed to be `libltdl'. LIBLTDL will be prefixed +# with '${top_builddir}/' and INCLTDL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) +]) + +# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl installable library and INCLTDL to the include flags for +# the libltdl header and adds --enable-ltdl-install to the configure +# arguments. Note that LIBLTDL and INCLTDL are not AC_SUBSTed, nor is +# AC_CONFIG_SUBDIRS called. If DIR is not provided and an installed +# libltdl is not found, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and INCLTDL will be prefixed +# with '${top_srcdir}/' (note the single quotes!). If your package is +# not flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, main, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + INCLTDL= + fi +]) + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) diff --git a/coregrade/src/mailsend/changelog.debian b/coregrade/src/mailsend/changelog.debian new file mode 100644 index 0000000..1e8b12f --- /dev/null +++ b/coregrade/src/mailsend/changelog.debian @@ -0,0 +1,5 @@ +mailsend (1.17-ubuntu) unstable; urgency=low + + * Built debian binary package for mailsend v1.17 + + -- Muhammad Muquit Fri, 11 May 2012 13:54:10 -0400 diff --git a/coregrade/src/mailsend/configure b/coregrade/src/mailsend/configure new file mode 100755 index 0000000..7de51f3 --- /dev/null +++ b/coregrade/src/mailsend/configure @@ -0,0 +1,6982 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69. +# +# +# 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= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= +PACKAGE_URL= + +ac_unique_file="mailsend.h" +# 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 +IV_HEX +MKEY_HEX +MKEY_GENERATED +DL_LIB +STRIP +EGREP +GREP +CPP +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +SET_MAKE +RANLIB +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 +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 +OPENSSL_LIBS +OPENSSL_INC +OPENSSL_DIR' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +with_openssl +with_openssl_includes +with_openssl_libraries +with_genmkey +' + 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' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE}' +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 ;; + + -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 +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 this package 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] + --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/PACKAGE] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-openssl=PATH where the root of OpenSSL is installed + --with-openssl-includes where the OpenSSL includes are. + --with-openssl-libraris where the OpenSSL library is installed. + --with-genmkey=yes,no If master key should be generated + +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 +configure +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_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_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_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_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_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_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 +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 $as_me, 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 + + + +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 + +{ $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 + + +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 + +test "$GCC" = yes && CFLAGS="$CFLAGS -Wall" +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. + + +# 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' + + + +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 + + +for ac_header in string.h strings.h memory.h malloc.h unistd.h ctype.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 + +for ac_header in stdint.h sys/types.h stdlib.h fcntl.h sys/file.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 + +for ac_header in limits.h sys/syslimits.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 + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; 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_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $STRIP in + [\\/]* | ?:[\\/]*) + ac_cv_path_STRIP="$STRIP" # 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_STRIP="$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 + + ;; +esac +fi +STRIP=$ac_cv_path_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_STRIP"; then + ac_pt_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; 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_ac_pt_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_STRIP in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_STRIP="$ac_pt_STRIP" # 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_ac_pt_STRIP="$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 + + ;; +esac +fi +ac_pt_STRIP=$ac_cv_path_ac_pt_STRIP +if test -n "$ac_pt_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_STRIP" >&5 +$as_echo "$ac_pt_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_STRIP" = x; then + STRIP="" + 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 + STRIP=$ac_pt_STRIP + fi +else + STRIP="$ac_cv_path_STRIP" +fi + + + + unset ac_cv_func_flock + unset ac_cv_func___flock + unset found + + ac_fn_c_check_func "$LINENO" "flock" "ac_cv_func_flock" +if test "x$ac_cv_func_flock" = xyes; then : + found=yes +else + ac_fn_c_check_func "$LINENO" "__flock" "ac_cv_func___flock" +if test "x$ac_cv_func___flock" = xyes; then : + found=yes +else + found=no +fi + +fi + + + case $found in + yes) + +$as_echo "#define HAVE_FLOCK 1" >>confdefs.h + + ac_cv_func_flock=yes + ;; + + esac + + + unset ac_cv_func_socket + unset ac_cv_func___socket + unset found + + ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket" +if test "x$ac_cv_func_socket" = xyes; then : + found=yes +else + ac_fn_c_check_func "$LINENO" "__socket" "ac_cv_func___socket" +if test "x$ac_cv_func___socket" = xyes; then : + found=yes +else + found=no +fi + +fi + + + case $found in + yes) + +$as_echo "#define HAVE_SOCKET 1" >>confdefs.h + + ac_cv_func_socket=yes + ;; + + *) + + unset ac_cv_lib_socket_socket + unset ac_cv_lib_socket___socket + unset found + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5 +$as_echo_n "checking for socket in -lsocket... " >&6; } +if ${ac_cv_lib_socket_socket+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $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 socket (); +int +main () +{ +return socket (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_socket=yes +else + ac_cv_lib_socket_socket=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_socket_socket" >&5 +$as_echo "$ac_cv_lib_socket_socket" >&6; } +if test "x$ac_cv_lib_socket_socket" = xyes; then : + found=yes +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __socket in -lsocket" >&5 +$as_echo_n "checking for __socket in -lsocket... " >&6; } +if ${ac_cv_lib_socket___socket+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $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 __socket (); +int +main () +{ +return __socket (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket___socket=yes +else + ac_cv_lib_socket___socket=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_socket___socket" >&5 +$as_echo "$ac_cv_lib_socket___socket" >&6; } +if test "x$ac_cv_lib_socket___socket" = xyes; then : + found=yes +else + found=no +fi + + +fi + + + if test "$found" = "yes"; then + ac_libs=$LIBS + LIBS="$LIBS -lsocket" + if test "$cross_compiling" = yes; then : + found=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +main() { return (0); } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + found=yes +else + found=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS=$ac_libs + fi + + if test "$found" = "yes"; then + + + case socket in + c|c_r|pthread*) ;; + *) + LIBS="-lsocket $LIBS" + ;; + esac + + + +$as_echo "#define HAVE_SOCKET 1" >>confdefs.h + + +$as_echo "#define HAVE_LIBSOCKET 1" >>confdefs.h + + ac_cv_func_socket=yes + else + + : + + fi + + ;; + + esac + + + unset ac_cv_func_htonl + unset ac_cv_func___htonl + unset found + + ac_fn_c_check_func "$LINENO" "htonl" "ac_cv_func_htonl" +if test "x$ac_cv_func_htonl" = xyes; then : + found=yes +else + ac_fn_c_check_func "$LINENO" "__htonl" "ac_cv_func___htonl" +if test "x$ac_cv_func___htonl" = xyes; then : + found=yes +else + found=no +fi + +fi + + + case $found in + yes) + +$as_echo "#define HAVE_HTONL 1" >>confdefs.h + + ac_cv_func_htonl=yes + ;; + + *) + + unset ac_cv_lib_socket_htonl + unset ac_cv_lib_socket___htonl + unset found + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for htonl in -lsocket" >&5 +$as_echo_n "checking for htonl in -lsocket... " >&6; } +if ${ac_cv_lib_socket_htonl+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $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 htonl (); +int +main () +{ +return htonl (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_htonl=yes +else + ac_cv_lib_socket_htonl=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_socket_htonl" >&5 +$as_echo "$ac_cv_lib_socket_htonl" >&6; } +if test "x$ac_cv_lib_socket_htonl" = xyes; then : + found=yes +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __htonl in -lsocket" >&5 +$as_echo_n "checking for __htonl in -lsocket... " >&6; } +if ${ac_cv_lib_socket___htonl+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $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 __htonl (); +int +main () +{ +return __htonl (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket___htonl=yes +else + ac_cv_lib_socket___htonl=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_socket___htonl" >&5 +$as_echo "$ac_cv_lib_socket___htonl" >&6; } +if test "x$ac_cv_lib_socket___htonl" = xyes; then : + found=yes +else + found=no +fi + + +fi + + + if test "$found" = "yes"; then + ac_libs=$LIBS + LIBS="$LIBS -lsocket" + if test "$cross_compiling" = yes; then : + found=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +main() { return (0); } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + found=yes +else + found=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS=$ac_libs + fi + + if test "$found" = "yes"; then + + + case socket in + c|c_r|pthread*) ;; + *) + LIBS="-lsocket $LIBS" + ;; + esac + + + +$as_echo "#define HAVE_HTONL 1" >>confdefs.h + + +$as_echo "#define HAVE_LIBSOCKET 1" >>confdefs.h + + ac_cv_func_htonl=yes + else + + : + + fi + + ;; + + esac + + + unset ac_cv_func_gethostname + unset ac_cv_func___gethostname + unset found + + ac_fn_c_check_func "$LINENO" "gethostname" "ac_cv_func_gethostname" +if test "x$ac_cv_func_gethostname" = xyes; then : + found=yes +else + ac_fn_c_check_func "$LINENO" "__gethostname" "ac_cv_func___gethostname" +if test "x$ac_cv_func___gethostname" = xyes; then : + found=yes +else + found=no +fi + +fi + + + case $found in + yes) + +$as_echo "#define HAVE_GETHOSTNAME 1" >>confdefs.h + + ac_cv_func_gethostname=yes + ;; + + *) + + unset ac_cv_lib_nsl_gethostname + unset ac_cv_lib_nsl___gethostname + unset found + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostname in -lnsl" >&5 +$as_echo_n "checking for gethostname in -lnsl... " >&6; } +if ${ac_cv_lib_nsl_gethostname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $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 gethostname (); +int +main () +{ +return gethostname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_gethostname=yes +else + ac_cv_lib_nsl_gethostname=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_nsl_gethostname" >&5 +$as_echo "$ac_cv_lib_nsl_gethostname" >&6; } +if test "x$ac_cv_lib_nsl_gethostname" = xyes; then : + found=yes +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gethostname in -lnsl" >&5 +$as_echo_n "checking for __gethostname in -lnsl... " >&6; } +if ${ac_cv_lib_nsl___gethostname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $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 __gethostname (); +int +main () +{ +return __gethostname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl___gethostname=yes +else + ac_cv_lib_nsl___gethostname=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_nsl___gethostname" >&5 +$as_echo "$ac_cv_lib_nsl___gethostname" >&6; } +if test "x$ac_cv_lib_nsl___gethostname" = xyes; then : + found=yes +else + found=no +fi + + +fi + + + if test "$found" = "yes"; then + ac_libs=$LIBS + LIBS="$LIBS -lnsl" + if test "$cross_compiling" = yes; then : + found=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +main() { return (0); } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + found=yes +else + found=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS=$ac_libs + fi + + if test "$found" = "yes"; then + + + case nsl in + c|c_r|pthread*) ;; + *) + LIBS="-lnsl $LIBS" + ;; + esac + + + +$as_echo "#define HAVE_GETHOSTNAME 1" >>confdefs.h + + +$as_echo "#define HAVE_LIBNSL 1" >>confdefs.h + + ac_cv_func_gethostname=yes + else + + : + + fi + + ;; + + esac + + + unset ac_cv_func_gethostbyaddr + unset ac_cv_func___gethostbyaddr + unset found + + ac_fn_c_check_func "$LINENO" "gethostbyaddr" "ac_cv_func_gethostbyaddr" +if test "x$ac_cv_func_gethostbyaddr" = xyes; then : + found=yes +else + ac_fn_c_check_func "$LINENO" "__gethostbyaddr" "ac_cv_func___gethostbyaddr" +if test "x$ac_cv_func___gethostbyaddr" = xyes; then : + found=yes +else + found=no +fi + +fi + + + case $found in + yes) + +$as_echo "#define HAVE_GETHOSTBYADDR 1" >>confdefs.h + + ac_cv_func_gethostbyaddr=yes + ;; + + *) + + unset ac_cv_lib_nsl_gethostbyaddr + unset ac_cv_lib_nsl___gethostbyaddr + unset found + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyaddr in -lnsl" >&5 +$as_echo_n "checking for gethostbyaddr in -lnsl... " >&6; } +if ${ac_cv_lib_nsl_gethostbyaddr+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $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 gethostbyaddr (); +int +main () +{ +return gethostbyaddr (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_gethostbyaddr=yes +else + ac_cv_lib_nsl_gethostbyaddr=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_nsl_gethostbyaddr" >&5 +$as_echo "$ac_cv_lib_nsl_gethostbyaddr" >&6; } +if test "x$ac_cv_lib_nsl_gethostbyaddr" = xyes; then : + found=yes +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gethostbyaddr in -lnsl" >&5 +$as_echo_n "checking for __gethostbyaddr in -lnsl... " >&6; } +if ${ac_cv_lib_nsl___gethostbyaddr+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $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 __gethostbyaddr (); +int +main () +{ +return __gethostbyaddr (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl___gethostbyaddr=yes +else + ac_cv_lib_nsl___gethostbyaddr=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_nsl___gethostbyaddr" >&5 +$as_echo "$ac_cv_lib_nsl___gethostbyaddr" >&6; } +if test "x$ac_cv_lib_nsl___gethostbyaddr" = xyes; then : + found=yes +else + found=no +fi + + +fi + + + if test "$found" = "yes"; then + ac_libs=$LIBS + LIBS="$LIBS -lnsl" + if test "$cross_compiling" = yes; then : + found=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +main() { return (0); } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + found=yes +else + found=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS=$ac_libs + fi + + if test "$found" = "yes"; then + + + case nsl in + c|c_r|pthread*) ;; + *) + LIBS="-lnsl $LIBS" + ;; + esac + + + +$as_echo "#define HAVE_GETHOSTBYADDR 1" >>confdefs.h + + +$as_echo "#define HAVE_LIBNSL 1" >>confdefs.h + + ac_cv_func_gethostbyaddr=yes + else + + : + + fi + + ;; + + esac + + + unset ac_cv_func_yp_get_default_domain + unset ac_cv_func___yp_get_default_domain + unset found + + ac_fn_c_check_func "$LINENO" "yp_get_default_domain" "ac_cv_func_yp_get_default_domain" +if test "x$ac_cv_func_yp_get_default_domain" = xyes; then : + found=yes +else + ac_fn_c_check_func "$LINENO" "__yp_get_default_domain" "ac_cv_func___yp_get_default_domain" +if test "x$ac_cv_func___yp_get_default_domain" = xyes; then : + found=yes +else + found=no +fi + +fi + + + case $found in + yes) + +$as_echo "#define HAVE_YP_GET_DEFAULT_DOMAIN 1" >>confdefs.h + + ac_cv_func_yp_get_default_domain=yes + ;; + + *) + + unset ac_cv_lib_nsl_yp_get_default_domain + unset ac_cv_lib_nsl___yp_get_default_domain + unset found + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for yp_get_default_domain in -lnsl" >&5 +$as_echo_n "checking for yp_get_default_domain in -lnsl... " >&6; } +if ${ac_cv_lib_nsl_yp_get_default_domain+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $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 yp_get_default_domain (); +int +main () +{ +return yp_get_default_domain (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_yp_get_default_domain=yes +else + ac_cv_lib_nsl_yp_get_default_domain=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_nsl_yp_get_default_domain" >&5 +$as_echo "$ac_cv_lib_nsl_yp_get_default_domain" >&6; } +if test "x$ac_cv_lib_nsl_yp_get_default_domain" = xyes; then : + found=yes +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __yp_get_default_domain in -lnsl" >&5 +$as_echo_n "checking for __yp_get_default_domain in -lnsl... " >&6; } +if ${ac_cv_lib_nsl___yp_get_default_domain+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $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 __yp_get_default_domain (); +int +main () +{ +return __yp_get_default_domain (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl___yp_get_default_domain=yes +else + ac_cv_lib_nsl___yp_get_default_domain=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_nsl___yp_get_default_domain" >&5 +$as_echo "$ac_cv_lib_nsl___yp_get_default_domain" >&6; } +if test "x$ac_cv_lib_nsl___yp_get_default_domain" = xyes; then : + found=yes +else + found=no +fi + + +fi + + + if test "$found" = "yes"; then + ac_libs=$LIBS + LIBS="$LIBS -lnsl" + if test "$cross_compiling" = yes; then : + found=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +main() { return (0); } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + found=yes +else + found=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS=$ac_libs + fi + + if test "$found" = "yes"; then + + + case nsl in + c|c_r|pthread*) ;; + *) + LIBS="-lnsl $LIBS" + ;; + esac + + + +$as_echo "#define HAVE_YP_GET_DEFAULT_DOMAIN 1" >>confdefs.h + + +$as_echo "#define HAVE_LIBNSL 1" >>confdefs.h + + ac_cv_func_yp_get_default_domain=yes + else + + : + + fi + + ;; + + esac + + + + unset ac_cv_func_res_search + unset ac_cv_func___res_search + unset found + + ac_fn_c_check_func "$LINENO" "res_search" "ac_cv_func_res_search" +if test "x$ac_cv_func_res_search" = xyes; then : + found=yes +else + ac_fn_c_check_func "$LINENO" "__res_search" "ac_cv_func___res_search" +if test "x$ac_cv_func___res_search" = xyes; then : + found=yes +else + found=no +fi + +fi + + + case $found in + yes) + +$as_echo "#define HAVE_RES_SEARCH 1" >>confdefs.h + + ac_cv_func_res_search=yes + ;; + + *) + + unset ac_cv_lib_resolv_res_search + unset ac_cv_lib_resolv___res_search + unset found + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_search in -lresolv" >&5 +$as_echo_n "checking for res_search in -lresolv... " >&6; } +if ${ac_cv_lib_resolv_res_search+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lresolv $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 res_search (); +int +main () +{ +return res_search (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_resolv_res_search=yes +else + ac_cv_lib_resolv_res_search=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_resolv_res_search" >&5 +$as_echo "$ac_cv_lib_resolv_res_search" >&6; } +if test "x$ac_cv_lib_resolv_res_search" = xyes; then : + found=yes +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __res_search in -lresolv" >&5 +$as_echo_n "checking for __res_search in -lresolv... " >&6; } +if ${ac_cv_lib_resolv___res_search+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lresolv $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 __res_search (); +int +main () +{ +return __res_search (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_resolv___res_search=yes +else + ac_cv_lib_resolv___res_search=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_resolv___res_search" >&5 +$as_echo "$ac_cv_lib_resolv___res_search" >&6; } +if test "x$ac_cv_lib_resolv___res_search" = xyes; then : + found=yes +else + found=no +fi + + +fi + + + if test "$found" = "yes"; then + ac_libs=$LIBS + LIBS="$LIBS -lresolv" + if test "$cross_compiling" = yes; then : + found=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +main() { return (0); } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + found=yes +else + found=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS=$ac_libs + fi + + if test "$found" = "yes"; then + + + case resolv in + c|c_r|pthread*) ;; + *) + LIBS="-lresolv $LIBS" + ;; + esac + + + +$as_echo "#define HAVE_RES_SEARCH 1" >>confdefs.h + + +$as_echo "#define HAVE_LIBRESOLV 1" >>confdefs.h + + ac_cv_func_res_search=yes + else + + + unset ac_cv_lib_bind_res_search + unset ac_cv_lib_bind___res_search + unset found + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_search in -lbind" >&5 +$as_echo_n "checking for res_search in -lbind... " >&6; } +if ${ac_cv_lib_bind_res_search+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbind $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 res_search (); +int +main () +{ +return res_search (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bind_res_search=yes +else + ac_cv_lib_bind_res_search=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_bind_res_search" >&5 +$as_echo "$ac_cv_lib_bind_res_search" >&6; } +if test "x$ac_cv_lib_bind_res_search" = xyes; then : + found=yes +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __res_search in -lbind" >&5 +$as_echo_n "checking for __res_search in -lbind... " >&6; } +if ${ac_cv_lib_bind___res_search+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbind $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 __res_search (); +int +main () +{ +return __res_search (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bind___res_search=yes +else + ac_cv_lib_bind___res_search=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_bind___res_search" >&5 +$as_echo "$ac_cv_lib_bind___res_search" >&6; } +if test "x$ac_cv_lib_bind___res_search" = xyes; then : + found=yes +else + found=no +fi + + +fi + + + if test "$found" = "yes"; then + ac_libs=$LIBS + LIBS="$LIBS -lbind" + if test "$cross_compiling" = yes; then : + found=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +main() { return (0); } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + found=yes +else + found=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS=$ac_libs + fi + + if test "$found" = "yes"; then + + + case bind in + c|c_r|pthread*) ;; + *) + LIBS="-lbind $LIBS" + ;; + esac + + + +$as_echo "#define HAVE_RES_SEARCH 1" >>confdefs.h + + +$as_echo "#define HAVE_LIBBIND 1" >>confdefs.h + + ac_cv_func_res_search=yes + else + + + unset ac_cv_lib_socket_res_search + unset ac_cv_lib_socket___res_search + unset found + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_search in -lsocket" >&5 +$as_echo_n "checking for res_search in -lsocket... " >&6; } +if ${ac_cv_lib_socket_res_search+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $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 res_search (); +int +main () +{ +return res_search (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_res_search=yes +else + ac_cv_lib_socket_res_search=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_socket_res_search" >&5 +$as_echo "$ac_cv_lib_socket_res_search" >&6; } +if test "x$ac_cv_lib_socket_res_search" = xyes; then : + found=yes +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __res_search in -lsocket" >&5 +$as_echo_n "checking for __res_search in -lsocket... " >&6; } +if ${ac_cv_lib_socket___res_search+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $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 __res_search (); +int +main () +{ +return __res_search (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket___res_search=yes +else + ac_cv_lib_socket___res_search=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_socket___res_search" >&5 +$as_echo "$ac_cv_lib_socket___res_search" >&6; } +if test "x$ac_cv_lib_socket___res_search" = xyes; then : + found=yes +else + found=no +fi + + +fi + + + if test "$found" = "yes"; then + ac_libs=$LIBS + LIBS="$LIBS -lsocket" + if test "$cross_compiling" = yes; then : + found=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +main() { return (0); } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + found=yes +else + found=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS=$ac_libs + fi + + if test "$found" = "yes"; then + + + case socket in + c|c_r|pthread*) ;; + *) + LIBS="-lsocket $LIBS" + ;; + esac + + + +$as_echo "#define HAVE_RES_SEARCH 1" >>confdefs.h + + +$as_echo "#define HAVE_LIBSOCKET 1" >>confdefs.h + + ac_cv_func_res_search=yes + else + + : + + fi + + + fi + + + fi + + ;; + + esac + + + + unset ac_cv_func_inet_aton + unset ac_cv_func___inet_aton + unset found + + ac_fn_c_check_func "$LINENO" "inet_aton" "ac_cv_func_inet_aton" +if test "x$ac_cv_func_inet_aton" = xyes; then : + found=yes +else + ac_fn_c_check_func "$LINENO" "__inet_aton" "ac_cv_func___inet_aton" +if test "x$ac_cv_func___inet_aton" = xyes; then : + found=yes +else + found=no +fi + +fi + + + case $found in + yes) + +$as_echo "#define HAVE_INET_ATON 1" >>confdefs.h + + ac_cv_func_inet_aton=yes + ;; + + *) + + unset ac_cv_lib_resolv_inet_aton + unset ac_cv_lib_resolv___inet_aton + unset found + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lresolv" >&5 +$as_echo_n "checking for inet_aton in -lresolv... " >&6; } +if ${ac_cv_lib_resolv_inet_aton+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lresolv $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 inet_aton (); +int +main () +{ +return inet_aton (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_resolv_inet_aton=yes +else + ac_cv_lib_resolv_inet_aton=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_resolv_inet_aton" >&5 +$as_echo "$ac_cv_lib_resolv_inet_aton" >&6; } +if test "x$ac_cv_lib_resolv_inet_aton" = xyes; then : + found=yes +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __inet_aton in -lresolv" >&5 +$as_echo_n "checking for __inet_aton in -lresolv... " >&6; } +if ${ac_cv_lib_resolv___inet_aton+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lresolv $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 __inet_aton (); +int +main () +{ +return __inet_aton (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_resolv___inet_aton=yes +else + ac_cv_lib_resolv___inet_aton=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_resolv___inet_aton" >&5 +$as_echo "$ac_cv_lib_resolv___inet_aton" >&6; } +if test "x$ac_cv_lib_resolv___inet_aton" = xyes; then : + found=yes +else + found=no +fi + + +fi + + + if test "$found" = "yes"; then + ac_libs=$LIBS + LIBS="$LIBS -lresolv" + if test "$cross_compiling" = yes; then : + found=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +main() { return (0); } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + found=yes +else + found=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS=$ac_libs + fi + + if test "$found" = "yes"; then + + + case resolv in + c|c_r|pthread*) ;; + *) + LIBS="-lresolv $LIBS" + ;; + esac + + + +$as_echo "#define HAVE_INET_ATON 1" >>confdefs.h + + +$as_echo "#define HAVE_LIBRESOLV 1" >>confdefs.h + + ac_cv_func_inet_aton=yes + else + + + unset ac_cv_lib_bind_inet_aton + unset ac_cv_lib_bind___inet_aton + unset found + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lbind" >&5 +$as_echo_n "checking for inet_aton in -lbind... " >&6; } +if ${ac_cv_lib_bind_inet_aton+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbind $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 inet_aton (); +int +main () +{ +return inet_aton (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bind_inet_aton=yes +else + ac_cv_lib_bind_inet_aton=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_bind_inet_aton" >&5 +$as_echo "$ac_cv_lib_bind_inet_aton" >&6; } +if test "x$ac_cv_lib_bind_inet_aton" = xyes; then : + found=yes +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __inet_aton in -lbind" >&5 +$as_echo_n "checking for __inet_aton in -lbind... " >&6; } +if ${ac_cv_lib_bind___inet_aton+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbind $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 __inet_aton (); +int +main () +{ +return __inet_aton (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bind___inet_aton=yes +else + ac_cv_lib_bind___inet_aton=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_bind___inet_aton" >&5 +$as_echo "$ac_cv_lib_bind___inet_aton" >&6; } +if test "x$ac_cv_lib_bind___inet_aton" = xyes; then : + found=yes +else + found=no +fi + + +fi + + + if test "$found" = "yes"; then + ac_libs=$LIBS + LIBS="$LIBS -lbind" + if test "$cross_compiling" = yes; then : + found=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +main() { return (0); } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + found=yes +else + found=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS=$ac_libs + fi + + if test "$found" = "yes"; then + + + case bind in + c|c_r|pthread*) ;; + *) + LIBS="-lbind $LIBS" + ;; + esac + + + +$as_echo "#define HAVE_INET_ATON 1" >>confdefs.h + + +$as_echo "#define HAVE_LIBBIND 1" >>confdefs.h + + ac_cv_func_inet_aton=yes + else + + : + + fi + + + fi + + ;; + + esac + + + unset ac_cv_func_dn_skipname + unset ac_cv_func___dn_skipname + unset found + + ac_fn_c_check_func "$LINENO" "dn_skipname" "ac_cv_func_dn_skipname" +if test "x$ac_cv_func_dn_skipname" = xyes; then : + found=yes +else + ac_fn_c_check_func "$LINENO" "__dn_skipname" "ac_cv_func___dn_skipname" +if test "x$ac_cv_func___dn_skipname" = xyes; then : + found=yes +else + found=no +fi + +fi + + + case $found in + yes) + +$as_echo "#define HAVE_DN_SKIPNAME 1" >>confdefs.h + + ac_cv_func_dn_skipname=yes + ;; + + *) + + unset ac_cv_lib_resolv_dn_skipname + unset ac_cv_lib_resolv___dn_skipname + unset found + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dn_skipname in -lresolv" >&5 +$as_echo_n "checking for dn_skipname in -lresolv... " >&6; } +if ${ac_cv_lib_resolv_dn_skipname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lresolv $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 dn_skipname (); +int +main () +{ +return dn_skipname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_resolv_dn_skipname=yes +else + ac_cv_lib_resolv_dn_skipname=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_resolv_dn_skipname" >&5 +$as_echo "$ac_cv_lib_resolv_dn_skipname" >&6; } +if test "x$ac_cv_lib_resolv_dn_skipname" = xyes; then : + found=yes +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __dn_skipname in -lresolv" >&5 +$as_echo_n "checking for __dn_skipname in -lresolv... " >&6; } +if ${ac_cv_lib_resolv___dn_skipname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lresolv $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 __dn_skipname (); +int +main () +{ +return __dn_skipname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_resolv___dn_skipname=yes +else + ac_cv_lib_resolv___dn_skipname=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_resolv___dn_skipname" >&5 +$as_echo "$ac_cv_lib_resolv___dn_skipname" >&6; } +if test "x$ac_cv_lib_resolv___dn_skipname" = xyes; then : + found=yes +else + found=no +fi + + +fi + + + if test "$found" = "yes"; then + ac_libs=$LIBS + LIBS="$LIBS -lresolv" + if test "$cross_compiling" = yes; then : + found=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +main() { return (0); } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + found=yes +else + found=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS=$ac_libs + fi + + if test "$found" = "yes"; then + + + case resolv in + c|c_r|pthread*) ;; + *) + LIBS="-lresolv $LIBS" + ;; + esac + + + +$as_echo "#define HAVE_DN_SKIPNAME 1" >>confdefs.h + + +$as_echo "#define HAVE_LIBRESOLV 1" >>confdefs.h + + ac_cv_func_dn_skipname=yes + else + + + unset ac_cv_lib_bind_dn_skipname + unset ac_cv_lib_bind___dn_skipname + unset found + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dn_skipname in -lbind" >&5 +$as_echo_n "checking for dn_skipname in -lbind... " >&6; } +if ${ac_cv_lib_bind_dn_skipname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbind $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 dn_skipname (); +int +main () +{ +return dn_skipname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bind_dn_skipname=yes +else + ac_cv_lib_bind_dn_skipname=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_bind_dn_skipname" >&5 +$as_echo "$ac_cv_lib_bind_dn_skipname" >&6; } +if test "x$ac_cv_lib_bind_dn_skipname" = xyes; then : + found=yes +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __dn_skipname in -lbind" >&5 +$as_echo_n "checking for __dn_skipname in -lbind... " >&6; } +if ${ac_cv_lib_bind___dn_skipname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbind $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 __dn_skipname (); +int +main () +{ +return __dn_skipname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bind___dn_skipname=yes +else + ac_cv_lib_bind___dn_skipname=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_bind___dn_skipname" >&5 +$as_echo "$ac_cv_lib_bind___dn_skipname" >&6; } +if test "x$ac_cv_lib_bind___dn_skipname" = xyes; then : + found=yes +else + found=no +fi + + +fi + + + if test "$found" = "yes"; then + ac_libs=$LIBS + LIBS="$LIBS -lbind" + if test "$cross_compiling" = yes; then : + found=no +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +main() { return (0); } +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + found=yes +else + found=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + LIBS=$ac_libs + fi + + if test "$found" = "yes"; then + + + case bind in + c|c_r|pthread*) ;; + *) + LIBS="-lbind $LIBS" + ;; + esac + + + +$as_echo "#define HAVE_DN_SKIPNAME 1" >>confdefs.h + + +$as_echo "#define HAVE_LIBBIND 1" >>confdefs.h + + ac_cv_func_dn_skipname=yes + else + + : + + fi + + + fi + + ;; + + esac + + + unset ac_cv_func_mkstemp + unset ac_cv_func___mkstemp + unset found + + ac_fn_c_check_func "$LINENO" "mkstemp" "ac_cv_func_mkstemp" +if test "x$ac_cv_func_mkstemp" = xyes; then : + found=yes +else + ac_fn_c_check_func "$LINENO" "__mkstemp" "ac_cv_func___mkstemp" +if test "x$ac_cv_func___mkstemp" = xyes; then : + found=yes +else + found=no +fi + +fi + + + case $found in + yes) + +$as_echo "#define HAVE_MKSTEMP 1" >>confdefs.h + + ac_cv_func_mkstemp=yes + ;; + + esac + + + unset ac_cv_func_getaddrinfo + unset ac_cv_func___getaddrinfo + unset found + + ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo" +if test "x$ac_cv_func_getaddrinfo" = xyes; then : + found=yes +else + ac_fn_c_check_func "$LINENO" "__getaddrinfo" "ac_cv_func___getaddrinfo" +if test "x$ac_cv_func___getaddrinfo" = xyes; then : + found=yes +else + found=no +fi + +fi + + + case $found in + yes) + +$as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h + + ac_cv_func_getaddrinfo=yes + ;; + + esac + + +use_open_ssl="no" +OPENSSL_LIBS="" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenSSL" >&5 +$as_echo_n "checking for OpenSSL... " >&6; } + + FATAL=1 + + +# Check whether --with-openssl was given. +if test "${with_openssl+set}" = set; then : + withval=$with_openssl; openssl_cv_dir=`eval echo "$withval"/` +fi + + + +# Check whether --with-openssl-includes was given. +if test "${with_openssl_includes+set}" = set; then : + withval=$with_openssl_includes; openssl_cv_includes=`eval echo "$withval"` +fi + + + + +# Check whether --with-openssl-libraries was given. +if test "${with_openssl_libraries+set}" = set; then : + withval=$with_openssl_libraries; openssl_cv_libraries=`eval echo "$withval"` +fi + + + if test -n "$openssl_cv_dir"; then + OPENSSL_DIR="$openssl_cv_dir" + if test -z "$openssl_cv_includes"; then + openssl_cv_includes=$openssl_cv_dir/include + if test -f "$openssl_cv_includes/openssl/md5.h"; then + OPENSSL_INC="-I$openssl_cv_includes" + fi + fi + if test -z "$openssl_cv_libraries"; then + openssl_cv_libraries=$openssl_cv_dir/lib + if test -d "$openssl_cv_libraries"; then + OPENSSL_LIBS="-L$openssl_cv_libraries -lssl -lcrypto" + fi + fi + else + if test -n "$openssl_cv_includes"; then + if test -f "$openssl_cv_includes/openssl/md5.h"; then + OPENSSL_INC="-I$openssl_cv_includes" + fi + fi + if test -n "$openssl_cv_libraries"; then + if test -d "$openssl_cv_libraries"; then + OPENSSL_LIBS="-L$openssl_cv_libraries -lssl -lcrypto" + fi + fi + + + fi + +if test ."$OPENSSL_DIR" != . -a ."$OPENSSL_INC" != . -a ."$OPENSSL_LIBS" != . ; then + $as_echo "#define HAVE_OPENSSL 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + use_open_ssl="yes" + MKEY_HEX="a02abc222" + OPENSSL_LIBS="-L$OPENSSL_DIR/lib -lssl -lcrypto" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +DL_LIB="" +if test ".$use_open_ssl" = ".yes"; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether linking with OpenSSL requires -ldl" >&5 +$as_echo_n "checking whether linking with OpenSSL requires -ldl... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +int +main () +{ + DSO_METHOD_dlfcn(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +else + LIBS="$LIBS $OPENSSL_LIBS -ldl" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include + +int +main () +{ + DSO_METHOD_dlfcn(); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + OPENSSL_LIBS="-L$OPENSSL_DIR/lib -lssl -lcrypto -ldl" + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5 +$as_echo "unknown" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: OpenSSL has unsupported dynamic loading" >&5 +$as_echo "OpenSSL has unsupported dynamic loading" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi + + + +MKEY_HEX="" +IV_HEX="" +MKEY_GENERATED=`date` +if test ".$use_open_ssl" = ".yes"; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if masterkey should be generated" >&5 +$as_echo_n "checking if masterkey should be generated... " >&6; } + +# Check whether --with-genmkey was given. +if test "${with_genmkey+set}" = set; then : + withval=$with_genmkey; openssl_cv_genmkey=`eval echo "$withval"` +fi + + if test ".$openssl_cv_genmkey" = ".yes"; then + bin=openssl + OPENSSL='' + for i in $OPENSSL_DIR/bin/$bin /usr/bin/ssl/bin/$bin /usr/local/bin/$bin /bin/$bin /usr/sbin/$bin /opt/bin/$bin + do + if test -f $i; then + OPENSSL=$i + MKEY_HEX=`$OPENSSL rand 24 -hex` + IV_HEX=`$OPENSSL rand 8 -hex` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes $OPENSSL" >&5 +$as_echo "yes $OPENSSL" >&6; } + break + fi + done + if test ."$OPENSSL" = "."; then + as_fn_error openssl binary not found "no" "$LINENO" 5 + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +fi + + + + + +ac_config_files="$ac_config_files Makefile libs/libmsock/Makefile libs/libmutils/mkey.c libs/libmutils/Makefile libs/libsll/Makefile" + + +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}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.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 $as_me, 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 + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" + +_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 + +Configuration files: +$config_files + +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="\\ +config.status +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' +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;; + --he | --h | --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 + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "libs/libmsock/Makefile") CONFIG_FILES="$CONFIG_FILES libs/libmsock/Makefile" ;; + "libs/libmutils/mkey.c") CONFIG_FILES="$CONFIG_FILES libs/libmutils/mkey.c" ;; + "libs/libmutils/Makefile") CONFIG_FILES="$CONFIG_FILES libs/libmutils/Makefile" ;; + "libs/libsll/Makefile") CONFIG_FILES="$CONFIG_FILES libs/libsll/Makefile" ;; + + *) 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 +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" + + +eval set X " :F $CONFIG_FILES " +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 + ;; + + + + 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 + diff --git a/coregrade/src/mailsend/configure.in b/coregrade/src/mailsend/configure.in new file mode 100755 index 0000000..281a53e --- /dev/null +++ b/coregrade/src/mailsend/configure.in @@ -0,0 +1,121 @@ +dnl -------------------------------------------------------------------- +dnl Process this file with autoconf to produce a configure script. +dnl lots of m4 macros are borrowed from php configure +dnl muquit@muquit.com Jan-12-2003 +dnl -------------------------------------------------------------------- + +AC_INIT(mailsend.h) + +AC_PROG_RANLIB +AC_PROG_MAKE_SET + +dnl Checks for programs. +AC_PROG_CC +test "$GCC" = yes && CFLAGS="$CFLAGS -Wall" +AC_PROG_INSTALL + +AC_STDC_HEADERS +AC_CHECK_HEADERS(string.h strings.h memory.h malloc.h unistd.h ctype.h) +AC_CHECK_HEADERS(stdint.h sys/types.h stdlib.h fcntl.h sys/file.h) +AC_CHECK_HEADERS(limits.h sys/syslimits.h) +AC_PATH_TOOL([STRIP], [strip]) + +PHP_CHECK_FUNC(flock) +PHP_CHECK_FUNC(socket, socket) +PHP_CHECK_FUNC(htonl, socket) +PHP_CHECK_FUNC(gethostname, nsl) +PHP_CHECK_FUNC(gethostbyaddr, nsl) +PHP_CHECK_FUNC(yp_get_default_domain, nsl) + +dnl Check for resolver routines. +dnl Need to check for both res_search and __res_search +dnl in -lc, -lbind, -lresolv and -lsocket +PHP_CHECK_FUNC(res_search, resolv, bind, socket) + +dnl Check for inet_aton and dn_skipname +dnl in -lc, -lbind and -lresolv +PHP_CHECK_FUNC(inet_aton, resolv, bind) +PHP_CHECK_FUNC(dn_skipname, resolv, bind) +PHP_CHECK_FUNC(mkstemp) +PHP_CHECK_FUNC(getaddrinfo) + +use_open_ssl="no" +OPENSSL_LIBS="" +AC_MSG_CHECKING(for OpenSSL) +OPENSSL_DO_IT_ALL +if test ."$OPENSSL_DIR" != . -a ."$OPENSSL_INC" != . -a ."$OPENSSL_LIBS" != . ; then + AC_DEFINE(HAVE_OPENSSL) + AC_MSG_RESULT(yes) + use_open_ssl="yes" + MKEY_HEX="a02abc222" + OPENSSL_LIBS="-L$OPENSSL_DIR/lib -lssl -lcrypto" +else + AC_MSG_RESULT(no) +fi +DL_LIB="" +if test ".$use_open_ssl" = ".yes"; then +dnl following borrowed from bind 9.3.2's configure.in +AC_MSG_CHECKING(whether linking with OpenSSL requires -ldl) + AC_TRY_LINK([ +#include ], +[ DSO_METHOD_dlfcn(); ], + [AC_MSG_RESULT(no)], + [LIBS="$LIBS $OPENSSL_LIBS -ldl" + AC_TRY_LINK([ +#include +],[ DSO_METHOD_dlfcn(); ], + [AC_MSG_RESULT(yes) + OPENSSL_LIBS="-L$OPENSSL_DIR/lib -lssl -lcrypto -ldl" + ], + [AC_MSG_RESULT(unknown) + AC_MSG_RESULT(OpenSSL has unsupported dynamic loading)], + [AC_MSG_RESULT(assuming it does work on target platform)]) + ], + [AC_MSG_RESULT(assuming it does work on target platform)] + ) + +fi +AC_SUBST(OPENSSL_LIBS) +AC_SUBST(DL_LIB) + +MKEY_HEX="" +IV_HEX="" +MKEY_GENERATED=`date` +if test ".$use_open_ssl" = ".yes"; then +AC_MSG_CHECKING(if masterkey should be generated) +AC_ARG_WITH(genmkey, [ --with-genmkey=yes,no If master key should be generated], + [ openssl_cv_genmkey=`eval echo "$withval"` ]) + if test ".$openssl_cv_genmkey" = ".yes"; then + bin=openssl + OPENSSL='' + for i in $OPENSSL_DIR/bin/$bin /usr/bin/ssl/bin/$bin /usr/local/bin/$bin /bin/$bin /usr/sbin/$bin /opt/bin/$bin + do + if test -f $i; then + OPENSSL=$i + MKEY_HEX=`$OPENSSL rand 24 -hex` + IV_HEX=`$OPENSSL rand 8 -hex` + AC_MSG_RESULT(yes $OPENSSL) + break + fi + done + if test ."$OPENSSL" = "."; then + AC_MSG_ERROR(no, openssl binary not found) + fi + else + AC_MSG_RESULT(no) + fi +fi +AC_SUBST(MKEY_GENERATED) +AC_SUBST(MKEY_HEX) +AC_SUBST(IV_HEX) + + +AC_CONFIG_FILES([ + Makefile + libs/libmsock/Makefile + libs/libmutils/mkey.c + libs/libmutils/Makefile + libs/libsll/Makefile +]) + +AC_OUTPUT diff --git a/coregrade/src/mailsend/copyright.h b/coregrade/src/mailsend/copyright.h new file mode 100644 index 0000000..d926395 --- /dev/null +++ b/coregrade/src/mailsend/copyright.h @@ -0,0 +1,37 @@ +#ifndef COPYRIGHT_H +#define COPYRIGHT_H + /* + ** Automatically generated by copyright2arrayofp2chars.rb. + ** 2015-06-20 14:58:33 -0400 + */ +static char + *mailsend_copyright[] = + { +"Copyright (C) 2001-2017 Muhammad Muquit (http://www.muquit.com/)", +"", +" o Redistributions of source code must retain the above copyright notice, ", +"this list of conditions and the following disclaimer.", +"", +" o 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.", +"", +" o Neither the name of the author MUHAMMAD MUQUIT (http://www.muquit.com/)", +"nor the names of its contributors may be used to endorse or promote ", +"products derived from this software without specific prior written ", +"permission.", +"", +"THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"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 COPYRIGHT HOLDER OR CONTRIBUTORS 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.", +(char *) NULL + }; +#endif /* COPYRIGHT_H */ diff --git a/coregrade/src/mailsend/doc/examples.mediawiki b/coregrade/src/mailsend/doc/examples.mediawiki new file mode 100644 index 0000000..d54913d --- /dev/null +++ b/coregrade/src/mailsend/doc/examples.mediawiki @@ -0,0 +1,94 @@ +== Show server info == + mailsend -v -info -port 587 -smtp smtp.gmail.com + mailsend -v -info -ssl -port 465 -smtp smtp.gmail.com + +== STARTTLS + AUTHENTICATION == + mailsend -to user@gmail.com -from user@gmail.com + -starttls -port 587 -auth + -smtp smtp.gmail.com + -sub test +cc +bc -v + -user you -pass "your_password" + Note: Password can be set by env var SMTP_USER_PASS instead of -pass + +== SSL + AUTHENTICATION == + mailsend -to user@gmail.com -from user@gmail.com + -ssl -port 465 -auth + -smtp smtp.gmail.com + -sub test +cc +bc -v + -user you -pass "your_password" + +As -auth is specified, CRAM-MD5, LOGIN, PLAIN will be tried in that order. Use -auth-cram-md5, -auth-plan, -auth-login for specific auth mechanism. + +Note: Password can be set by env var SMTP_USER_PASS instead of -pass + +== One line messages == +One line messages are specified with -M. Each message can have its own MIME type, character set and encoding type ('''requires mailsend v1.17b15+'''): + mailsend -f user@example.com -smtp 10.100.30.1 + -t user@example.com -sub "testing oneline messages" + -cs "us-ascii" + -enc-type "7bit" + -M "This is a test" + + -cs "iso-8859-1" + -enc-type "8bit" + -M "Das Wetter ist schön!" + + -cs "Big5" + -enc-type "base64" + -M "中文測試" + +== Attachments == +Only requirement of -attach is the path of the file. All other attributes can be specified before -attach with appropriate flags. Note: The flags must be specified correctly for each attachment, otherwise the one specified in previous attachment will be used. + +By default, MIME type is guessed from filename extension, default encoding type base64 is used: + + mailsend -f user@example.com -smtp 10.100.30.1 + -t user@example.com -sub "this is a test" + -attach "file.pdf" -attach "file.jpg" + +But all aspects of attachments can be controlled ('''requires mailsend v1.17b15+''') + + mailsend -f user@example.com -smtp 10.100.30.1 + -t user@example.com -sub test + -mime-type "text/plain" + -enc-type "7bit" + -cs "us-ascii" + -attach "file.txt" + + -enc-type "8bit" + -cs "iso-8859-1" + -attach "deutsch.txt" + + -mime-type "image/gif" + -enc-type "base64" + -aname "flower.gif" + -attach "/usr/file.gif" + + -mime-type "image/jpeg" + -enc-type "base64" + -attach "file.jpeg" + +By default, content disposition of all attachments are attachment, use -disposition "inline" to give hint to the mail reader to display it as mail body. Look at FAQ# 1 for details. +== Including a body == +Only one file can be included as a body of the mail. If the file is not us-ascii, the SMTP server has to support it. If you include a binary file, result is undefined. '''Requires mailsend v1.17b15+''' + + mailsend -f user@gmail -t user@example.com -smtp smtp.gamil.com + -port 587 -starttls -auth -user user@gmail.com -pass secret + -cs "utf-8" + -mime-type "text/plain" + -msg-body "file.txt" + +If you want to include attachments and a body, you must provide the body as inline attachment: + + mailsend -f user@gmail -t user@example.com -smtp smtp.gamil.com + -port 587 -starttls -auth -user user@gmail.com -pass secret + -cs "utf-8" + + -mime-type "image/gif" + -enc-type "base64" + -aname "flower.gif" + -attach "/usr/file.gif" + + -mime-type "text/plain" + -disposition "inline" + -attach "file.txt" diff --git a/coregrade/src/mailsend/doc/mailsend-FAQ.mediawiki b/coregrade/src/mailsend/doc/mailsend-FAQ.mediawiki new file mode 100644 index 0000000..f47cb15 --- /dev/null +++ b/coregrade/src/mailsend/doc/mailsend-FAQ.mediawiki @@ -0,0 +1,298 @@ += Frequently asked questions about mailsend = +This FAQ addresses mailsend v1.17b15+ +== Can an attachment be part of the mail body? == +Yes. mailsend supports attachments as inline with the option `-attach "file,MIME type,i"`. Any decent mail reader (gmail does, ThunderBird does) will display the attachment as a body of the mail but it is up to the mail reader to do so. mailsend can not do anything about it. + +Microsoft Outlook does not support inline content-disposition MIME header by design. Please look at the Microsoft Knowledge base article http://support.microsoft.com/kb/814111 for detail. + +My observation about Outlook 2010 is, if the very first attachment is attached as inline, it shows up as embedded in the body. The rest of the attachments show up as regular attachments, no matter what kind of content-disposition is used. I have no idea what kind of logic they are using! + +'''However''' mailsend v1.17b15+ has a feature to include '''one''' text or HTML file has as message body with flag -msg-body file. It also has a feature to embed images inside HTML which is supported by most mail readers including Outlook. There are some scripts for testing embedding images in HTML in the [[../test|test/]] directory. + +== How to find out the capabilities of a SMTP server? == +Type any of: + +'''c:\> mailsend.exe -info -smtp localhost''' + + [S] 220 t105 ESMTP Exim 4.76 Sun, 04 Mar 2012 14:13:24 -0500 + [C] EHLO localhost + [S] 250-t105 Hello localhost [127.0.0.1] + [S] 250-SIZE 52428800 + [S] 250-PIPELINING + [S] 250 HELP + [C] QUIT + [S] 221 t105 closing connection + +'''c:\> mailsend.exe -info -port 587 -smtp smtp.gmail.com''' + + smtp.gmail.com + SMTP server: smtp.gmail.com, Port: 587 + [S] 220 mx.google.com ESMTP xxxxxxxxxxxxxxxx.8 + [C] EHLO localhost + [S] 250-mx.google.com at your service, [x.x.x.x] + [S] 250-SIZE 35882577 + [S] 250-8BITMIME + [S] 250-STARTTLS + [S] 250 ENHANCEDSTATUSCODES + [C] STARTTLS + [S] 220 2.0.0 Ready to start TLS + Cipher: ECDHE-RSA-RC4-SHA + Certificate information: + Subject: /C==US/ST==California/L==Mountain View/O==Google Inc/CN==smtp.gmail.com + Issuer: /C==US/O==Google Inc/CN==Google Internet Authority + [C] EHLO localhost + [S] 250-mx.google.com at your service, [x.x.x.x] + [S] 250-SIZE 35882577 + [S] 250-8BITMIME + [S] 250-AUTH LOGIN PLAIN XOAUTH + [S] 250 ENHANCEDSTATUSCODES + [C] QUIT + [S] 221 2.0.0 closing connection xxxxxxxxxxxxxxxx.8 + +'''c:\> mailsend.exe -info -port 465 -ssl -smtp smtp.gmail.com''' + + smtp smtp.gmail.com + SMTP server: smtp.gmail.com, Port: 465 + Cipher: ECDHE-RSA-RC4-SHA + Certificate information: + Subject: /C==US/ST==California/L==Mountain View/O==Google Inc/CN==smtp.gmail.com + Issuer: /C==US/O==Google Inc/CN==Google Internet Authority + [S] 220 mx.google.com ESMTP xxxxxxxxxxxxxxxx.19 + [C] EHLO localhost + [S] 250-mx.google.com at your service, [xxx.xxx.xxx.xxx] + [S] 250-SIZE 35882577 + [S] 250-8BITMIME + [S] 250-AUTH LOGIN PLAIN XOAUTH + [S] 250 ENHANCEDSTATUSCODES + [C] QUIT + [S] 221 2.0.0 closing connection xxxxxxxxxxxxxxxx.19 + +== How to embed images in HTML? == +mailsend v1.17b15+ has has a feature to embed images inside HTML which is supported by most mail readers including Outlook. This feature can be used to embed one complicated messsage body of the mail. Note: -msg-body file.txt can embed only one text file as message body. + +Two screenshots of embedded image in HTML file are shown below: + +The HTML file [[../test/embed_image1.html]] is used to send this mail. + +[[/images/embed1.png]] + +The HTML file [[../test/embed_image2.html]] is used to send this mail. + +[[/images/embed2.png]] + +To embed images in HTML one below another (without HTML file), mailsend can be run as below: + + $ mailsend -sub "Embed 2 images in HTML, one below the other" \ + -from mailsend@gmail.com -to mailsend@gmail.com \ + -smtp smtp.gmail.com -port 587 -starttls -auth \ + -user mailsend.test@gmail.com -cs ISO-8859-1 \ + -embed-image "test/blue.png" \ + -embed-image "test/green.png" + +Note: No content ids are specified, they will be generated. The mail will like: + +[[/images/embed3.png]] + +If you look at the mail at gmail (select Show original), it will look like: + + Subject: Embed 2 images in HTML, one below the other + From: mailsend.test@gmail.com + Date: Sun, 05 Oct 2014 15:18:10 -0400 + To: mailsend@gmail.com + X-Mailer: @(#) mailsend v1.17b15 (Unix) + X-Copyright: BSD. It is illegal to use this software for Spamming + Mime-version: 1.0 + Content-type: multipart/related; boundary="NxSfacGEuTT0nqf7" + + --NxSfacGEuTT0nqf7 + Content-Type: multipart/alternative; boundary=Stw5amS+Ppc1NmFl + + --Stw5amS+Ppc1NmFl + Content-Type: text/html; charset=ISO-8859-1 + + inline image 1
+ inline image 2
+ + --Stw5amS+Ppc1NmFl-- + --NxSfacGEuTT0nqf7 + Content-Type: image/png + Content-ID: + X-Attachment-Id: ii1_FsOAfO89d/e04/32 + Content-Transfer-Encoding: base64 + + + --NxSfacGEuTT0nqf7 + Content-Type: image/png + Content-ID: + X-Attachment-Id: ii2_Z5T3o06Y3iw8DIFf + Content-Transfer-Encoding: base64 + + + --NxSfacGEuTT0nqf7-- + --NxSfacGEuTT0nqf7-- + + + +== Does mailsend support IPv6? == +From v1.17b1, IPv6 is supported in all platforms. If you have IPv6 (native or through tunnel), mailsend will use IPv6 automatically if the fqdn of the SMP server resolves to an IPv6 address. Or you can just specify the IPv6 address of the SMTP server. +Example: + +'''c:\> mailsend.exe -v -info -smtp smtp.gmail.com''' + + Connecting to SMTP server: smtp.gmail.com at Port: 25 + Connection timeout: 5 secs + libmsock: using getaddrinfo + AF_INET6 + IPv6 address: [2607:f8b0:400c:c03::6c]:25 <------- + EINPROGRESS==10036,EWOULDBLOCK==10035 + conenct(): socket==312,rc==-1, errno==10035 + Try socket 312 + [S] 220 mx.google.com ESMTP q19sm8376288vdf.21 + [C] EHLO localhost + [S] 250-mx.google.com at your service, [2001:xxx:xxxx:xxx::x] + [S] 250-SIZE 35882577 + [S] 250-8BITMIME + [S] 250-STARTTLS + [S] 250 ENHANCEDSTATUSCODES + [C] STARTTLS + [S] 220 2.0.0 Ready to start TLS + Cipher: ECDHE-RSA-RC4-SHA + Certificate information: + Subject: /C==US/ST==California/L==Mountain View/O==Google Inc/CN==smtp.gmail.com + Issuer: /C==US/O==Google Inc/CN==Google Internet Authority + [C] EHLO localhost + [S] 250-mx.google.com at your service, [2001:xxx:xxxx:xxx::x] + [S] 250-SIZE 35882577 + [S] 250-8BITMIME + [S] 250-AUTH LOGIN PLAIN XOAUTH + [S] 250 ENHANCEDSTATUSCODES + [C] QUIT + +== How to send mail via gmail? == +Please look at the [examples Examples] section. Look for -ssl and -starttls and -port. + +== Does mailsend support multibyte non-ascii input? == +At this time it only works in linux and mac. In windows it will be needed to change code to support reading multibyte characters input from command line. Here is an example of non-ascii input in mac, mailsend 1.17b14 is running in linux: + +[http://mailsend.googlecode.com/svn/wiki/multibyte_input.png] + +The verbose output looks something like: + + Date: Sun, 20 Oct 2013 20:42:44 -0400 + To: muquit@gmail.com + X-Mailer: @(#) mailsend v1.17b15 (Unix) + X-Copyright: BSD. It is illegal to use this software for Spamming + Content-type: multipart/mixed; boundary=="aWGL4q7mlq0dFml7" + Mime-version: 1.0 + + --aWGL4q7mlq0dFml7 + Content-Type: text/plain; charset==utf-8 + Content-Disposition: inline + + [C] running on linux, input from mac keyboard + [C] Nicht möglich! + [C] Das macht Spaß! + [C] 中文測試 + [C] গগনে গরজে মেঘ, ঘন বরষা + + --aWGL4q7mlq0dFml7-- + + [C] . + [S] 250 2.0.0 OK 1382316162 b10sm27076637qeg.7 - gsmtp + [C] QUIT + [S] 221 2.0.0 closing connection b10sm27076637qeg.7 - gsmtp + Mail sent successfully + +The mail in gmail looks like: + +[http://mailsend.googlecode.com/svn/wiki/multibyte_gmail.png] + +Notice smtp.gmail.com accepts raw multibyte characters. However some SMTP servers only accepts US-ASCII as data. So it is a good idea to use the option -enc base64. The verbose output will look like: + + Date: Sun, 20 Oct 2013 20:48:05 -0400 + To: muquit@gmail.com + X-Mailer: @(#) mailsend v1.17b15 (Unix) + X-Copyright: BSD. It is illegal to use this software for Spamming + Content-type: multipart/mixed; boundary=="NflDZxwWowVAFTP3" + Mime-version: 1.0 + + --NflDZxwWowVAFTP3 + Content-Type: text/plain; charset==utf-8 + Content-Disposition: inline + Content-Transfer-Encoding: base64 + + Oneline temp file1: * /tmp/mailsend05qsry + Oneline temp file2: * /tmp/mailsendtGT9GB + [C] cnVubmluZyBvbiBsaW51eCwgaW5wdXQgZnJvbSBtYWMga2V5Ym9hcmQKTmljaHQgbcO2Z2xp + [C] Y2ghCkRhcyBtYWNodCBTcGHDnyEK5Lit5paH5ris6KmmCuCml+Cml+CmqOCnhyDgppfgprDg + [C] ppzgp4cg4Kau4KeH4KaYLCDgppjgpqgg4Kas4Kaw4Ka34Ka+Cg + + --NflDZxwWowVAFTP3-- + + [C] . + [S] 250 2.0.0 OK 1382316483 u3sm27124567qej.8 - gsmtp + [C] QUIT + [S] 221 2.0.0 closing connection u3sm27124567qej.8 - gsmtp + Mail sent successfully + +The mail will look the same in gmail. + +== Can this program be used as a mail sender from web browsers? == + +I'll use the Firefox as an example in Windows. By default in MS Windows, Firefox will start outlook express (or nothing) to send mail when you click on a mailto: link. This behavior can be changed as follows: + +*Warning:* the following instructions might be different for different version of Windows. + +Go to Control Panel +Click on Folder Options +Click on File Types tab +Click on [NONE] URL:MailTo Protocol +Click on Advanced button +Click on open then Click on Edit... button +Uncheck Use DDE +In the Application used to perform action field, add the line (without line breaks): + + "C:\path\of\mailsend.exe" -smtp IP_address_of_your_smtp_server + -v -d your_domain.com + -f you@your_domain.com +cc +bc -v -w -t "%1" + +Note: there's no need to clean mailto: tag from another program before calling mailsend. + +On Unix, search on the web on how to setup external mail sender for Firefox. Again there's no need to remove mailto: tag from another script. + +== Does the program support ESMTP authentication? == +From v1.15a+, STARTTLS, CRAM-MD5, LOGIN and PLAIN authentication is supported. SMTP over SSL is also supported in v 1.16+. Type mailsend -ex for examples on how to use authentication. +== What's the difference between -ssl and -starttls? == +With the option -ssl, an encrypted connection is made first and then SMTP protocol continues over the encrypted connection. For example, smtp.gmail.com supports it at port 465. With -starttls, a regular unencrypted connection is made first, then if the server supports STRTTLS, the command is issued to make the connection encrypted. For example smtp. gmail.com supports STARTTLS at port 587. +== How to send mail to multiple people? == +Create a text file containing the addresses and then specify the file with -list-address. The syntax of the file is as follows: + + ##################################################### + # File can contain addresses to send mail to. + # A line can start with To: email_address, + # Cc: email_address, BCc: email_address or + # just a valid email address. + # Any line that starts with a # or ; is considered a comment + # and is ignored. + + #user@example.com + To: blah@example.com + Cc: foo@example.com + jdoe@example.com + mjane@example.com + bar@example.com + ##################################################### + +Make sure there is a new line at the end of the last line or the last address will be ignored. Run mailsend with -v to verify that all the addresses are used. + +== Does mailsend verify certificates while making SSL connections? == +No. + +== I send mail but the mail never reaches the destination. What's wrong? == +* First of all make sure you can talk to the SMTP server ([mailsendFAQ#How_to_find_out_the_capabilities_of_a_SMTP_server?]) +* Make sure the mail is accepted by the server (run mailsend with -v). +* Make sure that the SMTP server relays message to outside domain or only accepts mail from certain IP addresses (Talk to the admin). +* It is also possible the server requires authentication. Type mailsend -ex for examples on how to use authentication. + +== What are the valid MIME types? == +In mailsend v1.17b15+, type mailsend -show-mime-types. In older versions, look at the file [[../mime.types|mime.types]] diff --git a/coregrade/src/mailsend/doc/mailsend.1 b/coregrade/src/mailsend/doc/mailsend.1 new file mode 100644 index 0000000..f203b5a --- /dev/null +++ b/coregrade/src/mailsend/doc/mailsend.1 @@ -0,0 +1,359 @@ +.\" Automatically generated by Pod::Man 2.27 (Pod::Simple 3.28) +.\" +.\" Standard preamble: +.\" ======================================================================== +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft CW +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" Set up some character translations and predefined strings. \*(-- will +.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +.\" double quote, and \*(R" will give a right double quote. \*(C+ will +.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +.\" nothing in troff, for use with C<>. +.tr \(*W- +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.ie n \{\ +. ds -- \(*W- +. ds PI pi +. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +. ds L" "" +. ds R" "" +. ds C` "" +. ds C' "" +'br\} +.el\{\ +. ds -- \|\(em\| +. ds PI \(*p +. ds L" `` +. ds R" '' +. ds C` +. ds C' +'br\} +.\" +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" +.\" If the F register is turned on, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.\" +.\" Avoid warning from groff about undefined register 'F'. +.de IX +.. +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{ +. if \nF \{ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. if !\nF==2 \{ +. nr % 0 +. nr F 2 +. \} +. \} +.\} +.rr rF +.\" +.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +.\" Fear. Run. Save yourself. No user-serviceable parts. +. \" fudge factors for nroff and troff +.if n \{\ +. ds #H 0 +. ds #V .8m +. ds #F .3m +. ds #[ \f1 +. ds #] \fP +.\} +.if t \{\ +. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +. ds #V .6m +. ds #F 0 +. ds #[ \& +. ds #] \& +.\} +. \" simple accents for nroff and troff +.if n \{\ +. ds ' \& +. ds ` \& +. ds ^ \& +. ds , \& +. ds ~ ~ +. ds / +.\} +.if t \{\ +. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +.\} +. \" troff and (daisy-wheel) nroff accents +.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +.ds ae a\h'-(\w'a'u*4/10)'e +.ds Ae A\h'-(\w'A'u*4/10)'E +. \" corrections for vroff +.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +. \" for low resolution devices (crt and lpr) +.if \n(.H>23 .if \n(.V>19 \ +\{\ +. ds : e +. ds 8 ss +. ds o a +. ds d- d\h'-1'\(ga +. ds D- D\h'-1'\(hy +. ds th \o'bp' +. ds Th \o'LP' +. ds ae ae +. ds Ae AE +.\} +.rm #[ #] #H #V #F C +.\" ======================================================================== +.\" +.IX Title "MAILSEND 1" +.TH MAILSEND 1 "2019-01-10" "mailsend 1.20b2" "User Commands" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.if n .ad l +.nh +.SH "NAME" +mailsend \- A command line program to send mail via SMTP protocol +.SH "SYNOPSYS" +.IX Header "SYNOPSYS" +.Vb 1 +\& Version: @(#) mailsend v1.20b2 +\& +\& Copyright: BSD. It is illegal to use this software for Spamming +\& +\& (Compiled with OpenSSL version: OpenSSL 1.0.2q 20 Nov 2018) +\& usage: mailsend [options] +\& Where the options are: +\& \-copyright \- show copyright information +\& \-4 \- Force to use IPv4 address of SMTP server +\& \-6 \- Force to use IPv6 address of SMTP server +\& \-smtp hostname/IP* \- Hostname/IP address of the SMTP server +\& \-port SMTP port \- SMTP port +\& \-domain domain \- domain name for SMTP HELO/EHLO +\& \-t to,to..* \- email address/es of the recipient/s +\& \-cc cc,cc.. \- carbon copy address/es +\& +cc \- do not ask for Carbon Copy +\& \-ct seconds \- Connect timeout. Default is 5 seconds +\& \-read\-timeout seconds \- Read timeout. Default is 5 seconds +\& \-bc bcc,bcc.. \- blind carbon copy address/es +\& +bc \- do not ask for Blind carbon copy +\& +D \- do not add Date header +\& \-f address* \- email address of the sender +\& \-sub subject \- subject +\& \-list_address file \- a file containing a list of email addresses +\& \-log file \- write log messages to this file +\& \-cs character set \- for text/plain attachments (default is us\-ascii) +\& \-separator character \- separator used with \-attach. Default is comma (,) +\& If used must be specified before \-attach +\& \-enc\-type type \- encoding type. base64, 8bit, 7bit etc. +\& Default is base64. Special type is "none" +\& \-aname name \- name of the attachment. Default is filename +\& \-content\-id id \- content\-id in the attachment +\& \-mime\-type type \- MIME type +\& \-dispostion val \- "attachment" or "inline". Default is "attachment" +\& \-attach file,mime_type,[i/a] (i=inline,a=attachment) +\& \- attach this file as attachment or inline +\& \-show\-attach \- show attachment in verbose mode, default is no +\& \-show\-mime\-types \- show the compiled in MIME types +\& \-M "one line msg" \- attach this one line text message +\& \-content\-type type \- Content type. Default: multipart/mixed +\& \-msg\-body path \- Path of the file to include as body of mail +\& \-embed\-image image \- Path of image to embed in HTML +\& \-H "header" \- Add custom Header +\& \-name "Full Name" \- add name in the From header +\& \-v \- verbose mode +\& \-V \- show version info +\& \-w \- wait for a CR after sending the mail +\& \-rt email_address \- add Reply\-To header +\& \-rrr email_address \- request read receipts to this address +\& \-rp \- return\-path address +\& \-ssl \- SMTP over SSL +\& \-starttls \- use STARTTLS if the server supports it +\& \-auth \- try CRAM\-MD5,LOGIN,PLAIN in that order +\& \-auth\-cram\-md5 \- use AUTH CRAM\-MD5 authentication +\& \-auth\-plain \- use AUTH PLAIN authentication +\& \-auth\-login \- use AUTH LOGIN authentication +\& \-user username \- username for ESMTP authentication +\& \-pass password \- password for ESMTP authentication +\& \-example \- show examples +\& \-ehlo \- force EHLO +\& \-info \- show SMTP server information +\& \-help \- shows this help +\& \-q \- quiet +\& +\& The options with * must be specified +\& Environment variables: +\& SMTP_USER_PASS for plain text password (\-pass) +.Ve +.SH "DESCRIPTION" +.IX Header "DESCRIPTION" +mailsend is a simple command line program to send mail via \s-1SMTP\s0 protocol +for Windows, Linux/Unix. +.PP +For deatils, please look at the web page: +.PP + +.SH "EXAMPLES" +.IX Header "EXAMPLES" +Examples of mailsend Version: @(#) mailsend v1.17b15 +.PP +.Vb 4 +\& Show server info +\& ================ +\& mailsend \-v \-info \-port 587 \-smtp smtp.gmail.com +\& mailsend \-v \-info \-ssl \-port 465 \-smtp smtp.gmail.com +\& +\& STARTTLS + AUTHENTICATION +\& ========================= +\& mailsend \-to user@gmail.com \-from user@gmail.com +\& \-starttls \-port 587 \-auth +\& \-smtp smtp.gmail.com +\& \-sub test +cc +bc \-v +\& \-user you \-pass "your_password" +\& Note: Password can be set by env var SMTP_USER_PASS instead of \-pass +\& +\& SSL + AUTHENTICATION +\& ==================== +\& mailsend \-to user@gmail.com \-from user@gmail.com +\& \-ssl \-port 465 \-auth +\& \-smtp smtp.gmail.com +\& \-sub test +cc +bc \-v +\& \-user you \-pass "your_password" +\& +\& As \-auth is specified, CRAM\-MD5, LOGIN, PLAIN will be tried in that order. +\& Use \-auth\-cram\-md5, \-auth\-plan, \-auth\-login for specific auth mechanism. +\& +\& Note: Password can be set by env var SMTP_USER_PASS instead of \-pass +\& +\& One line messages +\& ================= +\& One line messages are specified with \-M. Each message can have its own +\& MIME type, character set and encoding type: +\& +\& mailsend \-f user@example.com \-smtp 10.100.30.1 +\& \-t user@example.com \-sub "testing oneline messages" +\& \-cs "us\-ascii" +\& \-enc\-type "7bit" +\& \-M "This is a test" +\& +\& \-cs "iso\-8859\-1" +\& \-enc\-type "8bit" +\& \-M "Das Vetter ist scho\*:n!" +\& +\& \-cs "Big5" +\& \-enc\-type "base64" +\& \-M "XXXX" +\& +\& Attachments +\& =========== +\& Only requirement of \-attach is the path of the file. All other +\& attributes can be specified before \-attach with appropriate +\& flags. Note: The flags must be specified correctly for each attachment, +\& otherwise the one specified in previous attachment will be used. +\& +\& By default MIME type is guessed from filename extension, default +\& encoding type base64 is used: +\& mailsend \-f user@example.com \-smtp 10.100.30.1 +\& \-t user@example.com \-sub "this is a test" +\& \-attach "file.pdf" \-attach "file.jpg" +\& +\& But all espects of attachments can be controlled: +\& mailsend \-f user@example.com \-smtp 10.100.30.1 +\& \-t user@example.com \-sub test +\& \-mime\-type "text/plain" +\& \-enc\-type "7bit" +\& \-charset "us\-ascii" +\& \-attach "file.txt" +\& +\& \-enc\-type "8bit" +\& \-charset "iso\-8859\-1" +\& \-attach "deutsch.txt" +\& +\& \-mime\-type "image/gif" +\& \-enc\-type "base64" +\& \-aname "flower.gif" +\& \-attach "/usr/file.gif" +\& +\& \-mime\-type "image/jpeg" +\& \-enc\-type "base64" +\& \-attach "file.jpeg" +\& +\& By default, content disposition of all atachments are attachment, use +\& \-disposition "inline" to give hint to the mail reader to display it as +\& mail body. Look at FAQ# 1 for details. +\& +\& Including a body +\& ================ +\& Only one file can be included as a body of the mail. If the +\& file is not us\-ascii, the SMTP server has to support it. If you +\& include a binary file, result is undefined. +\& +\& mailsend \-f user@gmail \-t user@example.com \-smtp smtp.gamil.com +\& \-port 587 \-starttls \-auth \-user user@gmail.com \-pass secret +\& \-charset "utf\-8" +\& \-mime\-type "text/plain" +\& \-msg\-body "file.txt" +.Ve +.SH "SEE ALSO" +.IX Header "SEE ALSO" +Please look at the web page for latest version and documentation: + +.SH "LICENSE" +.IX Header "LICENSE" +Copyright (C) 2001\-2017 Muhammad Muquit (http://www.muquit.com/) +.PP +.Vb 2 +\& o Redistributions of source code must retain the above copyright notice, +\&this list of conditions and the following disclaimer. +\& +\& o 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. +\& +\& o Neither the name of the author MUHAMMAD MUQUIT (http://www.muquit.com/) +\&nor the names of its contributors may be used to endorse or promote +\&products derived from this software without specific prior written +\&permission. +.Ve +.PP +\&\s-1THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \*(L"AS IS\*(R" +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 COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES \s0(\s-1INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES\s0; \s-1LOSS OF USE, DATA, OR PROFITS\s0; \s-1OR BUSINESS +INTERRUPTION\s0) \s-1HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT \s0(\s-1INCLUDING NEGLIGENCE OR OTHERWISE\s0) +\&\s-1ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE.\s0 +.SH "AUTHOR" +.IX Header "AUTHOR" +mailsend is written by Muhammad Muquit . +Homepage: . diff --git a/coregrade/src/mailsend/doc/mailsend.pod b/coregrade/src/mailsend/doc/mailsend.pod new file mode 100644 index 0000000..0521cba --- /dev/null +++ b/coregrade/src/mailsend/doc/mailsend.pod @@ -0,0 +1,226 @@ +=head1 NAME + +mailsend - A command line program to send mail via SMTP protocol + +=head1 SYNOPSYS + + + Version: @(#) mailsend v1.20b2 + + Copyright: BSD. It is illegal to use this software for Spamming + + (Compiled with OpenSSL version: OpenSSL 1.0.2q 20 Nov 2018) + usage: mailsend [options] + Where the options are: + -copyright - show copyright information + -4 - Force to use IPv4 address of SMTP server + -6 - Force to use IPv6 address of SMTP server + -smtp hostname/IP* - Hostname/IP address of the SMTP server + -port SMTP port - SMTP port + -domain domain - domain name for SMTP HELO/EHLO + -t to,to..* - email address/es of the recipient/s + -cc cc,cc.. - carbon copy address/es + +cc - do not ask for Carbon Copy + -ct seconds - Connect timeout. Default is 5 seconds + -read-timeout seconds - Read timeout. Default is 5 seconds + -bc bcc,bcc.. - blind carbon copy address/es + +bc - do not ask for Blind carbon copy + +D - do not add Date header + -f address* - email address of the sender + -sub subject - subject + -list_address file - a file containing a list of email addresses + -log file - write log messages to this file + -cs character set - for text/plain attachments (default is us-ascii) + -separator character - separator used with -attach. Default is comma (,) + If used must be specified before -attach + -enc-type type - encoding type. base64, 8bit, 7bit etc. + Default is base64. Special type is "none" + -aname name - name of the attachment. Default is filename + -content-id id - content-id in the attachment + -mime-type type - MIME type + -dispostion val - "attachment" or "inline". Default is "attachment" + -attach file,mime_type,[i/a] (i=inline,a=attachment) + - attach this file as attachment or inline + -show-attach - show attachment in verbose mode, default is no + -show-mime-types - show the compiled in MIME types + -M "one line msg" - attach this one line text message + -content-type type - Content type. Default: multipart/mixed + -msg-body path - Path of the file to include as body of mail + -embed-image image - Path of image to embed in HTML + -H "header" - Add custom Header + -name "Full Name" - add name in the From header + -v - verbose mode + -V - show version info + -w - wait for a CR after sending the mail + -rt email_address - add Reply-To header + -rrr email_address - request read receipts to this address + -rp - return-path address + -ssl - SMTP over SSL + -starttls - use STARTTLS if the server supports it + -auth - try CRAM-MD5,LOGIN,PLAIN in that order + -auth-cram-md5 - use AUTH CRAM-MD5 authentication + -auth-plain - use AUTH PLAIN authentication + -auth-login - use AUTH LOGIN authentication + -user username - username for ESMTP authentication + -pass password - password for ESMTP authentication + -example - show examples + -ehlo - force EHLO + -info - show SMTP server information + -help - shows this help + -q - quiet + + The options with * must be specified + Environment variables: + SMTP_USER_PASS for plain text password (-pass) + + +=head1 DESCRIPTION + +mailsend is a simple command line program to send mail via SMTP protocol +for Windows, Linux/Unix. + +For deatils, please look at the web page: + +L + +=head1 EXAMPLES + +Examples of mailsend Version: @(#) mailsend v1.17b15 + + Show server info + ================ + mailsend -v -info -port 587 -smtp smtp.gmail.com + mailsend -v -info -ssl -port 465 -smtp smtp.gmail.com + + STARTTLS + AUTHENTICATION + ========================= + mailsend -to user@gmail.com -from user@gmail.com + -starttls -port 587 -auth + -smtp smtp.gmail.com + -sub test +cc +bc -v + -user you -pass "your_password" + Note: Password can be set by env var SMTP_USER_PASS instead of -pass + + SSL + AUTHENTICATION + ==================== + mailsend -to user@gmail.com -from user@gmail.com + -ssl -port 465 -auth + -smtp smtp.gmail.com + -sub test +cc +bc -v + -user you -pass "your_password" + + As -auth is specified, CRAM-MD5, LOGIN, PLAIN will be tried in that order. + Use -auth-cram-md5, -auth-plan, -auth-login for specific auth mechanism. + + Note: Password can be set by env var SMTP_USER_PASS instead of -pass + + One line messages + ================= + One line messages are specified with -M. Each message can have its own + MIME type, character set and encoding type: + + mailsend -f user@example.com -smtp 10.100.30.1 + -t user@example.com -sub "testing oneline messages" + -cs "us-ascii" + -enc-type "7bit" + -M "This is a test" + + -cs "iso-8859-1" + -enc-type "8bit" + -M "Das Vetter ist schön!" + + -cs "Big5" + -enc-type "base64" + -M "中文測試" + + Attachments + =========== + Only requirement of -attach is the path of the file. All other + attributes can be specified before -attach with appropriate + flags. Note: The flags must be specified correctly for each attachment, + otherwise the one specified in previous attachment will be used. + + By default MIME type is guessed from filename extension, default + encoding type base64 is used: + mailsend -f user@example.com -smtp 10.100.30.1 + -t user@example.com -sub "this is a test" + -attach "file.pdf" -attach "file.jpg" + + But all espects of attachments can be controlled: + mailsend -f user@example.com -smtp 10.100.30.1 + -t user@example.com -sub test + -mime-type "text/plain" + -enc-type "7bit" + -charset "us-ascii" + -attach "file.txt" + + -enc-type "8bit" + -charset "iso-8859-1" + -attach "deutsch.txt" + + -mime-type "image/gif" + -enc-type "base64" + -aname "flower.gif" + -attach "/usr/file.gif" + + -mime-type "image/jpeg" + -enc-type "base64" + -attach "file.jpeg" + + By default, content disposition of all atachments are attachment, use + -disposition "inline" to give hint to the mail reader to display it as + mail body. Look at FAQ# 1 for details. + + Including a body + ================ + Only one file can be included as a body of the mail. If the + file is not us-ascii, the SMTP server has to support it. If you + include a binary file, result is undefined. + + mailsend -f user@gmail -t user@example.com -smtp smtp.gamil.com + -port 587 -starttls -auth -user user@gmail.com -pass secret + -charset "utf-8" + -mime-type "text/plain" + -msg-body "file.txt" + + +=head1 SEE ALSO + +Please look at the web page for latest version and documentation: +L + + +=head1 LICENSE + +Copyright (C) 2001-2017 Muhammad Muquit (http://www.muquit.com/) + + o Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + + o 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. + + o Neither the name of the author MUHAMMAD MUQUIT (http://www.muquit.com/) +nor the names of its contributors may be used to endorse or promote +products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT HOLDER OR CONTRIBUTORS 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. + + +=head1 AUTHOR + +mailsend is written by Muhammad Muquit Emuquit@muquit.comE. +Homepage: L. + diff --git a/coregrade/src/mailsend/examples.c b/coregrade/src/mailsend/examples.c new file mode 100644 index 0000000..d58a11f --- /dev/null +++ b/coregrade/src/mailsend/examples.c @@ -0,0 +1,102 @@ +#include "mailsend.h" +void show_examples(void) +{ + (void) fprintf(stdout, "Examples of mailsend Version: @(#) mailsend v1.17b15\n\n"); + (void) fprintf(stdout, + " Show server info\n" + " ================\n" + " mailsend -v -info -port 587 -smtp smtp.gmail.com\n" + " mailsend -v -info -ssl -port 465 -smtp smtp.gmail.com\n" + "\n" + " STARTTLS + AUTHENTICATION\n" + " =========================\n" + " mailsend -to user@gmail.com -from user@gmail.com\n" + " -starttls -port 587 -auth\n" + " -smtp smtp.gmail.com\n" + " -sub test +cc +bc -v\n" + " -user you -pass \"your_password\"\n" + " Note: Password can be set by env var SMTP_USER_PASS instead of -pass\n" + "\n" + " SSL + AUTHENTICATION\n" + " ====================\n" + " mailsend -to user@gmail.com -from user@gmail.com\n" + " -ssl -port 465 -auth\n" + " -smtp smtp.gmail.com\n" + " -sub test +cc +bc -v\n" + " -user you -pass \"your_password\"\n" + "\n" + " As -auth is specified, CRAM-MD5, LOGIN, PLAIN will be tried in that order.\n" + " Use -auth-cram-md5, -auth-plan, -auth-login for specific auth mechanism.\n" + "\n" + " Note: Password can be set by env var SMTP_USER_PASS instead of -pass\n" + "\n" + " One line messages\n" + " =================\n" + " One line messages are specified with -M. Each message can have its own\n" + " MIME type, character set and encoding type:\n" + "\n" + " mailsend -f user@example.com -smtp 10.100.30.1\n" + " -t user@example.com -sub \"testing oneline messages\"\n" + " -cs \"us-ascii\"\n" + " -enc-type \"7bit\"\n" + " -M \"This is a test\"\n" + "\n" + " -cs \"iso-8859-1\"\n" + " -enc-type \"8bit\"\n" + " -M \"Das Vetter ist schön!\"\n" + "\n" + " -cs \"Big5\"\n" + " -enc-type \"base64\"\n" + " -M \"中文測試\"\n" + "\n" + " Attachments\n" + " ===========\n" + " Only requirement of -attach is the path of the file. All other \n" + " attributes can be specified before -attach with appropriate\n" + " flags. Note: The flags must be specified correctly for each attachment,\n" + " otherwise the one specified in previous attachment will be used.\n" + "\n" + " By default MIME type is guessed from filename extension, default \n" + " encoding type base64 is used:\n" + " mailsend -f user@example.com -smtp 10.100.30.1\n" + " -t user@example.com -sub \"this is a test\"\n" + " -attach \"file.pdf\" -attach \"file.jpg\"\n" + "\n" + " But all espects of attachments can be controlled:\n" + " mailsend -f user@example.com -smtp 10.100.30.1\n" + " -t user@example.com -sub test\n" + " -mime-type \"text/plain\" \n" + " -enc-type \"7bit\"\n" + " -charset \"us-ascii\"\n" + " -attach \"file.txt\"\n" + "\n" + " -enc-type \"8bit\"\n" + " -charset \"iso-8859-1\"\n" + " -attach \"deutsch.txt\"\n" + "\n" + " -mime-type \"image/gif\"\n" + " -enc-type \"base64\"\n" + " -aname \"flower.gif\"\n" + " -attach \"/usr/file.gif\" \n" + "\n" + " -mime-type \"image/jpeg\"\n" + " -enc-type \"base64\" \n" + " -attach \"file.jpeg\"\n" + "\n" + " By default, content disposition of all atachments are attachment, use\n" + " -disposition \"inline\" to give hint to the mail reader to display it as\n" + " mail body. Look at FAQ# 1 for details.\n" + "\n" + " Including a body\n" + " ================\n" + " Only one file can be included as a body of the mail. If the\n" + " file is not us-ascii, the SMTP server has to support it. If you \n" + " include a binary file, result is undefined.\n" + "\n" + " mailsend -f user@gmail -t user@example.com -smtp smtp.gamil.com\n" + " -port 587 -starttls -auth -user user@gmail.com -pass secret \n" + " -charset \"utf-8\"\n" + " -mime-type \"text/plain\"\n" + " -msg-body \"file.txt\"\n" +); +} diff --git a/coregrade/src/mailsend/images/embed1.png b/coregrade/src/mailsend/images/embed1.png new file mode 100644 index 0000000000000000000000000000000000000000..b81a9e7b59afcef540ecaabdcea20f0da65c1c1e GIT binary patch literal 92360 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

F%V#Zb2tf;WZ}&yM8})7N$9<@~rdl4h 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�n%&W_`l#KQZPqn>XM;PWt!}N zKQjG;P;~-gM@0XwtOK-L<8@sX0R2JFm){;&4AP)uHqYm_2_vk(K3J%0nR$Doy9m7e zZ>p`JQu(e2H$=sX&CK9W)V2Xk3fzHWzWrG=f$0?b;~1Kqz{D!5rY+>Ff*|-)A_?Ee zl^j}`@OO5(^iK}yHfnMHMP6zc{-)pc6Om48Anx8LwBmG0aLBFnRIlu(-m|o-?9IA4Uo!MD-i-vX?zA7~5 z+K-a^j6N76GDvpN;J|GCrFXGCbtDRt_urgq0%0JoJgjYTk&Sg~89>MrVFKu~W~>U~ zC-gM9`uYVrHWf+Ckj@>I@qrakwrzna5@TUJ?i;e>?osPCd-Fv*1`V*s=mp3MKNktu!VJwGrBulXmCsW~8lXGSv71Da@RTpR7L>o-Pho=aYW^0Cn*Je-9 zMsqg%1a>HEME=7CQ}P-WZeFrca25X^HbG_40pj|EQpYccl5q^e4)fs8g*l2WEZYwF zg|pB~%%Bu*OmM;=2G$J;Rs<$2`3#vGh`w`i{*w=00cA2~%cc&B6Tn)tN}a&hfn*Cd z!yNIfSp=70F{KW@HIe1GNW3Fm!k}1;pEGX7BlG-lcA>g$ZTYPYnyCdU<2lpvSjDJl zC`WJ!405h)2)AG!8QG;Gq9r_{lWT7h|BIi;;{W7R0A?B?W)Bfzn}8$SvLhCCRqrdJ z@ZXGf7{?@3?&-Sr{VZzME1W-5M(L5om_fnOS%IhnReq?b;c5(0CN2)gF|BhAtfhso zfk-QjbtTzbnMszZOxQe|-9rG(L;XAr2I`u*3gII;hR?L-cxA0td~hWSrIMGW8R{$o zIR;^QT0*L}1#8DNjdiXjgXMV~XR^834Z@{M*2jKczvm_B$jKN4GuvCWsyUZjOoon=MwFu?ib5KA5RG)Yw7P~j9Qu`*IiFonoN5{u z3c~Tx1)4Pg42FA8#Y?bbE0rRoLoqk$W)8)B{7QaM99k??q)+V{f($`VR+^VEq#@U6WzC@BX_G+tUZw zfa0wR>k8-jZ~g-80PxTNH!Hk6jU4oUchLhxnp4=A z+gk%D=S5!v)2ykUWu{HO5s>209&l;yE=PSw{^H@$Xq;8&qK+msG&hX2rGTb%VN^+q z(2RYA)TGVwH!?P0j6ViN08X}aLjPpFNHTj!Uci+Q+c>D$1>SeK6N@BCa{CsvY|vS0 z8R3>GXWrS*jfE;|E2Mz=10}aQD*~Ad)YrrV<{kl1h}#8HBmS#lP5)qpbxs6%e?0F7 zOjPk$g~|;N|Km$Xx99T;-~FE}xuxG_;E;!e6a_R)o$Tpj-B!y+!?B_AQiKwP%|^+2 zm)u4FhiJ{@e|U}zX0Mu{LT=6y*S(%yGX#h(4F(*!g_&;&?JTasx8{V9IE9489KX&z zwaa2WSydcuE*+DIRCE+n=H(4l=vo7&qEZlN5@+S&4TDk=UOq);JX$nmaRl(*Bq^wd z#=>#$|DP=llxj#g<@SuMAWFZhl-&JdMQgf7@=zw-g!Z<5(4uDxQlc|c`0{%NvRD4! zYP-!rrZ6bxdaLp;K0ZkY?53sP zEB=#a*Zct46hM9mEe|2eG;EdQWygalYJj=9>x2oty7CSVLDQT8Z0_rSiZj4D2k*be zcEJGu1@Aw)8QTK_{qy#D1H3I_;(vCb3O5ieSM@jQU;idN06hR@UxsuQcqIyh&^jVw z-snbKrGs7qYQ-A5spRI&%Z(x>P2)O}*xOr1G3rE&$p1h9z^POh*D<39r zBsMd?*m=I(aM1D92G`^eNP}v#&gMjhHnqHJA})#_op3lf=!Hi*FViVoaEbgP-|>>j zZsxY5pn6x>$S#exgia64U-&!w6IJfyru6|4gAr8Ihl4X$_iHPG-{!u<@S2s^v8rCt z>$>KAsD6mLYqUUk=%`|)|;nL~^=k(<4oGnt!Bc~G?MfXTU)tFa$ zK0|U&XLK6*qkD#tVt`7fw|B)->%gfXlEbLbnk`vEglFw;|H_Re;m40icQy*h6DuP5 z(5kB1+R06>9vVu>)l%#e^CmQa;X|H2+D^~bUqP*%Zy( zQ$mP6+3q`vLJ)>hb&L>@wt=VxHJDpdU{k}6&|7i?=cl(po$&n778Oe9l_|*+vgnQ| z)1(j@>eU(um!KV!>5rkTRm7)Y8`t~c`Xi%v{Y6*$WBWu8M1P5UE+6uE;&a*HgayKa zaxZZw3&a!B&zjCQDmRLcudr5+A3!dW z{>?K`13O4pZuF#xjstys{~-5wOp-gIn#0c=~22+BC-JE|8bWp28t5wQLFQo+Chd!--k{YW=+ z-=X*@G~XetMt>FIg<{vY@IrSR>Ga1;4InW1&}wgY%-7lbZl&#O6qbaJcZ*`aX^JbRlv<7VT5w1Q8^Vq zTqluThj^{6czT6HvILp0q`C;|^n@@a*U^W5{oRrx_zX}IeauQ3`Xnk>|MOX=g;N_9 zl+vU9Q!nAO)qg4fXEo>1PlQ>e^IT{@`wB0KoHWl3aRY$>x<<9wLt)ImK@EfsR+UDx z3L~XDqjntCjEpvl5)MvGOlsBxpr8|doC?~!8*9*tV^5L-XkLw>h%TJr+zlqO$c0+a z$v%l5OO3gdSzQkxY%s2K^mT{GU|KeJG#266+dN*Y!U!Rb-B>Bvg+&rH0?r2{ zV8UfvS91#W7~_x4jmXn>+fw(qKg$qD!We%B7-aro+i3)O3RV)A3SloO@NVKzqIADG zXm{M~nxno}Yfz;ql&TO~g|vk#so`=h&9L;n+Vy}>f{(+z<=SrBEzao30_qKrY|GeW zub$r7TCd7!xe`)9mgf#igiV|}TKFl@uwg09=u0*9$nGn%F6HD3L(N;`c(^_UBZl`F z;JIXK0~;J)HT?A9E71GBIy1P--1X1Kfa!lj-5=a zMC#*GnV@z*ZC#tc;?st+Dt{PIx$wOkmfuWli4_J=3}KgiJ3m2EVK8`>T(2Z!$wrzS z1BQ`c$$2(&NrJNdZkR!K>E47|r z!l`}I?9K5Wa#!P)iqTd-HqM9Kq681p-_Vn2?$-Dy>L;RC30$Q)=WW>%HtAJdc_g?( z+rr9Fm+z0=3S~u&X13(IW95ixgUg8!)3=s(-7+37F(j_*%+Bsy#h@+=zhMr6c~cxS zx57I>djPICGdCoa=1q7up#D=gLGoHc;!stog9ZNEoY7@kYaSg!VD(@4 zzd@mL%#vuCP?fs?Qd298+4!k4;vCf0N{(^xT3&4O#Y5S?^t+a-mN;fG_Y%0q=Cw*( zO~G&qjU{mxJ<|Y9!QO~QT4C9;eCpRag7JJ5nUSnsq2eORInLc}N5{Brfd5)E?Pox0 zA-39I*i0hzXBpb~9k!2fOO10z>j4w4qkQwVt=rd;yjsHW3)k{aiaXcoL4_gX-xbyt zus^x#a?@qqUbr4f;cD}!Vui`_< zhrGy)xnpPQQXoh3u>48nnOop}#}v*Nm7EfyJr`!4R0xgWe_VbnT(EVqUDz+Y@fs&; z((yem>uJS3Gr~w6nR|C_{&IMBdG(m*+SI2#$ z9?Q&u)8Y~@4}`HnYgSqRbr+Vzp(6B`&iYG%4G+Cbd!F$-(0bnSuTk(WJ$^W(WaSOu z`;}8mQ$TQ%^p!VgAcl->Po zU_Q8Kujj@;a`Z*#PAN;}faku%Y9&k2nNScj`ohcVi#nre=oQ>ik-1ozYk~A<64gy7 zB*ihLL`~!Q2sg)&;sVXWvd7v>(J2WKi>d!rII;t61UD3ELbt1PVZdVJtui7|oDRUC z>Nu_t|7#2+i1giC)enXMkz6HV;<8b#N+oxx)TQD~QhZ;d0JGKVzdCHilZzEm@Au)7 z6+ZUczykxSlUOM_zkQq6$&e($2L8nyyYnJRzhjd5Z^l|65Zbg$%<*~QIpOWCtN6ie zAAscGEL5cBn|Z}y^ug7w@dyOePEo&?I9K{vc$CIIrL&HLDsJPIdZF4wG#P^C&)Skr z!@{}Q6x)nfl}Y)x|CFM!upX2FU2I)2lswJLfpc|aD7-oATE~Jtbvs&gXa#`$x?>Nl z!mMa)iQp~KYhrm}!=d4lkQu1RT+r(l>MaCGMH2)XN)e`6dQd8}=`yJzMjh)Z5fxT1S`YQ4%o+vX~KTtrt(^oPX60;(M-6p6WN z{iLjLrJE~AK@})fcX7U$ArmF1fRhTRb+t&gs8%a^=?MZ7{72-3EvIgzASYB)9 zC0+VC*1J3GPI9I=P&Fe5l}jQ4zP9>T&0Rkrj$D=V^piVP<7xWbK)b)e&6s~rgzhB+ zq}$Q|rQ2%Mo^F6oqNe|aJpdkQAp9}Nh1UD=|JU`I!T{CQYqBBM&pZnd08JL(=Qa4x zC{q)IR|m)F(T^%vp#6)KFk*UaQC*dH>_<8kn-S8GIIzlI0|^3i(*Z}jQKucYJ93(D zL>Qs~bIPV`UeYT3kO#B%F!wQ<9OLI~b0j0tL6v5aHMArj1)xNlvRur}bO#_8+XdnZ047#|EOfF0~Ct?rrG5ibs z#E}FFm;#3hF&rFABKO)UHBoAFj~#Fxc%fQz<2(yI2oft2W{x6~_B56d7;u&pN^)iR zw@^Lf2Aopb10>koLgf(gu>P(lYR}NbP{FL2l2U{6P-|x#_GfQfaJzezTbif|z$fPpc>4iAN|6xt|lsiw3v|=Ww4TYwxiLXFgD7v|}V_f&=(y7@y(rYaNxf)VbySWVq1i}Lg3 zq=G#~CkX5~tZT+a9UJ1@82XdWgW+GDnJvZCex}BjLOH72ZP3eJiB4{t{c%PB8MOhB zi4GUKW&E+xei`)VtuGXNd6pm>-7?WfB8bi|JiELV8B-R%`O&`*Ih6AGD0pB1Upc!J zj~~M!d&M?y!r4Wq!m|q*MucP#A|)0C2lj_ISE;?dV~3P?b$Ko`4EYie3QLX)C#U`% z$6cxO=)7%Rh)lX{Mk#cJ5nTK7hf^kjTUx~S9?m~@9e~XK=8n5p-JK;JjL)WPm|3q} zPGicBN#(uTW5Zn(?Npt~0z_(}F<-5|79Jj1bvEdoxYrn?6)45Y%4-U3_iE=Evr9=q z^kV<%4uF3~{lQV`;iX~;rqzQ>Z1M@JAm%z(Q?&G4+@ayAc>;wNQ(<}=kp50lfRz#2 zW{YZ<0!0w}7gGW#h#%y@+sDnn%J9Ef7R?_b9-1$-1IT|mq#Xj#=?0AJ88?wD1gY5& zEP#p7QL@cmmW}FeY=4cuy>&qK{jUVVs6@`2gWCAX@$sY-NCCHs%B4K7&@NpO%5Pay|5z-4 zY$hT(8D|^E`Vd;DCzXvh!rnCyS)V%|fra}1DbRvZGnOX1Ab>a)Jo9%@GubV|@x}NV zUUnrVpa(E5LdkMPf$FT^`DI|H)s#AfPq=?WSw??(b)pZbr=3hqyT&l`QH3U?zFCq{ zW2fxsmA zgc}8Mr-frPPw3VT)oI3W*0W4Dpd868^b2;wsSNMw#(M`=LtHXNzYW~E&Sw|!CcKi) zStq15thJ9RIOancGV=Rh5ocu`?k}O(*M9}`78tuBF!1PxFkR_io zp+6cCQ*xcFaPAL4#x#CY5G;ldAWqL@jtU6V`@MxreoaM|iBmQ=4=^X(Gc+`wUPm%~ z*YrvUZS{j&azpXha|R=dGZfwNv}8uX%l-JRdKS;f$St7{DT{|VD}CAoXH;Gw!$FfmmI zWQltcR{QgpUl2B>M~8ZXDr*BdBOQNn@azblTPb}3s>C*3>jU=$C0EcPoRx3^7gh*p z!*2`Y`L><+we^><(+RJ$QB_eKTe`CXR-kriE_4@wb?|^wfJ+gBK0?vsjy%8_!9_Y<;1uLvAM_vp_wqH>#119-gE4o) z@fW1vuqoc%Z!YLdH*~JyW$JT^#Nmx8igDL3fA1x(=-@-6U{u`0zh=Q61|~ z4HOJns7tfWp?kPL0sJf1oi8;I|DH$){p*m_Jsg^?OYHUkHKhC?1nGZLYaeRgg+c$d zdH~Wg1OOVh3#kuv`g`h30{Dhi=c#Rg1A;%V1nd;VgpjL%>o`{_vc`sl8O{;l-TX-Y zNmy1=?r5L!Xb|)A1^rzrK8F96+F^nqRb!VHu3KMs1$# z-a9vaccm#-M136h?WzF{dXWDVs3PqClBpMVH;auK_z#gd$Ed{ixNfYv>&O7QPJ-Qc z88P?=SuPtdJ5lNlX_0z2?`m~l#+jI$UhP?P^1`oSL#scUU>v17#0~UnFJludJh(Ck{g5M`9RZ=SgI58_RNV@Fh)yJ3mp5b2OutT@pb_& znL1-^)@;ZnOaoU!w8oUsAHP{#1o6f=6_xs~Q?-2-*E?`wx(52wgTLDAGA>;23g=R#z#%zA0t(u}!s76==w5QD z-I8CBnAk`%8b2kZL4$mWpE*;yE|l{equ?0-$5_74w=j5|l*hD#8P)rNn+Y%JD>P9@ODj{Us^>=8O!;+y6u`ML?95 z+j_)b!)C!l$`Yv&`Q-sMPdJ-xr~yphWD6jSQ)1LJc4ub{yPt=}q;5T0YpdVi{F6tk zYB0F{^R_GffAjYFvw5je9*Iay&6koCc*IKHP_r%u;%XO>g+b|mRnX!}4oA*fx|;Wc z6#QSQkv|alk3~Vl(DQqRR>-_kR{#MwCtpxp<+98yR%HPqQ&*2Vm;P(gs01zQtP%(? zHDT^J6>8BSJc<s@kpOT9xc=?>#$# zx`bY=Y5&+7f3Bo|HxYdrzY4!t{{KHhT)r3^mn$D0!k7*XQ6%2@guuE^3QP0@b(jn_ z6zfM`e-4reNZZ%zE02Gosfal@&>s*G=Sfj;hM+TGk>wyrKPYD~S)1%zhRZ8Lg4!Sf z(T8%?k$W6go)xycC(yQ5h|u<8mNqS=D+IjRo`yW&KH%Afxy=r(vojc#J3|iohC=x> ziAVWi%ekVwcRCa(Ou5bpagLDcwJ()QwTPM7h!3*o_Ycjb5&`a7n1qGF_wYfQ)|w`) z+jvCSrpin%`^CAYm8w+t0F2rxJB{XRVFBOwdtE!GPTD4J&I4C23rwi57I4rly%h_u zRALEiGkgZtS9bOMK$o^yqf`FBM;?`~MFp*Ovq8xb^3Vc_ROtDS*7p8MN7|kwmLGI^ zZ`lIJpwO6kh@8DJSq@L^>{@eoR_xH$oExA=Ob*9FmBe6-^V2ARS!S!|$SXC|UbmzN z{*(AMV@G*H^2#R2K6Nt5kN{C6hIBK^bQE4pvC^ow5eZ`FA9labcm}n0EzJ<1Ya#n; zMqhQx38CN4LzNa1WloM{fE{W^9G=O*uCpIywo%Xj#kRX$sFa+7Tq(ts z{6v32aU>)`@sjMCG1n%|SMd+4b=~$)G}Mkg2PRF98XGsfXc6_d!mUcMM%5cSTi-u% z4ZwDp3O4%jb~)M~touJ)q=gEkWwVpYdigIAB(_HespsKR#-LC3zwI%+XEd_iQ1gAB zSOT$UPE>l!kJsVHf1&0|(i-BuD#QoOhK;}t<$!I~Ux+qP27$S4e8)_fZA{mjo*m{$ z{|+1g5U&S8NZ(4J_bU-q#$^$!6zWuiLxCh;S|08_uTa~FK+xX$lPq{vw$>rvQBULy zko>!Cw~+lw;>-u0E}i4g)pSyBhDRpwc<7k1{3;lnU$>_XUgh4-W*}!o8l0=4-*Ud)v4q+11VD z@X0#zqB+>V{vLqjHY+k5+2-s@E`<80zJMj$-MAt1rUi4OQe&RMPk2;6!X4xS#WW>D z0Z~%@tUUvke?{d7VHW}9AF@aR$c)ZN{NENArLEDs{6FwlPd4FG!;W6Z!~qCpX@S3F z9Y+hsAFoQmAebchD?qXevHa(|cbO*ox~K zDfltcet{#NT2xh#Dk%YqzudvK&GcM0AqjFf#a8CqgvSc)kXIK^DcQ_4)#RRMby;SC zomz<%6|H|?T(#PyVs;tExM=$75vfYIHLj_Ge}1o0OY)Zo1~^`d1E>$x;hU1$@r>CU zI@*eE33ESd=^LG4h7z!c{vKobLBRjaQW)=Eq5mnXnakgiSIoJ+e&G3k@>2qGTbmOh zyTtx?EOq|_-QjCB{H6bj=Op&v5x8Nf84^WsA)UeuhAS#0XN53#i&2F#X9MBl|FN_o z{}L70bc{Z53k-Lb1;L?znDfZ+K%Ec)iq9j%l-hH!iLtlFm_4!_Zhj{$l<)ttv8~*~ z@$oBRly#)AK-cz%NVyPIsEANR@IU)JUc+sfX0% zkwF08JO%Tm+niNrr`>ZqK+iXK2w8bQaAg4$F z4@$#gS*_pZZRRDkVO!e{p{{5|1hZCrgxFw;T>&M?xAKTl$ogWKVa{Iy`tR_j6>6wkPss?=^j_eyseg{I-JED@=1kN++AMJ^y7%3>6W$_2VIn*9$UFCw8la z89Vx;d8-q6rSwsay+2mCg>S~C(;HMW+isMmtt%pf&nHk>mi0u}=GbnG6sz!qh;)-A z?y4Hz<^3YcBfp*fHCfU_FhN6T`|{u%wHAlP2Q)zFxW3&l*VpY?bt#6w)Awt6cjrE( z^vM+xL!Pfw!5NKw#a1V|38ZThDhM<%V36C-i0(yK!Y_No^FK*mPxgKGA8xhJfBTai z)5K|#a$>;*xmf#E9)soDE5`({dD0qUJXoIW3+_J{5)XRPMurFe78_)q<3_imZQPQa zp*HFH;z=ECvrmZX%9cQ~#IPJU_`!|)i+lz4g6sGV5Bp$A=@}hHr0)jo436{$ht$!L zN^%UM)o^h(7|zp^{%h3OwJ|ljLa%ND2v%Fd;4f2ubY{m)ragApJovUVu#uWM(i^V*>|O0&a{ zkxAHZ7PdIWC4&yEp(#^trISXpIZk7G``8UuM~%QpF;`dFi)Y2fL6rpPdnu<;PjHp0 zaKeUnvk4~9a9|;{oIEpenD0DY z{4Q67n@WtZlMhj=#Vqgs=ZpTCwj|fyT2>6j^mtH8X*${&1Knni%AiA|qNTj;4ig9h zuj~g@<;RdB8#MJB^IDedjsAOcXScx`BH5g6Z9@*!@CpuB`&C+pjR=(_I@PH0XFkuJ zBZv^|h&zKsRn^x@yXia`djZ@kTHo5(%-s*(*7?#F*pFkEq#w<2=0_#Hej>izO(6Z8 zr`7H#nmcTVJ2ojC$j8A&_?ekk+R0)W>fDD^aA%xVMTADUQ&)|+;r8}J z+t&+HG5e}&l%~F(2FDA>u6X`iJ#glW8o<2BLvrJQ=smxVyHBa20|9HXPSm5^p^jkB zO0_dv%4v4EKh2EI>h3D<)8$9ClfC3PY=%xsOUbqdNecXuKux?wS!IVgiRk}u91qNp z?@O|&7BMqiFcn>n23%zh^Us0@m@q8Fr_sC1shpW+N#rY*sSY7T;X(8%t+P0NOn2)& z+DnQ>c$l&K8V$0)4cytl<~v@kvE2LL)_>kP72=oXmW^OFAn~6VmYXWPe>(q1B>y8J{)zUfkjCAD|2+cqNKNqf zXW*coJEEM!jiWwI2gQF|0HjNEOG5Z}Kmf4-mP7vT^3I@=gX*6#{*iQ|eH7yF>H|ze zZ^#ml$LAW=jQ<|}Q3L3IWB$KH4UCH&YqrW#Nt##B1&$nzlQavaA+?(xg|ly1q(JX? z#nX8Ao}l6@d$$U<8OChb#iya1a%gMhuP7qVt>Xf>51L7%tp=7-qq=a5SCKIFl?5ra z;$bHFck5l1L=S@$IMSBWWh#$%iN9%%E+{O%bz$bwcV;z+@kFJFyT5gqXsjK(lKTZ; zJa-%!7-O=7@A097!=OrS*J5iV^f&c{oAGrOTsu z>Vp-^UpAFp{Ybd9>28P=iK8bPR2*hwbuw&+!9#!Nlp0uYtk-v_r1n1b-d-2y|ImsN z2~jVN5|Vg+8Ovud~r1#_FndG zyj6o0nNUl6hPhGa!*8{AR~bi?lhw@uLn_B;@E)qE_4|%igi&Vy<98Brx0|NM2Ei5n zVJ#I7k@T2k3%2wXiNOZMkEII9T|LCwauzqM`ZR@O<=p}DGy4n~Naw)Sb{qsw7d9kv zX6*f0q1cGwRvL$kAHM{SP>ed_s1}d;w6Wb9fojRVhIP{+i>)S4#ch$wHfN5qiAhjV z^s7@+r}fEf*xH(ni@s@+m+His4dZ?(SSI>`S+Gc+J|XIgOs`KSU+aQ0S`b9Yc&t%S zF}kZ4dW1-#ffqvjDjUma%6zHG|1u(p$O7;IfLP*Ci`}#2@YZF|m2n<+W7gJQD+d(< zHs~u=Y2k}dG|n%&>4}C=`;Kwh!tmc5e$9+iKRyS$^gXy)zv)!IVKkZ0<=@HD16{Hb zCAZXZR`4)iW3TsFPoInKrO(@uSvxb`;mGx&25l&`Dfh3Q7mFRFbd^uhF)Pu&kO~-HQ1>#$!}1t6Z!a4SRFNfPg0&dmBrg-&woCFC#AY z^_87cLwg5zGucL^>Jc{UW&RRv#P0>Y^-(Ot?$g$8hI;lPiR3);waIq3s?*o$IHw^yRUlFnQfw-{LvxeA`h!yWA1k9%GqVo zfbZ`zsVb30_E=y$61q#QH_|MU)l1*!v(FW4#xvcdcK_4IDKN@0+|l$tjql-7#}H)< z;^OU2*`NG8jW*r4yo&Ia0X`a3!>G~GkIAp=& znNPD>30aPriyU1yOC}O-mx?j=@j>0%Zc2qX91~uBOqWwYgTYA!`xfgSjPD7eIXQDlN(Zw3AshMoUUQPm+>S0UA-G%$v197N`PY7l3`ILLf_<# zFqsCGly+D8nBm&ECuXN#S`pX_4CJMKLP$mT9DNLqfc+WIXzSU_QHwdy^F(NAdT~wq#R}pYc@AAs_d>bXoip zjZKk4FbpiWGlpJ5qDmGz3#uHU*5;T>nM8WKQsCp@8LrwMmz?E)|Ax#z8u4<*ax%^p zsz^fdZ&}$tKCSX{`lU6MwZ6WkvqKw4K=@eQYwr43w|3=rML(1FntEU_a7Uklo0XB7 z^NF1KDE8C%J1?-2CkvxUb-uz)JY%6or5E_663)S^&u1HK*h4dG_1rPz!^biFy4|F_ z0eZ-kw>s%p`l-pM8nd#w?zI$-sXp{4U58ppO+N5JW z4s|wL;dSs0#+Ja@YH+=QqMkMG2fy=o;}8YUXYxL_cCy)S_ZuR63(aO8JdM3X^WXgl z4q%493?;6dpqe6BSl3E!EY{-MLyUD*x1x^s%vqs{nZ{`M*5L@s_ww3IN>j|MAORNL zgj+)k>XO(?VUoV_n4N>m{H-dsjTasx>y31RBg%+`)tQ2Ty3tN^N_meuj{OBM9yoA( znMW<>UZkPki{2V(V3c#=N^xU6={ zvqtrGy~hl4QAC8KkDR2YO6>elhZz#2MGd>&V-yNLk*DP5VMq89%biB8G8Hjrun4Gn zpR=`X4V%&paaC7gWDq2pBeEy9{OJ2S>Y)7_^& z=S~uv@0I!-qr7o)|I{L1!!P=>fWW4h-;5K^{yx*188>{K?r0el_$#+V52R@=cJKEF zUaUpIxKwRjvn07r{i#};qgd?w)eE-s0AGGdAZkhaax>i@8s!TBdRXL!k2O~{o`iqh z$mqM-H2r3sHWLmE=*{yxE-Y0Uh`JZTe%z(tp5^prcTmwjsCfq6J{DKcYtXC@yC7`M zbt}pn6Y@Z-8|uEp_%IVNDbEah!Ny9AFGb50W|?#`#)<>lp6J;lxQNVqY_ixNqGiO(yWwsxtPh+! z%y~aa7RABd&%e`m_use)@5llW`U`e5NdFbdrL0ecKn3sjhKOQFEen!mgBI?i42C^ysOdZp_r5xV8;ZJ{i4wGHm%x7<)MlKfJ3G zG*-PI{fCDz+@R0ynoJY|j8(o?b@g!jt%5v zt3oy52=S?I$wJGoUP?ZI`tSC)#QS^#OL)R@NjB4M9X&+({z8H+2W^%DT!DT^p1vcc zI`$=nR8PO=vVJ#OX*I9oMVT;-DYHl?8wZ(S$2!D9)ug7jE#L|>|c9N zn=`+q7mO#84AB=i>PzBC12J3#yVCUZMD00KuGi(drp9w-sHmA=O^h~dyUl)0|ApF3I4WJk}uLV#0ID>;VfEav--1O zq4Kx1m%q&Riw#2*^p;k*`IZ^Ex!!QrK1{dU$;G z%WLkSccj9}N$uP1p}BL`-}JMnBl~;Rw^~}cM&BPak;fy<>A~)CHq!LN?n8}%?dN~no?%VgC5v*8? zMbh|adB&oBrCY9fW+3!FV==fIC2QEZyo%qT74?1)v~V!js$|O>Z(LFWf@EBZAvd1- z-iM8Gou1v4%wf}56J?!o$zZHTbJEJ1ZMt50phkb8gCYApB3}taIVxhZ7&%=$WNpAW z=cvUx#8lJz;f*^`2Dv4OBsX3tsVQE)w`nm-C{4F=6>@FEgHoOp4rB9(@1AX`X0lX- zk<8jm>SQi*rkDSO_0{rW_rSvm%flzUKgq`TSGqT!uuyYAPnLBJrqD)8?Xu+sH;W$^ zYz^ehGR5@QPUX!^o~O@ev%IT0omkljlRfLNpi#P2vT_LbAq#3SJ)8)9Ou{Iql65~S ztNT_TjPWsx7itd516@!23mb}B(#-0GZe7E5V%Qf=F09+945ZOP@Ih|gljm* zc;LFEQl)A5j-0MIxohx;PrRdfaeUa1sUF=R-x?ub`5VBxXjUs|YIT2KFYlfKv*#JU z%-$1jaM2Z~r+wc^xMAA{i^@9ovcfVN|3$?r8@IJjeF5xK)o8*vn->OVBvt;3d2-Fw zZL-O$?iv5kqg~9HTCQ7$jXCxI_l1g%5 zaOcf30FTyWs&zf+V87jsj}yXD*xbIhEjDAU*%NkoHg`E<3o}2H#MiF`p9yj&WI`M2 z){R;VU=IQ(2Yv}M>)9CiV;@3@?T+o>Lw}6PKY9JGQL<=YvO3bW0ijgGJEdrT2=468 zOFvFnORW?wUb0Y~J!|$n^fJ2R{pDn>$dMf_ERXfs0)b7}1xtzXdrHea?6#w(`s=?D0t~6hq6W8gnV%lTXK>YF%>B1er*Y_I_WIT4Q4kiF=1 z&6A!?H4cPb1jbZu8q>y0 zNLN%d%zGWY)VbIaq^@a2GMH@fCx`uvzqvCjxnXk`=1w^0|CS*`dW{j*0QwCzB2%@Ty;Vq6EbSxYR*^vYW5K$Ez4 zyGtRB7mzq9ll&suo|{*=Is1k!>&r!m9{#{E-e+PHZPz4-L(Sh*S-YbO*fAg zo*?2FNV*5fX-sB)I3S{H$BoKJ9BfS6Mu!I|nub8*i)IiF^b8mq>mlm23Po=@fvqHzng#|6Bd22^9(38W%*E~xM9s1HD{Hj*HsW2jrOVPjASK7o9Nfo)O zyljXshZ$Pl*6)}gu)SkC9vX~G_PjGS^&*DP;~s(VFioIVWo%eshS|%qGwmJBSgMz1 zesZ>#mo~Xk9A36~vQmrb_6l*kRvoR{N&w^(*c|{8;%?4fE%Q2m@*_%66BKt=M{6(& z%F>5b+vu%^mtU0AFvLdC9UaPVKW?0I#z$J7#|p>}X7B&>JF&#@X43W&lQxuPV4H*K z>6s~yn!4tV&LZ!6?a)u5cl;_+*AcA648J1o4BNDsY%b;g8bMYU(O6(8zUtRep-k!O zcBKC%U}{~Yn4Av-6_%rETRu}hR(}r@;X~-EtR(D}fl9)<>lY+)-fBn0&?Xr*CdFxuma@l@DIRpn{d9+vX{(;|8Mg`fA z$3^$0vjm1(92kAhaiC=JNsF=QoVXtJp%)yU zSOuctJ3HoeNlDmd3U!ybp?t%U`9+CqDM2{|>T_@eS*SHyo>_YYaJ1061}3ALE|uNH zzf@DtsubJ`lm9-fBoX~)Nleu}P3bW6bJ1OSr~B>w%J;M6 zixBnaov+7J@pMFE<$3o_W-**ap)D2Ipvbmb_Xj<4#CyzEkncO$QpBF)=isSC+nq1T zlU43j-shZKg2L;#eZv9iXtZsCr8h8`;MV(rH}}h9a}?Wa{Q*G}+vk$+9odWPF$2rp zjD7nI;EwC}v4hIWiIMA{IWOSzUnSn4T!;0d)AIh`$U{&MBUo_f6n8~tTk(J4h@hT5 zBuus|w(`*4qc>Xc+LC^AKX;F|fNei++n>*UO5R*)-B(Y`h&n#Cbdr}`swZ;AS4CW# zNdwDR$8G|P_CWFa zgZrlvx}4*OsQTD?K41t=z;@U6 zp_Z_8swjuvL$tj=NHQ3R{PM;BW;I<d=-RLRICJ84}h5*!z~Ec?zG8n3hOTW;qGwSL3ejBdZDt>-NY6Dwk&k`x~rCB#K9@o z2ogB~Qo8(M<=;{)qe5?VKHtdPaMs(=C)Dw1o`9~@&(fBhOb+*%Oq7O7WBu<1!w- z3hT>iySvx+xCMY;%FShJw(700NM4t(qsvWL;`4>lu}77E_l{kAdS7)YwKbZq+8N^$ zKcpzSaVNRYU>;p&iP1Rbf!(@)4ZYosu?i+6 z>Jqm%1mZB$;r{ZTo7<9O`WP&jjs=xVjVJ_RVnVUFdX9v^Y23f>DEO+-&l$({YwyX( zCklSrbkAET7cQzqMiz*cJ_!kEtjgR>_!4+oQn)Uiq;D@3x6KfIhq3P=os9-Mc40h{ zAZUXQJU>qu$+2j277Ox1twNl6kY}X3j>Cl6y0nz`SB``t?0gWUlCc1hU@lV71i_|M z;*jIaRDND%Z;jx%Fqdp9;@A}(cn*^_JE?3c66amyn0+^}KYJv%%_}0(6s(N}L~0zd z2OzyWpB=kb5o`et!qw~Hm873`*Pkn}MXOkakx*mZ@tYj14cfo`j~% z{QwIX5Q^gCmt43Dph&P#_JT|~jRtt=F4OuMx)o9dLXYht4K6?eHpaOktj~~9(8_K) z6F>Mfa1vie3Ch4#^(SZ>nB0AzQYzz*M#gc%FNs(~<5w?h+&QQSpp zTm_WdDVW%f>IJetlTUZCkTCHfVtvFvvSgD_iic>-9^Y}mbUdX{kPxb+2pDSyt%xQw z(L&&v#w)g+A&1E#tPa7B0!G=WC{B}s`YB&#L)`^mr%)>+hnmi|bQGj}9?c$?yjUYi z(uf9{@-dZ_Qj8)A4I{W4wxH1H5 z1Ipg|48{EtG%DFNq*c&V0eJt{1l!wz7G>8Uh5G}foAX0%#dIVhsR-$!@{o|!9NM5bhrob4tkY6ko-cm7nz2DYB4SnK9yLv(uMQGzZx2te~ zYkno9zkcKT6|BN!NvsU6d8}bpnX^6L|RQ_@^365xy{oy~LwwHCa zu8H>U3%Z*qQS;~XK(>LnD0t!HF^uO+{9?Vu^cM6Y;^JOSqXn#`F}v)c+lWaFM2}eA zYiy)qTIMK*K|J5{8ri)>C%zsSbM1+Y>o`dPdOg*?;tTE>oYH7^ajcj)b_a3bL&|x5 z;4O0=4imm8F0o}i3k5_uY%Qg|-AfFb#wO7j!pEaRIq9cnD&Br4vCvSmSYscPz<_EA zW0+8ok=J}AXqMldwDiRr>|!r5$|jMJjD<+B^W;HtM3MoifZ`~YW=5nT}@2;hit zEGu@hadgTQ=uJDZiOIHbRw?jjjz0S#F|b*#WXII*rL}e)p2fx=icUi;DfE_|i&N8b zM%Azc#vFf}6w@ZY<6L{5mk433Z{x3z!5e_t4kJcz{8@}} z2M>jf8BSE?)VTSiwtx^;*(q#Ls%RyRadu<9nP-d)`$Q79Io!9bVQUfOzNgNS9TGZS z9OK5hdWzB#v6WIoqM#m!&Vp_H;Q(Rfp$l$nMT!33cTynjs&;G~L z^xUt!ah~C2Qt9G`>L6I#5x^p*!T{IE=)cL3*RQD4!}dqIv&F1sAxKu;+KG4x=`gco zNY*p0zq*cIm`t{wZGaF-&G~3CMXer@ouolj-oM3fmu38Jt^5vHN3Pxi+t++kpY}}8 z^s7RITze4ICCj{>CaLa;5Q0vtt&SP(iE$+%{~?l1O1oii#)SCt2Bvxo<{lGl|oAeUSr|cW2@OU zouagH@|3ad{QUdcNEnd7rSYb;1IQQWgbrwq~N0V_(gjK2B$hZ$+c0e3~%8c(wNH>UJ;lx6f=tydnIyCfn z+v%Ao9PHmY+?6UCsdUwSo(0vDIpblz?M{j^BA4OlXjVbS4ott*q*58kUwv(!4K3;o zDbUT2Wf1q>e=^?CA?7*E6H5@LOp00J!zFR0?nw~nU1q6h%Eg>wRtic+c z$@DTYh5>nkag@FgHr`M%HY^-3YL}=i9Ldd%%hZtuLP8w6ZRHuj2>+OanTT1@8HWx& zxeg3T%G6|fWavSZT1H%ug9Udx74*(@w$Q|QQYU;VQX(_y=o8%&N-W`9GJ0iVz%wIE zjDrCgBPZIA@X((3b$Hl_Bm7ojvz+;bO>#m%4V~&G!uA|#Fci6kp9l{L)7i@6H6Z8% zO~u>TQ@KGvsvwJ1ks>Q={|@svK9zsj#{lBf0;S~6v-F$3R)iK83oa4^v#P@{vpj}t zC{UJitfQ(Q+wQW=MkYbV4if-e02yjBtc^_621meGnUbEaO=sghWWPOCA{--0eQiuO zr19jJt=03!FIY4t9$$47!EP+y}wtzv1eEAuhX+~m!oHS?58g5x4+F;DvJpDC6*;5--!ghZ0&OQ&}hg3LcHf*~QTdkIY>_FcBR|M-d77MalY-{7pFodYuBI z?l=n1y3qzyqjtYRJ-4ksGADVx{9#Ee$)<}I{_ql#Dn`J9wo*F|J(FDCTNYi5MMt|` zyjuzzVmP$DnVz1}lI+8J*YGatfX1`RJFT``i9rFqyY43B!5DN;2!(!SUx6^{DYuAW zRL8+l8CFcos&%wB1y8!(!xFrLmf#3bb88$GVYB=q5^a{LOLaoFK77xo!woyR5qDwV zCLQOFH++9%J>1T`q4p&)Uq=SH)Mc}JT%yc6{lE~_-}iZRxa;&d3uZhPUJf{j#yaHUx>ih88Xr{`#DC|pfL778e|vopTC7~(=7hw8D3BPAu`%c z?n@f{B~w0y{~;#Q1XQcj{L5VIVgJLH?EaQO6NL7c7EMD8XjBc^Wmx(5Wm~v^`aP7c zLRJ0CpsWu4(}?&f{9p3BJfyeNpMKL>S{2p*k}m%b3iEmU*!}rEcDC|v^z+8|oiFP? z8*ss0H_RtzNm#Y_^x1oT(fg>{CBt#1n(XJzR2L5WrCGJgxA(OzpGU4x!yEpL`MFKI zPvW;ThvjE*cj>T!_iU}BV&A)|Es@WArYO);O-rEP-S0zuuNy7=h+kQs(|zA;?vY%f zVg+cMoN>37Wvv=2-!ANoj5Dj_Ju6pFw(dWOu|MQuK$T7fX9bliv%#MgVjpO$y=dLq zcPQcOUOP<-XPsB(sh?kS`~_d-k|f_hFW%40`=PM;j#)qVd^?_|H22+n%O27e=Ez?! z-Fi37rmNoUxIVoOcC&pR7}5Y2X+OFLj-ndm2~6k?#XXBnf94rMnBANCBH>#BISVJH zNoXE7AUV}#y{fAros_=)6x(*P=hU2kKe^a+v4@$;^zjf`Vz1&ZydC>kNUXZjbvbbR zUif~dGwizXx!z54_JYcsO(4+=So7d)k7qpbp4zz~4lR4~{))Z`;TO>mX%g2^GQnYn z>t}jGi16pfZJXG9g_S=S6RKL>dgx<>MNb9aX)uk2E>mL)K1p@nqG+r4)`!mZGQt<8 zpPSIl6N_v(?IKQ}jp`;(# z{CPYKpZ)*zb{AYxaNQojL8YVwB&AzLI)_q1Is^rz8EWVlVqic-7&@i9K^TUbp@(h+ zq+_HJknR$M%YC2sy?3qq0q*$>XPtA_fB*JAT(QbJ28FN(LR=1WJh8buR-_g?liy zI6NtIy>`|eIhHwDHMhr41ys=O$_G4sK=2Nii7X{}#H8AwjOMw6iZgho9sI?BL`?yM zt!N4!z3NWIPQpduFk8h5kg8}=JSQv&FACIEoczwMs4ros(-Q0SVH>Y;$M4wgLV1$;=BD1n_8?|qTDBdUN!nax@+_-kBh^Bh z_7Q%<%6^2oNcB7cjPV5gc3h6xdTxe&O|(hTh%;g!6zO?kTo3;o!d#L_ej)$UKC^VR zoBYeIoKzbt5GUz^jo)$cY^F{XcN3;AOqG$D8Kt=SVwjQ7+O11$~OFA-&$ z?K;nZdvpWVj!^u(?Qbpcsvzm-XG&C>hEL++_ll(BaWs}S}hCLo06(C^-RKysl zNrGmVYjIw%?ypVFD1STqV{u+pqqt#2Qo}j76M%iqA(OpQ{jSQ3a#>-f%;}T$tq^EN zFxL{u#OFqZARo*JA8~KdMOM%b)@UAuireS2Cl49E#Ev9Uc~)yD_Sj8FA>_W=Q?E`I zS^0qoVMrNfJ6PQtub|PG&Z+fg$jUg6Z=QiM|pr2~)q34}V~giZN(( zu$wb-K8^lrERL-hHn#`3BKJ;%3~YkyygqyIYKcE0Aj0LVr{;&6v2NF7;Y821Y9pH{aFi5r}DSaW`q(Fb=qMNu=kL3RB2>kI9qweCNK zzd=7oRQ=pV2l6+`576h*`>^lgQf|vD&+~vCl2kkBl~#Q$i^w{{5*5r=rC%UjX3a-s zN^bil8R^m(Oo3*lV+4wGhmz%+fQkpUqKcepo0kyVD57NcLkAQC_%(VH zd~BWh$;J5Gg{0%6>F#RZ@nL7?{4)M_dQN1e@uKH}i>5Nq8yjJd>Yu41vu*%$u*b|^ zwo`8WeJ6?gQp?MrwWnEZCyeq#Q4YG(YnWd=AN2_rMHgm&bxYt!3=TA6YVx9MS31*Xy zqm5`j(MdFa7in0di)$B4y!VZK%?sBQtSJ0NefC4gt3Ry)0X@XWRD+Mhd4PGUcxzRf z{4ybjCSCJYjwvJ+d7~V;XkHiQHa8zqc>kmaBt}p>&MU;^-aq-~Xf@1pHz3gw$2Z~q zEt9Z6Gq3TEPq^sl1tus?6Ru@^q@}RVe=ln5r((d^=U2G%qqxgUCLNY%7q;HPosf+u zh5P$&!b*v2hCI`n290ROCMyEK!C%<6B@Zp;jf3%M&P^mbDN^^>86BlPy$&w3C+&m# z%D0As`v$|AKd+nsV*K_{msDs4(xd!gr+NdK2PP-qu8yVO^L3pO@sVGD>Hj`t$<9*r zW4}4~mjEcI7yGaD*(*XHw_O@%>#khLTWeBnPGhuWs%853I32H$Gta1C6PabK*82pi z`6b=X@A$MW%_roGZ`j5s_c>f2p>z*o8D-ux=%b6vuCvWW~2^-%H#nf8E7LXKd zZ==skYl71?7iCsHiNV}Uy++weyA^{l7%Lh55^7tq_w_-gpez6rg8PULRGDOs~P&)0aFOyEPz3)3p&LBLLL49}M&S%Eh=<#{tPq9ts3 zt{$94LSPoV`1M_P&gL_Qz^qTGtcYN_i7g-e#srNJ`S`|ldT1`Czwn2$Z0eG(@`(<* zzhdU%zD3UNyZ$_rT+=b*6J$EBEl+GoONcM(y1r_x*(>CeLHlGu0o^QrSG?#BVU{N_ zzf6YAy6Q%>h^K;GU7YQ1?wrM}=M-`v4Yn6vdmMX$q9p&C3<$+dkRESW51!Wa z1w4KHqfiK|u}|4tx?YHh&|zg@_%D4Oho1GC3wy$ZiXl{Qv&)u85Z07V z8}Bf}T0SotBld3LhQX1QMV5K!s0D=sPAW~rNKx)Lr`JG9&{V8NH-jM1O3*}FYDhue zGDH4}-#@}pEjfJnVAG@b2QZ3`ZYh}RJaWp=_Uj+hKxjMGSEu4bZcbrhWOb-kRclhA zUdF($DxXTXo&3m3>te+Ah?xfIPn8`0nE0&b@k~aozBvJP;{LnCK*UI&e1A*=N?BcL zi6nHP@8{%GE=6i}vy9j(lHP2{HV2d&5IPq{TwgO_Op{CWJpmljIRU1@Lx&{RtWC?R zYP?-ur*Y+UmmC0z3reK)8T2y*HctR9Vyt8;Wp@L%j zhwmCK@NevAhd)DU)<617N+6vU`jDKj1lw9>#*#&mOpv2hO;3Lr;02#lWalY5F|#_o zDg`8jkHp*NnO8JHsIb5@xqode&+)c1%pxZ!u-x{2 zu8}~Pb0PjT;TMQr_1(X`BB0n-=WT@AquTw(J79O$iH%W2KYGMV#&g{3ehgd_|D&4r z*V*0CfYn|Bs$CDgih)EPklJjp7|w6R$>o6(9y`ddjAS zL^JOq{LO9U?P|NsYWg>teW9ND4a27Ut9hHbl)FA7?+OJ_zdYGR(QKlzj3I5d~qkp zeV)+I{W5>Cy{C;=$Y z>thS37!^xx(4Zh!QfG|qvlC@C`%IUmv-F^6FO5WQlp(-_Xd5qXr~2Y#vb&4azM0}JKNfG zX3V7FPA}0|S(bO_N(YXg|H$^MX|p%8+K#*(btw}}20(9L0J&}DBHCj2j2D-wPYdF& zVi_0{U!<~^Kiop}&<5UZfYI;M=jVRK$DjnBnh;)m)WIs5OfNBtFI)w4oXdzh-+I-R zu!=2u=yi;CVj=nF0k@7umH*v(3b(SHbQ!x=G+sOB+6@l~3vsra@$?Y5^R7;tn$q!; zU5|=}6xN|pw8MK@$I&)$@s#d5jqJmaM;V7BnEkR9TC`Ql5{AG+)YtW zY^2QP`wokC!?5Kz_?8X5>lywY&tpTLXSVP(>)!v>g03UzC3rbiuNiM!i+Xog&zUms z6IJAMv3#eBlN(a%yRMs_Yk^^wni3f?TZC2jv&4g1jNvM3>fT~UPyB`L+H*t;;pTyf zF-3UE(_KTSEzEF5!K+L7&9vTc12f4^q)GrQtb8P7SKO{0)ou2w2DW#jXkzx#(%oGI z#RYc*5qN@L&%qHt4#|pU%BFoQYB863RFYY*mlBd{D4J_ZTHRFikjd#cQv)h!p9mvp z^fZw^y)4ARLpx}Z;-#Gz^}xY zs|DX4Tj5KsWPXg~gb&FLgNqUV3E*{R5mAtRk{8PPCb;Zgi%Qb5A3{y;psukp0g zzM9x0J?V5C2O3Sy%Qnlwh#r`N*vUle=aBchuvPE(rggpJ{S>dEXXm-1I*Qe$b`S0< zmVkDm`8acz1SOl!ks zv`AsZR5zMRqdkC_t5h()@j1VCEN|c32AuxBiMWgh%!Y{?y`ZA{dSy@e z<5^Uz*c-4)FhIZPO>2EpqxGMQ&R9?>V#vO_u?or=h(vObRQVvG6)NYvt9lP z1@r^7!o;P~$zHyO$Z?4qUnx;T56YlXopbsiwaO0$nyt`_g61u8z2Z;iMA~c(F*aOW zpKppnap6Fs$& zr_F_9CTECa0B-Gp5Z~M%-x?Xvw9r(Grn{Zp*ZOe2{eA5WWzUi{WB(KE2|TUdgcm1Y zZb1olQqhvis}_Pnnw)8#H?VkEcjw2KLv5{byGb&x0>e`cN;an8)_07BrU*__1F66< zDn4!9YN!|4`=Zci|FMNM;JN?cLPkAoo0nAr(}?<_pr8#uQ4Zdwg8$^!HvCc&BTUoE zTdrQOWD@-4mG=3lskumG#x&Hwg@>P=!F($dIZTes%C#3hYF3P>>p1*9)3cTgS8vjG z%0rIO>%znTA$zlfnl^P*ghB^3Nj3u3*kr?-TqCj=E{XWH-6;^d=6UP-jDpEhM+7IE zYSJeD=W7i99zHDveyG(y;7`i3D^(8f^33`q8vCI#p+rK`$1s?gXML8R?OQ%)=ztjYyrw=JvCvNYK*q=YyD!C> z{4S%Tem5q6>oueB=iZ`qKN|4|f>);438FeyITkxEXGaRH*-EIAUI<>I0<@KFC-xV} z`b*hamjkBk=gHB^vpw*^3ijtakslxw)t?OuMvZ>40(xPQDzE=GCoCjIQzYnKkRJf| zn@n>^KyQ1hq_SRIg1_T@wl{|5hVx*)8%~Er_smMiOuSa=N>8aDDoY zR>obG(nsot3%n=iwTTwrXUWX9epl5xN_c^UQImN%zJ@)&3W=_0fhNp;d0g6vqna0xX36b{TB}jt#P)Heu zN#cR*X8)BEiOFZ*rE#A)gGcnz3XNT z)T5hzMl0{fPoz9kC$kJoT`_5DB}baWRleJc^`W2XB-+Y{+Ymk%-+?9H{-?oyx%&QA z^55vI(LVckQ2pN>|NLb4(*xXb{+(|BKTQuqn_viuA50K|k;|Goy^X{q zVC*KMBE5|ub(jNzA)>WUkeVv1z=-EsbtG{?E)dPkk8WmbIUC}zwWFSYqJV6m8zbfTj}L43-!xQKLNe3$FSEW7 zInI9e>e$usQlw^597Wjox*0*geRCd2Umx5P_{c__vBIxe0z9+6`*8YtoE zqj)Hz35Y%-me?8LA|Dp8n$4kx-1#%UA&*^5I$YiJ3-C}CAs-V=6;ctgd6R@ggXQF9S73)9{6(nq|EZxbCR&gw=!uW zQr6~Ld+WRip0JL@My?=&k)d?94~l8~PT_mp13Z8tX%r)--o^~1A(JRKmBm2YD%*2V zlPj4+@aq(|PhaH4gKpcE3lRFjWj|^f$EFE5e`^qj_irF~A6x7}92(yY>~~C%T0~EADF&_ZG5&xMW zK?W-Ma~2teL=-lDLE@WIqzXxUg4aIfKBp5@Yw$gZdxEbCjAxLKnBxxuRnbO8V;Anz zXs?3r7OdP@vcmN3d_j6b_P+tga4rzgoVc+ebN!mTS&m&T4mu?C z7?izq{TO>=j%+PrI(XG+?gUF=-VtxXl)LF3?3<`pp-6qh+n&!h@67MqKIFbcT{wP- zegs=_L_>b0j4)adaDg-d!r_#KD43{`FbBb%!N$RN!I{BAecmJqBP1Ef+2KM15JudN z-y8`Xd4Lhia_8iT$l?-YiBO|~`*N_9j*_i~B(vA7V=L-V?V$6UGMR!GrOb-8O5qenDmNMOi!M4-E+B60r)y&H|4se{l*O#qjB`2 zMa1Zh`3iCzQ*Od<6a&f(ih2~cX=v3;l`Pa+im#;-ep?hCS8>WS=>v6c!go~%Q>DE(O2><{;9;IcB8&ifnI*D$W_7IGr)w9 z)+Iye%vPV`nZs2orNX9oP+DA(Qc9?Dp+=yltXQuerK(-1R^+Bs6>RQ_oo`vk0|l zxJb8nM765iQBo+Q$y4Mw)<{J(UsCQ}R#J*p!BMuQ@>SWpc)c_-y<9l+`$hq+#OIM3@m3uW{)#$=@)x1&vwAQ7= zW!81fMeYRtgxQtPC8W)?t;99Aeqnj@T*eLZ4c}WsUYbEdzPwqxM%!LxOGH4-FWEQg zQy9EFpkAn4C|xM5w>H1pFwHQ)FldL5G%}$+p~s>^v1A6?7;TSpk8Ox<=#R|2EGNYa z1p)<<3{G)Q@k%jUF~>x>*_0WM+1jMngrYOFbAV^^iz?iF-^@=7;KpxvT*HiU)|rM3 z%VxThl+6^+6oixyHQEY=3RN{awVGl)Ir*$EORuAQ`$fdX^u@--CtDSpKwGtyhLsK= zTl2w++RA3F@iOExU9)wgx2?Tlu2FaYXDs;K_X)!o;jn&naZ2$B<;FQ% zbJZi5BiAV`T^M?P`f**k79S^9mq}N?^VhJZ>W&t&7d0 z-babs<%5}{vZK+5${U|^)9t~h)w75BwF#b$H~%LZB5R_EKTNquUDaLEfVB??-vHl1 z-;Gb|Po~f0&p5Dq@L4ciuuyOUuvCa9Xq3R8f$WeQhZfErSzc2PwaVAC+s@zb<4fbm z;)nAO^Ao3=7+GmKZJd{b(#2RrS+x7UXQ6d*y&DEgintB@sSmFwF;kuNLbXKGL|(xe zjLslx6gUMm$lr$^zcCdv&8Ed_3@&p4AAm%=@4Hfaue&9~3^Cn_dFjM57P4gILll>? z_~{n{-s9)JT!_w*hwB;E%=4|^(vx(u zc_;1;Y!5oOy>G^!g{dy7im2q3HZghefG>!_Txra>HTL9b;&RM-2d0s#mn@!pOfTc5+Eft!FLjsLD*c zNXiy%Nxt3j-j?6;(?{!im?Yei%>1q%Jd9eR_st-R|Jp-+N8L<}1?vnf*>sFmur{C3!G@43Q_M2{pBZC+}r zT6y97^xk>eu)bKd(|)T;)Awl|Xe;d4ALrg|8y8r9SGeh4ew}~Vz{BS_UzS+^vFc%+ zbW{u|8Y_A!0?+Jc=ST&PM~-jWrgtAGwE|wIs^+U^s{k1J7*%WV&9>{0MM?^u^q*T=lD0OsM{!dEi&qQl z+I3IX*`?L?`uknZ4{{F=Z;g-k7J_(%2*S{Z_{Utw?zN3Gb&l?66=nO#_=$vGpUSiH z&4^+6mz=vkg*T-$GpEKA#)Fd*ce{r>m_pL})<3PUZnpObZ0&4^eVbleFM~HD%9E@p zIkJA|Q1i06aev)Qw6}a5q&KjD6WsA!=Eewk@2yulZyX6v>31MI?AVmJADu*9V#(_` zb-KLQ-5sRR#Hwes|T!p?S?N8E9BI*y>+}+z0B`(+73N0CS1GEu<}M1<1Kf;$7?d8poF4@-3^0i4V}4Y>dq2?3sf&MI zzZO_?`g&Y9?msMNy4tgCE_T-YEis`o-5vuL-)4{oiP-or-}c|j?wr?;N($h*Gs!xfR#WdCiOmoB`{7K5oKl2&3RBpRK|;Ga6#3y>E1oUkzluBjp7|s-Nnx+ z%7)wLNK(OUEWrs_|7kaW0u7G7wAe{zN%RZI((LRGV@%C)$;NsD=wSNZ!qH(Muz3}v zklnu~5eS^QFgDh=X6p3C%H#9?={MdHAqCPd!Q5u@n>6#Y;Nx44#5)Xn`y~em2xzvY ziiV4ZtPHoYy)C_=iM^32y@##C-<>W92(JhC-=eLliy^Uxt&N>Cw+A1|e_C+=E&n5C zAR+!w6Blbf5)D}eVqtqHQ(`uHR(eJfepq5+VqPZ`Gj1gjvHz<7z2hUXaB*?qW?*o4 zcc*t}p|^K3XJF#u;$mQAW?*Kf``d!f+0)L&(1Xs-ne<;H|Idzysk5<@rGty5y&dsC zb`6c}U0wJ{Nd9s3Ki9v{Y3gD5zn<)z|J$v<9c1{YhJlHmk>P)A|5fGvN6M{W>0xT4 zA!2E3YUljd2R|DtBkzCO|Nm@u)cjvfPIk`!tNDLw{;SE$@J|Q+Plx`E)_)P43}tW`v*^34GzSZf0<(2uxzB{ z)uNVH;lqx*kg@@Q6aMou`37wxo||Z2D3oL?xhx+=cOn#v5qEbvPk<@!sR&M#o2>5F z`;#Ox!~lOmL1JQLWEfs3u&*7aU>F=Q(ErMaAqEOb-v6zIfgnTxWh&#v{q-~czY6ce zTc3~3P_UErw*v2bx%k7~pKtC0S06k3NPeHm_|NGH7y)|qKDWbHU0)Ad8l<{Adi7qn zVLA1cG;1&@QZ-LlxqpiLYLyDG6w43362EE=cyjR(U&A5@ej&ntT_5R>fNtf3SL#_}X21y5qAJcBaAZM3d~)`*U=`{EspfOl;}Qaeq}oNTZ+WOJb=$X z(9U*?BwgwJ-jKnD<{)=YM8R$I`xeYDajQ&NAbjfPOIPeSct)S!S#i0r$!Y^nmrRT4 z<_=Pdc+#IWKoW!J6MvPCFqz8b)orb)<^uHSRhmka}SksItg{DgX-TPn`R-sNaNHnt0#cEcg2erVgQG~dZ z@y08wB0Q(ZNl8>pka6TiO36@5`WSyeKw zm7iqT2fttZEdd5zDD%bXBf(%9NJ0{$1J&4_!X%T3#S5p{DFRBkgs~2=XB>SG*?_fy zdP}iv<<;wf7F_;F?})U#1btSh7)ngfxMMn!(`w1+hGnF^lHMrUIHf5V{rG!p7%Un{ zN@_vIVPtIdugsE6NX2?5H2TZ5GV^G|+}EH0;~0F~*EqW6tfdhz>MXc#^7n zHCz25r?S=~5nmI2mu69aLrYX@S8rQuR+|VXVCnw4%o^k*~o1bA6;)JshTkp^+nehxZJL#n( zojRwAfmmew_drxe>k4~CqJRSxwpZaLzAb{QP|-L{!n_b3`hz3gPzz;Xa8^=NF2fjy zoJJvmpnQzx;I?{I%ZW_dx0F?pq9$1}l8Gy&IRCGFp*Z9GtC>=2l z3zrXDRI9fvO^+soxsf=Cxni{_Pj!qKRMoFU`WScmiczA< zlgcJj)kZiaVQ!aO>w4W`Z)miO6%$9eQ|wU)v?#-`Boi&RgQgFt(n7+7@!P?qsPYw1 zqNVUgers-(XrtbsDKQRoiO!OtXU8Cv3MI^vs;WZ5@c59UiT!-^x`WEL;7v4-Tu5ZG zqGVJh&}bics!ki%bre-qmn}w2i(X#GkUA`|wx(LKTzrbj`kOGHHtb z0S3CcA^T;(&D!a1N~TLR9rHQcE86Vs-Nq6XLP9%#UxS3)a{7dX0#xbSFl%;=&aBpa zgPmnFk;T7%TcX7pwaK;<)G9O8nB%Fk>)x_ew4H-q+?W5rygZ^{k8S^uUvf$1 zbM%O4@2oDCd75KW-i00gux`7{q2-=L>V|CK)K)G^HtbXj1sme8@${Nj#tZNPthLeR zOKEMN>gV%f+G?P5p2SGNMQbVhGDB>FnJ@=32HREU^F^~g%#gDbOrwWY**&=g70TG- zZ@Foc2PR${N`uaoOijNk4+vVBoijrGyTN~cL-Z;pq}C!*lwt%+ET z@|w+PsC~`TF-s{XtYiyws!HjCwr>y%aD`$qX1T`4fIa%R?8g!XK=ehOUAPWRCz!N;d~(k>|+W}4oKrPkHT%v#Q~bJzVD z&vsxDly>=YyrJuQpT^hV&Nj|CNW{VwYX!Zt`S&d@my9^`x(d5I=w#tl68yS?%|EbG z*(jjqF~EZ%<4Kb_D%mZ-h?Ci?VxBDxXaV6F!-!0dW%X66IohC+P!XI=W>71i^(fY} zpMbDsMm0~a|H)zFrW{w-(^&RPTPd(^L3)~345Ecn-V=Fx5%cJIl)R&=fOZ&CynxRM=- zm$0%$PlnByTH}+!;9Wh>X1)kmm@P1SqFVPQG#knI*5PF)xJ!I|Wlv0gEX89t6_`S? z7Y5V>6hlG2p42FTW34UtFtNjRJrk=iO+R11A&Kc4^c=xa)c0JkckrpU44uwqb?5hA zKp5o8^p*W=UGV53il(cSbT3TJ`q4*80j^XMBu)P;B6!2tq)C(aJTY!ivT`$;pq{Am zK7H5{T<`Xj6Lb5>{%r) zEHNQn|L+2%x6zA^EJBGZOsS-6b?%T^#*GnF&e>vXg5Ct>a<$uDG5hHuT>X<`oTcL0 zFl@9-5Lpn~G@5~bs`PgQ9LKDdZ*p5UZ+%pVubc7TY+do=kFn+kek(MRc!$!2A!#qfk#?rp8RSF zg00uX(_MB^ai`=BoTfah$zZij{um{Wp%pY9pve6p^8@wH7G%8 z51dXis!sueQDOd;&uCL6CjC7zjwpU&Er9A_^ftrLBc=VUuQxJ#-r#r6*ntzMI_qkZeAUQC)2 zr`bA|v=jDY*4~sYP){!zAsW2H6$y>Rtum*1t^A`-_vOi6#M?m%`YxR->z9q0lrJF* z6J8`KCGb;XC7f=az34W61AAZY$CpG@n~n}NPWz6zeHA|q0XQmGZ?>f!>bki`H=Slh zt8lw16_hbMpW|-Z-*R|nQ-ZvmV#S5ep%g8Bdx+1$aR$Z|M#KPmCe5hB+}Qh_Z-&^-%>ZIRyfUW?x# zye31($zgZG1ovju?A6o**}#Y){gQAq*Yw^r+BKi!oH_}8A3JFtshls^tUyqAMuwh}~s+75R<0)j5juyCySEI-o0#*8*pqvE{gg>Xc zduSlDJH?Z|v=!B*R*51LgL!-{8-$|O6L_ZDO^LwzB&I?mX0SeFr83s0a+ZG5ki*ji zCpmgln3#AD^n{P=gIlRgu{hsoV9J*P1qGiH8NO2HoRc5>-q&TCX8REY{ZpEK%esCT zq40)|_J%Fe4K3L_aM^-~WN)Zgmy*{ZCqEwDn#*>eIyJR3HgkRfOI)U~4tFD@>PsY3 zeIqVmRw~0q6B)w27eAV<7ud(PBlrm8#3yNxqL{JMTQOGZuH}w}KFsQtj|D%~oX}`o z>-47t4_+2nCd@hyFMs+t-h}1s$5o46vCoNedLVHvtps`5k=5X`OkquSfDx}ab*_}s zc5KcQJ!f)-2K#(sB{sBb+dX+b?5@6M?=i7Li!FOJXH)fysop8fcAVTh#t{4tG-vkd zyE<#Euy*VV^FsWi!4>If>c{36ijjY~V&`M`=}zR$n|fVpH_x2FMGL9kG$&XP7+ zc_q{ZrzcsUeASSTm1zJtpi(9y2_p2fg_Edv0IF@AzEej~z3K1t)8kIRfzqk8W6^`-!-S#lh3N9bAHQjQVygs%*y2EO zXVM*!X1_<%gxR@PK~GIeTgl*9)!|-~M|x8#-`(5*s8OT{s)wsYEit~C0(N#c$L8OE zr<}>!@lENqtJJ^lpKH0$-@X0_x|5*B*w_*mkkqQC`Cyo>DSUYFkhPq5d*X(>yK{uk z<*c0*#UdE(8}oExiais;&##*GQmDg}JiE&hXw|l)A2=$G{js;48Fb2iZ?Otrh>q_R zsGPu8@-2#9zq7bo8^9Ow0&DRrQc^>pUfYskAOHm|8lw*%CwJrkH)3LqYD^M(G~P3T zHp0+uPI*utcIsV039N?2{;3FP;UdFr-bd@FFv3}i_)!OGc=*=4(3xEDvQYK}vad>A zzS*Ss{WV^;4>l;&$8(_p>(2F%tz8q}+gYPfeTXN+j=u{S3T302pjmiQQ=-vOI1JNe z;U=3g9?g>LQJ;vrw)r)EUgSA6d*|ON=i}>}^&&#nn3VbL6{A`DSaqgGj|WM~n*Y`< z&723HNzH%32lU}5F6lO&2akTNX+frQ&F~E2JPspN zj*kT;X+Ttjz`)7@tEe+2!5cBX6A8r-qrC`feceKUF}7& zqVNj!z_=#AaoRn#fk8JL+L6c z)CyqR#685bo@7#5&R;MvCP*&}6jw6-dv@YLi^kF21~5A-FjMc21Koaq_t&b&RjLXQ zYSg~-47m}};?|E2v!=057`l8+U~M|mxG*GNk!`}Pb1xE9;MU6Gma3|hY~1*`YoG6p z2EC6{l~eWl0X6TKWt^JYsc-zQZ>aQ!`+&)y5g6G)8IeI!Y8vVP0%9 z?zEQLxYxQ!L6Lm4TGvPapETb!1kC$$b9auQrDDIaZaaxDdaDdWAf#SZUO8vYA@CnJ@`qVu%77bUZu{;U zjr--Ig?3BXu}d+T)kR%M*vC>jm2cyHSf;LtkYjM;(-Z^T6YG zG0V9ngO30=?pO_iX9IyusR~8M`=0*ICOUp5A><0mfXQ{g{izJ`xf9O!5iI9pR}nX` zrt2sQOqdhMHxB3u_Jy0^lJk8AUBJ0NObHZ@$dlc);XrusZ@VX>`0_>n@R|{S|4_0u zCz&X?{7QggdKcfGRj=5|tmJ?eco3)NENrRnuI`UNk4v{{h^hvc=PcNhK9K?78me1p znk!tPhOG`k*6f!$LK$~d4^3}!)R~Z^5Up^)m+^8iV!y@cAi-e!3*?<2(e-Uv?#|!_ zR`6cQiIQeK?o|+vN5QxFyWeQ+2}A3VxxdcZgT#-Btgt9%XVF+|SI+hmgx*z1v}3QO z3)$Pzl`7A%JbGxmxf$(D4tdkt_4!o=hqZywZdkCYEnF$81Qc&{{G1RxGk5$^xKpEQ z`d+FTqYPV{)$xWxa-PQ_6W{xNT`kAms4P2hN(@M4Lp*^$=u;3SQA}A0O(a&>oNEZ3wg3RO+HP zGeVZp$UJxT0i8TtwFDB-oAF|V(ft6Q)B+mBw5iaa8Jf+oWz;aKtg%Ig3EelT$dSAw zMp9rbQ;$WAR{emJ^$6~0aP{eVx?wu67ZKaDY7DA;h@QxbN5Qp5T7+&KF+Ow`51Pb$VMTi-1Zn0#uRgom zK{wxw_XpF^-*uE;w;qY~)x%jwmi$psEx%27Iatps(CLvOLg^Rc9S^)494a@I_+^QF zGZtP;9G7apNN~qY8$a3UR&`_ESgo}b|NOG2D)y@j=m6sHR#V=BIj@P^{IRc9fyPqp zI*c&nMEU)^59@x4kxV`Q9~YJ=bK}7nPI~9*3i7lBNs* zCV3;Synp0kFd+8F3Fmm*SNvt(c;`}$$>c_7A>GL~$H%8_1P~~UcWxXevD-=Mb%8ME zAS83dN`i{w-t8(`xZb1dPJn6|&5Zlf#G%d`hp9*KDvTIuIg~B{TI?A$MQ7wgpCC;@ z3c08c;**(e!8c1C-@$S?uIff zaQoXTy|};=FS|w3bpq3=!Z%tPzmX-`c5FfM@Tud}fAEKWwn<+{%+XO~%A6Pfgi?5N zBJ1SZ?mzW~zzkRwIMV|;H@5j6plOqXvoEFYvTdk;>fmI%~d=ySG3na~{eM zQ|h)co=`am9TLQ_<(~~)Ib)NX#$AqK!IqTb5M_)2Ol*l_>KOqnVYIy+cn8^WK@4fn z{ARzkbgyFL|76)C1$^z$`As*$P*XSHg#97X57XcBv2bhgR&^L=g`?mP0t#?`8`>>E zA}CXa#^rn*MaM;5>f^sm!NFu|+6I~Qw0VC=Ab1v@+(saPDs*y}#9k$^F^lmrdizc2 z95J>w#s4(l^-{P)V-i38su!5x_)#n_vVCfotdh(t$*S;((xU*1^z(kf#%O(h;CDqS z^ptMH^)Kc$BQ2WfY<_dK!e;Y_;(I->#%8RXT!9+OgA8=?az}W9j{bM_+nNFT>hpO~u*;xrYps;7SINkWLH`vw= zC7+dTX`cfSrKMvay3;DGi)oX*%k6#`Z}UX4)^y6Ryc8E!G>5>2;3a)B)Ng$qaz66QoKys}_UWF)qM zr?>lZQexr4R@mC!24<$`wgMF^QV5go;4Xt)r*vHjU!fSfOu;kD0`c9Cewy2 z-Q9o3Z-b`g@cQwYv4)bXj7gW}RIXYVHPi*V^PJDmHVKyNB8?kHFgg?-p*EB`@fN6q zr>%KI)566_wg0E?YHFC}FA6Hs+>`^a1e}0ILpB|k3Q!%k$h}t&Zkt6JFvJo>$ zHSxQ}K#SQ=?}H9QGsup@&H8lvI{adnoGeRXV{(!qQMsPSJ08_Y8!^(Oe$dV&tgbQ4 zxMJ3g0zlR|RwdVUEO{f!I+~eHXWj0#5c`~e%Qt3Jm@!kXfZkyPa?uJ%;wknVA&b49 zoajp+V^Su`jIswZTuot$*?Iw1@UNojSa=~k#k}ipoY`Hr5!gET_$LquIM?{*msm|l z?sVJ9;Li|qLg8g<>HJVw?lul_-4@lj52_%OowZ{FeO$b&6d>)r3pzpowFNDX2{@px z#UQXRZjFrHaf6IDa4$dG#*@!%;a#jrooctDsIrM$$`)dz9n8`hIN|8ec}`TpD%@`2 zwOORd=Qq?`=2{^iM4oDTGcTmPh>5zSW4VjDPbLqrH8Ps9YDK-pHyJmb)BGTB*aFd#^Sw>7k-j& zL`LbX#fp!&A*)8M23k%&b{}-AWkURD?KGM00~Qy7D9ySfW)+8s*%L9 z3-5?*NyoxkMJfW}l~tkcI5yVvT{J%&6^0!q4{{1|+ob&4bj(Wup%Xhmk;ZVA;%46^ zNJ2RN_N8hs!Cd98h0Qe1+lpKr;{irGsv*{ku_f~Xp|+WZ>0Q4ZyKh8$KDb}$-=(bI zU*+#Y*53xM|CJAH;=#~5{=>GL-h73??uJ}HIx1C-^JjvfDye~ECCGM2t6O*FrTKYx zo^w!4{ZWk)oZr-yoVoGU4VI}!sSF5sY$CbboyhNn|4T^w6uY!NupsJ!>0tKLj5K-| zy#}^+CfoBy6g_@$x?!ixFK~?>f2W3QE;7LI?n(=*!o{?`HA{sZv9dx0l#!((ZK1;; zu)dtun2}qW5#7JY?2V>-NlJE14LlV|pp%-#kiG41j1iJfZ57T*z-n8+`iyOky}Xk! z&)%3-m~2S;TNNBX*;8)qQT`gkm|I0FmOQ@(c6X&T$hZA^`3}4GvOFp^#Sg1`&JHEx7uc}`f$x^u2n7b%`eEA#B|rirdc4;}N?XWwM% zcZ$O3WqN$ULbEulQixNLE{Wp7g=&DtQ(E!Dq%Zu?XTO*&FScZi9P3jW5~a!O@@SmiZk+nL9}ViLhWH5X}n=A zkteVkfeQ^i&BJR`B;}ySkRq^-RN*UGpt=qe^ozrgV)t$Dm#{VXZ4MsFLO}3lH4gMVGR z-29veM?sc3M}oNI!tj>E;|`ZR;PNc475x`JVghUWn}pE7QtbS162j*I=3l_5_#3eU z|I42H*4L~3L}^&CpuL>*T+luYhd?hYt2$=7Hi?vUm)jdtoQoy zFO&3Wmy>|gvGtcNx_gQxIK#HGO7ZhaTe92MJ$BLcyD`3FYoTww5u zsZV;%^&^LdfBOb(yYGCjw|dzR0>Al}HB#MX@WTyno&OJ31h(z1>94-`B~7o--~G1o z<$mY)wA1P5NHfI1lQC>$c(;$lSE1-*iOy5{z$c{{^!II0Y3pmf=T8ALC9bt2 zWvBi-_4bZ;7AkGz%f5bB>I*%9Xsy!VLtGnweP@ow>$OAIAGN}1I z1{{aRD~KA`6&a7LpLFv2cQ3)ph#3Y;OE}w6>NoA&H5RW%Z-;U1ajia`>MO<3lq-3X zkAm|0(n+K?rWs=uU%??%lNS~^H@cy-1CPtCP-)*rEg*W0HVM2?QrN7oNO~8C| zjCjF&rbNkZQo%Rrj0WKeJ*ttV_v06v_gMoUNuq`0Zya%O#1Nxx8ih%gC}Vg@*X(|I z805Kj2oW-6lcI*Bnrom=S|W7|w6#eeY7EKJt6kS8JGr%ZhZ2`EHBT&jXy)&f%+2z900Q=hHf zUY$@eUe7c-t)ZUcP^+~x&Ttu&Ti}`a2P>oK@3%(Rx${7k@YP?yDvb$u@F{AR`+Bu) z*^Mg|Nd~*2_Mg;QT4HliEd(pb;$_v}R~1EE=?cOtcK;9<=Bku7Y4OsA4G;Gla%I<0 zCo0K|-HxRfi`U>L90XS7uf8cm4eRiSN}h3#3THQq zNcL37Qe15ypxqL$J#g{pNr=at$ixovWlf6KNy!OYxh=FOyMw$c6CL(-6Bd4_Tfb|B zkpk`+Q8z%V_?lr|*<>yKK^@_@lv>>=TvC(&53)2IHvPg%tg?`_g`pZCbYh0#K#J*i zx6q^;>15Ws)YhEKx3*ocqJWsRBqV1tm2U_9=IBB zIlRI>jH_AsaVTz3&6>E=oOZ{dA4b~F*6%%OwQ6p;ahrA+CPuE~WJ*q6X*2ubN*d_`@h%GT}CgRseLSE3g4aOB3_G!VPsOuOny zyR9w<;*XYZ;MUaE%pv=`6@C|dpkt+k4$ynZ-t63~INro$ITz}G%x`S2@Qh~6Xcyny zVUxh`Y~zle_DF~x0rKAQ#kwldrt-*G6Fou+w_IDS^_c1_R-fh2iK{U_Ys>`Y_=~B6 zxMGY=r=E}u<4>A2%k%WZQs)<1%TJI^g6*ril9y|0$|WMT4CBv5!Oy&R#hDBv+oI=z z)NHLV`$V9fZN!bOMR)S`)cH=@k-5{iojY>@%ptW>nI1z6e&g32$aD9yrP|a69EM?UPhCLWlT{h6?SMIiZ#An!C>fzIW){49pAAPXo-e5T$@-$Et6{$ z6yW<5_~@R`C*ATlJz}RbWTVS=$)N7nGZAm@Z8`lq%jW3MK%|F!Pm8KOr7?J-MUYFF z+vJhHfI$ttCV&}NTLR1Ut{rP_Gl7;-E7&Cxug!t$n2a0RIwvM=iyoX>5E?UQtx#rt zX`;duO{gQDBc5qrHk9W_iG|43?8?ZZrIow(D~sNM3QV~cyIDxK|H9&Q5h=faJf)2i z%z&?}%T`xuPbtU>F8Wax?HNWx;?467Jq>f_k&+tx>w2{;o9Vb`LmLa*TBEzmKg?jb zSQ}od2;n#a!wl(+*7dO_B2pmarq{{gNxU|X!zCASl7p6nPN<3Vu&}WNK+|x+wo*sd z1heA?u@N=h-cS|M0>~{2#TRZ+G_jy;w0Oe_y5va)uA7m-IHf#OtGV71Wf**imu&QD z45A55I-gmVntkQk1dOIQ>O$+iPQ!*H_v~Lr`CA-M`5qZ(N~*d6rkl|w(bO;qJGtp0 zJ7po=cHtnSNmaKC-RsNMIBax^uiV=p}pVry&1jDK!FgSiw<*Tuo=f;gj{*PWND)jNMS3I{oX;e?gbAAIn85)pgZOGr&5EZlr^aZL=^6n#r~Vtr4b`Z7m>pJ=BDqy!Ft zi(^*j(HBxL`~pH0zyynFS;v+a)R5Z&2?&RhIO1_!g3JC6v_a0AkpCA08h+`BmlEsaYe0~0do{qEOg{9$jlB)&c zS&YBnA%bdr;nzB$Ir_DuC==qBB@mUD?`)bEWT=Lx^I7^jNV;}NigTt#y< zb9KMZ@Nkx+GEuZmm_kn)d}P86H{_yFT%Vn7Q|>sDV*Kha9Y>>UGOqCe4tc8Q3V`L0 zIBC}`dpyq+UD@Z6BkXKLN$(#;pX?QTV01Y>wpW^6cYEx>)S~JI*j8KKn}vl8QN462 z>7)rHE>TlTp6dol|8dY6#5At<{Z@SEi+51UzzfCI{apcJJ?eK>W~-)z4PnR=b*m(E zF$!F_n+nsh3c(%pL0-f6G`#*%My@88$N7!c2Y!#T z03JFjO*>a~*^_zw_TvSeTKor5(3Ib+c>NK^Tfe$&xL4g8Bz)2fI6P%(Qh|57n1nMw{`S&I9ISFsI~jiFv$sl6?W z&Ndmy+je@4KDl5uxE*`xQ3ly7M`sIBG|R6bV+Pl~s4we%cAXoQ=kx}^;A*j#ehG6L zV0im$<9rmN^-(>w_w1F>Tg{na-f;PnG4$8sc>4;;rm+(ty_UDh^>Cg2Wo+$wd?Zjk zS)*)b2!G${5dgCfKT}S)?t7$ibC=6=sZxryPGCwAS9+*YUFfU2jyB9onA~5p_z=(*5B=+-%qkW#!*zl_OpgD=$RkHVG>8eVj;`DYC#6 z_V2%q!Tn93_Jyl2k!{~G11b<$p1J-^WaEV_O1TnP4ZP?V>Pw!T-DEf=Y9}2s?};y) zLwe^G4mCXquzD*}4D`ND@+RMJvzSSb$=V4t$8S4qI^T;!hDzez_ESx}dO08WOrBet z|A(sBA{8b}_6o5r6KDX!u~|8t!wELx)ss2R?S$_L(IfO_G4gCR2oiGJWMN-{3PT)Cq|a&y>$NgWhK;xsseJTjtlW%rquM$Rys2+MBkK>4~E--8V*vuN{H$3gtTFLuBDqTFI zu;#BWP*)zSP~%|f*8*MOI2LK8vb*9~WR8#|{U(>I8#QIBS3d;{9d~(^x+aC{4GU3n z?eWlQPgABgLf|~H0W0Bnil(@}-tx--82z*E?~KZ@Lhf~I?YPa`*+cOdSWtr|i znri?%jGdE0YPN^bIH1Y2%SKKa8+pI6?c}6&dIPIORe?xLw8V;eLVo!DCbs;oYOiR1 zs`1cCx8svd$llL#xW95vTH9B5NNe{0WA7W{1X-Fmr>$w*wr$(CZQIkfZQHgrZQHiZ z*`D{_ci-Dy_FBKph|0*Q%;3M+`mPRj%-&+>VN;(n0jtSydaI?*qJLbOS(v-NqrJ95 z8yEUK_1X!D7pZ55nbxY+1)U?fygvn%aLZ?Xd;K@ec)y63su0^PnsNJ9EY=)^ZDp}` zD?eqjIr>F@{ZmOXySbv%RLm2Lop*6O=8&xY+VViM$re5k)O#ZilH+9DBGV5+SDZo1 z*LDyJ{$1X%qbZszPwxA|da1032&HRgGF(4nMiPky*rHr#w{-G4pg5YAYSo#;QU4?E zR+50OzwnND5#AXB7#Q%o3#xZH^4I%iP0cDsUdMk?2`+L#m$P^Nay7MrzQAF(Rb`l` z*_BSPurEM!P*Y|=8x0>pfK3KMe?X78o{b1(EH0-91;mu{H4>jfL;~19V5q0>yr1ti zfL+_Z3KYV)i3=;Bk++2*tMPNO2J{Y#`u7vDhy{Pgp_zMQ=e>6|XnF&Hq zPeNS;g=9s&QSkjiP~wPGEFE%N4XYFLMNGxiOV7t0mr^94HOd{6JQzHM z^ksm8u@ssI3qCwpc&;UDFts0d3|noB+t@QHga90Rge|${FdfG+H^G7P;EMy8V-tVo z+j1JhFMRH_m~rfN9TvA2a<^%<<17b`;H!zAaF6?0)GB93NUa=+z{F9>pTX;P?=NqJ z;Vz={br;2o@u+-*LzWfurus87AdAOkP#N+4ESWXHzO45$akgZuYkoQW%Qut-lQP0q)B5HhtJ^PlBA$18PJ=p=(Vnx;N?w- z(7WbWoHbR2eK%_S1r)3Zs6eoWlBsb>xbY7)<_4uQLrZXG@QF>}9T>*T)-|KOz>G1~ zq#=w$Xr-vsJ^(>|N&YVQ#b)QEmY3e#Oe6mx>MR2{l)G>~NU&a5fD?2LF2xC(SgP>aw(qpEu}e=DA~1NB1P}b3@J65gS)}27 z{#aeQu*6*@9GCAPVh6)MZ%$@fwzpet|Oy7WoVFpAI zj~@+P)DVOW+19oDUmP|oHq35^9{_3OwX|t-n#qoy662aJ^e0a6vO(I;wiYjO5LN(W z6q6PlHDc6xn6`0E4c<{bj~*YRDP9#@8vD#N#D72R9#T6XP*zRxkE5}M0jU*jN%`d= zbryy!Z=T1iTNMbgN_;Lw>%YP&73q}s_4GEA!>GWjpaO8}aS8)oG9D{Z<*J*w zAlT%F&AL$@&#g;tCwkBW;pOwQbvJAayp^4m+yNQKIK;)%iMhv-4 zfiRkwY)STS;G`Y_L8DD7u*kV-+4G-9QnFDMm=>_yBp5q~UV_V^32oMZ%GqluKU7rK zw{+BFq`f16+GA;{d;KLkg|BmbM=5Z>ws(iQyaQ+=)tGMkXY-}>WbHw!dz6jQAQ!Mjb| zSmkqDR=gagbO}$bj!`$SF3Iaw)-e<=i7Lz5OBQw&(WV8Za=Nffe1)x+Cdpv zP7Tn?U{dh(df2$TJFVfigaWp0wf!;DNqYK_-gKm1DBPJ=!_9N!! z$CLYlrZ85fAZ>8J?XuERcR8|tAwzq1+-QmP(WI1ZCJ3Zoqj@qTnp9+jO*tL zVFI5pJ^p~Vlct(S0Szq*uG>C3FM^RjON4ft#~f+dRDm$0hhDW(?i1g$Wd4?o_HSX9>SU=mb_pwu1&z*2Z(Eh&AfKYR=`1HcZ!FfxH~5icb3O zExV(~H++qcmeBC}#r!-cT;b_yeQa*HE#p1CI5j9Z^3O2`sA;Nb}W%3FZVl}RtFq-J31OTgz=qa)5rhERYugZ?8Ie7*R+AakN zeD8>ftRm-ghb79s_8lmp4n48f2ddD)_TmUC$-@x|^0QyAlhlFyIeIs(`M!Z>e}5m*E7=bY;Liw58^7 z-@LRzGW=m@I<<2xdQN6K2CGy_5Iq=WE0|>(EjY;|y_LM}-Yf}=TT;yyYPR|&q+gNH z=JA;LwJjODL$A0ZFNUV)i5(|^!}}-^2F$|V?Jr(5O|^upnNTf+>$nAUsXtdTj|#|g zKz~N@*iH?h@WWjK>gOPyIxPY!d6*1YGOO?`g*ac^h8QYf?HoLA zMlk`|e2SPHMboLfcZ{OFR6n;Q?=NqAbuowfRy=CcempAMF@zaU-HpJ!WlROyjv9+Z zOU1zAV9b+x9)5NNk+p_Sh<)$;2$m##gn)@1UqCh1cNI(HB+`;Yg+nhdPk=S^iJ32% zp1i9wC>4=k+N3sfJY_j!t*)VZjHJi(D(w$S=|-qtnqh*dlPwmHG!$rXd!nEBaJ1$+ zUN1nySTsDz@Z_nzb~?ZTW}28&rvplB?nczRxp{XAXMVSCw8LC8zYXWsVWS>aJw||*deIPm8;wpXU&RhM zu3t-7X`Ow>P0~X7SdLT!kwT z0ZkE)FNUkb;Tv+V5v-a7d-P92c!RlTt=FiS2mU;xz9!usnh9a++O%fItUT&Q4Xf+8 z$0Vi}6o1wiLdaMYdw4nN=K$||>qaUwyFk+*%3E`|UKP-R&k{(@HysqOb)L$4saeUJCahzI-zfb0A4X)Q4 z?h!25(kP66M#{PM1`kCK+OD;AsOjmP-|7R&_3bGgYr zNoko%0a>O+gg9xajx{#Jba2|@2=2o=Z)w+nq{&coU?fJiR(WRh_rT^^G&b*T5Z z6xYD7zOq1(V0iN{^rG62wjQG0Eee^oqvICQw>)0H6yBShwvNF5`~6fM|B5(JNFvyL zX%IWkv9m&cS1ybxRBc-vMdc>%22b&BXfQSxHI2(V1{#C8{Po^IEH8By3b(=-ndgVUpjwpeX2C(VH-@=|$f;}}nGmBMM67)ilyV%u{kbj$d;48jPZIIHQnkAen zv0%C4yQ;I`3>tsc*5=kcH%RUEBLhVsaT<42=;~?PKLFcCX^N(o-wys5wlnt1;m`xK zVS4Rc`ty)Mk>F$`?2ALu?70@!N#Ey>*xPk~0Qtk~;Cs7RwoNLV{+x7`jTZVz+oP@) z5{Fu!JxG*yqzy~oIP_-3=_KZ3emc>n^7+vN`RFW@4bBqeV)ooXGa$MaUEo9za~J3( zDvN)K4_a@uz|rY%t4kAj*HF>D%c;ZA?-OlG{L#^T5nJI=k+ocmU$6&YB_7Ea{Q*R` z9-lU`cHZ0(>P+FXC&2sHbgPZT&dcI-FtT0MEH%Up!Z0gqAY>ZbQ3+qm z%j(X%Pdzfjb*=(<3E7wmYFCWduHwTzCWn0xtUwLG6IZ%Zs1vKN%Ep>s^Vht3fp?#i zla;r3^%5mAAPFZ^M|W*h{EqjwCVP%<*ut4(#B0mJBd<*l+Jg8- z9@J~(?S}9sN|HqfwBJ+Tr&rx#*YDYnb#kiH82D}GBk_quTKXV9g(^863gDkpPK#gM#61nW3bZ*U!y^a#Y!_ZZskF(|Q@v(O5bPO-@8U-=7e4{=??q zCtQ_$Z8-!SG^U_``LN!bt4_J>-fTIm`%6YC4vPf}19>HOOxJcyccCS&J1FOh*c%IA zd%uVy))JJ~Xfb*pK2NW{7Aqv8gG~-8)cWZQmKeOfkP1abg2KBlRcggo5rBtdcA638 z)(I_C0&q(mtUy8Xl056`nrQJzibuNa*QYP7_#b!44mqYc^92gete1}uHkvatTmLMq z{Z&_2eQlY^El8zsnC|OUjKqx*pKD=RB!?)sqf1XGR2MnWYOuoOm`vc1AD zS}Hb?ZdmeP~mRM*eu*DH$(pi7s&{&u*` zfVXeMNfnY+k?R!lI4`Vb_GAnP=SraqYAPS`PlV%z1kSGW^HF+*DiR4C{BIbuxN5EJ!T$#IzgA=vEGgY<8|Qyo5h9Ab4(d3 zvUALDCh`d?D%=n=J<$M@p2SHQW2}@03?>OVRf9wSN52LXV7;(^tEh>~d?3P#qOWlh z3&mUt>fxxMD3qGCOS-BULux!yZ}q9UP^X_pB?h_YKY*GWWPH6GC8;6LLn{TC@6_|i zfJ3F)@={CsVI@_=?{A!o%8XU=g((pu^{M8|y0f%@FfW#jX=f+~W4(*~Pa!stgIBE7 zi_{Y_UPG})F%wW_%R>?WTXhZ!;D>loobK<7<$5sFC=uqAc$MubrM}h0-y@9gHT7VR zA_a+(UAo>GRpklNatdo5ab=$!szt-?Pi58fQWG$538<^f=SrrXY2N5>e=br zJ`K(@W-Jt*l<#TF9nKz=`@VJQ8s57|gi|1Y15V!oE7Hgxt_r(|3!VurIXyTzYu!-T zEIvP&FKP+N7F9?|k8OsRFnA|^mHZlSgU0V09rQ48XzkR040HMqv**PC+>R6(SIis> z_;F>;FFTO!_xiIfRZaM&7af_3sQjNRt;uhoE!m-x;^HkFzl-1R=#ymr!Z`m;ccTDq zO@Q3`ID}s?1c``iVboT>drFB!pmtKTz37Z**)|bzbCil3UOJ0vV4Ztimx3p7p1Lgd zP=a}i7xE?fADYn18{Ccz1rH7X=Z`y=SjpiQSi(7XuPTP0KwRqlPdjhB=}z74D&~&t zE%*nbb3L$%f`w53#oYD@caFaDJAl(9Hbh4GAFg9!0%FPjQ^c5Gy?j@+BCS@YqasO>W~<2W1do1Fs0D#QSS%*pGY9TVUX^SN+US_*`r=Y zVLmB}=|=q^^?!Ga91bpFOfi?{>|ceRM*0hrG#`v?@=p}euY~V=xU64$sp7wdPKtl2 zNnxs_{>w2N@b7StvwWF<*xg9Me^X<$R?|=Z=X-Sf|IGit*#9pS&JI)M)X5`!Za~+j z9wY1lXM9l+^Z-HpUk$|+&`T6AS~hD06PTMCbEuzbJeChPM;Bc~x1B!Z+W#(s!EoEs z%F~G8wa8S(NJt1vu&{Bc&z+{|vS9y1lSb1b-8b2P;C4lXn=!%spasN?81^sWRl?pJ zC6CKD8;xkA>D153hx2;&#Ism3wnjTT$JqX)uI&7;H-uM{PrOAN4p1#gc25A8VdNo& z(#!%#?ky70EgLKm3~a*l(nBkO!q~*n$dTdU4<2fqXQH{0HTQKB6Eft8&P)gpuf&Ra zgt+gnZFY5WGZn?TCkAB$X30XNFJXnO1xiaJ3Pva)l^n?O4el7!7G}l z*fYXKiwrmvZWPY0qsH1cvnIf|GlvRrEgH^&cPrJy|L^?RsUu0S}Msmq_Nw9=D zu;FDFdqk$z zR-~z#T9Mm@4wh-DkxjTcx-fqjc1D!F<$6p~$~8yZ9O#VP0qj3ipv|Nmw_+oY7Yj)*m8-yO77#E&8|P% z-rimtHJMhnl6B#b=#mS=`noqkM8bEkfY7U5E=^kyHzPJBWIeoI2^Ej=3`a2@RaC<9 zN;2|RP*Oa;Y8)Ijwj?8;lMdY^LG-?zsc`}h-LXPy7Rwb`KcuDHj3Xvt%KhVIWtcLm zA><^TKFG$hjCd;Si6j)9S=n2(C9Sa+Fx{t&PRD2o{?)I0!JQgA)+2pnozh1TvmMnj z%Grr`P9vzUQREiWwV;P{=M50CII}_*9m&g2+_|$qowBDFp(fKV3H)VgFeBs%D5|5R zhbHWp(-#%=HA^tf^9j}FMOjf&?82`ehgJj)zJeel3P}l%dNo*CV<*VnAEa zyv!})>H>Kk85t)k#Jq&Y1@_WwD-~UP%^&*K6!$vHd>%=bA9VW)e3DLIjpOiL!*#5j z$Lsd4{5!-TfKJE%K@{Fp5zy%=)Cu}$z&zb(MhtN(^PIQATaO!~=4H=vYIWvMbw)$l zTMAU@WO7u2u=k5nm?q)(|8rD)8_aURBH2nf8h&J?|K0Q3Fo094;XT;n-^JMf;vL?c zfPa@H&*CEk{(H~2MEpus>fUTdP5#F;@e>vOzQ|)>%HaOBFuJvYyKf2^5;N}Bts(T= z{=Kb1!M&cujgf35f(bnzRV@Mx*|KWDRfbJ>H2Z1YB2KCdxItG*s7Kt6(TIayge~&my!5v5M5{KlZ5muWONWK%YJg?Jqp>o8-oW zk$2Q>1+~iG#>>kZ{EJpX_^|Y9=^qlUn3#}+R}Mjm{o=%4X?GRl^=iF&9lM{HbS`%* zlf++wFWPytR7Csw{6)rmg#Q`0B{99n8ejFAS3}aT1e7DrKBDBR<`cgaN}`hJ>62D& z5&t{dDfxHCr6^qJGL_<s4HR(YN{bw!f(E;XMrj6}b2$%mO|8EdW z(ZA*umZtK`zYa+@_+Rr1{w81JUlCw^n^)ng6%?0Gzo1XMB)pg0isnyuk*z+kwW8)M z3HNunHWqX`K64$k^tV-rnjkGRLUz7>lRhB8YvIofFdv$x-WZ|Im_Ja6pA6o(&X92OmFVdbeogclx>+@K;>i}OXrso4m zaYNB>H0Puo9~DT*u{5ikqv?zQ09N;5^=~e2b!o~)kwon(SAk4OXlqCqJoxk~R+mcP zaB;O}O&46}Ge063fiewRF{;+5;8-wEBB_`@1%-5%vN0<%5#GuZMLN_Di<_%RzQ2w? ztq-ECRZqp5&N_fd4MAI=si9Tj7<>e1j&UiNj012e3u&v%dvb*Jdh>|3Id>pMPG4a& zrqGoMba~S{d{1dWBdW-}wZi_Rf_ayTq~6?iRE*lYbAB7&0+kL$-ne#QHD%e!27dWoxFsn zr1Wb`sMKlGR2hw#a}0m_LAa#}KD~><7&DC;pyWoD&fLRbdXC~V3%)my8WA(4h0kz0 zJb2w)p1Hh{?B)~^l6~`+dn7etNhbCWQ=88XYKf|?>L4JVuG-J#s3h*s`I4pE-7P1w zMn~g4*Cxg;d;Z>w+GIAJ>|Qdv!;`UcEYlRx3u>*`7nO=53m~-hx_JdARvaR&@mK0E zG2NiqmSwwmIkIm=KB??E+bo*NJud@ucX#q8uQ9G-U+-{sKL&hbj~K7KZI0qw8m10= zH*0iJERq6LESm{}^?DwlZ#zI-?o7_PR3$8MhMvD3|I^>=<;gB>io`^*0WtNA2FqY^ zew>?(nVy?}=;`<4dl50PViAG}1#|tMGSA6M!{fY}UFM7Rv@B`r@2Y|vX=^M-={HqW zv~?TWYNncNofI+KOEm$E16&3qJfYD$kzg+)g)Vg$B1>ALptxM5rA*%FUy``M$uB>PSmcd(bb)oNnsAAS#PtfjK( z+G76a?Z+iVuX-B-cBX&k{!5nt{g9JV?hDhmws!S~2bqKmITxX~i~# zd!|O12!yE%E2V>l(2S_@M~e_y7) zi_3nh_S1tVs$I!d6TKEkCQ5s3!RZJNbB+sJHFb5`NFhwk;=z}57-XHvuL1_u5}cA2 z6|;iE!-d1N9vAsf1V?fNmPrZO>sZ*PpRb5a%JaKd5}7Q_6?GvncFyK$N^dQysx6;a zk3~E&4>i%|dwpbf_Emm6S9j&VuZBR|NuUJ%jG116EyE786c^DqY%Wl2majCq-XTen z=Aqq$%=TCI#ts<&XYw_1=zh294}&=OQ#!>%u#}lWuko4?;#cc#P_S9u2AE}wIBMeK$^TcEA7F5p8D{~n=_e|q0sMhap-RFVV9Vhn;q9f_nAqqgP4iPcW-8iQ)UiI zDEcw%Z1E^}?*7{mhcY8CEYC$epE&qS zN_CEPbLCvPvNeHxC(+6Cgpi=Y_6Sc; z46j4TCGXe9U!_CxfQe&6qxVshaThswrNn{lzg>uCFh0V#(EcAyVKcJ5P!(Xe=TI;9 zVt#c&_C0?HCChDykH`8J1eDt2j4VuKRQK9Knpia~_^@Y|QFgfixZlKW7#n=QNIDY4 zr9i#(ZBkS*hA!)@0<XKZ<(waRopk}!lsIdpkCJe$W{mWe*N@7ifOR?sFB?0VR)|$Q zLWyQ<82Ja7WOB45J(`};r2F$zC#pT$dW{Y3(aqvDG203WZuvycNeP*JB4yWv-CH;A zj|`83wya3Tl0z5wqRdsTI#;HL0us-81WiHZjPUg+_x?5wFT*(9b!&}hm5$Hrl!Zl` zN+Rlc1|%E=y;-1;w;e*~mEN^E?R-NK*<#$&gH8jut(X z`L2G7C>JW+ISD`&w+HYy?q6P1^OobgX9d`oWnt|f)?6NaW3fegWs@!T zUrCO>yAq<>Ni#GcX0ir3)JONagpHJU3od2$2slp6%v#jVS$Bd?xI;(scN<{j7jIn1 z)l7457?Whic>(iWDU+F8t&vB5BbM%>^Y>63O3r0`kL-_5iFxyJfgR&fB$=Zvp3RyI zDKYN3lQzO#a&}I{<);wNDaJt+n zg>^{*dw`zJw}oe3VPi=q^jNyW(z8hcn;=hEzjdf_46;}~eXXM&#uXEu)4VE;gHfi(YlnxZ?FZtv%mA!?4%(OS+I%jd=!v@b(pV#DQT zHv-8kBprN~gbR%Sp04KTjhAQC5uY_iRy6FNBryXA8Bg=g)$A`Nq8TO!1&3#j!;D_q_--xQnsWPi!UyR6Z{7&f3N z3ZpnM-a-h78&rJDY%Q1%mN0RUM;vsVm?gUI>X$i3E?y#2-HSqA%}0a>*y_5V`IpZE z*QH+H{wPLJ*md89djTY_A8}j>C#wvcM6^E#7zYw&6?SI!WZdIW0ghRNrYtQImUh_L z_ioy}_?*$}z82mU-uMJixqa`SIQP}6$``atk?DGJJP}Ef=|-!pUOHZ)7vPL=5};oW z0-%AyD|u7!%)edU-#y)4(6+wbhj37j{{>kBdJ&~5vOJ2$d_iv3{dCkQ{?Wc{TtHdI zG9{JmWKXw-fM}P3RYk$Qn*V(Kzf_*S`^i?%GQm>q|S#lhG9NpYZ@fk%02mRzRvNc+fKPQdFQ)V?T@4@@a>-)neiZ;`za`@RXrm2@(xincI1S>Z zbTiGbZO5rDR@PByzcjjpUPlh%=WI`%?0fgAu4!)CXRL;YKwq|*3m&`BMd;x5F~zy> zN_9Tq&>!$*KLIlq70S%gPs}$t?RqaCUkA=^Ai}XQEEwN4lsOIS*Ceq`A}0NY!?YQ3 zsPxM)vF!IZtm3lO5T>s0`|~dzAEg>&g~=n^1r^``zDY8GTP4f$0}WhWLWcOaaQa^< zgp}x7L8XGbI@L~LEEe0DBhaDspAhxW&pZ6a={Pz&WYR#8@y&`3`vH#!D3mJ)Zl&_9 zYVlg@*D`8AA0*0kHG^%QrK<1S&~XX}Yg>VdZLWUPmJUNbe$vqabJg7`E!u1|>q?1+C~Fg&Rjota_?GVFi^Q0Nyp zoZln-N+W&Jqp@t>zw`Ad;qeOUlN!a1@&69UGzK(MnyLpR^ZcG1+N(lP3tu2m!DmA} zsi^+XgbY4CAQ5B13O<>aOqXe~H3#jL?I_>F6Y1yeKnMBwzdQg4>`=hbFq0HDK@iS) z@1%=@D$LHBh38dqo0lI#0s@+2ub@2P)lgwGatt4T|ER(#vn#~?%Z^VTUW}EZq#2TE z>Cm6vu2l;rq-z!T2)K4|Ou#l^WHf_BxjWWGSBeBmks4N4!J$7O)XocDT&U3{h~%k( zzRu$y)WUnT}bqoctXzr8Ax*7W{m{4XY z(Bdt@YX#6LN)ix#{v$OwKLWhiIR*AZWxRs<&#SfMxU{tWJ`j@x-H8Hrg=6xOV)Ej- zbQ4XgbgOK$Cr)_ou@!w?!K8WhdAb894#a#zs$k}O?rNZr%N=wYa*t9J`*~KSb1`(u2`kNFYcF5#3xcj zwkRU-kA_1g{6J6YUw{%9{zqW{FD9Cc5OeI}romWZjunXA+>*McvXU7RkhmU(2Yr4) zbdxThvRl2M$T}k8JFC__l2(Z!L&?4XVMfysWckRqHd16gO8T_p3&#zdixZbze_F9r4R5qb5lg^Q;-qoXZUL@i(uZk{S^X9`l! zzhGURDz+k~tN|>js4uT1co9`+qpU9$MzfSmh?HSaERgB>e9UQ3{PY|%Tz8W_4m1g_ zg(~nlr$#$P+eT1p7jgy3gN0j&?T#M6wEd% zCvT&iWpJ1iH)deWK%aF-leR#Qku-ZrHoglM$V;9plxwd?6PnYO7J(NHLrdp0v3@ps zL5KfMBBEjNv4H0aFCjY=NRV(^D;beVli*-e$Vpv_mzxz9V5Q8BE8X};NLXg&HlzH%Nx{jeA+uWbl< zGdWL74yMVMNKvDV(0Y+=bk9rmM9f`9zcLP%j)wN42C^}C!|khnhV>sTTgA%AW>TQ& zsr%O3q1$$&4f$7`$!+hkw>b^``+%fohJa#mldFnb_d@k$G7Xk@(WdXdv`N@ID`7vk zC$NxXA@}`#ZgG1N;nTpL4@BH8+lq^fgwqOzbqZLR=qK_z3Rnu^RO~^_JiDZK_YAQd zB`+0gN9FvwdbS}<>2ONR#OpH3hJbR?m}$nzBbB3gxp9~&|F5&N4?Bxfk>j=!V6>bN z7#JM&#M7#Yy-PKV5YJFlR(whI?QkWJGzzO#esyrcq|t?g?blhCCaz|exF)}7m3@I> zhNe{GQdsgf%q8eN^$Z!JPSWBb1!DQ6ruKHGqP_!%OI#_xvWlFDat!!#8!!0^HiFS2 z@+y;+r{|jp1+=PCXYcqj`kWUp1?i;A()asL2I%SuSPO^;Dcm3nBV~20<0_QXHBn^0 zWvbs?6dQf^`2BNirOg#1Vn$wZlwGzq;uRL$4U)fcX-_f!=zAk06U)qMaMr9Sm`oWP zm&-?u21%VWhE5Z!@0Jr0Qt0Hk!Ts8_Bd%FgcOKa%HBOigS1u^8F873XK0z|2#LSj1 zGm-S~sTLrAwq;mdC|RPjp>x;0F<8IxQWP9s?sJ(OiRd>auF^s0(%CC56@QBw2>%&8 zjWrNnIF_kImMxIa_aUo2tz@yd?4NT5ASuq58oT>CBwuYc3sH=ol%%f1jtPdUx+m#a z@By*F1EM(#(=p>?1oF(Ks!4nnZ|1NDT7t5FD|{=)+lqATDzMt8?^ZPtLzpFzS2$F* z`?UMuKMA|{_La?l`u6rF@)~8G*+J*mJWQy#zkf$g3006Ffsr)aSC*7ibc>VCn0a-86yBv8UN0H!YsrXH#YhN;rsz5@7E*WzLCk zD(x(?P53L#kdPXaq!>GTEVXx8Yu{7TnNlXI4+gg{HW!Sq#|~j{V#o^vhmGQo5IjR%Jnb(6-jL>>1btT_59#O zh*U={{${3Bjn4yFDb4-N()vulE9XF7;8)?VL3MR50-C7`FTLM+oVPZEmfdkH^{i^; z=JH(oFwvH0sl0PAjiN_!V^|V_<$zU!Qvn|+q2rLl+XoKF2jHrQWIw1JK<-h&e5l&< zQWiRpL1QeR!CQvrO6|TV?>}I~e53Y3{0QV5P)yqnIoYB~YrX0;ceQ7YFC8U6l12U1 zBggpTSZdgfx$z1TWlF^sWl%QJ7oqpds})--tIN(}yS$RP$v_eZ&k1W@MAK#bsB_U8lw4txYX`2T%pbf)MVts6kg&A_ zv~em{jqH`4-!iTAsQd*P88vrHnlcd*Hbc}mb4xZX7}U8p{kr*Sp{B7+CNvu&gbC>z zHunvnK1Jz8tf*_uE68O1Tsx&2i9O-*rli{B}&i-sfH_=9WlGQ zjZKsKUZ6Od zH!YL+3q`}!#V;jWfZ-{(I7?0&89nf-U7n}`;+WLO00RncDI|xA7(%EY2pzltHaNE^ zX-biJI!Dw58fRg~hCa~RiI0JNChOoD0^#GNL#PrCpd*Mw?nQqy}Gs>g1$j zJ2{*!+V7P=u9|7yL(E1um{92&$AA`XDsOk9Cwm$eZ#ed47P&bNiY)cUc$Z8w7fR%g&#$RUlv??;AG$Ej?w*}1 zmLhV64p0#y^bw%K^}m{T8AoaficsV-N6WW2c@a`gilqDWO4C(iKRWJz#tS`{ws{qL z+6pUL_cVx(syInlG%cMC0=09doAI+VW=&Ru27->?26BYcX*XTbFq@6qNIuO8(G~CE zN=6spDfF{FV{p+`IDtw_XRC59?j}pX_FW!GrF0OGM|aPa!oSkasg^4OKH|ba3{cz> zviXeWB`2!uXDv|Pd5mq}7`b|n=ueJ^wPN+b5PO@f?NZBosx--wgBh#@yr))n+*q;U zgsJ1}S)4v7Nk^A=RT}D%?2+{i=-WEiBkGb+LK49w3?T{cXipR5VNo=ge@-0Th2IIe z0cHJ3Q1dIQ-ci(o4V$!7|7S;3jOcX3Q&(Ltok(0Fv`O zi#Qt_VQ-}yJ)^d)OU`l7TfTzBcVIv^OOS;^@=&3)@Gy#s9PI>JPV6rU>2IsMiaZO( z+T9m7Q|{`I&zGlGEQ>Y+w5?9aev3Ay*4@D0IAv6pEZZ1o`1N5a0L>T?M`~|V)m(SA zKilk(5L%4B@Qbn_4 zJAb9GT|3Xs#6UqHZRxCeJd>9U1ZJla^v4|px&k>;I65Zp62LEdUqQrK6I>8=51X1{ z*E++>eDB#HjI z#=fzX91LreD97TrZK04`AieCE^C7S*;x4{g;!^jok_{UM;^1U z+6>Idy$YWXWZkWXxP3F`EkAov8DD7A$G1#RudJ-2f#xIqTPrO>yE9^)<|d`#8rmDp zjFc>4k1lJ~iym@IXmM%I!wELR?2aEq@v>pDhk+%8#YRSL)$Swx_z4x%SXbe~{f3{= z)Y8_>%7QS=Ibw8Y7MPH(#00x~zJk_@18PY*yp&DHHV-f0l($-4W5g4sa~q8LTSReT zTg~E{5v{O|8;@XNz-yS!^SdnOVFUAs@=!WWj>v-tX7=?Yv}a>i#dmjs)@|mp)N{AH zHV3cgT2GpI=%J=5mFkGyoFtMN3lfmVvb!8MlDHE7zIe!?UG znk#cNE2VQ(QYmR~>)T#p?n|30x|NPa1wRC9{bVF(QYSQonm7+U%FU&cq0}3GH-Ez>|(l5SAIi1a(482hU8>^<6CNb>{jWB1(Yh(+5@#b$)Ak zr(y&s=% zDHciS2+C(dYxRGH(G~McJ+Lg`l=61FVDjT?x?0s(^sie4OyfoedUU|rBZ=31qo;T)R z-#5}7Npydf9H(=+Ds4_B!{Tb_NiVjKTJ3S5n!9tPcE-im*%{SiR!Bh^x#nE}RSC|^ zoj!<}E*~5e71`32<7-4F0#QF_qMsI+*F9w4p*S?N*A`M0V+f{$;VnB5??kT8g@ZLu2( z6MG8S(`|_g!Pzsj)SV7(nnk$Nnz+l~OXj9ij;H~`xomNhq@(9&4tp@NI3lxqY$(&h zvdTMM?*C!$t)l7(nzqqEaCZpq?gZE1PH^|&8r#TEe zZqD6zIeU6nSJzbcbk$Q&PuA>fY5Zg65WX|JxK;5*V7j5-*zW6^J*w2#)q$M@SUc9n zR7!DKF2j|T!*iQ$oj^xcGc(%>VjqE`-!H|+m1n2h-O3l%qjSi{-X*SI-C@sM98JLQ zZRfM)fjWY>U%$3xphdP<;;ko)Hk+ln5>jV$CpWX2$vvvy6cgk{{V8amTmGqijy8P( z7ggIXWPlBM(9|gY#3miH`BwBk*EJ-Dl80+loPijc%T&X^PQqyJe%ghVIplkJtI9riDmJWy;BNzn>T&g?>=4J zf?wx^kC*r4n7c?A%KcqGPBz4_4&|n*cIddIGvbWT5%y@G zKvB3HlM1)wj$2?XHshuP{FEpGol zrc*dGQmW!T7@?M;)c78s1pBqw(NEO8d8*hp(n)mtg@w`vA(@5)vk^rEL;Gy-lPGB4 zxW+Xn)@@0F@UH_uLvzHrQZz{{Eb5r55Lbc33bSWhCGRTuCeGKucic}+&&((q1aV^- zx9b=YN`9ZuBo*))k!%S(53}2;Yu*PXhE7c{xHY!>i%>3U?#rdjm>o((eO+>DW3D)2 z40@qjpPZhJzNl+9O})cLV^z^iH`Do2iH=J%L%_S<^BsXSy+7XXG-Ex(x(8^t*x(vg z`r3$}KR_Yli}<95`6)XtT}i}ugJ3%Xjic?povXU)fGx(V^3^7qb5g^LyhsA44P#2)>PM`ULf ztYGq8tr22~6UR%ENFvDL;j7s0BjOG}6^Y{yky&wJ+%qGDl|t|)9wKgc%BzxoE;7we zml;Kj6<4N5PoCHww);4pc<@5C7bd%3)JzFdjxq?T^mWwJZZ2_^K7d%qig z_o^35ag$BYuF?r(rz|Nc9iC|cw~_lRfds1?Pg#@OEw5>?Vf|9a7$hBe6CqT}m4w~d zf;yN^>Al!HnAfN1pIld%0^B!3J4 z%oIy!mT3OWiQ@wo{?M^irwkrck(X~<48dPkm0e+=Z$fZ?>9Dloh7Y2IcR}%8&U=+a%{hNj`5RecwCa8|){h&LappN+63{u4KqhJ?EHMVmNm|< zR1CzepDu!OXR$*3xgy+EdJ6O- zdzLtT>GDbf`3b`z^Ju266_}sn(ZtN3;K=R;kpSPRXj+!o{7n@652@+&;tP?5jI6bj zJi~Pghkm*dJiY9Ba_8fW1u6W$ScX; zyRrP8etWwenP-7Nb|o;%O^VemoOjBXuK)N6SbrTykDDbapPuIo=JXWBadF}?R zibKj%ibjbYHyutY(!mTb84E&M>wlmFxv-GUlD~g|R8X41pgr{|Tr(ppjnJUsr5M$j zrWw-+|9cj|d|ap69jOtl5sRcT&KupjFWW)!80!*P# zDO~Dv4O)~i7hfQSrVgp@MEykOL~A#9j25{;bsD&tb5BUM#Pg#^i23^#tL>%rDDp_t zGK)#%KM7E=01Gjwp{7+%Y2|ptqzBRJWS*AN&;?zzmmRY3C}L~(JhrBpewZOpl!&ecQ568(b^@PPqX&Z|KqB^z3!#+m6=?jr)Uy~}bE?D2CbN&B%n zX|LK{8|>Lv@UwoKVZeB_o`wwWht%Id?dG#*SZ{#fn&dtzB$ka@KVCx9`9-mapj z+y#LiN!-CjI#tD>Xm6>P8PJ6Uz+N>!VtzS*4wvq3azx?w_-Vb$PTb*ek-WU7$9K%L-SQ+U18{z8G>B%VPYSU2LHsa%z-v z5w&!P$k66McYd2h19t2){FI4JRxX3g<4immJG!vk3!;9sh##g8;v+zyH!jW#M$Nbg zq&ZeAp`sy7{|C)a_xlTT4y3YVG=8H3W9%f@N@a?KfyvikSk%YF!A-Da{T|Ci%;19 z=o8!Yg4hWMfIF?(d4B&4>JJ@|NR}`3ZUr@ED4F=Kh1wB6v2JEUJ&0pM3n3hmbmzTd=W4poc|rr|FHHLT)_hF+N`V7d?0^0RIcvQh2TqLYU9kiKB$S|J?Co0SzEE0SA}u!AlCAyeD{U{Q zWViRUP#lwM`g|}(-h3_+LLpwPSvC0322JcB5jdOyeqx2G0{16*l=dzTR|Oiuohcw; z;ZQk0%Qa)wr!;0GW22=*g)PjWN)`@NfDQ=}*`PtHF;NHgYF;~Jcwd)m@KFqs;epXL z=v)3=Y}Uq^H!Nk)I&+N0N{9M)f{vh5uh#seo{mXdiS1Mq21VQ58B(t&OQiXEL{&jg z4njRVG$MnkfnTYIZw<;MXUZTd&1i`S{QYN#yPXsX$%kW^a{xRmH6n@e(@)It08UpQ zSy7z#;e_5&WPHK~fW#Kq=hdlzR~R4<%p4#0F^&Hm0=&?iLvQ%g`~SEDJa37oxgh3q zzOkeO99~L9^4q6h*24q(SP@xJko%Z3odw7MsQxgB;_K(t9RZ+^=Yte+@eglav;!!> zg2P|{Xb8CC`RD^rQ(o+|&>&SBpg;jp0nDelR{}c|m?_b<29=Z_I|?(lmbu>Dc5e=u zT9OA}@2MW!cWG7%GuXhh;GTCy)+dA$%lF!w(gvHmW zHRYT8By>hF{4iJpX^mks^MD(j@aZHgZm z?{0TT$~7aj+ljc&#LkCTBi{&lu3^-*3`vn&E`{$7a?O7;eB%r8qkq5V6`QbdwL4?q zSEJn#_a{*iE7SPBiAvXUV*t-{_ct?hTf9y~$9ZnIlEY=|;CxFgKci=S$+>U5l(zZk zkeAo}syO!j*)M0dmnj&GSNX`cR5kvo)i%SZr8mGcvJV&fodw&IRH%5ubNyP|{jrp; ziKc1lRrO)yznNtrV-4`*v=Js~tmvLJ10_?%O^wh5gFB0p&w8 z1WJNz)1BHINFWyG*2HC`XWAxExRIj?h3i7g;y&+$Os131nhO=DLm0R(d(*v^VZ*il zA+D2G+kM-rsD?F=>&x%6`#|15=xw4+CGWpEmONj;ef^{0npPdKp1a`VW*j?G-ET{W zg6`J_)-U1i3VAO}vk@A;UtgECXLR8O_gJ>Qzn++BZ!6O^2Zcvehd_C7@r-L-0DJsN zU#mmc#%lMavOicv$k@i~c-(g4+g{Rq+MRZ6JJQT_^u#TcdAST$2e;&|?~QN1zDmDu zf7W^?5zFVf82ow;P%-lLtqMBBvuhh~Q~b3j^Zg=c0)u?cx$c_x?j4-k4GMp-Es9gf|q+F9`lJedt|)B{B7v*>3nWO*%hz5)3VL; z=2aWoCSU8uCsdd_7j?lVKjPi=1$5uiHDA2_CJ_Pyk$jRNzJ&5FSjHL|SXr)HhcZv7 zivst+aV;MO6i34)6nKNREx4|MN_pYoM=XTE!5?yC>zAhmE_|EEepVE$i@SyzD-R|U zS?k+!t6kuOwfsaISJE+5Op?skGNgrld1@%&4IAi|LsIuV3wI5J%BSA3OfN_v{}^a- z+=mtL|Mpfwe(U<&QP@D<_*9VCUi>=0DlQaz@bKfLaRl{wU>)XM!)o!|@HcgMrW#O{nCdgC~^`l}koit}(D6Iq0-gk#I5Lrl4n{xG;8 zJ`V5wd{>lyc9-VKuLbtDnx5QvM8SP1n;NtpUu14vy3*OYhKHS4<4z8jYXV&>P90A5 z5;eMgJMFTaXXpCbpEWH-D_UdJ88N^Pd2T849ia=u!%qURP&{8ci#l7g-HC8OJRV1y zG#^(w6y0=6Gu-6Z3-A#5WESu;A9Lr&>|YHQc%N5ms{C>k7V0#L0of9CIB72XoRd-m zR*zfZrJ1^Y)Ta36<6+Ij)+nl5WZs9~x_38=1y6hTd-RRhy(%lM#~do%A-4uf@z>dh z!l;v6sz}0L`l{Qo$|Uhnxxm)}cd)cwKmI0aKiMqCcesb=C@hwcy^D&+I~~v=(v$vF zS<`m;ws8R#aMvpUPvJq2iqXusfQ+57hcW8(pvxosa8&x3`@-6>xh9W+@}m+xaQm69vQXemV*3y8*L&?dQXU z!9arP+h#)f{*xZx6Htu~S?{r_yXt;iOQmFSRpPuZJ=SbFeV)?-=yN!A8grjR*aumgbGwn|o$f{fXq5mDd@LxN0oRCVO3%yW1Gko_z+D zUZ5O+Ji|+md6mrDMQrBdl#!N8aE^jq#Os!?Mll@=g}DFY6q!E|Mp*Tz(0(4Ef7hW< zl>C4kf+X^n=e{dCY&5wNTr3=9Z(?s?_f7stv^19A&^X#QrU~l`ofSH1FOvl8UVNE~ z+IZ*S>K#1`LA);nc=FM3<%HjrESpG@zm%bu!MzOyK+tNq{l21%Ktp>d_83pn()p&~ zsrY2R(s3}wzf>2je((VJ9^1viLef8>7J-wWQvb;GPXm{^UnE$y?gn-|5sb#e1jr`H zbX?A0fKKUkxpW=<&8+=)(edCMA2CP!gtNTu0A(WuP!xlO+Tur6N-=?Jz zsmHQwBsjvBvKF8N#P9O*L33x!LFmEW7U;Ic-49sdPuq;Fh|!#{atsWs2Sf;{2$3CvIif# z9&T?!7D|9M&IWk*(DIwrzD-P`)2%QR;B=h3yFGwxli(I0ewXC^zxZO(qP%GK5~251!c3>2|G0lg4DBrjKOJDBG6g&!3Ol} zc1lmK+bR5Eu57-EkGG4Pe6>D!WXO2wxo0Nc%M5Q7oo6zu5-vz|{wyzWg;BgSPQ>&Sc)sY|`_A-cF5ejIZ$hH01R6st^* zGO@8#iuE~@ueaUTqQ&3x27MtQfI&G5s&P+s2+?@z1AG2(HK+FXKcwj#PV;EVy4mw$ zggtJdJF}v56knhckAg)^LEde=k9~FDr8?1mSA?XYfg)wy-j3gRQ%V#}=#g<3|F%A0 zKg#?7Sm=-3cZBmIQ!D4Tm zb-Z=}Hkhx&o}RnfcnWcpAF?}M)vewwxEkabpufEuGKzeN1{W(%ei#abAP0de&G$*} zGPdp9WO8C_-5Zf_l7x1ne*;1WCff(ejlQgJxYVM4WS5?E>LNf0G>OB z-4@X%a_CWbVLf^l-_k#}qS#PG5m-Fggb^3q>OW74N9@i7SWzTT?+^l{%NpAh=xbB29S-TUVRN=BB2R^VrUsg~{ z2NV$A&}VFc59|U6HEzBiB>hWDNQVMKmYHsm=zlfMd@^2PAsJvFvEWC{Vgkqq*r+{_ zGa`P*Ne6&R&Z(I!{f~QJ5ZPz|lBA*Wg#HyL191bw9T!YH$&Y)0G@sC4YB$+PW`&Dn z7nZ=t&E1%*CE&7w_ipG|yv{;@Iyz;vZK%MdExlzS4sIb}6#>x9Vx!Qo|EuA?c9Hv+ zOtkh@HCps-DBf>cVbO9k7n2l-Y`GxgKC)dADtM2g^Za^LPEBKa^9W{Ios?0FHPEGb zI>odCfd;|(Vm({E>FEJK25oyl;8vaf5>-x=C{R03bIrGI3eG{OfFij%v^^SF^~-6N zXb+z^Y&=>}OT*AnORqj6%b7x9a}WRcBG%CFRFR5oof$Fs;CvCQ$HwqQV}0al0%+;(qN zYzN-~+|Fs|HW+n=Ze2+s4rj+Dp6~Wor?zE>6MQp=sZj|R#5U?I`;dN!Y+D~La4FpMVl^qcZq_8Q@ZBv z^$T>3VwD{X&VrXQs<*v9I=4$l&r8j)W1W%8hK{RK<h zOQm~_h*A;7Tfv&(W#@gmFg}dW4~hu7$L&BLA>RJdW^3hkhy^%2=NLN@S44PPTOtiE zsIwlBg%5)g9=wFNbY>66R0p0IqbNLR#l+BIW*#bq=N-Kue}6r1f-ma>yi%)k3GZf~ z20VXx-YTCUXa3C5LDoJgzsk7ZVWGrmNNo9oAMO5}v>F6@*g5TXtPUfE*O-8o!THNe zfIjUA=Oa#FwX(Li{|K{OYddwNRfLSmqPB9*WJG?`h|Igo&5R zuOU~gFDvwKKW=tMVgWDfs=&RR5Wu^E`Qpwy1qTpb0k)K^Zo2^+@4-~4^IOMO@68?} zLMO$yk?)U@p10_px525X`FhA3R`YJx-1qJKQ}08%3iOtdQKD$UC$=ZCSXKDxtT%0& z>d)=|1@N?Wt=XVW0${jhSDDr!U&jb8XudXdwssX-Dz7cP?U^m+f(|Th>?ZGLM626t zuG_QMgZ9i*Z!A8Cb1#s^KV9c%a=ur}({5Lih=L31JR=}XbO2LXy0+-aUi|F8Beq`9 zt~8JHVRZ-ia5zrYH53edy@6j(r^mQvlT#xzPQBMGQqzsx`j;3q&}iD`AggxZ`x0dm zn&It8D&$eEM{$P%oEJ(K`2N9;T5`7Xk}WB;Ho%StCDi9scXHU<_p&F0cBQLsW0{r) z3U_!h14O9(t@^m5I?xKx>8q#vaYuKK&VIai?$^Zx#0)@ywZ9rqMaF6lR7_$6h_7%h z*Z^-Q!jDjrN2NdhiE^a$d+61JeB=nEVI{TmE{=4Cf;sN0>Kp|Plys@NqH*H~;O2TeD)hjXX42@I&V&COcD{V-)r5Z0}X#*l|B&1lNgg2)as#prA0;{kKh} zo;h$p1&g`h#>PZNa|r9tyjUFLMTSwmP29x{=$2`Gj_KJ|39at+dmfK~QzGqWHHS6( zRod?C-(O>!>edYQwH^L~RVdU-SiT&EFT7pXMZQE(p~9kY?P_~0jUaw0JYeIGT(anC za3{WqPO)0Rr*|2elp)#Fsj$A6WPM89Idpl;a2;=g=eqJ5h2GR9C?J|q(@tA0#Ypwa zE``OKy2m^1ID%Hr_9m210BDx5Xal57S-;FtmT0~AD{q;nLXTIdwpn`!(KR@gR^8PY52V^9M6(41%6!o5LRC~ZPhD$ zi2zAu&u}{G1)b>NgGn3Nn)1~K5LnKHykoj^@x>v_d6d)c^ zeC@e^|8WM}Dy{KHApTux3EMbfbBe^?_I>P+`W1@rcQ&uNF0I&w7te*&-|sksPqC;W za+S?NREpyY{ax^QkGju-&#oP*ISS@Z)Ga55giIqcbh%+_O_pz==>?nd@#Ix~34Y#KD`aP6cxF?k6z2JL#>@H0 zWY^vmFf?PESy;J7O6I`f^YJ@=2@L0k`z19L*5jRIZ(>?xUDx|mG4hL!V@ zI^zgQ&!jftpEU@SG+E~@NFmSz(rH5)y$GGXA98bC;Tx%DMz`p5%HuI#KSp9?z4jqdC)dfmEh!?*1O?BVQ~1iz4G;8~K1Q zcHpW~SL^8uV4G7<`Qgw>%Tze)Hw?_saHn5RRq5!~Y~i2pJ@*4K+`A4yvH81;dbeLN z;L;^hHvw6>z8trg?US0!-R(PLOhrJ_zCEtgJF4O83!`Jlh*hO^cj6!gUh(GZ3NQXkqt$+u zt9r2se_h;$!P(`fIm+(9<`fEo=a2>JOUFBj8gL1Dc%ccAHm@0g=phM_u)QxHlK6Q%D^01E0O{?^ftzocD^AOcNC3ZdhfirCxZr8#d_1q|W3)7x>bMRsxdE zar*ysx8R9U9%U{6u+tR_|N1Hb7y6YZMo@ig0q^Oy?YtdbQx_vM3IxzC96gal#=6s7 zcoITb5(u0LlhE4Yf>b~GP2&oCu>?CkGy&pVJeeaqrrfclD*nYy>#u^%-YsGHU z#VEyqjwH$0)JAMye|p;RxM{ebv&q-{zRPLbigk3k!Al!>$w2I}QffK!+=ID6Fa8(D z>O{pC(QI%KQ%90;<9V-!zbyatdy)k#&r9fPOXI?=qTP0UzQOD0Y?uBB|+vNXv!Q&(U#QvtLNp3)9;lPalZD zX}KD{j3u*T4+ZUy#cY#2K#0xcGmZKCEqqtzf_xx|dzs1v?klBnZdRydL|dUI_n174 zpAIm_+i(W0yQxatu0Gy2-unB2$jKlgZPUp>4>cn-OKviUp!d#0JJN0pj^2~tm6KZ^ z>Nc75YD~qxHOug&^fhkN1 zcj0$nyUMhR=b_-Me33th(x{}h(16(4NRtVDUK4hTri=V z7Qpd57=msn=V(+5NJ9RZMfcyAvT%D#LsNpe0qY@YRAgiw#m_}a^tEy`JzM6`691OFB0 zM`@U<19a`jn_t6DZ!Cp^ePn=8)t{{(C$TapV#=fYXUJVT7x4fecYE7FCu9>LiPs%+ zfL!hQPLuTe1M$a?V$lgfy`;dYQeJA5kHlfO1Aii*)hIEpx(ZX0mV_!6A$49E%C>zH zpaR@3ib)L}P+fyXJqZ64f8fe^bo~nSzFw~& z_J;$Af0rWE3K>7cW57)S+6OE#^pCGf^nv!t9xE7rM$V)k#9T2Q3f0dm2LS2OfYUU6 z_%k?OB>q7AAgM_tKGD92542CDTt4|9+9wD=`$)a>e|=u9L<9ObEwZO%`iQ`FVn5(U z;y-cJpI4knfIe{Qqzyg;aC4*&NE0L><{!W*0&G?;=l1rkM}zjh&gAM)5hP)6pz*E?8zzc$vs-HJX zKN9k-X+IK*9U^?D2EGvG^2h(bR{%uWOYT;*oDp)UhkZG;3#Et)5deXT@~V<$cYr|- z9JHVS&YPjhm!^b4Bv$~QeN`+lKy#sx{5~Gv&liB9 zQ99s?K|Y)M01()G9fco0p92cX1Q>d2f#Bbme$sz54WkrAAOxg3_$~p^t=tPo9@1x1 zr~p7yA6ZaH{!hfz1Mo0Iv;!4@Kbv+T0GiU5;Q#nES|1>tB7S)sB@U1R09P>pO`(KQ zi6K5UfB4|Vdf>=Gel`UKz|7)ZMLr;(oMaSUfad=@$p7D;q}O^8F+Y$eKFZ850IOHz zWoFr#knwcDg!%+8ImpyI&KIM?KL;|P^bL|m+@)xYJunSf!(1_7Y^aZZPQ?jx5Gkyf z5hGyuW;Qq_s1HFq4*|l!dMvD&052OZ zCpar3OYT;Z4F8^6>6LBrkvgX zY7AiUrBfBlcT`vvC#6ZXEJ^aU(~xyDF?EYS8s!y-;oLH*o7FA-(i^qxC$U7DW2Kij z`5@CWGkMH~y(rY9D+>L)B#Ys;fp+GMpp;;wfCpl5q0XKLlfSf>0$C;s>23*iRtb7+ zR3(Z{{*h2#_K|dWrdlukn(x zp&7E)1fq;#Y|}M!^!?o;iOCj=ympSMu2KeMIZS1O2Xi3o7HKiM;}r1}Qow1LC0Yup#uJ%E7Z+8GkQB%7yV~Hfs@0Vg^^=8v7 z>kn0OlE!j5GVOeYE>pJ>cxTFrvfmh&LfLl$IAU$ohvHQoMzT@CbP;Ak@^T~H2$e_S zB|%(;ujDP>p`jtfD~%HJr{oKb#^L_S@vYD7n=&GbKHl+ZSW0om+gkcs6LU4#{;4p1GE@TanJ-1DwVZ zE4FRVXF=38HM`p6f-#Gl*;kpn<8MdD;jdsQ6^+3I<8{ms5QfUaj{GqE5lTz1b59vn zU%1)0Mtr{&i)C{1haHQvQHmSe$@JMP$|_&ZK4Yqm!I7GwgJA54We=M?m~&SL*j6>l zA7}9F)=@PbP(+hZA9I!*pi@rIsob{reAW3`9u#jsiB`F@q^a8}$>^OY_9zrAzmth4 zInQgy^y^4-ecV1L;S_H^h4GlrLS?hYm$QzFnt7S9!}hU9Cx6Y*3|l({u=nr4lN&J7 zCAix@qz(@$|84!-z(6Yrb`k0O=1;yh+29G=XFF?*c|uy>{Mtkz0}GS{!)RV(ogtkH zm>lw@x!{wCi>Mw1Jp;7ak!6v@t;;6aAoCS?=~$JFfTz-!NwpG5T~2+qGcxH;pmr9|9ZGfiFihzA(^|cHKKB&jtgByk=Z}-0 z1Vq`3id`sman6>>cxH+So3e=l7{Sf38$6ws_OL|`nyG_W*LbF*1XYbjyLg@N$UIYD zW>%>D%Vl9ZkTn*a8G#n06K(hlw~oOjMD==PzkS+DN40OyNKTk-Wo<6dife_ooA z<^6er4E~LL4$;B>y3md>&zVidM$mGx8yIO?v`6f=AEHI@Z#G>UKH?Y+8JAVC$tI|7O zWG`_`mzEg9wklqkA-#Dkbg-f96+$pdIRCe`seyq>+CD*?fx=uYNSuqFfI-lJkUQ5bV@o{uI;dA%lg2LvD~5{ zD%(>wjhUjL)QT@UM@gf1mnogQ+9{}P@?lVM_JRso&I*`BZB&?o78txfl;srE=%zhT zm3`wY-tEuOr&wllmJY_Gqk7pu{UtbPv2!N+OiY_9I|mT9E@k4W9lsh!^qEru)Y@_C z@SKZL1pWFW&3R)s(`rsfCKek7)~#QR@$?RjEuO^mW8$ekT|evQ;<&|!bQ%W7Pk%TV zGmsLB7$uc=!%{Jo!cSk64%v8gZu2QF)Lvr1s~ zc~UZtBmxeH)}%c8Rr7*Lwaj=`?KI7da9BLWl^bE%yt3rSkC|uXpGA9{5ptnEZFMbu zmJEqXt`>yy0JaE1(nW$AQZzY7p%=PX2o;4V@qIR;olQansPF5X!;LNO|C7HAl{yqf zLMQ-TW?uw)+r3qEW(B$w*K1EUj~VB&Lk?CSKOIS6>|`8MH_uj0rADknQyyDKf`;^W zQH8Ca5Mf$Lvm|=PApSQwmGXO(Cx@OXCUn44DZ7?*W%;ZgqdJwEJIfv~u7tI-`PiJ2 zmQ8GpA*(tr)Ij%IVEnLtb%G-}76`nzJ9yB7+Md6~NH9f-IaU(9<+n2vaxw|h)p8aGS9neZ`2YhzMk3{q3v z6po+Q+5cD)WxcOX$0a2G)Ed&6v2&dE$~Q}|b~|vzi5M0j>qFB{&^p_ax_&_}BJPKi z(VhMKL0xrrtj_72SZ1Cwx|(mmMwozA*X-O#;0{p@E-@G|y9PcAb-K9HI{pq`Trzut z5Td=m<5-l7TY$5UlpYaVqu>;T$3!%{3YX_#C&5a%5e+f82jW~u|+DR zV)*DEG`y0~J9@M)LIadr!IzYX8$nc1`Gb|#2)i=#!3Vz@3b(E0_!JRdD~p?{5SZ)i zYq1Zu*2mBItm4USmCMy1tT$rTS~D=|QF?gYA~MqlWOc8|lgDM(M(?CRdQK2l))w}Q zDl=hRPMAh_dz@Bf1+{Z6RZ3DN?m!~~v=DSE#(9*jUU%%q7}rfwut^JC8HPsXFRPRs zZ-u08acBYsqmP=uS}4BAsTde6$@V1pPWi=-OetzdQ$K2H(a%cX3Nx>aj9mVmpCzdX z;Wbpg)^gAxUe&#Kq&YdO5HIyLRe}gj1g)bjnW|B?X9m$SJt+b0Qx{~1rt6eI4NZ1% zPA{_{nAc-ah)rmLG#RyPvL{hER_W*N+c5p9AQ%r56Z03M-jBxCV=D!-Q;mBH{dV3F z8zC#*eyz=7&IDVKl7gZX7@safH)V!+;U)Zx6WP)P1La%)uQhLFa`#@rq87akuU0iy zuJGs6vMx!#5vn^1gJLW=XOw6Lr{=7&Os4i|6t)+=f^}}dPPr(L*3%|S_1trU1tx#dp<)0v8ZH5wXldgF~X6HQMCW6Vx!slb(;bi|B|Ahp?4zd|Hv ze<>RM%?iQ);g8nt1?7ySDZ4W~6n{29wM6|>)GO(UgUr;(ovp5BNRqwkec zs8@S;9`({Wey*%e_bH`tNp@FH6E;I&bWUE&(!QGe+1mE>^v9t<6Uu3ksjjBfdXKrI zqr_tbhArNg#y0MB7unh{MtHr=sG&JDILAK1&8oM6go64Md@ZnS7ZUG-OGKsa)V0=# zJE;c6ppd{+nTvH}z7>&GAM*#FgfuxEAj192sjt12lyjgdOVknmL_> zp>;d^uMxuAAgxw*-ctYOw~JKu{(hGfv#ogok&#D^B&I@DRspc4VG|H(S#TiKveb8- zNnWPkenlsD^v4Y@zzhDoMSvEOtf;cafc5>W;%OlfyCJ`exH>JjTc|3>0#STF?6DyQ zmMaOPNA_?6DMcC`pKGGmZN`{qK*zhK*rnuo3>DitkvHOQvQ#)Lq6U=2Pyx$y6@CiBFO#W*397Zl(Ho`|BBx}>adVC(W^z{ zB6(!`Fhf(AlfBUvrp$j&TRPM%Q449oyqmlu$2cpU6AN2+mcqwYFiYdWTn35j2iTqJ zd`E+Q#F_|-p(O+pmAeb*e* z^EGg3-B8k1(q01#dgg!y%~Y%{phg3P9v(Sn4o)i9M?{$8n2aoWJ6tO+%ib7M4eF6I zb@HIbptM`t}<}edNzk5Q^O5oJn<>tvCDE4Mh3AL$n1gD&+s7Th+$hS-ru){55hw=$h^#zJ2!fSbC%>9C;~FV19-XDR4sMg0<`b=y? z#y((VR}=_oX^vpS=SNE!DPFImy)s9yw5Nl<@*Sjg=A9|zuk0ab&t^BwfOcFq_{s* zHjAgx)+REg@epY!n9zyaXX_A z`l5TVldq^bUzoSdt5uvEL;0I^u88(wh3?$eVQQ}B1+boI!Oo<+R9_uuOLmZz`zn}J&Soq*4z zaFYSK+FRjyo|kl92V|F{8&@q$d7u4hDZcx2v3!hm(%mB7tsfb+sJC4oOqf& zeh!SXsbWjw)v)Otd(JVEl-f0Aa!7HjdyT7jgk}4Wjt)Pge{fqt3#Yu>rKof+ITR@Q$(XktNkJ>VrAIi#{or#a-3c{G5&+4R694cNy}ij!H`?NU@< zGcrw`dcQtCfBa1xHe(m2#&14VHvuKAb$bcu8>se3S5Q*+>Z5K9hsK#V?OjSp2g20$% zbuW%l{f2#L%SxU713O}1Q2koq>>JR0qEkg&9d#JoG<)yB3YKec9-p69a(5g9Pa$of zgbYa61g+$bRqsqA#xYuaVTy0x(|1Ga0T(wWb;`$TB}SasP3xGHz)eK~8D`-lI-dfU zU)(*dNG#5sr%5K3_5m&}a5XVJb)Ix)X`|3d$X?3fZY{Me1Bb*N()gc)@)v{t207l? z{P=SUOjC^!D=eLgZ9!2k52X3&fh<)RN)om>FI8YJ*xI)4c@o&x0ZeXv{8sL;dcpNL z!WNMpflwKR#@_ubfMk~c2+l@PXr}_227cjVP)sp%u6effOA@ND-XTNHdz36Q4D_mU ztb-jFnk)HaK9hiT!s@L2*}2+MR)~m^H8`ztURrOgbiebe?3)g>X79tuAc7Jk6DK9t zoT9^&eT{#Jh>)r;pSj+z>8+CK0+@0{JNHCFqV~6<++lh7jK?HRZ77tZS_qxFwrmD! zCgTcg=MqYmH*s6FWci&s2y?RBYBca>;eQo=&iGLb&s6Xxa!4QfbO1F<3ex;835v8) z8vZs?h@Rx?wt!b-*N(H-F6N}RO3!vNhEwGZd6O)l6$X;zQeg5c@F zb8X!Ye_KBw%!Z8ga@XKY=i4Qq()C}$-3tI~Le0;28>M}#see$;GRe?8+zT^-Tvdim zhTya^uqYk8>ac*)G2}qKytz*k{3Gyx^U1s$RE5+-mjt#1sQq#Lo zjNrpJPCtcwghl6pAW2d-yFfy|_yLoKd*~q~l>>g*65)kivA};8jG_a6id2P}hfz-W z)c~vSzxzO_{U`Z6P`A~ux(jJW&;9o9@-hA)qGK@S2{G zc@=fX)bv?1^eF}?G>2|Hu0ylx?Tzizn+i+2EnmK>%Iho2$+hP zB%;Q05sw$qSk%sAuu$4uDRie5P@Id0OVN5;^TUA^|CpzpU=Vp2sN2jvRopVlv3Rab zLy9RDxGhV@W7fGO1+Yr>s_)ZVW(oX@**Ed)r-~{9jip`t@FM(e>+Uw*mej>ojkTQZ znU}CqnLga=^0dvLtlGtS5V_`#uz8q)l5J~fDc9bobrRP=kye$HK_@_U#BDPTHDSWa zHtg4?AQlhj)!O_%d&)_lA?Ai%RO~`Y%zp7JVX8J)?*AN`0Vw9M)5U@#Xc@Ast>wI9 zKf*h>t;Hx)uZRtR`&YE9Lj(fTA>Y-nw!A;$7n?^-oXTxJ zPxZ3$O%pSk&uTxcymV|VT*Z7@RqYrDmZb=*XVQ^Um3aa$TR8nNbD+iDQ~bvmyTYx49|+UaK!N zE!O$;RVD!THk@oE&HfLbr3T1RSE^H>{}^RwGJxW_JIYju{b@n<1b`fxQUF%`u{Ql3 z1;Bkad&%+2nl9b4tfKC|D}`mVz*%fZhq1D~zxzy0&OcJ8pbj!b-dSM` zgd+PLb)L}-HVo^plcywHa`=75`D)Q={91omt; z3fcee%cMT<(R;nNhdiodrdtKuwnUA|{-mG&MQ_821ftdX%prE3a!c6+T?dDj3oQ1sID&PO2ki9{KNiXhK5g|g}@c;KL0P?gR-TOP4 z9w`67R<0ruEo-*6wzq6U#Gt?+9}&V)fkkddr*y889*==ZI}Xz1YSG2BOMksB7s6g5 zmjJ(ViO3)O9|i^3a2^ulTYNH0qWo{CfDHyD7S+-~_4F_rR_8XY32%e`wDO)gr5U?I zSDk?P6N}Tsy+kt3W&WdU4`))1h2;}U-H}*LDT`S9b|q{gzyCwsJB3-+G+lsY+qP}n zwr$(&GP}$!+wQV$+qP{@z5V@jKeuytPM+sP=6*6Gcf?wOoON&(n;kPad9L(~^Bv!o zswQ`>HCRXz#=S#I?&qerGaVZ<1Nq6g4w!QwvENn`j7vklwCrlT!3 zdCL`+Q@h=|T@i+LgWB$miSnwt$YNpQ;eOa6s|yhi6RpE3GI-it-2=xz zIA019(Npt;KgnAE%36r_jFfWt_7chuaYPmsyV|RN5=va(sfe4|i4PU)B%2uDU5o55AD$3m*{x0AQNe%v$NnP(1QHu8 zd=@p3D47ltgw;~qWZ76DW~oNhp=l%`ZQrv+5p`;afF$Em%@- zU)jp;%NZHleg%h8F^O&*9xh`(EQ@{ESPC<1%_Z&PkT)lJ=lhs1x~;de)sPfee8%0Q zL6aKCziDaxvR!jv;D3b~ds6wQZHK5)`6>JY=W1UboS~u)ZvfqD#?bfK5ze^DPoCkA=Kj>Uh6q@Q z#g`YQ@R8|D&`+-<2c3X%yGRoOrdY5yw^;vE51aIJX`c5=8vfhH5aFKEcWdLhvnrtGe#^E6qb&`hp}B#+d1L-)UF&8W34;9wwyTQ6uan^Km3ei&)T}kiLf&0`ZDqtV zNwPlTZNHUYovhg4)j?s??OS8+4U!`L{Jc*NBFD99B_X08#=~^2Uv1FJ$ZFF@$i&9S zt2ON7Fh=nP3@$`iynxRq1@g?}MPs0>FX`R8klkH;Bayc+%&9t9@24yBIa@7k$n#%* z*WJV2Hh;NA0F{|zDM^qGQEtZ0YsR%2l?zU%Y6)jFE)uM1(aj1fptXI%sPJ*otBi8$ zfC{8cwggLVDmisO81*EXu7Fe#bRO~B2jabAF~m7_1xiw!NZ5@7ZLBSsUTMTo%%8D9~=3ZytJ*l>on%uvK(p@dZu}!}4L-4gd zt-jzuDY8{81}EX{Df3F?Dz&#UEmjX5ber-zQ}#M%4uqXQ)FtnK`Z_!NQn)-RnMkTZ zDYtf4`?_oqgiAS10$~kEdkvZs8hI~e5MkC*#H#Rl?Jh=EJ+Chq2XRw$ain(&*`+Xu zC6m0)Ft@c~q1QHO6W1g_(tLPY_mJ0MW~mvSZtAPq6~lRRk+V35sB3=W-PO+4i3oM3 zhfmca{q`F2Q?5C$If1!qI^9Q(3Xy{N&sG`Z8#pquOUy%>+_w6p)lYj|7c~J17~s z_lY%L79c4(t_&)ipN69yv8WSX;R$pm@mVlJk_$CK+i|23cEh2~qlNi)+_`br36N$kH>}1zdOp^ zUN-`qaG;QZ5|TV*;2{DjDw7a<#Sfvwie@==>Xf0#WniSNXDGjsArs8YZaqMt-6Ow@ z*>knb%vA6!W2&ovZqOMfGfi;G7t2R;{!X4GDgfGEAdof{I1Kqr9WTu7j4RYx{ov#^ zvA3-hhnvt*>IyoLzeOw@*u-;3vn20TzYD@!Lf9srgDWR6I34iJuEc5qVDuL=$}&mX zM@2)Xz?rpZkObF+7ROLr8hg>UQK@~Bc{O?Nnu7QW?qKPuoGPBRaOKKU)81Txrp0+& zYLLqxecBA2f+&=MagAJNy&|wDq;Xrl19dc|bIebHgw%P05gbA@Go?H|$*b zsfo>-GZ2jmR%bzR+xFSx<}na!ziL@aqkS&iZJC&+A3Fcu_HwQa!DwRf4v7xmJvlSR|6OS15r!}UoK*Xtg(fOq$o4u z$)k^XSraD9BIzf;K8^(0rlg!aU3igj4{dIl9Sj(E$drMDu;B7#{)~7hTo?F0T4nzu zl2Zhg_3`370Nid)_atoqVgdfLoagD||B% zOPw}*j#+YhqbV3#b!tP-ibg2G__i#iUseDNE>=}5Buu7A?4BTe9%4p_JrSUc1$xyK zpfTdcr*jko03{2p3vHL{r=W#x-t>*tNHjxk?b04ShFpOjPv5T#Y#FUaY&RW-X~Lhh zJq;fJO~e66F{8GjdFE5a8+V4rE)T8@9C!ow2x^wZ==O)GEmw-HtkEF@r!kg?;G10n zM6NTIYv<{poYX-GcO%TV8anKKKi;jaMun?n$FV?EsPk8Tm(& zoaCh=;N!!Gh>3%H?-=#(oLEqxL`pBxQ>61FIwI2#GW?x66*_fMvS`utPXA+0<{R!Z zrh(P=+ooiYPfvhp*?ewgR$OY-Y#5l1!!0BsEH~K-n1JP1xJvad0w3AdmdRD|NDOkf zF0Bd;W zP8Qrq(*1%LG2qyT$F>s~N4#_}Nqkb!UF-wnN0!^Bg!Acya#WTa2k$Y{czkLJ<5Nhx z{TDXlNC#r~xGx2plsbw0u#GBO?pg?lcZc`r_JJw>NZ;Y&9uKAr9Ma}2REP1fKtcFW z+zr4zF)L6-x^IW@I#Zt~&>G2o_&R}P7=352$s9Gh^dsCWu z#akKBC{?gB8a#c@Gv?-yUfG@uOFBld7&`rS*(#ONh7`GGKv#H@9RQ$!n%wRsU&>>&M2?H>iy{|$YDpo*Bk%tAxyhmvoL{Oy zG+HSls!yRFS@vyJrjI)yy;F9lTG5JTYse|M1Zo*l2P%1;w~4BtRSNm`fpADMPlzUC z7Q<@C(;TLd+Q4by_z}DxQuI@R_x9;2EWR2q^6&BrDX_fX+eTfeapIe>n?$_2_;WNFyKOZ*R z)qRi#tS0CMIHRlB3Y5y2)P$*b#wO?Ho$iuu03hTb1&~JF)^vn!2?E;bC`I#Tw9?lw zPSz9)CS%^-^1$nXbNLqxNJ3f|{q#MZqaS)vAL`$=qOFRglrK#XerH@BfLzg{q3)Pj zI;BovAot^q90W*F=30CD=<>;mT^#|%<-xN*Eu1V!$*RHv)A7b?7AT#U3l^`8IlCwp zmYs(1S*hfyK$*qPh^rb^&^DArNQ^$1=QT%AN`3ttOj|*wJ_fzOjHS6boxlt!*vUw6 z?AJO8rN0yZolF7z!GhrF&~cw>!XVnNB0Y3hd_?J68 z9x5SZ)qY!QSSBk8`hH%OtqrY$pvpzooeOI_ChH#4eVb5hT!pM{h@iMN4PfGn$Mn41 zok6}<*h1I3?=(n|yaZkcAb)kn$HVg>|8Z zyNZEL42&*5d&x9SC7g-?Fu-+j!EI*9>x4r}2@8HJnXg8yc@tAUny^PHFM@sn5g8Hk z&jvIh5jq${5+&UjD4gt1jjNSr>D4%t&nzq?xi^O?mkzP@tmT&F>s|I!^c|tM-C@@F zfw22JvZss7BZ~vR%0bJcf&!KpIiaem^z6(r1*Fp)T0CnkFuEW#zH)gzH${n5c#A6} zVuv<;2*W0+&{9FrhHRc=)Ljy(L|(?+WsdXcQzcqc71fQ6)FB&yO54*(z~d%QlR}V_ zJ7hu|y&n*ffKx6RuP>9I78vb;KC>uVSo+zGE{ez~Kd6)a_JQ6@mowO=TtccTp2Tt( zQ)(%^RMys7gDHLN2{7zx^O%jCY#m1?2S;#%_>3R`mbYLa z33+8zOSyb@T{W;`@J4u#$}b;;caBZjl=~QfwUdaOBaMuBaBs1lQ3trw**+v2zQZ~^ zkWNi-j^6{sE4<`WYz(g{s1hm~sZ|s;g%%MDeOtefarcFG42twT`WhF_de>r|)QzXm z%e)F3e)-@ao=l7Q8%d@C8Y}kZYdaz0E`1$b$u!5)YP=ym?(81vF?>L`58PM~&$+T^ z=LnCz(bT#_H$v*20MR7R6cW2TgVp-})0JjJQ{V{ca}g`7r3E;;K;)1iXc9Co9y#&% z#|t?0iKVlPmgFl3D(0jFjyn^F(w0V^ibV!Y>DDe!xEofK7_>|`-WGS%MW~MWgfvAZ zE+2NlDK)+A1UF?2mk^i|PWKBCV{PDxM{+02`6Q{y8-`zt-faKG`%8p2 zkrN(ow7l+Gj`Vvc2M1K?h)KM?U=*|`wQ#=1DPhX5PP63BMpN(Wn{rFoX4i3K!y;-5p#2us`k@%k}27J^Aj?Uf-`~ei&FTaRpBAUP6Yy?XCEcWi=w3 z@9CieMxmE3>F_unY{EqA?(O{%FqP&_J<24QbxGxy7IVl^BnGh}%z6VEwhF2knFKC1 z?ht4f%)(hyo#0Pd!CElf&*|20t5HHlL{}BGqU_%|Sof)8syn*^5fU|Nr6e07b2d7C zt@bs8n>hiT%#mJ%1oHxQ`n@x}kr}i^0%MjUoQ9t= z6%|XVd2y3H6Guot>@3DwUE(Q)kyxeW6AKaG%}*QlOmAz7=K>VG>-k}P;jEyf2a;hP zNJDy?pk?LqrRuRLscWT?bVwIP0V0_0{7~1V9M-N}-NcY={7R6?>P0`5lr`bqq4afH znyY+0Uf?$2S~IBW@AvTq@l~mqA{^>lMfbj_QrL5{L+?i(j(z(3To2t?W}#5Sxc{QJ z0d~nB{vBx|U{NEj>}Ll@b~qOH%b*yFUP*|EhxmOkobOX)VrN^l(UUMu$g8BrrYhIO zJsOYQ+HL8L?K9wG)%m*3Gz0euX5vc zxy|7u)qz6B=g+lAZ=Jp^)&;tD`rIpsFti>$aB52`J#}F3-r||89~E;g&VqdT_-mTvsLa>+NAY;=6 z5J{p(iIsOOilk-_L@lhK?z!FkyPOFrVltecNp=I}Jz6C@ z6t@=u8jJSYvy8abHnbnHv~XQLw(0iD@*m(9x-R-i2R5+~!g%sr*HMt61HO2Zx$vv$$Tp}pS#IiRZ zYo_j^yaOmYe+}4S1xrm~jzE@<8mEdgIyC%|Iw+CDFWoW)pI%H3U~Fx&Gw!Sb`4mTM z7eT|ABVtI;^A}PQ;Mh7dI95B+ zWTeL7I)yf*qhiUcvvFsHIr`zcJ<)np=3T@xmQ#mOnzf3Wa;B22H+oO~Ra3F;H|-Z^ z%Aj_hAV{w1<$NluD>mV7P0z9^?jhnkgJM_|KsiVtc6(XJtNt@}D%?FaTDnW}U=2D8--Ep#&WMH``%q+dgr6DpH? z6&8inUGPH{F7=qwGOG2j8B)tGa$1xJ!1fcr~>t~a28*I z537n5UBt_Te~WmFTQX1&viA#BP-+wdjOtG`Nz}TS1|w?EL>=#Z)g+R5L8>Mhs(Up` ze>eOh;M+1Zl4&fY*TA-tg_-Y#V-vu#mWN>ib)fp}!OjD#z>B$f3KdRp3+<>zxKg`6 z4IcEGbB^rcK@hl?sJ|gu#b`y$m1ZWRcJUfoKm?+^1-N?i+E~Ok`Y=d{Ufqo=)zGo~}Okm`L2%;GY{9Y2Efh9Jn770ItihpOrKKGA`8w26ec#SfG ztpAFByukvUyA>`J8B#CYsMP%Z80?Kc7J|)-*R%E-P8;F6ib<^qEfxvDhH*!T4If=% zK3C_+L}Vh~%iv%5XYnBDLDvfzBiY6W0iJ-Q1;|4nO)^ZtTS?!)99nGm#UK?mZeAN3 z%j&XG_v0oZ`f*3*3C~a@Rn(qrb>4qn&c3n#q|kjAjRsZ}wwIj|jgAVjFM1ysX9QvR zj}D*__TM1f{3|ka7J^`m?c$$0e#%(bB+8W$4W{MZHT?s2TTU;^-{9~CetAf1^>Z71|K=`ZG1B#9B`vwgI zBOnb@4})RjbBi4XA2K+ywv?3w7QE~S2VUMYplHWr;~=_aLXMH*#DV}Y3uxsOns5kQeh|!bp|OWj2yPNjXPvR|AJRIx#1o3DRh-G&a zIWG^yy&9Dyn-bX}p`g6k+gSh>>@?gIs8mY`MW0*!lgv5E6_3;izpX&+e6(~GI)sOw zxjl1W26O|JggoJ!1&~DbL})yzgn%9kHg2otHlOOXH7##(0tM^AX=H}|M7iq&lX;HF zo@jA{x+N79s6wR*6bQyAsUoF3A%{PAYZJ1Yoy5lEwB~ubN-=~J)rM1J(_R2Q9ZW3kCdffw3YK~ZZfGs1T%h8kP8Dq5 zU{&x9ky_puLE-2S-7WG%wJI1a6={LP`8c65V@<^pE}g!tWW%t^{1w#OW6Du9WOlp( zQtsPdCV7)i{ZmV@K+y^#8f%FZN`X8&fw~-mHz}eRD{Il8JlC8)Rb0M{Fv*IPrF+g` zmNE~0C*_#wu>CBmaEf&@nj&3N*8d7TOT^uxCyPph;g3M*8&zd)d2uUdZ#rTsmKZm# zSdV^Ql_g7D4cpvl^l}o?kUnIJLzMjCiS<7jSOt?a) zcUI7{dvdLHhlLb=(YV;(Xy=wHr7Fb0@lms-e=y8cQAs+1aDCizM>Pt@YO^kphki*m zlHMJ_la}@(XhpJ&QFa2p zyew_gpHv|lnmuneTtr5+5GXnmW|_kt^(P$z;jO~7gIY22A`lL$V}w-PM4f~xwE(_13P1_EA+^JV1a+`% z>?93wU&?$teRA9iLp+i=&&>H}897sR|F$;}D(L85AygiTKMC1%FIBIXGM11~(4L%* zwZjV#P`Ie(l2Bpy2!J06AIq!95DEO*n9u)P7moLW7qX?2?52E2HFq_a!YbSXUXPcl z)yoHVryeG_=hMXN3ewWi4gdDY9Qd_(*&WshU%gcL0)Jo@xPt5!p+(+t2i?Mel}OK@ z{0fipufi}3j@0ld5~!vez;b@Yl2sLGY}_K(@AnD~6_!ZVutNyT5?oBg_BhmM%}!`) zEuxMFLK7|4U!}RH5oav|U@1v2sDc~c(t))%L3JP!g8cY;JmcFO8bvgIqcQZ5r+yD} z(jp#T=GiezNT3!Vq6UT#m4OG+25nBF4mc$Qi2*tj9qeIY=(|m(vL~;B*>)H zI&=xxRts#F@8UT1vK)s@$pZmkPBW;`-z1SKNs`1AKM_aGOa%*O7jruPaZ!he%oh|6nB`|N`QRlr0IFcEXbOfh>)M3w*9#oDj| zgI@3FYW)#QKY^hCY~!PVAJh3BAc8FKpCOJC@cN%I{Na%9S1z4+oOnIW|Efb-)Aen~ z#H$YEWorl_Q$pX7*wt3cQ(xHiaTPLpL9=YZBDyml)uV)sN{3io5vuFa1CN2Cm)DKC zGu`!gg!}FA5aWm8eLkmiW=5ac*6(-~#?N){p>I^}a^If9>udO4aO_OHtlf><&&AS} z_B$=-4|cj#O2%DiO09z-Iy{@uJkDnxJ)im3cnz=bg|vLvXVG34a=OS?n@}uFG6PY9T6|6+Yd`e8@eC|hOADP z+c)E@#qm|?ROr8Yq$TR+lkHd8H67pQ?O(2w;y>;mfX>FErQ*UNKacZi^6?kj&gMh9 zpOqZz%N)HqX@NGH)b#H@qUFuc5Qla2rHHxf*Z0V0{f&nG%kFT*`mba_!19S@#?(_U z)hSXM4haw3Ev2rX9->qu#F;2Yq^Ur|g7Z2w9b`eOhJowujo+7P!^_z@ZE6_$6lX#o zx0HwP-7jY|LHLhZ*~VY&lg&bc@RXMf*le+lcB@T-6b?;Sily+J)Rv}7hkaY&)!ILs z%o0gdD}cSBufZcsi>6vDr@gIydaKfQu5HNf;!JQhL$ZP9 z{0uTRy~6F4!7{1kj2}OQ@h2i4vUrw#hb1L)S}*+bM*MU;4*L7A-@Wls_g8=7Pj8|4 zd+?n4Y+1EVF5^bqUtiZDBku&Oz|GI!F5~!E@}K*hna5p!Rmta=OJ#1!-=nsi7hikM zrq~VQv>x&0H#+aPxWgA*BOedwznvd(?dL=AyQAgZcs$;zV|_hw-@-G#WW07f4*m3a z6`$07${$`bw!P2h41+7zRO!WM>A&93#J~8BP?sv#7u9UxTs?A}A z=1afcGjdj5MMt3TkqW-CmR{}jkY07~(QHLi|wYodbv#o1*r+=A; zUx-m@b3aX_#_((E95Q#e)X0dbIjR_qtS?|?PGs6lB*{B*xpV(gO}%u_fOknO1e5nG z0Uc445{6V8{mBW@*Avz{9Od13D&cTB4sFhPmHPV~9hv&&w2kFr^ww1S9N-#uONo{; zd^Xk3-{EjGwfHQr>&+Q$_`PVXf5fU@sYy!v^s$SKiU(&Xq24)H{`$mgx>|N>iyhy5 zdlEaHcU=D3kO-c`*Zm!x_I{<)N$Yyqpm-b2@04{g7Q?NM`^(!*{IR%)IOo_qe#J01 z8F51T%BCy$YVF4D{g^Za%?*AO^!DbHpU2M)ej8y1-@*Q4@3nUymHtK^twPUo-p2df zMlw0iTY%N#$BpNKps}er08&atqU*EUX1M@y1GF~aqP@ZeQ}XHn#(wH9NxXGogMQzY z)#V|yL!w&^Kv#&#_$v~Bkmw!r5v*{h%XxoP%qt$F8%%=#Rrff;u08B4kMk;d!;@or zhVnif&s-wcVY%vzQqnr2Wiwntm)*ESLzx3h#Q(4wqoHR~Goj;4?&LF{T~NY7SYgjU z8aQ1Ycpxj^;Ry;yKa_WZE+;cN@v#goANART#`$!$nsdP)Lq9p-S9>gRv*69FL-jHc zZ{Ou%W@ZKz`7#fF{kTRj?p>nC^Ckqsq{oHI`B{Q&9*fJ>WC@>xXx@dyY32#{SE6r_ z`Q7FfBmuf_H|N){gN*4cGOetT{B}7X4?2w1hHs7}KrZ}yyiJwwBh)miRH?urDwvi> zsTRsxGB@hotxU<7zAJa`txH`Tle%qcJchA#b$J5zVERY@6iH%5VxL{TfWd-J=fFz!4=1Fq8<{{pEbt(mb`7#-cK9$ zM7kO;6Rq1gA!wQDtz52qBqPC7{vjWkSzMr^0;wFpxWI8VR}4Ov5TS(;&W%|KF0nc$ zUj|knSkEh*8?@W!w*FHNZe)PCk0*8T)j|s>)#?YCI?4A$Cy1guW&#FvW>h*0HNGvZ z=Gx=f-eQ?t6Lt_P{sIhT6TH)b@KLv*+AKHd;RK3c5+JyfTnUP*rv_TYn4ta6%Go3v zNj$=aa*j}=|s$7c@|eVd1roPUi7&VKva&uk zuR&Gtm78^-5%Tvrs~um=k+2r`Sc6Tl=dsYv@v7f8#ye>)x`UhFZAY|lAKKP~fx+FW z)8f07FMII#n7q+5P2B3XS#5zcmpK`2H}jS*U*?Hn^A%YTww*4IA6SFU*S*MD_Sdg9 zQ-TSepXOsrHPJQtkFb9LI)9;M7ti~pGknQccWKpKp0TQsQI_4DYEyVt^PeKu6zIzP z;CWB5Z9IO|TnC4JH0yOY?Q0(%IR2Xa+|~-y3mKz0DA%Du$6&@Esuw3@c@oLw>XS|D z*+}xC@xg{lUIv&Y1xc<>5X}1HQa)1!d4UA+tP~$gXE&8k1oRl|&!w1SLP7#BAG@IAed|q@b707h!nc(gAT=KZHxu!k+%zHPB zDZ}hMs{;O;EpZF_O$MJo6I2}efU1fqMHRyYgPBkek-bPOn(Q-P2G#+@oTwjpXPT;s zB2FByqWNv8E9lFr^h+z*nC7CY1>Cgbbg|}RFJL-PlEp*LzYT=C0WZtL_{`((?lYsl z<||NI9l@E>g3h4P4w~h2F*W<^j8|b<`uf9@rX7>!F+J9er{y$RoXsh~ff@c;(I1dt4BNX=F_;cCAm8XJi4Bp3LE1FMhQYf|p(w$Dp98&>}3 z9<77c7do8W-@|_1N8xApG40E_r_#eE#l6*q!}DRYR<$Oj4P!{YCxoH~hs3o>+-IBw z3xk#TBrWf~P9#{YM?pjq*EfU zy>rr#h^R0%N5#L%!yDeOls?W*+he~`=6?uy&J=k0f<5>BS8 zEvvs#x8Bn?#tpf7uldEle--2UedRi9r|nOlcCl8-A$V&|5E=}-$>`~s!|u6v$?B$4tb8vW#v|# z_qD$E5Mou`{ZZ;(*cj>5C;4r@hevAFZe8wM45RG82sohQU#siOGeM?+>l6L4W^lg` zHNWld@4eY^ZFm}UXufwWE@r-=U{pK&^jWBGOnk4>h9uF`LN-e_5j^gwO({OZ%vX48 z5?Pa3t^4VJow8^uQ&u{80%#9=g2dP^K*=^$(9Y-;moc5gYg+`^RYP@U_Z96Fz%Z)-k|T=yWM7(OE2FQ{6t!c>-R zlzdj`^Hy(0?(u)h9FU-RqTCfpS6_*l$$uNZEHIjebm*0ynj(;azh*apUbzh~WR`Wa!6cfw)I&AY(!+*y{74}#1 zp1yzdb{_XaKn7HTWsyT07@?fv8Q@hT4N3srA>4f7XLC}s4cH1#Tlc1PEc$IwoV1?t zYq36yPbay>Hv8p~u8Q71(2E+F{v0bYQ$UHh=8gl2k7{Dzt*^bFbJk;72+QJSTmP`t zRiU-^)X((iif3sY#d^}g8mcPAN^R;XQv)X!y!ZYU{U+aY=x1c~=s$>C=De>jDUcHZ(&FP-sD+x%0Xg@{ zI>d-OOl$XV=D@KN!ytMSdQ_Eni=)eWvSiCO-Xl@I8Lx3XzQYChp?;5x-Ur$rZMbCg zr*Gm+uz>buzAWxlHS{UPxe%2YAZkAp2L&Jh*C6M$z%M|9yjA|gQ*0}~?-#%AzY+uw zv2vgG-|X!YefFMp&zp^QEuUN3UFi*h%}7Aa;fk%v>A_1O|07R2AZQ+shBMG9%Q^p# zPtigDAwa635oQ19rBMLgi~dj=uSAcKbBcGp@&I^~Qa|q7h6+TbNWtHh!jRN0&-1{R zTSv?EGc_XoO!0L9^V0U}I=H}sI(|Z%ErWON0PzI{-Q{UBh_kZXj6%!c9aLrCji*0h zYJc-h?@+~iy>EiQ7P?)ou}JcP#6-;LAfPzBezW(EEQN{vyb=I_r0rBpTEJi5Lpnrd z5C{uH@UO`No0$Wm=$j(|26lbJU!D^%JlPt*li?*eb3RH$IKn&9M!`+7!u(Yh*p>n5 zn3q2Ds=K>P>N6bcKR(uRvXpwMlFyR02u9Q2ZNk|zxFD-MI!{I&LyB%@;_(=C} zH}TK~trN#7r_zr|H=3l9&72%e#koq*;eQJnsv!TlX@+$HQmy z$JLi#+sk~f-%#G?PJOtj=k`!{y#sOWR{9Rdbhg{QhC3s-AYQauq{CpeM{kfymhC0o zgZYL*u19Zt?Zb(V%lMfhGR{5YQAtQrXng}Yy>Lr1M7>lCT#mn~V8XOjdZr52lwwBw z%VrvQq+9fm$j7PA2Th#%BKMdK!|d!;PUt7&0ma2)j+hW_f~!^aV#vtdAH~;Mp$M31 z^XZ})`mge{QxcFt4}-RpXd~O|gqygfm?4Hc;7W1i+&x3rY13-gTb@n$&(%TB%g^37 z09W8L@7S6=W(ORMiBGDl9JwnNT3#a5s=yNQRNK5e*a$Lm1Bhw^5j9u>{|a#lP2i_p z8DQ*$1qb!QsT05{p3-$vCds`&L|L=&ZW%iDN;08YFtCD%?bm70z(oX%IG}Kla|;RJ z{(%J?E-Vu#DWIA8TyYlvg%He=I@RgcaX#bM+h|OW_vuOEdZsSU&g%{a@!s{ikw%SQ z7y~-owfc6{D)Ovw0cqG1KPQnvZ)JNDKNrF#f8*Y=D&FC5o zFysNDK~Pm^Gcm=Wn@3XZ%w-Z{)>p;MEH}aj4>(OO|D-8J5y6ZSW>YzAVs!$!Gtmf` zeZ#n3VE$roO}Uc^)A|4#RJdWpc+jEX9xfHzw$lpap0$!Y?g{~CVnIj9go%v<6CE4m zvC$Y_Npv=sHkVCC4RvScxQs(8R0~DAsnJ37sa?t`=4?iW2@M-6HY^T26T$dKAZ1Sq z&RihS5cxPUWSj@qS!Ryn#qZ*mK+kPwTKQt+r7-PslT3Jb0xxPnN>r=CjH)R#Y8AU_ zwzO!BJl;Z`3Grt>*{TTW7c5$q5@S9P7((o;ri9Dl8Z}M?Pdc@ zqZT^f0~e;ov9|l)wXpBmR)=u>9xEonH8OXCt)VkOUz2RaI|XcOSmU3RbjYHiX2hO& z>Sr{E6bXAYGhCTtSLZAhw*zrIsxlOmKpHpdd1aUwr2(bsmlDR<7R?+e5dp=cV*-WB zSy(e^+{mn#L~j?}uGHu0P)C4BnwiZ?)VmEd*AX!%ENtB7^HvVzMs96c0w!fNi&Te= zX+J##r>tlvBB(>Ufcy#Y!NZMe>$T8l+GQ7A4yF!~R(D;O-@*JLNHP+MWQ48Wa)MYFJYRD=?)) z_rv|EcQ*bkW$qI?c`nrk8yPbfb78puGP)ZtQnG>Kj#swfi1J-^Aa;EYMJ6D`@^J$i zjYlKOHJ$kNeoNo^ectWcZYzB3_X|P|G}th3cMl-8beVuIBkJ1|#sumiK8{cJgcvp0 z>CgxNYhtgr+5aaA`ptITtUTN2{v+h2H^jBcNP^(8k{i0HmE+znfg;R&nOs)oOq-b6f3rW(RAlluna7A z0km#3AZU)?rgV9dOO6VszZDMzygx2MI@**bs|8;4ebE=su&6+SI_5u$;jxL^2F*YY z?Kg6nG^teT1IsHE5@ewiM~x19%E$pcBW?)^hsziYH-qBpuC2Y}f(kVve5Ftk7G_Va zGje~WMY@1|3cv{DCcYiWF59jWDQ-!j36>zDh8;+X!&}m0fN-$kgO@|diTBWaUA7hn z>wh@2mqSu8P-E0+7%o24?5xlzBBQ;oWL|z!sC6)^Jn5f#(Y2?G3*VV9ni8<{L<4npL+4@b}&46>et97ZwP8 zw67|DNH})AzZjUkRDwHG`yC{JoPO8O{Nz6t_0WsFU1p!Y_HGd_Y<7C!bzo1~;W4@Q zXsT|^?sah#`mfy}iGV^(We+SrLkJ+B5DGB%@Z6wGA1rZ14NM3cU|Hy2?}u#{K{q#{%7}^M zqBbdv*Z#&!P5QS&ji?YD7F_FH|$bk-kHiQQT`VI0|CSy zpr|R~YN7Qn$mEBqk^3=9@_uoii;Vv-=mjOfROrX3GX=^5f0kb+gb!A<)YC)AWo-7bd$2%7@AI*t z^cZfm{gDx$p>p=MxA5QLB9)bg*V~t2D(cUr7w(X~9qPg1u7`tl{kN@^S8M~Axi9hQ z@7PicyItgS0O?=#a)zT1QU6TR5yD!eD5wtQv~^9glkkGb{TtHP6`#QyJ@?=p@9S3z zk5LZqMg#bRw)SoWyLX{0>ci&`-@$i!yS3XV{X5Sc2oFL>I!iGR-4~+>Mt_N}8K0{v zZhQ#!8ZUP&`?@6Pc|Q*-SFL=)95875g+vtc#oeG!d08|H2g0wHq`OajAJ>!K*f+V~ zLjuJkmU>Qk{4inIa5nS%+0S>sUH-Gb9dCt@Kl-e@ z`!ym5cg8ylT4m^EjW22bd0e{)~8MsK|i3^!YBn)jBy$$R`Sx)J|} z;u|~3WcS7P$Dh}l_iUcmSVb3nA##MbE8&c<&8Z%>=jC6HN8G^6GwG_&veO*+6Vem- zy1v8T_3j-OM~yk1x122XRd4q(xH;nL+qZ1GFSqL)i!tE#eus7RHNuJD*wdGO*yEf5 zYOtQ&ZMIZLR@0dR%+)2^0?H?O!%e=%<8K!W4^7b{>mCoo$1~20K7{{Yz-1WtWnb%= zh|~4HE%2*V05O)Y{%cZwv5Nlgw|om#f_1DxSGNzD?#1uoThdvft;XH|ke>RICl*~E z87N<`?_->29U9Xo7nP*@vpN0$0>adU4Q8JVQkc$?=Z*nmv$y1)?1#bHxgcJ52rkH~ zVRy3TOzfGb!T#WZZwU{%Qlu=EZ6y7_wE!lI_j$%m>b8{m)@S*BZ}e&|N1(~KxF7ds z(TS7==sc;M-sH)r@cO-HV~^c3^doTUdEAQydVVlo2w9Sd%(FFT5)ZJy@}IYZ#@+Hd zfzi{okl*BCH&gf2=3753-tf)T2XhLqc&sk~_yzlOR3~tmJ~nXms55$v-s{eU{1eV? z764???i{!I3c0PgxBS3#7MI@@Fv73LSQBX;wQD0BC@(-JqclVWP{yvM{bP<5Cw|wf zfef@2UB9DlxvWTe!HJ29)^FDf@+$FX&*{FaH#((_AAooBVIV`9S-k`z2;ju?aKLeV zdbLb>7%<=`|4rq7to``=1qrJ~*pDU9Z*?Hcb$}Vy!sxVWC*B^Sk^iUg6*S!4=-#OdD?h4;{u?q5Apv zRaV8kGC~AfYE?)CP+MCY%qOWQWZsE><#xC8IoKb}Om#5R_kn! zYJvq1uM`t8bYC~|v-1$P?aqr!Wz-h^`uvK?Wezy~OiLSVE}mGnH0y1bL6het&6}UE znfrG2R<6g`>WUAY^YhHle&3P%TYn!wA8Nb}%Im;3D}H%RYIi_ouNZ5u@Yv|Il=m0c|x)w1iNCyHng9io3fz#hqfst+>0pySr1|y_Diw z+})+6FVOG(%+0+wo86t6GiPMez#6pmGm0i%fv_7q`22<*{lUu{cku$i%)TEKL~%!4 z-qH6^4d`Fj2XpBGRn5t#m;)9a-gr!h`J!Z*%7)o|43I!iF#^WSP9mKbNzI_mEan+O z=25NtFJ66>{t8vRPfrr@10O+B3Y)O}K_@01U2a>>H@_qPp1wp``Ks3&F*Q^eZHpZ6 z9dF}a1o*`qKWwTliL*TQg~A$o1nW;ywL9L9*A#o3sVC`%cmF<`n6F8w=y8G(_I5ul znrA%!294AO(%oj5DkMH%j`$KqzF_kV4zo${sP6vlx@U-mvU)g-YAKL8?@a#Wy0@TD zEt2v~!1EZ=kaAu_B{D-uKJ!s?RHkg(n9z2umulX#al2QphPOVh-3h_w9Ub-8LL8P!X~d=yY{=A8_Mzej{~#s^xU5 zJ0Df~iw(u7HOOZ*{f+*e<{p?rUErwkas55{ec{XVzQp`mj9GMKw+~Y4U75)**5x)s z1W=suT_QU8yyn-f59LR`rj�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 it0B+%ADtg8u_F-I8tq literal 0 HcmV?d00001 diff --git a/coregrade/src/mailsend/images/embed3.png b/coregrade/src/mailsend/images/embed3.png new file mode 100644 index 0000000000000000000000000000000000000000..5c629ebb18aacb921ed23b9170f5ca9849523b1c GIT binary patch literal 10413 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 n!Ng= 0) + { + if (getsockopt(sock_fd, SOL_SOCKET, SO_ERROR, (void*)&optval, + &optvallen)) + return err; + if (optval) + return optval; + } + return err; +} #endif /* WINNT */ -/* returns SOCKET on success INVALID_SOCKET on failure */ -SOCKET clientSocket(char *address,int port) +void msock_print_error(void) +{ + if (s_logfp == NULL) + { + s_logfp = stderr; + } +#ifdef WINNT + msock_print_winsock_error(); +#else + (void) fprintf(s_logfp,"Socket Error: [%d]: %s\n", + errno, + strerror(errno)); +#endif /* WINNT */ +} + +#ifdef HAVE_GETADDRINFO +void msock_print_ipaddr(struct addrinfo *res) +{ +#ifdef WINNT + INT + iRetval; + struct sockaddr_in + *sockaddr_ipv4; + LPSOCKADDR + sockaddr_ip; + char + ipstringbuffer[46]; + DWORD + ipbufferlength = 46; +#else + struct sockaddr + *sa; + char + buf[1024]; +#endif /* WINNT */ + + if (res == NULL) return; + if (debug == 0) return; + +#ifdef WINNT + /* + ** Ref: http://msdn.microsoft.com/en-us/library/windows/desktop/ms738520%28v=vs.85%29.aspx + */ + sockaddr_ip = (LPSOCKADDR) res->ai_addr; + ipbufferlength = 46; + iRetval = WSAAddressToString(sockaddr_ip, (DWORD) res->ai_addrlen, NULL, + ipstringbuffer, &ipbufferlength ); + if (iRetval) + { + (void) fprintf(stderr," WSAAddressToString failed with %u\n", + WSAGetLastError() ); + } + else + { + if (debug) + { + (void) fprintf(stderr," IP address: %s\n",ipstringbuffer); + } + } +#else + sa = (struct sockaddr *) res->ai_addr; + switch (sa->sa_family) + { + case AF_INET: + { + inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr), + buf,sizeof(buf) - 1); + if (debug) + { + (void) fprintf(stderr," IPv4 address: %s\n",buf); + } + break; + } + case AF_INET6: + { + inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr), + buf,sizeof(buf) - 1); + if (debug) + { + (void) fprintf(stderr," IPv6 address: %s\n",buf); + } + break; + } + default: + { + (void) fprintf(stderr,"Error: Uknown AF family\n"); + } + } +#endif /* WINNT */ +} +#else +void msock_print_ipaddr(void *res) +{ + ; +} +#endif /* HAVE_GETADDRINFO */ + + +/* +** It is assumed that the socket is a blocking socket. In order to +** timeout the connect(), socket is made non-blocking and changed +** back to blocking after a successful connect, because lot of other calls +** are blocking. Someday I might change everything to non-blocking. +** +** returns a blocking SOCKET on success INVALID_SOCKET on failure +*/ +SOCKET clientSocket(int use, char *address,int port, int connect_timeout) { SOCKET - s; + sock_fd; struct sockaddr_in sa; @@ -100,46 +279,205 @@ SOCKET clientSocket(char *address,int port) struct in_addr *addr; + struct timeval + tv; + + fd_set + fdset; + int + eno, rc; +#ifdef HAVE_GETADDRINFO + char + service[64]; + + struct addrinfo + hints, + *cur, + *res, + *ressave; +#endif /* HAVE_GETADDRINFO */ + #ifdef WINNT rc=initWinSock(); if (rc != 0) return(INVALID_SOCKET); #endif /* WINNT */ - - addr=atoAddr(address); - if (addr == NULL) + +#ifdef HAVE_GETADDRINFO + if (debug) { - (void) fprintf(stderr," Invalid address: %s\n",address); + (void) fprintf(stderr,"> libmsock: using getaddrinfo\n"); + } + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = PF_UNSPEC; + if (use == MSOCK_USE_IPV4) + { + hints.ai_family = PF_INET; + } + if (use == MSOCK_USE_IPV6) + { + hints.ai_family = PF_INET6; + } + (void) snprintf(service, sizeof(service) -1, "%d", port); + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + rc = getaddrinfo(address, service, &hints, &res); + if (rc != 0) + { + (void) fprintf(stderr,"Error: Could not find host \"%s\"\n",address); + return(INVALID_SOCKET); + } + ressave = res; + rc = (-1); + for (cur=res; cur != NULL; cur = cur->ai_next) + { + if (debug) + { + switch (cur->ai_family) + { + case AF_UNSPEC: + { + if (debug) + { + (void) fprintf(stderr,"> AF_UNSPEC\n"); + } + break; + } + case AF_INET: + { + if (debug) + { + (void) fprintf(stderr,"> AF_INET IPv4\n"); + } + break; + } + case AF_INET6: + { + if (debug) + { + (void) fprintf(stderr,"> AF_INET6\n"); + } + break; + } + } + msock_print_ipaddr(cur); + } + sock_fd = socket(cur->ai_family, + cur->ai_socktype, + cur->ai_protocol); + if (sock_fd >= 0) + { + msock_make_socket_nonblocking(sock_fd); + /* + ** Try the current addrinfo + ** Patch by https://code.google.com/p/mailsend/issues/detail?id=34 + */ + rc = connect(sock_fd, cur->ai_addr, cur->ai_addrlen); + eno = msock_get_errno(sock_fd); + if (debug) + { + (void) fprintf(stderr,"> EINPROGRESS=%d,EWOULDBLOCK=%d\n", + EINPROGRESS,EWOULDBLOCK); + (void) fprintf(stderr,"> connect(): socket=%d,rc=%d, errno=%d\n", + sock_fd,rc,eno); + } + if (rc != 0) + { + if (eno == EINPROGRESS || + eno == EWOULDBLOCK) + { + /* + ** our socket is non blocking. + ** we need this to timout connection . + ** we'll make the socket blocking again at the end + */ + rc = 0; + if (debug) + { + (void) fprintf(stderr,"> Try socket %d\n",sock_fd); + } + break; + } + } + else + { + msock_close_socket(sock_fd); + } + } + } + freeaddrinfo(ressave); + if (rc != 0) + { + (void) fprintf(stderr,"Could not connect to %s:%d\n",address,port); return(INVALID_SOCKET); } +#else + addr=atoAddr(address); + if (addr == NULL) + { + (void) fprintf(stderr,"Error: Invalid address: %s\n",address); + return(INVALID_SOCKET); + } memset((char *) &sa,0,sizeof(sa)); sa.sin_family=AF_INET; sa.sin_port=htons(port); sa.sin_addr.s_addr=addr->s_addr; /* open the socket */ - s=socket(AF_INET,SOCK_STREAM,PF_UNSPEC); - if (s == INVALID_SOCKET) + sock_fd=socket(AF_INET,SOCK_STREAM,PF_UNSPEC); + if (sock_fd == INVALID_SOCKET) { (void) fprintf(stderr," Could not create socket\n"); return(INVALID_SOCKET); } - + + /* make the socket non-blocking */ + msock_make_socket_nonblocking(sock_fd); + rc=connect(sock_fd,(struct sockaddr *) &sa,sizeof(sa)); +#endif /* HAVE_GETADDRINFO */ /* connect */ - rc=connect(s,(struct sockaddr *) &sa,sizeof(sa)); - if (rc < 0) - return(INVALID_SOCKET); + if (rc != 0 ) + { + eno = msock_get_errno(sock_fd); + if (eno == ECONNREFUSED) + { + msock_print_error(); + msock_close_socket(sock_fd); + return(INVALID_SOCKET); + } + } + FD_ZERO(&fdset); + FD_SET(sock_fd, &fdset); - return(s); + tv.tv_sec = connect_timeout; + tv.tv_usec = 0; + + rc = select(sock_fd + 1, NULL, &fdset, NULL, &tv); + if (rc == -1) + { + (void) fprintf(stderr,"Fatal select() error\n"); + msock_close_socket(sock_fd); + return (INVALID_SOCKET); + } + if (rc == 0) + { + (void) fprintf(stderr,"Error: Connection to %s:%d timed out after %d seconds\n", + address, port, connect_timeout); + msock_close_socket(sock_fd); + return (INVALID_SOCKET); + } + + /* make the socket blocking again*/ + msock_make_socket_blocking(sock_fd); + return(sock_fd); } - /* ** this function writes a character string out to a socket. ** it returns -1 if the connection is closed while it is trying to @@ -201,12 +539,12 @@ int sockPuts(SOCKET sock,char *str) return (sockWrite(sock,str,strlen(str))); } -int sockGets(SOCKET sockfd,char *str,size_t count) +int sockGets(SOCKET sockfd,char *str,size_t count, int read_timeout) { int bytesRead; - int + size_t totalCount=0; char @@ -216,6 +554,34 @@ int sockGets(SOCKET sockfd,char *str,size_t count) char lastRead=0; +#if defined(SO_RCVTIMEO) + struct timeval + tv; +#ifdef WINNT + DWORD + dwTime = read_timeout * 1000; +#endif /* WINNT */ +#endif /* SO_RCVTIMEO*/ + +#if defined(SO_RCVTIMEO) + tv.tv_sec = read_timeout; + tv.tv_usec = 0; + if (debug) + { + (void) fprintf(stderr,"> Setting read timeout to: %d seconds\n", read_timeout); + } +#ifndef WINNT + setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval)); +#else + if (debug) + { + (void) fprintf(stderr,"> Windows Setting read timeout to: %d seconds\n", read_timeout); + } + setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char *)&dwTime, sizeof(dwTime)); +#endif + +#endif /* SO_RCVTIMEO*/ + currentPosition=str; while (lastRead != 10) @@ -226,6 +592,8 @@ int sockGets(SOCKET sockfd,char *str,size_t count) /* ** the other side may have closed unexpectedly */ + msock_print_error(); + (void) fprintf(stderr,"Error: Connection is closed unexpectedly\n"); return (-1); } lastRead=buf[0]; @@ -249,7 +617,7 @@ int sockGetsSSL(SSL *ssl,char *str,size_t count) int bytesRead; - int + size_t totalCount=0; char @@ -268,6 +636,8 @@ int sockGetsSSL(SSL *ssl,char *str,size_t count) /* ** the other side may have closed unexpectedly */ + msock_print_error(); + (void) fprintf(stderr,"Error: Connection is closed unexpectedly\n"); return (-1); } lastRead=buf[0]; @@ -289,11 +659,11 @@ int sockGetsSSL(SSL *ssl,char *str,size_t count) /* must be called after msock_set_socket() */ /* must be called after msock_set_ssl() if SSL is on */ -int msock_gets(char *str,size_t count) +int msock_gets(char *str,size_t count, int read_timeout) { if (! msock_is_ssl_on()) { - return(sockGets(msock_get_socket(),str,count)); + return(sockGets(msock_get_socket(),str,count, read_timeout)); } else { @@ -335,3 +705,54 @@ void msock_close(void) msock_close_socket(msock_get_socket()); } +/* +** Make a socket non-blocking +*/ +void msock_make_socket_nonblocking(SOCKET sock_fd) +{ +#ifndef WINNT + int + flags; +#else + unsigned long + mode = 1L; +#endif /* WINNT */ + if (sock_fd == INVALID_SOCKET) + { + return; + } + +#ifdef WINNT + ioctlsocket(sock_fd, FIONBIO, &mode); +#else + /* Stevens: Page 411 */ + flags = fcntl(sock_fd, F_GETFL); + fcntl(sock_fd, F_SETFL, (flags | O_NONBLOCK)); +#endif /* WINNT */ +} + +/* +** Make a socket blocking +*/ +void msock_make_socket_blocking(SOCKET sock_fd) +{ +#ifndef WINNT + int + flags; +#else + unsigned long + mode = 0L; +#endif /* WINNT */ + if (sock_fd == INVALID_SOCKET) + { + return; + } + +#ifdef WINNT + ioctlsocket(sock_fd, FIONBIO, &mode); +#else + /* Stevens: Page 411 */ + flags = fcntl(sock_fd, F_GETFL); + fcntl(sock_fd, F_SETFL, (flags & ~O_NONBLOCK)); +#endif /* WINNT */ +} diff --git a/coregrade/src/mailsend/libs/libmsock/msock.h b/coregrade/src/mailsend/libs/libmsock/msock.h old mode 100644 new mode 100755 index c68158d..1af5418 --- a/coregrade/src/mailsend/libs/libmsock/msock.h +++ b/coregrade/src/mailsend/libs/libmsock/msock.h @@ -8,8 +8,13 @@ #include #include #include -#include - +/*#include */ +#include +/* http://support.microsoft.com/kb/955045 */ +/* for getaddrinfo in win2k */ +#include +#include +#define snprintf _snprintf #else #include @@ -53,8 +58,17 @@ #endif /* HAVE_OPENSSL */ -SOCKET clientSocket(char *,int); -int sockGets(SOCKET,char *,size_t); +#include "werrno.h" + +#define MSOCK_USE_IPV4 0x01 +#define MSOCK_USE_IPV6 0x02 +#define MSOCK_USE_AUTO 0x03 + +/** + * familty can be USE_IPV4, USE_IPV6 or USE_AUTO + */ +SOCKET clientSocket(int use, char *server_addr,int port, int connect_timeout); +int sockGets(SOCKET,char *,size_t, int read_timoeut); int sockPuts(SOCKET sock,char *str); void msock_set_socket(SOCKET sock); @@ -62,10 +76,22 @@ SOCKET msock_get_socket(void); void msock_turn_ssl_on(void); void msock_turn_ssl_off(void); int msock_is_ssl_on(void); -int msock_gets(char *buf,size_t bufsiz); +int msock_gets(char *buf,size_t bufsiz, int connect_timeout); int msock_puts(char *str); void msock_close_socket(SOCKET fd); void msock_close(void); +void msock_make_socket_nonblocking(SOCKET sock_fd); +void msock_make_socket_blocking(SOCKET sock_fd); +void msock_print_error(void); +void msock_set_logfp(FILE *logfp); +void msock_set_debug(int debug); + +#ifdef WINNT +int msock_get_errno(SOCKET sock_fd); +#else +#define msock_get_errno(sock_fd) (errno) +#endif /* WINNT */ + #ifdef HAVE_OPENSSL diff --git a/coregrade/src/mailsend/libs/libmsock/werrno.h b/coregrade/src/mailsend/libs/libmsock/werrno.h new file mode 100644 index 0000000..1fcbbac --- /dev/null +++ b/coregrade/src/mailsend/libs/libmsock/werrno.h @@ -0,0 +1,118 @@ +#ifndef WERRNO_H +#define WERRNO_H + +#ifdef WINNT + +/* +** This file is auto generated on Sun Aug 26 10:12:25 -0400 2012 +** Map wisock error code. Newer Visual Studio defines them +** but they do not map to Winsock error code. +*/ +#undef EWOULDBLOCK +#define EWOULDBLOCK WSAEWOULDBLOCK + +#undef EINPROGRESS +#define EINPROGRESS WSAEINPROGRESS + +#undef EALREADY +#define EALREADY WSAEALREADY + +#undef ENOTSOCK +#define ENOTSOCK WSAENOTSOCK + +#undef EDESTADDRREQ +#define EDESTADDRREQ WSAEDESTADDRREQ + +#undef EMSGSIZE +#define EMSGSIZE WSAEMSGSIZE + +#undef EPROTOTYPE +#define EPROTOTYPE WSAEPROTOTYPE + +#undef ENOPROTOOPT +#define ENOPROTOOPT WSAENOPROTOOPT + +#undef EPROTONOSUPPORT +#define EPROTONOSUPPORT WSAEPROTONOSUPPORT + +#undef ESOCKTNOSUPPORT +#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT + +#undef EOPNOTSUPP +#define EOPNOTSUPP WSAEOPNOTSUPP + +#undef EPFNOSUPPORT +#define EPFNOSUPPORT WSAEPFNOSUPPORT + +#undef EAFNOSUPPORT +#define EAFNOSUPPORT WSAEAFNOSUPPORT + +#undef EADDRINUSE +#define EADDRINUSE WSAEADDRINUSE + +#undef EADDRNOTAVAIL +#define EADDRNOTAVAIL WSAEADDRNOTAVAIL + +#undef ENETDOWN +#define ENETDOWN WSAENETDOWN + +#undef ENETUNREACH +#define ENETUNREACH WSAENETUNREACH + +#undef ENETRESET +#define ENETRESET WSAENETRESET + +#undef ECONNABORTED +#define ECONNABORTED WSAECONNABORTED + +#undef ECONNRESET +#define ECONNRESET WSAECONNRESET + +#undef ENOBUFS +#define ENOBUFS WSAENOBUFS + +#undef EISCONN +#define EISCONN WSAEISCONN + +#undef ENOTCONN +#define ENOTCONN WSAENOTCONN + +#undef ESHUTDOWN +#define ESHUTDOWN WSAESHUTDOWN + +#undef ETOOMANYREFS +#define ETOOMANYREFS WSAETOOMANYREFS + +#undef ETIMEDOUT +#define ETIMEDOUT WSAETIMEDOUT + +#undef ECONNREFUSED +#define ECONNREFUSED WSAECONNREFUSED + +#undef ELOOP +#define ELOOP WSAELOOP + +#undef EHOSTDOWN +#define EHOSTDOWN WSAEHOSTDOWN + +#undef EHOSTUNREACH +#define EHOSTUNREACH WSAEHOSTUNREACH + +#undef EPROCLIM +#define EPROCLIM WSAEPROCLIM + +#undef EUSERS +#define EUSERS WSAEUSERS + +#undef EDQUOT +#define EDQUOT WSAEDQUOT + +#undef ESTALE +#define ESTALE WSAESTALE + +#undef EREMOTE +#define EREMOTE WSAEREMOTE + +#endif /* WINNT */ + +#endif /* WERRNO_H */ diff --git a/coregrade/src/mailsend/libs/libmutils/Makefile b/coregrade/src/mailsend/libs/libmutils/Makefile index 6c5e203..84a4eb1 100644 --- a/coregrade/src/mailsend/libs/libmutils/Makefile +++ b/coregrade/src/mailsend/libs/libmutils/Makefile @@ -1,23 +1,24 @@ -# -# ma_muquit@fccc.edu -# jul-29-199 -# +# jul-29-1999 CC= gcc -DEFS= -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DHAVE_STRINGS_H=1 -DHAVE_MEMORY_H=1 -DHAVE_MALLOC_H=1 -DHAVE_UNISTD_H=1 -DHAVE_CTYPE_H=1 -DHAVE_STDINT_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_STDLIB_H=1 -DHAVE_FCNTL_H=1 -DHAVE_SYS_FILE_H=1 -DHAVE_FLOCK=1 -DHAVE_SOCKET=1 -DHAVE_HTONL=1 -DHAVE_GETHOSTNAME=1 -DHAVE_GETHOSTBYADDR=1 -DHAVE_YP_GET_DEFAULT_DOMAIN=1 -DHAVE_LIBNSL=1 -DHAVE_RES_SEARCH=1 -DHAVE_LIBRESOLV=1 -DHAVE_INET_ATON=1 -DHAVE_DN_SKIPNAME=1 -DHAVE_MKSTEMP=1 -DHAVE_OPENSSL=1 +DEFS= -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DHAVE_STRINGS_H=1 -DHAVE_MEMORY_H=1 -DHAVE_MALLOC_H=1 -DHAVE_UNISTD_H=1 -DHAVE_CTYPE_H=1 -DHAVE_STDINT_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_STDLIB_H=1 -DHAVE_FCNTL_H=1 -DHAVE_SYS_FILE_H=1 -DHAVE_LIMITS_H=1 -DHAVE_FLOCK=1 -DHAVE_SOCKET=1 -DHAVE_HTONL=1 -DHAVE_GETHOSTNAME=1 -DHAVE_GETHOSTBYADDR=1 -DHAVE_RES_SEARCH=1 -DHAVE_LIBRESOLV=1 -DHAVE_INET_ATON=1 -DHAVE_DN_SKIPNAME=1 -DHAVE_MKSTEMP=1 -DHAVE_GETADDRINFO=1 AR= ar cq RANLIB= ranlib LIBNAME= libmutils.a -INCLUDES= -I. -I/usr/include/malloc +OPENSSL_DIR= +OPENSSL_INC= +OPENSSL_LIBS= -# replace -O with -g in order to debug +INCLUDES= -I. $(OPENSSL_INC) DEFINES= $(INCLUDES) $(DEFS) -DSYS_UNIX=1 CFLAGS= -O $(DEFINES) -SRCS = string.c mutils.c mime.c -OBJS = string.o mutils.o mime.o +SRCS = string.c mutils.c mutils_mime.c mutils_blob.c \ + mutils_error.c mutils_temp.c mutils_time.c +OBJS = string.o mutils.o mutils_mime.o mutils_blob.o \ + mutils_error.o mutils_temp.o mutils_time.o .c.o: rm -f $@ diff --git a/coregrade/src/mailsend/libs/libmutils/Makefile.in b/coregrade/src/mailsend/libs/libmutils/Makefile.in new file mode 100755 index 0000000..5339b7e --- /dev/null +++ b/coregrade/src/mailsend/libs/libmutils/Makefile.in @@ -0,0 +1,35 @@ +# jul-29-1999 + +CC= @CC@ +DEFS= @DEFS@ +AR= ar cq +RANLIB= @RANLIB@ +LIBNAME= libmutils.a + +OPENSSL_DIR=@OPENSSL_DIR@ +OPENSSL_INC=@OPENSSL_INC@ +OPENSSL_LIBS=@OPENSSL_LIBS@ @DL_LIB@ + +INCLUDES= -I. $(OPENSSL_INC) + +DEFINES= $(INCLUDES) $(DEFS) -DSYS_UNIX=1 +CFLAGS= -O $(DEFINES) + +SRCS = string.c mutils.c mutils_mime.c mutils_blob.c \ + mutils_error.c mutils_temp.c mutils_time.c +OBJS = string.o mutils.o mutils_mime.o mutils_blob.o \ + mutils_error.o mutils_temp.o mutils_time.o + +.c.o: + rm -f $@ + $(CC) $(CFLAGS) -c $*.c + +all: $(LIBNAME) + +$(LIBNAME): $(OBJS) + rm -f $@ + $(AR) $@ $(OBJS) + $(RANLIB) $@ + +clean: + rm -f $(OBJS) $(LIBNAME) core diff --git a/coregrade/src/mailsend/libs/libmutils/Makefile.nmake b/coregrade/src/mailsend/libs/libmutils/Makefile.nmake new file mode 100755 index 0000000..2203a78 --- /dev/null +++ b/coregrade/src/mailsend/libs/libmutils/Makefile.nmake @@ -0,0 +1,32 @@ +#-------------------------------------------- +# Makefile for MS Visual C++ +# muquit@muquit.com +# updated for MS Visual Studio 10.0 Feb-27-2012 +#-------------------------------------------- + +OPENSSL_DIR=c:/openssl +OPENSSL_INC=/I$(OPENSSL_DIR)/include + +CFLAGS= /DWINNT /DWIN32 /DHAVE_MALLOC_H /DHAVE_STRING_H /DHAVE_FCNTL_H /DHAVE_CTYPE_H /DHAVE_STDLIB_H /DHAVE_OPENSSL /I. $(OPENSSL_INC) +CFLAGS=$(CFLAGS) /Ox /W3 /wd4996 /nologo +LIBFLAGS=/nologo +LIBRARY=mutils.lib + +# replace -O with -g in order to debug + +DEFINES= $(INCLUDES) $(DEFS) +#CFLAGS= $(cvars) $(cdebug) -nologo -G4 $(DEFINES) + + +SRCS = string.c mutils.c muilts_mime.c mutils_error.c mutils_blob.c \ + mutils_temp.c mutils_time.c +OBJS = string.obj mutils.obj mutils_mime.obj mutils_error.obj mutils_blob.obj \ + mutils_temp.obj mutils_time.obj + +all: $(LIBRARY) + +$(LIBRARY): $(OBJS) + lib $(LIBFLAGS) $(OBJS) /out:$(LIBRARY) + +clean: + del $(OBJS) $(LIBRARY) *.bak diff --git a/coregrade/src/mailsend/libs/libmutils/README b/coregrade/src/mailsend/libs/libmutils/README old mode 100644 new mode 100755 diff --git a/coregrade/src/mailsend/libs/libmutils/makefile.wnt b/coregrade/src/mailsend/libs/libmutils/makefile.wnt new file mode 100755 index 0000000..19730cd --- /dev/null +++ b/coregrade/src/mailsend/libs/libmutils/makefile.wnt @@ -0,0 +1,32 @@ +#-------------------------------------------- +# Makefile for MS Visual C++ +# ma_muquit@fccc.edu +# Jan-09-1999, Saturday, for Count 2.5 +# Aug-08-1999 +#-------------------------------------------- + +CC= cl /MD +DEFS= -DWINNT=1 -DSTRICT_MODE=1 -DHAVE_STRING_H=1 -DHAVE_FCNTL_H=1 -DHAVE_STDLIB_H=1 + +INCLUDES= -I. -I.. + +# replace -O with -g in order to debug + +DEFINES= $(INCLUDES) $(DEFS) +CFLAGS= $(cvars) $(cdebug) -nologo -G4 $(DEFINES) + +SRCS = string.c mutils.c mime.c +OBJS = string.obj mutils.obj mime.obj + +.c.obj: + $(CC) $(CFLAGS) -c $< -Fo$@ + +all: utils.lib + +utils.lib: $(OBJS) + link /lib /OUT:mutils.lib $(OBJS) + +utils.obj: mutils.h + +clean: + del $(OBJS) mutils.lib *.bak diff --git a/coregrade/src/mailsend/libs/libmutils/md5test.c b/coregrade/src/mailsend/libs/libmutils/md5test.c old mode 100644 new mode 100755 diff --git a/coregrade/src/mailsend/libs/libmutils/mkey.c.in b/coregrade/src/mailsend/libs/libmutils/mkey.c.in new file mode 100644 index 0000000..da0e92d --- /dev/null +++ b/coregrade/src/mailsend/libs/libmutils/mkey.c.in @@ -0,0 +1,76 @@ +/* +** mkey_hex and iv are generated at compile time +** +** muquit@muquit.com May-14-2012 +*/ +#include "mutils.h" + +#define MKEY_HEX_LENGTH 48 +#define IV_HEX_LENGTH 8 + +/* master key and iv are generated on: @MKEY_GENERATED@ */ +/* -- GENERATED CODE: do not modify stats -- */ +static char *mkey_hex="@MKEY_HEX@"; +static char *iv_hex="@IV_HEX@"; +/* -- GENERATED CODE: do not modify ends -- */ + +/* +** Return a 24 byte binary data. +*/ +unsigned char *mutils_get_master_key24(void) +{ + unsigned char + *bin = NULL; + + int + olen; + + char + *hex, + *default_mkey_hex; + + default_mkey_hex="cfed17bd5ca36d94bfb77e029a2d0c876f6d0cc2bc8a53d6"; + if (mkey_hex && strlen(mkey_hex) == MKEY_HEX_LENGTH) + { + hex = mkey_hex; + } + else + { + hex = default_mkey_hex; + } + bin = mutils_hex_to_bin(hex, MKEY_HEX_LENGTH, &olen); + if (olen > 0) + return(bin); + + return(NULL); +} + +/* +** Returns a 8 byte binary data +*/ +unsigned char *mutils_get_iv8(void) +{ + unsigned char + *bin = NULL; + + int + olen; + + char + *hex, + *default_iv_hex; + + default_iv_hex="f76f9c327947ee19"; + if (iv_hex && strlen(iv_hex) == IV_HEX_LENGTH) + { + hex = iv_hex; + } + else + { + hex = default_iv_hex; + } + bin = mutils_hex_to_bin(hex, IV_HEX_LENGTH, &olen); + if (olen > 0) + return(bin); + return(NULL); +} diff --git a/coregrade/src/mailsend/libs/libmutils/mutils.c b/coregrade/src/mailsend/libs/libmutils/mutils.c old mode 100644 new mode 100755 index ae06c13..26eef66 --- a/coregrade/src/mailsend/libs/libmutils/mutils.c +++ b/coregrade/src/mailsend/libs/libmutils/mutils.c @@ -6,6 +6,263 @@ static int lock_fd=(-1); +static const char basis_64[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +/* taken from Parrot code */ +const char Parrot_utf8skip[256] = +{ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ascii */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ascii */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ascii */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ascii */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ascii */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ascii */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ascii */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ascii */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* bogus */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* bogus */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* bogus */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* bogus */ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* scripts */ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* scripts */ + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* cjk etc. */ + 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6 /* cjk etc. */ +}; + +#define UTF8_IS_START(c) ((c) >= 0xC2 && (c) <= 0xF4) +#define UTF8SKIP(c) Parrot_utf8skip[c] +#define UTF8_IS_CONTINUATION(c) (((c) & 0xC0) == 0x80) + + + + +void mutils_liberate_memory(void **memory) +{ + if (memory == NULL) + return; + + if (*memory) + free(*memory); + *memory=(void *) NULL; +} +void mutils_liberate(void **memory) +{ + if (memory == NULL) + return; + + if (*memory) + free(*memory); + *memory=(void *) NULL; +} +void mutils_free_zero(void *buf,int size) +{ + if (buf) + { + memset(buf,0,size); + mutils_liberate_memory(&buf); + } +} + +/** + * @brief same as mutils_acquire_memory + */ +void *mutils_acquire_memory(size_t size) +{ + void + *ptr; + + if (size == 0) + { + mutils_error("%s (%d) - allocation size is specified as 0\n",MUTILS_CFL); + return(NULL); + } + ptr=malloc(size); + if (ptr) + { + memset(ptr,0,size); + } + + return(ptr); +} + +/* +** changes the size of the memory and returns a pointer to the (possibly +** moved) block. The contents will be unchanged up to the lesser of the new +** and old sizes. +*/ +void mutils_reacquire_memory(void **memory,const size_t size) +{ + void + *allocation; + + if (memory == NULL) + return; + + if (*memory == (void *) NULL) + { + *memory=mutils_acquire_memory(size); + return; + } + allocation=realloc(*memory,size); + + if (allocation == (void *) NULL) + mutils_liberate_memory((void **) memory); + + *memory=allocation; +} + + +/* from my hod program, muquit, Nov-10-2000 */ +static void mutils_hex_or_oct_dump(FILE *fp,int base,unsigned char *buf,int length) +{ + int + ii, + i; + + unsigned char + hexbuf[16]; + + int + count=0; + + int + line = 0; + + int + c; + + unsigned char + *p=buf; + + + if (length <= 0) + return; + + *hexbuf='\0'; + + + (void) fprintf (fp, + (base == 16) ? "%11d" : "%11d",0); + + (void) fflush (fp); + + for (i=1; i= 32 && hexbuf[i] < 127) + (void) fprintf (fp,"%c", hexbuf[i]); + else + (void) fprintf (fp,"."); + } + count=0; + line++; + (void) fprintf (fp,"\n"); + } + } /* while c!= EOF*/ + (void) fflush (fp); + + /* + ** pad if necessary + */ + if (count < base) + { + int + j; + + for (j=count; j = 32 && hexbuf[i] < 127) + { + (void) fprintf (fp,"%c", hexbuf[i]); + } + else + (void) fprintf (fp,"."); + } + (void) fprintf (fp,"\n"); + (void) fflush (fp); + } /* count < base .. */ +} + +void mutils_hex_dump(FILE *fp,unsigned char *buf,int length) +{ + mutils_hex_or_oct_dump(fp,16,buf,length); +} + +void mutils_hex_print(FILE *fp,unsigned char *bytes,int len) +{ + int + i; + for (i=0; i < len; i++) + { + (void) fprintf(fp,"%02x ",bytes[i]); + if ((i % 16) == 15) + fprintf(fp, "\n"); + + } + (void) fprintf(fp,"\n"); +} + + + +void mutils_oct_dump(FILE *fp,unsigned char *buf,int length) +{ + mutils_hex_or_oct_dump(fp,8,buf,length); +} + + /* ** mutilsHowmanyCommas() @@ -224,9 +481,7 @@ int /* initialize */ *port=80; - *hostname='\0'; - *page='\0'; - *tmpbuf='\0'; + *hostname = *page = *tmpbuf = '\0'; tmpbuf_len=sizeof(tmpbuf); @@ -324,8 +579,7 @@ char *mutilsSpacesToChar(char *str,int c) { char *ibuf, - *obuf, - *nbuf; + *obuf; register int i, @@ -708,6 +962,7 @@ void mutilsStripTrailingSpace (char *str) ** make a temporary filename ** filename - returns */ +#if 0 int mutilsTmpFilename(char *filename) { #define TMP_DIR "/tmp" @@ -726,6 +981,7 @@ int mutilsTmpFilename(char *filename) return(mktemp(filename)); #endif /* ! HAVE_MKSTEMP */ } +#endif /* 0 */ /* @@ -767,9 +1023,7 @@ int mutilsTmpFilename(char *filename) * Development History: * 3/26/92, jps, first cut */ -char *mutilsBasename(path) -char - *path; +char *mutilsBasename(char *path) { char *cptr; @@ -788,6 +1042,80 @@ char } +/* +** Return the extension of a file in a path +** Parameters: +** path - path of a file +** Return Values: +** pointer to the extension +** Side Effects: +** none +** Comments: +** If that is /usr/local/file.pdf, pointer to +** pdf will be returned +** Development History: +** muquit@muquit.com Dec-15-2013 - needed to detect mime type based on extension +*/ +char *mutilsExtension(char *path) +{ + char + *base, + *cptr; + + base = mutilsBasename(path); + for (cptr = base + strlen(base); cptr >= base; --cptr) + { + switch (*cptr) + { + case '.': + { + return ++cptr; + } + } + } + return path; +} + +char *mutilsExtensionLower(char *path) +{ + char + *ext; + return (mutilsStrLower(mutilsExtension(path))); +} + + +/* +** Return the basename of a path +** Parameters: +** path - path in Unix or windows style +** +** Return Values: +** pointer to the basename on success +** pointer to the path on failure +** Side Effects: +** no memory is allocated, pointer is returned +** pointing to the basename +** Comments: +** If path is say /usr/local/foo, foo will be returned +** on success. if path is c:\foo\bar, pointer to bar +** will be returned. if path is blah, pointer ot +** blah will be returned +** Development History: +** muquit@muquit.com Dec-15-2013 +** didn't know I already had it +*/ +char *mutils_basename(const char *path) +{ + char + *bn = path; + bn = strrchr(path,'/'); + if (bn == NULL) + { + bn = strrchr(path,'\\'); + } + return (bn == NULL) ? path : ++bn; +} + /* ** mutilsDotLock() ** open a file for locking purpose. If the system is Unix, use @@ -985,9 +1313,6 @@ char *f, *p; - int - len; - if (file == NULL || *file == '\0') return (NULL); @@ -1142,15 +1467,41 @@ static void _fs_give (void **block) *block = NULL; } +/* +** +** Given the length of a plain text string, return the +** length +** +** Parameters: +** len - length of plain text string +** +** Side Effects: +** none +** +** Comments: +** taken from apache apr util library +** +** Return Values: +** length of base64 encoded string +** +** Development History: +** muquit@muquit.com Oct-12-2013 first cut +*/ +int mutils_base64_encode_len(int len) +{ + return ((len + 2) / 3 * 4) + 1; +} + /** + * @Deprecated * @brief encode content to base64 * @param src pointer to source * @param srcl Length of the source * @param len length of base64 encoded string (returns) * * @return Ponter to encoded strin gon success, NULL on failure. The -* caller is responsile to free the memory + * caller is responsile to free the memory * * Adapted from from c-client source */ @@ -1215,6 +1566,82 @@ unsigned char *mutils_encode_base64(void *src,unsigned long srcl,unsigned long * return (ret); /* return the resulting string */ } +/* +** Endode a string to base64 +** +** Parameters: +** string - plain text/binary string +** len - length of the plain text string +** +** Return Values: +** Pointer to null terminated base 64 string. Memory is allocated for +** the string +** NULL in case of error. +** Comments: +** reason not to use mutils_encode_base64(), it adds crlf after 60 +** characters, which broke smtp auth with longer base64 encoded string. +** +** The caller is responsible to free the memory of the returned string. +** +** Adapted from apache apr util library. Does not support EBCDIC. +** +** Side Effects: +** none +** +** Development History: +** muquit@muquit.com Oct-12-2013 first cut +*/ +char *mutils_encode_base64_noformat(const char *string, int len) +{ + int + encode_len, + i; + + char + *p, + *encoded = NULL; + + if (len == 0) + { + return NULL; + } + + encode_len = mutils_base64_encode_len(len); + encoded = (char *) malloc(encode_len); + MUTILS_CHECK_MALLOC(encoded); + memset(encoded, 0, encode_len); + p = encoded; + for (i = 0; i < len - 2; i += 3) + { + *p++ = basis_64[(string[i] >> 2) & 0x3F]; + *p++ = basis_64[((string[i] & 0x3) << 4) | ((int) (string[i + 1] & 0xF0) >> 4)]; + *p++ = basis_64[((string[i + 1] & 0xF) << 2) | ((int) (string[i + 2] & 0xC0) >> 6)]; + *p++ = basis_64[string[i + 2] & 0x3F]; + } + if (i < len) + { + *p++ = basis_64[(string[i] >> 2) & 0x3F]; + if (i == (len - 1)) + { + *p++ = basis_64[((string[i] & 0x3) << 4)]; + *p++ = '='; + } + else + { + *p++ = basis_64[((string[i] & 0x3) << 4) | ((int) (string[i + 1] & 0xF0) >> 4)]; + *p++ = basis_64[((string[i + 1] & 0xF) << 2)]; + } + *p++ = '='; + } + + *p++ = '\0'; + return encoded; +ExitProcessing: + return NULL; + + return strdup("fuck"); +} + /** * @brief converts base64 contents to binary @@ -1330,6 +1757,317 @@ void *mutils_decode_base64(unsigned char *src,unsigned long srcl,unsigned long * return ret; /* return the string */ } +unsigned char mutils_hex_char_to_bin(char x) +{ + if (x >= '0' && x <= '9') + return(x - '0'); + + x=toupper(x); + return((x - 'A') + 10); +} +/** + * convert a hex string to it's binary format. + * @param hex_string - The hex string to convert + * @param len - length of the hex string + * @param *olen - The length of the binary string - returns + * + * @return pointer to a unsigned char holding the binary version of the + * hex string. returns NULL on failure. The caller should check + * olen (> 0) before using the binary + * + * @note Memory is allocated for the retured unsigned char pointer + * The caller is responsible to free it + * + * The format of the hex string can be any of: + * 0xde:ad:be:ef:ca:fe + * de:ad:be:ef:ca:fe + * de-ad-be-ef-ca-fe + * 0xde-ad-be-ef-ca-fe + * de:ad-be_ef:ca:fe + * + * The converted binary value will be: de ad be ef ca fe + * + * It will only convert valid hex strings to binary, for example, if + * the string is like: de:gh:ad:ff:bb:kk:cc + * The binary value will contain: de ad ff bb cc + * Note, gh and kk are ignored + */ +unsigned char *mutils_hex_to_bin(char *hex_string,int len,int *olen) +{ + int + j=0; + int + bin_len=0, + n=0, + i; + + unsigned char + value, + *out, + space[4]; + + char + *cp=hex_string; + + if (! hex_string || ! len) + return(NULL); + + if ((*cp == '0') && ((*(cp + 1) == 'x') || (*(cp + 1) == 'X'))) + { + cp += 2; + n=2; + } + + /* + ** allocate half of hex_string as the length of binary. + ** we may be allocated more than needed as : - etc may be + ** part of the hex string + */ + bin_len=(len >> 1); + if (bin_len <= 0) + return(NULL); + + out=(unsigned char *) malloc(bin_len*sizeof(unsigned char)); + memset(out,0,bin_len); + for (i=n; i < len; i += 2) + { + if (hex_string[i] == '\n' || hex_string[i] == '\r' || + hex_string[i] == ' ' || hex_string[i] == '\t' || + hex_string[i] == ':' || + hex_string[i] == '-' || + hex_string[i] == '_') + { + i--; + continue; + } + if (isxdigit(hex_string[i]) && isxdigit(hex_string[i+1])) + { + value=(mutils_hex_char_to_bin (hex_string[i]) << 4) & 0xf0; + value |= (mutils_hex_char_to_bin(hex_string[i+1]) & 0x0f); + out[j++]=value; + } + } + *olen=j; + + return(out); +} + +/** + * @brief convert binary to hex + * @param input - binary data + * @param len - length of input data + * @param output - NULL terminated string equivalent in hex + * @return length of output string (not including NULL) on success, -1 + * on failure + * + * Note: *output points to a malloc'd space, caller is responsible to + * to free it + * adapted from net-snmp 5.0.6 code (tools.c) + */ +int mutils_binary_to_hex(unsigned char *input,int len,char **output) +{ + int + olen; + char + *s, + *op; + + unsigned char + *ip; + + olen=(len * 2) + 1; + s=(char *) calloc(1,olen); + if (s == NULL) + return (-1); + op=s; + + ip=input; + while ((ip - input) < len) + { + *op++ = MUTILS_VAL2_HEX((*ip >> 4) & 0xf); + *op++ = MUTILS_VAL2_HEX(*ip & 0xf); + ip++; + } + *op='\0'; + *output=s; + + return(olen); +} + +/** + * @brief convert binary to hex + * @param in binary data + * @param in_len length of input in bytes + * @param out output buffer to hold the converted hex data. in/out. The buffer is + * NULL terminated. + * @param out_len bytes of memroy pre allocated in out. out_len must be + * greater than in_len*2 + * @return length of converted hex buffer on success, -1 on failure + * + * Note: this function is similar to mutils_binary_to_hex(), only differece is + * that in this function, the caller passes the pre-allocated buffer. + */ +int mutils_binary_to_hex_buf(unsigned char *in,int in_len,char *out,int *out_len) +{ + char + *op; + + unsigned char + *ip; + + op=out; + ip=in; + if (*out_len < (in_len * 2) + 1) + { + *out_len=(-1); + (void) fprintf(stderr,"%s (%d) - outbuf must have atlease %d bytes of space pre-allocated\n", + MUTILS_CFL,((in_len * 2) + 1)); + return(-1); + } + + *out_len=(in_len * 2); + while ((ip - in) < in_len) + { + *op++ = MUTILS_VAL2_HEX((*ip >> 4) & 0xf); + *op++ = MUTILS_VAL2_HEX(*ip & 0xf); + ip++; + } + *op='\0'; + return(*out_len); +} + + +/* +** return MUTILS_TRUE if the file is binary. MUTILS_FALSE otherwise. +** return -1 on error +** The algorithm is adapted from Perl pp_fttext() +** 512 bytes of file is used. +** +** here is the algorithm (perldoc -I -B|more) + The "-T" and "-B" switches work as follows. The first block or + so of the file is examined for odd characters such as strange + control codes or characters with the high bit set. If too many + strange characters (>30%) are found, it's a "-B" file; + otherwise it's a "-T" file. Also, any file containing a zero + byte in the first block is considered a binary file +*/ +int mutils_file_is_binary(const char *file) +{ + struct stat + sbuf; + + FILE + *fp = NULL; + + char + *s, + buf[513]; + + size_t + len; + int + i, + sz, + n; + + int + odd = 0; + + float + x; + + sz = sizeof(buf) - 1; + if (stat(file, &sbuf) != 0) + { + (void) fprintf(stderr,"Could not stat file %s\n",file); + return(-1); + } + len = sbuf.st_size; + if (len > 512) + { + len = 512; + } + fp = fopen(file, "rb"); + if (fp == NULL) + { + (void) fprintf(stderr,"Error reading file: %s\n",file); + return(-1); + } + memset(buf, 0, sizeof(buf)); + n = fread(buf, 1, len, fp); + if (n != len) + { + (void) fprintf(stderr,"read error\n"); + return(-1); + } + + s = buf; + + if (len && len < sizeof(buf) && buf[len - 1] == 0x1a) + { + --len; + } + for (i=0; i < len; i++, s++) + { + if (!*s) + { + odd += len; + break; + } + else if (*s & 128) + { + if (UTF8_IS_START(*s)) + { + int ulen = UTF8SKIP(*s); + if (ulen < len - i) + { + int + j; + for (j = 1; j < ulen; j++) + { + if (!UTF8_IS_CONTINUATION(s[j])) + { + goto NotUtf8; + } + } + --ulen; + s += ulen; + i += ulen; + continue; + } + } +NotUtf8: + odd++; + } + else + { + if (*s < 32 && *s != '\n' && *s != '\r' && *s != '\b' && + *s != '\t' && *s != '\f' && *s != 27) + { + odd++; + } + } + } + x = ((odd * 1.0) / (len * 1.0)); + if (x < 0.30) + { + return MUTILS_FALSE; + } + else + { + return MUTILS_TRUE; + } + + +ExitProcessing: + if (fp) + { + (void) fclose(fp); + } + return(-1); +} + + #ifdef TEST diff --git a/coregrade/src/mailsend/libs/libmutils/mutils.h b/coregrade/src/mailsend/libs/libmutils/mutils.h old mode 100644 new mode 100755 index a8257e8..8782603 --- a/coregrade/src/mailsend/libs/libmutils/mutils.h +++ b/coregrade/src/mailsend/libs/libmutils/mutils.h @@ -33,7 +33,20 @@ #include #include #include +#include +#include /* for timeval */ #define ftruncate chsize + +#ifdef getcwd +#undef getcwd +#endif +#define getcwd _getcwd + +#ifdef snprintf +#undef snprintf +#endif +#define snprintf _snprintf + #endif #if HAVE_SYS_PARAM_H @@ -48,6 +61,8 @@ #include #endif +#include + #if HAVE_FCNTL_H #ifndef O_RDONLY /* prevent multiple inclusion on lame systems (from vile)*/ @@ -75,8 +90,62 @@ vile)*/ #endif #endif -#define MUTILS_CFL __FILE__,__LINE__ +#if APR_HAVE_LIMITS_H +#include +#else +#if APR_HAVE_SYS_SYSLIMITS_H +#include +#endif +#endif +#if defined(PATH_MAX) +#define MUTILS_PATH_MAX PATH_MAX +#elif defined(_POSIX_PATH_MAX) +#define MUTILS_PATH_MAX _POSIX_PATH_MAX +#else +#define MUTILS_PATH_MAX 4098 +#endif + +#if !defined(O_BINARY) +#define O_BINARY 0x00 +#endif + +#define MUTILS_TRUE 1 +#define MUTILS_FALSE 0 + + +typedef struct _MutilsBlob +{ + size_t + length; + + unsigned char + *data; + + size_t + offset, + size; +}MutilsBlob; + +#ifdef WINNT +typedef struct _MutilsTime +{ + FILETIME + absolute; +}MutilsTime; +#else +typedef struct _MutilsTime +{ + unsigned int + secs, + nsecs; +}MutilsTime; +#endif /* WINNT */ + + +#define MUTILS_CFL __FILE__,__LINE__ +#define MCFL __FILE__,__LINE__ +#define MJL __LINE__ #if __STDC__ || defined(sgi) || defined(_AIX) #undef _Declare @@ -88,7 +157,6 @@ vile)*/ #define MUTILS_MAX_TOKEN_LEN 1024 - #define MUTILS_CHECK_MALLOC(p) \ do \ { \ @@ -99,9 +167,42 @@ do \ }\ }while(0) +/* from net-snmp 5.0.6 tools.h */ +#define MUTILS_FREE(s) if (s) { free((void *)s); s=NULL;} +#define MUTILS_TOUPPER(c) (c >= 'a' && c <= 'z' ? c - ('a' - 'A') : c) +#define MUTILS_TOLOWER(c) (c >= 'A' && c <= 'Z' ? c + ('a' - 'A') : c) + +#define MUTILS_VAL2_HEX(s) ( (s) + (((s) >= 10) ? ('a'-10) : '0') ) +#define MUTILS_HEX2_VAL(s) \ + ((isalpha(s) ? (MUTILS_TOLOWER(s)-'a'+10) : (MUTILS_TOLOWER(s)-'0')) & 0xf) + +#define MUTILS_MAX(a,b) ((a) > (b) ? (a) : (b)) +#define MUTILS_MIN(a,b) ((a) > (b) ? (b) : (a)) +/* from net-snmp 5.0.6 tools.h */ + + /* function prototypes */ +typedef void (*mutils_error_func) (char *fmt,va_list args); +typedef void (*mutils_hexdump_func) (unsigned char *bytes,int bytes_len); +void mutils_error (char *fmt,...); +void mutils_info (char *fmt,...); +void mutils_warn (char *fmt,...); +void mutils_debug(char *fmt,...); +void mutils_set_debug(int debug); +void mutils_set_error_hook(mutils_error_func new_func); +void mutils_set_info_hook(mutils_error_func new_func); +void mutils_set_debug_hook(mutils_error_func new_func); +void mutils_set_warn_hook(mutils_error_func new_func); +void mutils_set_hexdump_hook(mutils_hexdump_func new_func); +void mutils_set_hexprint_hook(mutils_hexdump_func new_func); + +void mutils_reset_error_hook(void); +void mutils_reset_info_hook(void); +void mutils_reset_warn_hook(void); +void mutils_reset_debug_hook(void); + void mutilsBase64Encode (FILE *ifp,FILE *ofp); void mutilsGenerateMIMEBoundary(char *boundary,int len); int mutilsParseURL (char *url,char *hostname, @@ -127,8 +228,10 @@ char *mutilsStristr (char *s,char *t); int mutilsIsinname (char *string,char *mask); char *mutilsGetTime (void); char mutilsChopNL (char *str); -int mutilsTmpFilename (char *filename); +/*int mutilsTmpFilename (char *filename);*/ char *mutilsBasename (char *path); +char *mutilsExtension (char *file_path); +char *mutilsExtensionLower (char *file_path); int mutilsWhich (char *name); void mutilsSetLock (int fd); void mutilsDotLock (char *filepath,char *errbuf); @@ -141,8 +244,64 @@ char *mutilsGetDirname (char *file); char *mutilsSpacesToChar (char *str,int c); char **mutilsTokenize(char *str,int delim,int *ntokens); void mutilsFreeTokens(char **tokens,int ntokens); +int mutils_base64_encode_len(int len); unsigned char *mutils_encode_base64(void *src,unsigned long srcl,unsigned long *len); +char *mutils_encode_base64_noformat(const char *src, int src_len); void *mutils_decode_base64(unsigned char *src,unsigned long srcl,unsigned long *len); +int mutils_make_encrypted_key(const char *plain,unsigned char *cipher,int clen); +int mutils_decrypt_key(unsigned char *cipher,int clen,char *plain,int plain_buf_len); +char *mutils_decrypt_hex(char *hex,int hex_len,char *pbuf,int pbuf_len); +void mutils_hex_dump(FILE *fp,unsigned char *buf,int length); +void mutils_hex_print(FILE *fp,unsigned char *bytes,int len); +unsigned char *mutils_get_master_key24(void); +unsigned char *mutils_get_iv8(void); + +unsigned char mutils_hex_char_to_bin(char x); +unsigned char *mutils_hex_to_bin(char *hex_string,int len,int *olen); +int mutils_binary_to_hex(unsigned char *input,int len,char **output); +int mutils_binary_to_hex_buf(unsigned char *in,int in_len,char *out,int *out_len); + +void *mutils_acquire_memory(size_t size); +void mutils_liberate_memory(void **memory); +void mutils_reacquire_memory(void **memory,const size_t size); +void mutils_attach_blob(MutilsBlob *blob_info,void *blob,size_t length); +void mutils_rewind_blob(MutilsBlob *blob); +MutilsBlob *mutils_clone_blobinfo(MutilsBlob *blob_info); +MutilsBlob *mutils_allocate_blob(int data_len); +MutilsBlob *mutils_file_to_blob(char *filename); +MutilsBlob *mutils_data_to_blob(unsigned char *data,int data_len); +void mutils_detach_blob(MutilsBlob *blob_info); +void mutils_destroy_blob(MutilsBlob *blob); +void mutils_msb_order_long(char *p,const size_t length); +void mutils_msb_order_short(char *p,const size_t length); + +int mutils_read_blob(MutilsBlob *blob_info,const size_t length, + void *data); +int mutils_read_blob_byte(MutilsBlob *blob); +unsigned long mutils_read_blob_lsb_long(MutilsBlob *blob_info); +unsigned short mutils_read_blob_lsb_short(MutilsBlob *blob); +unsigned long mutils_read_blob_msb_long(MutilsBlob *blob,int *err_no); +unsigned short mutils_read_blob_msb_short(MutilsBlob *blob,int *err_no); +char *mutils_read_blob_string(MutilsBlob *blob,char *string,int slen); +int mutils_size_blob(MutilsBlob *blob); +int mutils_tell_blob(MutilsBlob *blob); + +int mutils_write_blob(MutilsBlob *blob,const size_t length,const void *data); +size_t mutils_write_blob_byte(MutilsBlob *blob_info,const long value); +int mutils_write_blob_lsb_long(MutilsBlob *blob,const unsigned long value); +int mutils_write_blob_lsb_short(MutilsBlob *blob,const unsigned long value); +int mutils_write_blob_msb_long(MutilsBlob *blob,const unsigned long value); +int mutils_write_blob_msb_short(MutilsBlob *blob,const unsigned long value); +size_t mutils_write_blob_string(MutilsBlob *blob_info,const char *string); +char *mutils_getcwd(char *buf,int buflen); +FILE *mutils_get_tempfileFP(char *tempfile_path,int buflen); +char *mutils_basename(const char *path); +int mutils_file_is_binary(const char *file); + +/* time */ +int mutils_time_now(MutilsTime *mt); +void mutils_time_fmt(MutilsTime *mt,char *buf,int bufsiz); + #endif /* MUTILS_H */ diff --git a/coregrade/src/mailsend/libs/libmutils/mutils_blob.c b/coregrade/src/mailsend/libs/libmutils/mutils_blob.c new file mode 100755 index 0000000..0dade59 --- /dev/null +++ b/coregrade/src/mailsend/libs/libmutils/mutils_blob.c @@ -0,0 +1,692 @@ +#include "mutils.h" + +/* Note: all the blob realated routines are adapted from ImageMagick */ + +/* +** attaches a blob to the MutilsBlob structure +*/ +void mutils_attach_blob(MutilsBlob *blob_info,void *blob,size_t length) +{ + if (blob == (MutilsBlob *) NULL) + return; + + blob_info->data=(unsigned char *) blob; + blob_info->length=length; + blob_info->offset=0; +} + +/* duplicate the given MutilsBlob structure */ +/* returns NULL on failure */ +/** + * @brief Duplicates the given blob + * @param blob Blob to duplicate + * @return blob The duplicated blob on success, NULL on failure + * + */ +MutilsBlob *mutils_clone_blobinfo(MutilsBlob *blob) +{ + MutilsBlob + *clone_info; + + clone_info=(MutilsBlob *) mutils_acquire_memory(sizeof(MutilsBlob)); + if (clone_info == (MutilsBlob *) NULL) + { + mutils_error("%s (%d) - unable to clone MutilsBlob, memory allocation failed\n",MUTILS_CFL); + return(NULL); + } + if (blob == (MutilsBlob *) NULL) + { + memset(clone_info,0,sizeof(MutilsBlob)); + return(clone_info); + } + + *clone_info=(*blob); + return(clone_info); +} + +/** + * @brief rewind a blob + * @param blob + * + * Rewinds a blob after processing it + */ +void mutils_rewind_blob(MutilsBlob *blob) +{ + if (!blob) + return; + blob->offset=0; +} + +/** + * allocate memory for blob and and the data member + * @param data_len - the length of the data in bytes + * @return - pointer to blob on SUCCESS, NULL on failure + */ +MutilsBlob *mutils_allocate_blob(int data_len) +{ + MutilsBlob + *blob=NULL; + + if (data_len <= 0) + return(NULL); + + /* allocate memory for blob */ + blob=mutils_clone_blobinfo(NULL); + if (blob == NULL) + return(NULL); + + /* allocate memory for data */ + blob->length=data_len; + blob->data=(unsigned char *) mutils_acquire_memory(data_len+1); + if (blob->data == NULL) + { + mutils_destroy_blob(blob); + return(NULL); + } + + return(blob); +} + + +/* +** detaches a blob from the BlobInfo structure. +*/ +void mutils_detach_blob(MutilsBlob *blob) +{ + if (blob == NULL) + return; + + blob->length=0; + blob->offset=0; + blob->data=(unsigned char *) NULL; +} + +/** + * creates a MutilsBlob object. allocates memory for data, copies the passed + * data, update the length and returns the blob + * @param data The data to copy to blob's data member + * @param data_len The number of bytes of data + * @return MutilsBlob on success NULL on failure + */ +MutilsBlob *mutils_data_to_blob(unsigned char *data,int data_len) +{ + MutilsBlob + *blob; + + if (data == (unsigned char *) NULL) + return(NULL); + + blob=mutils_clone_blobinfo(NULL); + if (blob == (MutilsBlob *) NULL) + { + (void) fprintf(stderr,"%s (%d) unable to create blob, memory allocation problem\n",__FILE__,__LINE__); + return((MutilsBlob *) NULL); + } + blob->length=data_len; + blob->data=(unsigned char *) mutils_acquire_memory(blob->length+1); + if (blob->data == NULL) + { + (void) fprintf(stderr,"Unable to create blob data, memory allocation problem\n"); + mutils_destroy_blob(blob); + return((void *) NULL); + } + + memcpy(blob->data,data,blob->length); + + return(blob); +} + +/* +** returns the contents of a file as a blob. +** NULL on failure. +*/ +MutilsBlob *mutils_file_to_blob(char *filename) +{ + MutilsBlob + *blob; + + long + count=0; + + size_t + length; + + int + fd; + + struct stat + statbuf; + + if (filename == NULL) + return(NULL); + + fd=open(filename,O_RDONLY | O_BINARY); + if (fd == -1) + { + (void) fprintf(stderr,"Unable to open file %s\n",filename); + return((void *) NULL); + } + + length=(size_t) (fstat(fd,&statbuf)) < 0 ? 0 : statbuf.st_size; + blob=mutils_clone_blobinfo(NULL); + if (blob == (MutilsBlob *) NULL) + { + (void )close(fd); + (void) fprintf(stderr,"unable to create blob, memory allocation problem\n"); + return((MutilsBlob *) NULL); + } + blob->length=length; + blob->data=(unsigned char *) mutils_acquire_memory(blob->length+1); + if (blob->data == NULL) + { + (void) fprintf(stderr,"Unable to create blob data, memory allocation problem\n"); + mutils_destroy_blob(blob); + return((void *) NULL); + } + + count=read(fd,blob->data,length); + (void) close(fd); + + if ((size_t) count != length) + { + mutils_destroy_blob(blob); + return((void *) NULL); + } + + return(blob); +} + +/* +** deallocates memory associated with an BlobInfo structure +*/ +void mutils_destroy_blob(MutilsBlob *blob) +{ + if (blob == NULL) + return; + + if (blob->data) + (void) free(blob->data); + mutils_liberate_memory((void **) &blob); +} + +/* +** converts a least-significant byte first buffer of integers to +** most-significant byte first. +*/ +void mutils_msb_order_long(char *p,const size_t length) +{ + register char + c, + *q, + *sp; + + if (p == NULL) + return; + + q=p+length; + while (p < q) + { + sp=p+3; + c=(*sp); + *sp=(*p); + *p++=c; + sp=p+1; + c=(*sp); + *sp=(*p); + *p++=c; + p+=2; + } +} + +/* +** converts a least-significant byte first buffer of integers to +** most-significant byte first. +*/ +void mutils_msb_order_short(char *p,const size_t length) +{ + register char + c, + *q; + + if (p == NULL) + return; + + q=p+length; + while (p < q) + { + c=(*p); + *p=(*(p+1)); + p++; + *p++=c; + } +} + + +/* +** reads data from the blob and returns it. It returns the number of bytes +** read. +** blob - MutilsBlob +** length - number of bytes to read from blob +** data - returns +** +** returns > 0 on sucess, -1 on failure +*/ +int mutils_read_blob(MutilsBlob *blob,const size_t length,void *data) +{ + int + count, + n=0; + + if (blob == (MutilsBlob *) NULL) + return(-1); + + if (blob->data != (unsigned char *) NULL) + { + count=MUTILS_MIN(length,blob->length - blob->offset); + if (count > 0) + { + (void) memcpy(data,blob->data + blob->offset,count); + blob->offset += count; + } + /* + if (count < length) + return(-1); + */ + return(count); + } + + return(-1); +} + +/* +** reads a single byte from blob and returns it. +** returns -1 on error +*/ +int mutils_read_blob_byte(MutilsBlob *blob) +{ + size_t + count; + + unsigned char + buffer[1]; + + if (blob == NULL) + return(-1); + + count=mutils_read_blob(blob,1,(unsigned char *) buffer); + if (count == 0) + return(-1); + + return(*buffer); +} + +/* +** reads a long value as a 32 bit quantity in least-significant byte first +**order. +*/ +unsigned long mutils_read_blob_lsb_long(MutilsBlob *blob) +{ + unsigned char + buffer[4]; + + unsigned long + value; + + if (blob == NULL) + return ((unsigned long) ~0); + + value=mutils_read_blob(blob,4,(unsigned char *) buffer); + if (value == 0) + return ((unsigned long) ~0); + + value=buffer[3] << 24; + value|=buffer[2] << 16; + value|=buffer[1] << 8; + value|=buffer[0]; + return(value); +} + +/* +** reads a short value as a 16 bit quantity in least-significant byte first +* order. +*/ +unsigned short mutils_read_blob_lsb_short(MutilsBlob *blob) +{ + unsigned char + buffer[2]; + + unsigned short + value; + + if (blob == (MutilsBlob *) NULL) + return((unsigned short) ~0); + + value=mutils_read_blob(blob,2,(unsigned char *) buffer); + if (value == 0) + return((unsigned short) ~0); + + value=buffer[1] << 8; + value|=buffer[0]; + + return(value); +} + +/** + * @brief reads a long value as a 32 bit quantity in most-significant byte + * firstorder. + * @param blob The blob + * @param err_no If no error err_no is set to 0 other wise it is set to + * -1 + * @param The read value as unsigned long + * + * The caller should always check the err_no instead of the return code, + * because there's no other way to return a number in case of error + */ +unsigned long mutils_read_blob_msb_long(MutilsBlob *blob,int *err_no) +{ + unsigned char + buffer[4]; + + unsigned long + value; + + *err_no=0; + + if (blob == (MutilsBlob *) NULL) + { + mutils_error("%s (%d) - mutils_read_blob_msb_long() empty blob\n", + MUTILS_CFL); + *err_no=(-1); + return((unsigned long) ~0); + } + + value=mutils_read_blob(blob,4,(unsigned char *) buffer); + if (value == 0) + { + mutils_error("%s (%d) - mutils_read_blob_msb_long() could not read 4 bytes from blob\n",MUTILS_CFL); + *err_no=(-1); + return((unsigned long) ~0); + } + /* + ** We can not return ~0 on error because if the value ffffff is read, + ** the return code will indicate it's an error + */ +/* return((unsigned long) ~0);*/ + + value=(unsigned long) buffer[0] << 24; + value|=buffer[1] << 16; + value|=buffer[2] << 8; + value|=buffer[3]; + + return(value); +} + +/** + * @brief reads a short value as a 16 bit quantity in most-significant byte + * firstorder. + * @param blob The blob + * @param err_no If no error err_no is set to 0 other wise it is set to + * -1 + * @return The read value as unsigned short + * + * The caller should always check the err_no instead of the return code, + * because there's no other way to return a number in case of error + */ +unsigned short mutils_read_blob_msb_short(MutilsBlob *blob,int *err_no) +{ + unsigned char + buffer[2]; + + unsigned short + value; + + *err_no=0; + if (blob == NULL) + { + mutils_error("%s (%d) - mutils_read_blob_msb_short() empty blob\n", + MUTILS_CFL); + *err_no=(-1); + return((unsigned short) ~0); + } + + value=mutils_read_blob(blob,2,(unsigned char *) buffer); + if (value == 0) + { + mutils_error("%s (%d) - mutils_read_blob_msb_short() could not read 2 bytes from blob\n",MUTILS_CFL); + *err_no=(-1); + return((unsigned short) ~0); + } + + /* + ** We can not return ~0 on error because if the value ffff is read, + ** the return code will indicate it's an error + */ +/* return((unsigned short) ~0);*/ + + value=(unsigned short) (buffer[0] << 8); + value |= buffer[1]; + + return(value); +} + +/* reads characters from a blob until a new line or cr is read*/ +/* the string is null terminated */ +char *mutils_read_blob_string(MutilsBlob *blob,char *string,int slen) +{ + int + c, + i; + + if (blob == NULL) + return(NULL); + + for (i=0; i < slen; i++) + { + c=mutils_read_blob_byte(blob); + if (c == -1) + return((char *) NULL); + string[i]=c; + if ((string[i] == '\n') || (string[i] == '\r')) + break; + } + string[i]='\0'; + return(string); +} + +/* returns current size of the blob */ +/* -1 on error */ +int mutils_size_blob(MutilsBlob *blob) +{ + if (blob == NULL) + return(-1); + + if (blob->data != (unsigned char *) NULL) + return(blob->length); + + return(-1); +} + +/* returns the current value of the blob position */ +/* -1 on failure */ +int mutils_tell_blob(MutilsBlob *blob) +{ + if (blob == NULL) + return(-1); + + if (blob->data != (unsigned char *) NULL) + return(blob->offset); + + return(-1); +} + +/** + * @brief Writes length bytes of data to blob + * @param blob The blob to fill with data + * @param length Length of data + * @param data Data to write to blob + * + * blob->data must have at least blob->length bytes of data pre-allocated. + * If we need more than that, memory will be allocated dynamically. + * + * blob->offset is incremented with the amount of data written to blob + * + * This code is adapted from ImageMagick. ImageMagick's version reallocate + * data bultiple of 8 bytes. This one allocates exact number of bytes as + * needed. + * + */ +int mutils_write_blob(MutilsBlob *blob,const size_t length,const void *data) +{ + int + reallocate_bytes=0; + + if (blob == (MutilsBlob *) NULL) + return(-1); + + if (blob->data != (unsigned char *) NULL) + { + if (length > (blob->length - blob->offset)) + { + reallocate_bytes=(length - (blob->length - blob->offset)); + mutils_info("%s (%d) out of memory, re-allocating %d bytes\n", + MUTILS_CFL,reallocate_bytes); + /* find out how many bytes we need to re-allocate */ + blob->length += reallocate_bytes; + mutils_reacquire_memory((void **) &blob->data,blob->length); + if (blob->data == (unsigned char *) NULL) + { + mutils_detach_blob(blob); + return(-1); + } + } + (void) memcpy(blob->data + blob->offset,data,length); + blob->offset += length; + if (blob->offset > (off_t) blob->length) + blob->length=blob->offset; + return(length); + } + + return(-1); +} + +/* +** write an integer to a blob. It returns the number of bytes written +** and -1 on failure +*/ +size_t mutils_write_blob_byte(MutilsBlob *blob,const long value) +{ + + unsigned char + buffer[1]; + + if (blob == NULL) + return(-1); + + buffer[0]=(unsigned char) value; + return(mutils_write_blob(blob,1,buffer)); +} +/* +** writes a long value as a 32 bit quantity in least-significant byte first +** order. returns the number of unsigned longs written. -1 on error +*/ +int mutils_write_blob_lsb_long(MutilsBlob *blob,const unsigned long value) +{ + unsigned char + buffer[4]; + + if (blob == NULL) + return(-1); + + buffer[0]=(unsigned char) value; + buffer[1]=(unsigned char) (value >> 8); + buffer[2]=(unsigned char) (value >> 16); + buffer[3]=(unsigned char) (value >> 24); + + return(mutils_write_blob(blob,4,buffer)); +} + +/* +** writes a long value as a 16 bit quantity in least-significant byte first +** order. returns the number of unsigned longs written. -1 on failure +*/ +int mutils_write_blob_lsb_short(MutilsBlob *blob,const unsigned long value) +{ + unsigned char + buffer[2]; + + if (blob == NULL) + return(-1); + + buffer[0]=(unsigned char) value; + buffer[1]=(unsigned char) (value >> 8); + + return(mutils_write_blob(blob,2,buffer)); +} + +/* +** writes a long value as a 32 bit quantity in most-significant byte first +** order. returns the number of unsigned longs written. -1 on failure +*/ +int mutils_write_blob_msb_long(MutilsBlob *blob,const unsigned long value) +{ + unsigned char + buffer[4]; + + if (blob == NULL) + return(-1); + + buffer[0]=(unsigned char) (value >> 24); + buffer[1]=(unsigned char) (value >> 16); + buffer[2]=(unsigned char) (value >> 8); + buffer[3]=(unsigned char) value; + + return(mutils_write_blob(blob,4,buffer)); + +} + +/* +** writes a long value as a 16 bit quantity in most-significant byte first +** order. returns the number of unsigned longs written. -1 on failure +*/ +int mutils_write_blob_msb_short(MutilsBlob *blob,const unsigned long value) +{ + unsigned char + buffer[2]; + + if (blob == NULL) + return(-1); + + buffer[0]=(unsigned char) (value >> 8); + buffer[1]=(unsigned char) value; + + return(mutils_write_blob(blob,2,buffer)); +} + +/* +** write a string to a blob. It returns the number of characters written +*/ +size_t mutils_write_blob_string(MutilsBlob *blob,const char *string) +{ + if (string == NULL) + return(0); + + if (blob == NULL) + return(0); + + return(mutils_write_blob(blob,strlen(string),string)); +} + + + +void mutils_hex_dump_blob(FILE *fp,MutilsBlob *blob) +{ + if (blob && blob->data) + { + if (blob->length) + mutils_hex_dump(fp,blob->data,blob->length); + } + else + { + (void) fprintf(stderr,"Empty blob\n"); + } +} diff --git a/coregrade/src/mailsend/libs/libmutils/mutils_error.c b/coregrade/src/mailsend/libs/libmutils/mutils_error.c new file mode 100755 index 0000000..28e2dee --- /dev/null +++ b/coregrade/src/mailsend/libs/libmutils/mutils_error.c @@ -0,0 +1,232 @@ +#include "mutils.h" +/* +** Allow the caller to register a error printing routine +*/ + +static int s_mutils_debug=0; + + +static void mutils_default_proc(char *fmt,va_list args) +{ + if (fmt) + { + vfprintf(stderr,fmt,args); + (void) fflush(stderr); + } +} + +static void mutils_default_hexdump_proc(unsigned char *bytes,int bytes_len) +{ + if (bytes && bytes_len > 0) + { + mutils_hex_dump(stderr,bytes,bytes_len); + } +} + +static void mutils_default_hexprint_proc(unsigned char *bytes, + int bytes_len) +{ + if (bytes && bytes_len > 0) + { + mutils_hex_print(stderr,bytes,bytes_len); + } +} + +/* default error, info and warning printing routine */ +static mutils_error_func mutils_error_hook=mutils_default_proc; +static mutils_error_func mutils_info_hook=mutils_default_proc; +static mutils_error_func mutils_debug_hook=mutils_default_proc; +static mutils_error_func mutils_warn_hook=mutils_default_proc; +static mutils_hexdump_func mutils_hexdump_hook=mutils_default_hexdump_proc; +static mutils_hexdump_func mutils_hexprint_hook=mutils_default_hexprint_proc; + +static void mutils_error_va(char *fmt,va_list args) +{ + (*mutils_error_hook)(fmt,args); +} + +static void mutils_info_va(char *fmt,va_list args) +{ + (*mutils_info_hook)(fmt,args); +} + +static void mutils_debug_va(char *fmt,va_list args) +{ + (*mutils_debug_hook)(fmt,args); +} + +static void mutils_warn_va(char *fmt,va_list args) +{ + (*mutils_warn_hook)(fmt,args); +} + + +void mutils_hexdump(unsigned char *bytes,int bytes_len) +{ + (*mutils_hexdump_hook)(bytes,bytes_len); +} + +void mutils_hexprint(unsigned char *bytes,int bytes_len) +{ + (*mutils_hexprint_hook)(bytes,bytes_len); +} + +/** + * @brief Turn debug on or off + * @param d If 1, turn debug 1, if 0 turn debug off + */ +void mutils_set_debug(int d) +{ + if (d == 1) + { + s_mutils_debug=1; + } + else if (d == 0) + { + s_mutils_debug=0; + } +} + +/** + * @brief Set application defined function for printing error messages + */ +void mutils_set_error_hook(mutils_error_func new_func) +{ + if (new_func) + { + mutils_error_hook=new_func; + } + else + { + mutils_error_hook=mutils_default_proc; + } +} + +/** + * @brief Set application defined function for printing info messages + */ +void mutils_set_info_hook(mutils_error_func new_func) +{ + if (new_func) + { + mutils_info_hook=new_func; + } + else + { + mutils_info_hook=mutils_default_proc; + } +} + +void mutils_set_debug_hook(mutils_error_func new_func) +{ + if (new_func) + { + mutils_debug_hook=new_func; + } + else + { + mutils_debug_hook=mutils_default_proc; + } +} +/** + * @brief Set application defined function for printing warning messages + */ +void mutils_set_warn_hook(mutils_error_func new_func) +{ + if (new_func) + { + mutils_warn_hook=new_func; + } + else + { + mutils_warn_hook=mutils_default_proc; + } +} + +void mutils_set_hexdump_hook(mutils_hexdump_func new_func) +{ + if (new_func) + { + mutils_hexdump_hook=new_func; + } + else + { + mutils_hexdump_hook=mutils_default_hexdump_proc; + } +} + +void mutils_set_hexprint_hook(mutils_hexdump_func new_func) +{ + if (new_func) + { + mutils_hexprint_hook=new_func; + } + else + { + mutils_hexprint_hook=mutils_default_hexprint_proc; + } +} + + + +void mutils_reset_error_hook(void) +{ + mutils_set_error_hook(NULL); +} + +void mutils_reset_info_hook(void) +{ + mutils_set_info_hook(NULL); +} + +void mutils_reset_warn_hook(void) +{ + mutils_set_warn_hook(NULL); +} + +/** + @brief print error message + @param fmt The formatted parameters + + This function prints eror message to standard error if no application + error printing is not hooked by calling mutils_set_error_hook() + */ +void mutils_error(char *fmt,...) +{ + va_list + ap; + + va_start(ap,fmt); + mutils_error_va(fmt,ap); + va_end(ap); +} + +void mutils_info(char *fmt,...) +{ + va_list + ap; + + va_start(ap,fmt); + mutils_info_va(fmt,ap); + va_end(ap); +} + +void mutils_warn(char *fmt,...) +{ + va_list + ap; + + va_start(ap,fmt); + mutils_warn_va(fmt,ap); + va_end(ap); +} + +void mutils_debug(char *fmt,...) +{ + va_list + ap; + + va_start(ap,fmt); + mutils_debug_va(fmt,ap); + va_end(ap); +} diff --git a/coregrade/src/mailsend/libs/libmutils/mutils_mime.c b/coregrade/src/mailsend/libs/libmutils/mutils_mime.c new file mode 100755 index 0000000..f7cb38d --- /dev/null +++ b/coregrade/src/mailsend/libs/libmutils/mutils_mime.c @@ -0,0 +1,119 @@ +#include "mutils.h" + +static char base64_chars[64] = +{ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', + 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', + 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', '+', '/' +}; + + + +/* +** generateBoundary() +** generate unuque string for boundary for MIME tag +** +** Parameters: +** char *boundary - NULL terminated boundary string - returns +** int len - size of boundary (malloc'd or static) +** +** Return Values: +** none +** +** Limitations and Comments: +** boundary must have len bytes in it to store the boundary. the +functio +n +** calls rand() for random number, so the caller should call srand() +** before calling this function. +** +** This function is adapted from mutt code. +** +** Development History: +** who when why +** muquit@muquit.com Mar-06-2002 needs MIME support +*/ +#define BOUNDARY_LEN 16 +void mutilsGenerateMIMEBoundary(char *boundary,int len) +{ + char + *p; + int + i; + memset(boundary,0,len); + p=boundary; + for (i=0; i < BOUNDARY_LEN; i++) + { + if (i >= (len-1)) + break; + *p++ = base64_chars[rand() % sizeof(base64_chars)]; + } + *p='\0'; +} + +static void output64Chunk(int c1,int c2,int c3,int pads, FILE *outfile) +{ + putc(base64_chars[c1>>2], outfile); + putc(base64_chars[((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)], outfile); + if (pads == 2) + { + putc('=', outfile); + putc('=', outfile); + } + else if (pads) + { + putc(base64_chars[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)], outfile); + putc('=', outfile); + } + else + { + putc(base64_chars[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)], outfile); + putc(base64_chars[c3 & 0x3F], outfile); + } +} + +void mutilsBase64Encode(FILE *ifp,FILE *ofp) +{ + int + c1, + c2, + c3, + ct=0; + + while ((c1=getc(ifp)) != EOF) + { + c2=getc(ifp); + if (c2 == EOF) + { + output64Chunk(c1,0,0,2,ofp); + } + else + { + c3=getc(ifp); + if (c3 == EOF) + { + output64Chunk(c1,c2,0,1,ofp); + } + else + { + output64Chunk(c1,c2,c3,0,ofp); + } + } + ct += 4; + if (ct > 71) + { + putc('\r',ofp); /* qmail fix 15.07.05 (movi) */ + putc('\n',ofp); + ct=0; + } + } + if (ct) + { + putc('\r',ofp); /* qmail fix 15.07.05 (movi) */ + putc('\n',ofp); + } + + (void) fflush(ofp); +} diff --git a/coregrade/src/mailsend/libs/libmutils/mutils_temp.c b/coregrade/src/mailsend/libs/libmutils/mutils_temp.c new file mode 100644 index 0000000..9d99489 --- /dev/null +++ b/coregrade/src/mailsend/libs/libmutils/mutils_temp.c @@ -0,0 +1,205 @@ +#include "mutils.h" +#include + +/* +** return the path of current working directory +*/ +char *mutils_getcwd(char *buf,int buflen) +{ + if (getcwd(buf,buflen - 1) != NULL) + { + return(buf); + } + return(NULL); +} + +/* +** tmpdir - path of temp directory +** tempfile_path - returns. path of temp filename +** buflen - length of tempfile_path buffer, preallocated +** +** returns: open FILE pointer to temp file +*/ +static FILE *open_tempfile(const char *tempdir,char *tempfile_path,int buflen) +{ + FILE + *fp = NULL; + + int + rc, + tfwd, + len = strlen(tempdir); + + if (len && len < MUTILS_PATH_MAX) + { + (void) snprintf(tempfile_path,buflen - 1,"%s/%s",tempdir,"mailsendXXXXXX"); +#ifdef HAVE_MKSTEMP + tfwd = mkstemp(tempfile_path); + if (tfwd == -1) + { + mutils_error("%s (%d) - Could not open tmp file %s for writing: %s\n", + MUTILS_CFL, + tempfile_path, + strerror(errno)); + return(0); + } + + fp = fdopen(tfwd,"w"); + if (fp == NULL) + { + mutils_error("%s (%d) - Could not open temp file %s\n", + MUTILS_CFL, + tempfile_path); + return(NULL); + } + return(fp); +#else +#ifdef WINNT + rc = _mktemp_s(tempfile_path, buflen); + if (rc != 0) + { + mutils_error("%s (%d) - Could not create file %s\n", + MUTILS_CFL, + tempfile_path); + return(NULL); + } + fp = fopen(tempfile_path,"w"); + if (fp == NULL) + { + mutils_error("%s (%d) - Could not open temp file %s\n", + MUTILS_CFL, + tempfile_path); + return(NULL); + } +#else + mktemp(tempfile_path); + fp = fopen(tempfile_path,"w"); + if (fp == NULL) + { + mutils_error("%s (%d) - Could not open temp file %s\n", + MUTILS_CFL, + tempfile_path); + return(NULL); + } + +#endif /* WINNT */ +#endif /* HAVE_MKSTEMP */ + } + + return(fp); +} + +/* +** Return FILE pointer to a open temp file. +** Parameters: +** tempfile_path - returns. The buffer to hold the temp file path +** buflen - Length of tempfile_path +** Returns: +** FILE pointer to tempfile on success, NULL on failure +** +** The caller is responsible to close the FILE pointer and remove the file +** +** Note: adapted from apache apr lib +*/ +FILE *mutils_get_tempfileFP(char *tempfile_path,int buflen) +{ + char + tmpbuf[MUTILS_PATH_MAX]; + + int + tfwd; + + FILE + *fp = NULL; + + char + *dir = NULL; + + const char *try_envs[] = + { + "TMP", + "TEMP", + "TMPDIR", + }; + + const char *try_dirs[] = + { + "/tmp", + "/usr/tmp", + "/var/tmp", + }; + + char + *tempdir; + + int + i; + + /* first look for the env vars */ + for (i = 0; i < (sizeof(try_envs) / sizeof(const char *)); i++) + { + + tempdir = getenv(try_envs[i]); + if (tempdir != NULL) + { + int + len = strlen(tempdir); + fp = open_tempfile(tempdir,tempfile_path,buflen); + if (fp != NULL) + goto ExitProcessing; + } + } + + /* we could not find the env vars for temp dir */ + /* try c:/TMP for windows */ +#ifdef WINNT + fp = open_tempfile("c:/TEMP",tempfile_path, buflen); + if (fp != NULL) + goto ExitProcessing; +#endif /* WINNT */ + + /* Next try some hard coded path */ + for (i = 0; i < (sizeof(try_dirs) / sizeof(const char *)); i++) + { + fp = open_tempfile(try_dirs[i], tempfile_path, buflen); + if (fp != NULL) + goto ExitProcessing; + } + + /* Finally, try the current working directory */ + tempdir = mutils_getcwd(tmpbuf,sizeof(tmpbuf)-1); + if (tempdir != NULL) + { + fp = open_tempfile(tempdir, tempfile_path, buflen); + if (fp != NULL) + goto ExitProcessing; + } + +ExitProcessing: + return(fp); +} + +#ifdef TESTING +int main(int argc,char *argv[]) +{ + char + *pwd, + tempfile[MUTILS_PATH_MAX]; + + FILE + *fp; + + fp = mutils_get_tempfileFP(tempfile, MUTILS_PATH_MAX); + if (fp) + { + (void) fprintf(stderr,"%s\n",tempfile); + (void) fclose(fp); + unlink(tempfile); + } + pwd = mutils_getcwd(tempfile,sizeof(tempfile)); + if (pwd) + (void) fprintf(stderr,"pwd=%s\n",pwd); + + return(0); +} +#endif diff --git a/coregrade/src/mailsend/libs/libmutils/mutils_time.c b/coregrade/src/mailsend/libs/libmutils/mutils_time.c new file mode 100755 index 0000000..6e6853f --- /dev/null +++ b/coregrade/src/mailsend/libs/libmutils/mutils_time.c @@ -0,0 +1,101 @@ +/** + @file mutils_time.c + @author Muhamad A Muquit + @date $Date:$ + @version $Revision:$ + @brief Platform independ wrapper routines for time +*/ + +#include "mutils.h" + +/* returns 0 on success, -1 on failure */ +int mutils_time_now(MutilsTime *mt) +{ + int + rc=(-1); + +#ifdef WINNT +#else + struct timeval + tv; +#endif /* WINNT */ + +#ifdef WINNT + GetSystemTimeAsFileTime(&mt->absolute); +#else + rc=gettimeofday(&tv,NULL); + if (rc == -1) + { + mutils_error("gettimeofday() failed"); + return(-1); + } + + mt->secs=tv.tv_sec; + mt->nsecs=tv.tv_usec * 1000; +#endif /* WINNT */ + + return(0); +} + +/* buf must be at least 64 bytes allocated and bufsiz must reflect that */ +/* adapted from ISC time.c */ +void mutils_time_fmt(MutilsTime *mt,char *buf,int bufsiz) +{ + time_t + now; + + int + rc; +#ifdef WINNT + FILETIME + localft; + SYSTEMTIME + st; + char + DateBuf[50], + TimeBuf[50]; + + static const char + badtime[] = "99-Bad-9999 99:99:99.999"; +#endif /* WINNT */ + + if (bufsiz < 64) + return; +#ifdef WINNT + if (FileTimeToLocalFileTime(&mt->absolute, &localft) && + FileTimeToSystemTime(&localft, &st)) + { + GetDateFormat(LOCALE_USER_DEFAULT, 0, &st, "dd-MMM-yyyy", + DateBuf, 50); + GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOTIMEMARKER| + TIME_FORCE24HOURFORMAT, &st, NULL, TimeBuf, 50); + + snprintf(buf, bufsiz, "%s %s.%03u", DateBuf, TimeBuf, + st.wMilliseconds); + } + else + snprintf(buf, bufsiz, badtime); +#else + now=(time_t) mt->secs; + rc=strftime(buf,bufsiz,"%d-%b-%Y %X",localtime(&now)); + if (rc != 0) + (void) snprintf(buf+rc,bufsiz - rc,".%03u",mt->nsecs / 1000000); + else + (void) snprintf(buf+rc,bufsiz - 1,"99-Bad-9999 99:99:99.999"); /* from isc */ +#endif /* WINNT */ +} + +#ifdef TEST_TIME +int main(int argc,char *argv[]) +{ + char + buf[65]; + + MutilsTime + mt; + + mutils_time_now(&mt); + mutils_time_fmt(&mt,MUTILS_TRUE,buf,sizeof(buf)); + (void) fprintf(stderr,"%s\n",buf); +} +#endif /* TEST_TIME */ diff --git a/coregrade/src/mailsend/libs/libmutils/string.c b/coregrade/src/mailsend/libs/libmutils/string.c old mode 100644 new mode 100755 index a45e4dc..7f665fd --- a/coregrade/src/mailsend/libs/libmutils/string.c +++ b/coregrade/src/mailsend/libs/libmutils/string.c @@ -348,7 +348,7 @@ void mutilsSafeStrcat(char *dst,char *src,int length,int ssc_size, exit(0); } - if (strlen(src) >= ssc_size - ssc_length) + if ((int) strlen(src) >= ssc_size - ssc_length) { /* StringImage("buffer overflow detected! aborting"); @@ -506,5 +506,5 @@ char *mutilsStrLower(char *str) *s=tolower(*s); } - return (s); + return (str); } diff --git a/coregrade/src/mailsend/libs/libmutils/test.c b/coregrade/src/mailsend/libs/libmutils/test.c old mode 100644 new mode 100755 diff --git a/coregrade/src/mailsend/libs/libmutils/testb64.c b/coregrade/src/mailsend/libs/libmutils/testb64.c old mode 100644 new mode 100755 diff --git a/coregrade/src/mailsend/libs/libsll/Makefile b/coregrade/src/mailsend/libs/libsll/Makefile index c799e27..4039534 100644 --- a/coregrade/src/mailsend/libs/libsll/Makefile +++ b/coregrade/src/mailsend/libs/libsll/Makefile @@ -4,12 +4,12 @@ # Aug-07-1998 # CC= gcc -DEFS= -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DHAVE_STRINGS_H=1 -DHAVE_MEMORY_H=1 -DHAVE_MALLOC_H=1 -DHAVE_UNISTD_H=1 -DHAVE_CTYPE_H=1 -DHAVE_STDINT_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_STDLIB_H=1 -DHAVE_FCNTL_H=1 -DHAVE_SYS_FILE_H=1 -DHAVE_FLOCK=1 -DHAVE_SOCKET=1 -DHAVE_HTONL=1 -DHAVE_GETHOSTNAME=1 -DHAVE_GETHOSTBYADDR=1 -DHAVE_YP_GET_DEFAULT_DOMAIN=1 -DHAVE_LIBNSL=1 -DHAVE_RES_SEARCH=1 -DHAVE_LIBRESOLV=1 -DHAVE_INET_ATON=1 -DHAVE_DN_SKIPNAME=1 -DHAVE_MKSTEMP=1 -DHAVE_OPENSSL=1 +DEFS= -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DHAVE_STRINGS_H=1 -DHAVE_MEMORY_H=1 -DHAVE_MALLOC_H=1 -DHAVE_UNISTD_H=1 -DHAVE_CTYPE_H=1 -DHAVE_STDINT_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_STDLIB_H=1 -DHAVE_FCNTL_H=1 -DHAVE_SYS_FILE_H=1 -DHAVE_LIMITS_H=1 -DHAVE_FLOCK=1 -DHAVE_SOCKET=1 -DHAVE_HTONL=1 -DHAVE_GETHOSTNAME=1 -DHAVE_GETHOSTBYADDR=1 -DHAVE_RES_SEARCH=1 -DHAVE_LIBRESOLV=1 -DHAVE_INET_ATON=1 -DHAVE_DN_SKIPNAME=1 -DHAVE_MKSTEMP=1 -DHAVE_GETADDRINFO=1 AR= ar cq RANLIB= ranlib LIBNAME= libsll.a -INCLUDES= -I. -I/usr/include/malloc +INCLUDES= -I. # replace -O with -g in order to debug diff --git a/coregrade/src/mailsend/libs/libsll/Makefile.in b/coregrade/src/mailsend/libs/libsll/Makefile.in new file mode 100755 index 0000000..48e8921 --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/Makefile.in @@ -0,0 +1,43 @@ +# +# for Singly linked list package. +# muhammad a muquit +# Aug-07-1998 +# +CC= @CC@ +DEFS= @DEFS@ +AR= ar cq +RANLIB= @RANLIB@ +LIBNAME= libsll.a + +INCLUDES= -I. + +# replace -O with -g in order to debug + +DEFINES= $(INCLUDES) $(DEFS) -DSYS_UNIX=1 +CFLAGS= -O $(DEFINES) + +SRCS = sll.c +OBJS = sll.o + +.c.o: + rm -f $@ + $(CC) $(CFLAGS) -c $*.c + +all: $(LIBNAME) + +$(LIBNAME): $(OBJS) + rm -f $@ + $(AR) $@ $(OBJS) + $(RANLIB) $@ + +sll.o: sll.h + +clean: + rm -f $(OBJS) $(LIBNAME) core a.out + +realclean: + rm -f $(OBJS) $(LIBNAME) core a.out config.cache config.log config.status + (cd examples/append;make clean) + (cd examples/append_sorted;make clean) + (cd examples/delete;make clean) + (cd examples/insert;make clean) diff --git a/coregrade/src/mailsend/libs/libsll/Makefile.nmake b/coregrade/src/mailsend/libs/libsll/Makefile.nmake new file mode 100755 index 0000000..d31ace1 --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/Makefile.nmake @@ -0,0 +1,27 @@ +#-------------------------------------------- +# Makefile for MS Visual C++ +# muquit@muquit.com +#-------------------------------------------- + +DEFS= -DWINNT=1 -DSTRICT_MODE=1 -DHAVE_STRING_H=1 -DHAVE_FCNTL_H=1 +CFLAGS= /DWINNT /DWIN32 /DHAVE_MALLOC_H /I. +CFLAGS=$(CFLAGS) /Ox /W3 /wd4996 /nologo +LIBFLAGS=/nologo +LIBRARY=sll.lib + +# replace -O with -g in order to debug + +DEFINES= $(INCLUDES) $(DEFS) +#CFLAGS= $(cvars) $(cdebug) -nologo -G4 $(DEFINES) + + +SRCS = sll.c +OBJS = sll.obj + +all: $(LIBRARY) + +$(LIBRARY): $(OBJS) + lib $(LIBFLAGS) $(OBJS) /out:$(LIBRARY) + +clean: + del $(OBJS) $(LIBRARY) *.bak diff --git a/coregrade/src/mailsend/libs/libsll/README b/coregrade/src/mailsend/libs/libsll/README new file mode 100755 index 0000000..7a8cc79 --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/README @@ -0,0 +1,9 @@ +A Singly Linked List library. You'll need a ANSI C compiler in order to +compile. + +Please visit the URL: http://www.fccc.edu/users/muquit/libsll/libsll.html +for reference. + +-- +Muhammad A Muquit +Aug-09-1998. diff --git a/coregrade/src/mailsend/libs/libsll/VERSION b/coregrade/src/mailsend/libs/libsll/VERSION new file mode 100755 index 0000000..8852098 --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/VERSION @@ -0,0 +1,2 @@ +#The current version of ssl lib is 1.1 +SLL_VERSION=sll diff --git a/coregrade/src/mailsend/libs/libsll/configure b/coregrade/src/mailsend/libs/libsll/configure new file mode 100755 index 0000000..9e25faf --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/configure @@ -0,0 +1,1722 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.12 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +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=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -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 ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$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" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$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) + # 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 << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$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" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + 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) + 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" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -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 ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.12" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=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" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=sll.h + +# 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 its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + 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 + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + + + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:527: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +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 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:556: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + ac_prog_rejected=no + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_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 $# -gt 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 + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:604: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:638: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:643: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes + ac_test_CFLAGS="${CFLAGS+set}" + ac_save_CFLAGS="$CFLAGS" + CFLAGS= + echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:667: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 + if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" + elif test $ac_cv_prog_cc_g = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-O2" + fi +else + GCC= + test "${CFLAGS+set}" = set || CFLAGS="-g" +fi + +# Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:697: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_RANLIB="ranlib" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" +fi +fi +RANLIB="$ac_cv_prog_RANLIB" +if test -n "$RANLIB"; then + echo "$ac_t""$RANLIB" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 +echo "configure:724: checking whether ${MAKE-make} sets \${MAKE}" >&5 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftestmake <<\EOF +all: + @echo 'ac_maketemp="${MAKE}"' +EOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftestmake +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$ac_t""yes" 1>&6 + SET_MAKE= +else + echo "$ac_t""no" 1>&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + + + +echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:753: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:774: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:791: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + +echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 +echo "configure:814: checking for ANSI C header files" >&5 +if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +#include +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:827: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + ac_cv_header_stdc=yes +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "memchr" >/dev/null 2>&1; then + : +else + rm -rf conftest* + 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 > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "free" >/dev/null 2>&1; then + : +else + rm -rf conftest* + 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 > conftest.$ac_ext < +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#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)) exit(2); +exit (0); } + +EOF +if { (eval echo configure:894: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_header_stdc=no +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_header_stdc" 1>&6 +if test $ac_cv_header_stdc = yes; then + cat >> confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + +echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6 +echo "configure:918: checking for sys/wait.h that is POSIX.1 compatible" >&5 +if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#ifndef WEXITSTATUS +#define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) +#endif +#ifndef WIFEXITED +#define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif +int main() { +int s; +wait (&s); +s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; +; return 0; } +EOF +if { (eval echo configure:939: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_header_sys_wait_h=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_sys_wait_h=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_header_sys_wait_h" 1>&6 +if test $ac_cv_header_sys_wait_h = yes; then + cat >> confdefs.h <<\EOF +#define HAVE_SYS_WAIT_H 1 +EOF + +fi + +echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 +echo "configure:960: checking whether time.h and sys/time.h may both be included" >&5 +if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +int main() { +struct tm *tp; +; return 0; } +EOF +if { (eval echo configure:974: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_header_time=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_time=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_header_time" 1>&6 +if test $ac_cv_header_time = yes; then + cat >> confdefs.h <<\EOF +#define TIME_WITH_SYS_TIME 1 +EOF + +fi + +for ac_hdr in string.h fcntl.h memory.h malloc.h unistd.h ctype.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:998: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1008: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + +for ac_hdr in strings.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:1038: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1048: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + + +for ac_hdr in sys/stat.h sys/param.h sys/file.h stdlib.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:1079: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1089: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + +echo $ac_n "checking for working const""... $ac_c" 1>&6 +echo "configure:1116: checking for working const" >&5 +if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <j = 5; +} +{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; +} + +; return 0; } +EOF +if { (eval echo configure:1170: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_const=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_c_const=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_c_const" 1>&6 +if test $ac_cv_c_const = no; then + cat >> confdefs.h <<\EOF +#define const +EOF + +fi + +echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 +echo "configure:1191: checking whether struct tm is in sys/time.h or time.h" >&5 +if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +int main() { +struct tm *tp; tp->tm_sec; +; return 0; } +EOF +if { (eval echo configure:1204: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_struct_tm=time.h +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_struct_tm=sys/time.h +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_struct_tm" 1>&6 +if test $ac_cv_struct_tm = sys/time.h; then + cat >> confdefs.h <<\EOF +#define TM_IN_SYS_TIME 1 +EOF + +fi + +echo $ac_n "checking for flock""... $ac_c" 1>&6 +echo "configure:1225: checking for flock" >&5 +if eval "test \"`echo '$''{'ac_cv_func_flock'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char flock(); + +int main() { + +/* 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_flock) || defined (__stub___flock) +choke me +#else +flock(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1253: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_func_flock=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_flock=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'flock`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_FLOCK 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + +echo $ac_n "checking for strcasecmp""... $ac_c" 1>&6 +echo "configure:1276: checking for strcasecmp" >&5 +if eval "test \"`echo '$''{'ac_cv_func_strcasecmp'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char strcasecmp(); + +int main() { + +/* 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_strcasecmp) || defined (__stub___strcasecmp) +choke me +#else +strcasecmp(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1304: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_func_strcasecmp=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_strcasecmp=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'strcasecmp`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_STRCASECMP 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + +echo $ac_n "checking for mktime""... $ac_c" 1>&6 +echo "configure:1327: checking for mktime" >&5 +if eval "test \"`echo '$''{'ac_cv_func_mktime'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char mktime(); + +int main() { + +/* 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_mktime) || defined (__stub___mktime) +choke me +#else +mktime(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1355: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_func_mktime=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_mktime=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'mktime`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_MKTIME 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + +echo $ac_n "checking for ftruncate""... $ac_c" 1>&6 +echo "configure:1378: checking for ftruncate" >&5 +if eval "test \"`echo '$''{'ac_cv_func_ftruncate'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char ftruncate(); + +int main() { + +/* 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_ftruncate) || defined (__stub___ftruncate) +choke me +#else +ftruncate(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1406: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_func_ftruncate=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_ftruncate=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'ftruncate`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_FTRUNCATE 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + +echo $ac_n "checking for SCO""... $ac_c" 1>&6 +echo "configure:1429: checking for SCO" >&5 +# Extract the first word of "scosh", so it can be a program name with args. +set dummy scosh; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1433: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_COULD_BE_SCO'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$COULD_BE_SCO"; then + ac_cv_prog_COULD_BE_SCO="$COULD_BE_SCO" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_COULD_BE_SCO="maybe" + break + fi + done + IFS="$ac_save_ifs" + test -z "$ac_cv_prog_COULD_BE_SCO" && ac_cv_prog_COULD_BE_SCO="maybenot" +fi +fi +COULD_BE_SCO="$ac_cv_prog_COULD_BE_SCO" +if test -n "$COULD_BE_SCO"; then + echo "$ac_t""$COULD_BE_SCO" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +if test "$COULD_BE_SCO" = "maybe" +then + cat >> confdefs.h <<\EOF +#define SYSTEM_LOOKS_LIKE_SCO 1 +EOF + +fi + + +trap '' 1 2 15 +cat > confcache <<\EOF +# 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. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# 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. +(set) 2>&1 | + case `(ac_space=' '; set) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +cat > conftest.defs <<\EOF +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g +s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g +s%\[%\\&%g +s%\]%\\&%g +s%\$%$$%g +EOF +DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` +rm -f conftest.defs + + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.12" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir + +trap 'rm -fr `echo "Makefile examples/insert/Makefile examples/append/Makefile\ + examples/delete/Makefile examples/append_sorted/Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@CC@%$CC%g +s%@RANLIB@%$RANLIB%g +s%@SET_MAKE@%$SET_MAKE%g +s%@CPP@%$CPP%g +s%@COULD_BE_SCO@%$COULD_BE_SCO%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + diff --git a/coregrade/src/mailsend/libs/libsll/configure.in b/coregrade/src/mailsend/libs/libsll/configure.in new file mode 100755 index 0000000..6123d91 --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/configure.in @@ -0,0 +1,40 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(sll.h) + +dnl AC_CONFIG_HEADER(config.h) + +dnl Checks for programs. +AC_PROG_CC +AC_PROG_RANLIB +AC_PROG_MAKE_SET + +dnl Checks for libraries. + +dnl Checks for header files. +dnl AC_HEADER_STDC +AC_STDC_HEADERS +AC_HEADER_SYS_WAIT +AC_HEADER_TIME +AC_CHECK_HEADERS(string.h fcntl.h memory.h malloc.h unistd.h ctype.h) +AC_CHECK_HEADERS(strings.h) + +AC_CHECK_HEADERS(sys/stat.h sys/param.h sys/file.h stdlib.h) +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_STRUCT_TM +AC_CHECK_FUNC(flock,AC_DEFINE(HAVE_FLOCK)) +AC_CHECK_FUNC(strcasecmp,AC_DEFINE(HAVE_STRCASECMP)) +AC_CHECK_FUNC(mktime,AC_DEFINE(HAVE_MKTIME)) +AC_CHECK_FUNC(ftruncate,AC_DEFINE(HAVE_FTRUNCATE)) +dnl from vile configure.in, I love vile, a great editor +AC_MSG_CHECKING([for SCO]) +AC_PROGRAM_CHECK(COULD_BE_SCO, [scosh], maybe, maybenot) +if test "$COULD_BE_SCO" = "maybe" +then + AC_DEFINE(SYSTEM_LOOKS_LIKE_SCO) +fi + +dnl Checks for library functions. + +AC_OUTPUT(Makefile examples/insert/Makefile examples/append/Makefile\ + examples/delete/Makefile examples/append_sorted/Makefile) diff --git a/coregrade/src/mailsend/libs/libsll/examples/append/Makefile.in b/coregrade/src/mailsend/libs/libsll/examples/append/Makefile.in new file mode 100755 index 0000000..957604c --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/examples/append/Makefile.in @@ -0,0 +1,31 @@ +## +# Makefile automatically generated by genmake 1.0, Nov-12-98 +# genmake 1.0 by ma_muquit@fccc.edu, RCS +## +CC= @CC@ +DEFS= @DEFS@ +PROGNAME= sll_append +INCLUDES= -I../.. +LIBS= -L../../ -lsll + + +# replace -O with -g in order to debug + +DEFINES= $(INCLUDES) $(DEFS) -DSYS_UNIX=1 +CFLAGS= -O $(DEFINES) + +SRCS = append.c + +OBJS = append.o + +.c.o: + rm -f $@ + $(CC) $(CFLAGS) -c $*.c + +all: $(PROGNAME) + +$(PROGNAME) : $(OBJS) + $(CC) $(CFLAGS) -o $(PROGNAME) $(OBJS) $(LIBS) + +clean: + rm -f $(OBJS) $(PROGNAME) core diff --git a/coregrade/src/mailsend/libs/libsll/examples/append/append.c b/coregrade/src/mailsend/libs/libsll/examples/append/append.c new file mode 100755 index 0000000..5a91768 --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/examples/append/append.c @@ -0,0 +1,187 @@ +/* +** test appending a node at the end of the list. print the result +** and then free the memory. a user defined function is called to free +** the data. +** +** Development History: +** who when why +** ma_muquit@fccc.edu Aug-09-1998 first cut +*/ + + +#include + +typedef struct _addr +{ + char + *name, + *city, + *state; +} Addr; + +static void freeData(void **data); + +int main (int argc,char **argv) +{ + Sll + *l, + *head=NULL, + *new=NULL; + Addr + *addr; + + int + n=0; + + (void) fprintf(stderr, +"=========================================================================\n"); + (void) fprintf(stderr," Testing Append a node at the beginning of a list\n"); + (void) fprintf(stderr, +"=========================================================================\n"); + + addr=(Addr *) malloc(sizeof(Addr)); + if (addr == NULL) + { + (void) fprintf(stderr," malloc failed\n"); + exit(-1); + } + + (void) fprintf(stderr,"\n---------------[ appending ]----------\n"); + /* + ** it will be the last node + */ + addr->name=strdup("Muhammad A Muquit"); + addr->city=strdup("Philadelphia"); + addr->state=strdup("PA"); + + if ((addr->name == NULL) || + (addr->city == NULL) || + (addr->state == NULL)) + { + (void) fprintf(stderr,"malloc failed\n"); + exit(-1); + } + + new=allocateNode((void *) addr); + appendNode(&head,&new); + (void) fprintf(stderr,"Node: %d\n", ++n); + (void) fprintf(stderr," %s\n",addr->name); + (void) fprintf(stderr," %s\n",addr->city); + (void) fprintf(stderr," %s\n",addr->state); + + /* + ** append node after the last one + */ + addr=(Addr *) malloc(sizeof(Addr)); + if (addr == NULL) + { + (void) fprintf(stderr," malloc failed\n"); + exit(-1); + } + addr->name=strdup("Janet Hunter"); + addr->city=strdup("Santa Clara"); + addr->state=strdup("CA"); + + if ((addr->name == NULL) || + (addr->city == NULL) || + (addr->state == NULL)) + { + (void) fprintf(stderr,"malloc failed\n"); + exit(-1); + } + new=allocateNode((void *) addr); + appendNode(&head,&new); + (void) fprintf(stderr,"Appending Node: %d\n", ++n); + (void) fprintf(stderr," %s\n",addr->name); + (void) fprintf(stderr," %s\n",addr->city); + (void) fprintf(stderr," %s\n",addr->state); + + + /* + ** append node after the last one + */ + addr=(Addr *) malloc(sizeof(Addr)); + if (addr == NULL) + { + (void) fprintf(stderr," malloc failed\n"); + exit(-1); + } + addr->name=strdup("Babs Jensen"); + addr->city=strdup("Cupertino"); + addr->state=strdup("CA"); + + if ((addr->name == NULL) || + (addr->city == NULL) || + (addr->state == NULL)) + { + (void) fprintf(stderr,"malloc failed\n"); + exit(-1); + } + new=allocateNode((void *) addr); + appendNode(&head,&new); + (void) fprintf(stderr,"Appending Node: %d\n", ++n); + (void) fprintf(stderr," %s\n",addr->name); + (void) fprintf(stderr," %s\n",addr->city); + (void) fprintf(stderr," %s\n",addr->state); + + /* + ** print + */ + (void) fprintf(stderr,"\n---------------[ printing ]----------\n"); + n=0; + for (l=head; l; l=l->next) + { + addr=(Addr *) l->data; + (void) fprintf(stderr,"Node: %d\n",++n); + (void) fprintf(stderr," %s\n",addr->name); + (void) fprintf(stderr," %s\n",addr->city); + (void) fprintf(stderr," %s\n",addr->state); + } + + /* + ** free nodes + */ + (void) fprintf(stderr,"\n---------------[ freeing ]----------\n"); + destroyNodes(&head,freeData); + + exit(0); +} + + +/* +** routine to free the user data +*/ + +static void freeData(void **data) +{ + Addr + **addr=(Addr **) data; + + static int + n=0; + + n++; + if (*addr) + { + if ((*addr)->name) + { + (void) fprintf(stderr," Freeing: %s\n",(*addr)->name); + (void) free((char *) (*addr)->name); + } + if ((*addr)->city) + { + (void) fprintf(stderr," Freeing: %s\n",(*addr)->city); + (void) free ((char *) (*addr)->city); + } + if ((*addr)->state) + { + (void) fprintf(stderr," Freeing: %s\n",(*addr)->state); + (void) free ((char *) (*addr)->state); + } + + (void) fprintf(stderr,"Freeing the node %d itself\n\n",n); + (void) free((char *) (*addr)); + (*addr)=NULL; + } +} + diff --git a/coregrade/src/mailsend/libs/libsll/examples/append/makefile.wnt b/coregrade/src/mailsend/libs/libsll/examples/append/makefile.wnt new file mode 100755 index 0000000..b6d1039 --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/examples/append/makefile.wnt @@ -0,0 +1,34 @@ +## +# Makefile automatically generated by genmake 1.0, Mar-27-2001 +# genmake 1.0 by muquit@muquit.com http://www.muquit.com/ +## +CC= cl +DEFS= -nologo -G3 +PROGNAME= append +LINKER=link -nologo +INCLUDES= -I. -I../../ + + +# replace -O with -g in order to debug + +DEFINES= $(INCLUDES) $(DEFS) -DWINNT=1 -DSYS_WIN32=1 -DHAVE_STRING_H=1 -DHAVE_FCNTL_H=1 +CFLAGS= -O $(DEFINES) +SLL_LIB=../../sll.lib +LIBS=$(SLL_LIB) user32.lib gdi32.lib winmm.lib comdlg32.lib comctl32.lib +RC=rc +RCVARS=-r -DWIN32 + +SRCS = append.c + +OBJS = append.obj + +.c.obj: + $(CC) $(CFLAGS) -c $< -Fo$@ + +all: $(PROGNAME) + +$(PROGNAME) : $(OBJS) + $(CC) $(CFLAGS) -o $(PROGNAME) $(OBJS) $(LIBS) + +clean: + del $(OBJS) $(PROGNAME) diff --git a/coregrade/src/mailsend/libs/libsll/examples/append_sorted/Makefile.in b/coregrade/src/mailsend/libs/libsll/examples/append_sorted/Makefile.in new file mode 100755 index 0000000..7c50b5e --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/examples/append_sorted/Makefile.in @@ -0,0 +1,31 @@ +## +# Makefile automatically generated by genmake 1.0, Nov-12-98 +# genmake 1.0 by ma_muquit@fccc.edu, RCS +## +CC= @CC@ +DEFS= @DEFS@ +PROGNAME= sll_append_sorted +INCLUDES= -I../.. +LIBS= -L../../ -lsll + + +# replace -O with -g in order to debug + +DEFINES= $(INCLUDES) $(DEFS) -DSYS_UNIX=1 +CFLAGS= -O $(DEFINES) + +SRCS = append_sorted.c + +OBJS = append_sorted.o + +.c.o: + rm -f $@ + $(CC) $(CFLAGS) -c $*.c + +all: $(PROGNAME) + +$(PROGNAME) : $(OBJS) + $(CC) $(CFLAGS) -o $(PROGNAME) $(OBJS) $(LIBS) + +clean: + rm -f $(OBJS) $(PROGNAME) core diff --git a/coregrade/src/mailsend/libs/libsll/examples/append_sorted/append_sorted.c b/coregrade/src/mailsend/libs/libsll/examples/append_sorted/append_sorted.c new file mode 100755 index 0000000..6f76680 --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/examples/append_sorted/append_sorted.c @@ -0,0 +1,204 @@ +/* +** Appends a node to the end of a list sorted. The data of two lists are +** passed to the user defined function compFunction for sorting. +** +** Development History: +** who when why +** ma_muquit@fccc.edu Aug-09-1998 first cut +*/ + +#include + +typedef struct _addr +{ + char + *name, + *city, + *state; +} Addr; + +static void freeData(void **data); +static int compFunc(void *a1,void *a2); + +int main (int argc,char **argv) +{ + Sll + *l, + *head=NULL, + *new=NULL; + Addr + *addr; + + int + n=0; + + (void) fprintf(stderr, +"=========================================================================\n"); + (void) fprintf(stderr," Testing Append a node at the beginning of a list\n"); + (void) fprintf(stderr, +"=========================================================================\n"); + + addr=(Addr *) malloc(sizeof(Addr)); + if (addr == NULL) + { + (void) fprintf(stderr," malloc failed\n"); + exit(-1); + } + + (void) fprintf(stderr,"\n---------------[ appending ]----------\n"); + /* + ** it will be the last node + */ + addr->name=strdup("Cindy Muquit"); + addr->city=strdup("Philadelphia"); + addr->state=strdup("PA"); + + if ((addr->name == NULL) || + (addr->city == NULL) || + (addr->state == NULL)) + { + (void) fprintf(stderr,"malloc failed\n"); + exit(-1); + } + + new=allocateNode((void *) addr); + appendNodeSorted(&head,&new,compFunc); + (void) fprintf(stderr,"Appending Node: %d\n", ++n); + (void) fprintf(stderr," %s\n",addr->name); + (void) fprintf(stderr," %s\n",addr->city); + (void) fprintf(stderr," %s\n",addr->state); + + /* + ** append node before the last one + */ + addr=(Addr *) malloc(sizeof(Addr)); + if (addr == NULL) + { + (void) fprintf(stderr," malloc failed\n"); + exit(-1); + } + addr->name=strdup("Janet Hunter"); + addr->city=strdup("Santa Clara"); + addr->state=strdup("CA"); + + if ((addr->name == NULL) || + (addr->city == NULL) || + (addr->state == NULL)) + { + (void) fprintf(stderr,"malloc failed\n"); + exit(-1); + } + new=allocateNode((void *) addr); + appendNodeSorted(&head,&new,compFunc); + (void) fprintf(stderr,"Appending Node: %d\n", ++n); + (void) fprintf(stderr," %s\n",addr->name); + (void) fprintf(stderr," %s\n",addr->city); + (void) fprintf(stderr," %s\n",addr->state); + + + /* + ** append node before the last one + */ + addr=(Addr *) malloc(sizeof(Addr)); + if (addr == NULL) + { + (void) fprintf(stderr," malloc failed\n"); + exit(-1); + } + addr->name=strdup("Babs Jensen"); + addr->city=strdup("Cupertino"); + addr->state=strdup("CA"); + + if ((addr->name == NULL) || + (addr->city == NULL) || + (addr->state == NULL)) + { + (void) fprintf(stderr,"malloc failed\n"); + exit(-1); + } + new=allocateNode((void *) addr); + appendNodeSorted(&head,&new,compFunc); + (void) fprintf(stderr,"Appending Node: %d\n", ++n); + (void) fprintf(stderr," %s\n",addr->name); + (void) fprintf(stderr," %s\n",addr->city); + (void) fprintf(stderr," %s\n",addr->state); + + /* + ** print + */ + (void) fprintf(stderr,"\n---------------[ printing ]----------\n"); + n=0; + for (l=head; l; l=l->next) + { + addr=(Addr *) l->data; + (void) fprintf(stderr,"Node: %d\n",++n); + (void) fprintf(stderr," %s\n",addr->name); + (void) fprintf(stderr," %s\n",addr->city); + (void) fprintf(stderr," %s\n",addr->state); + } + + /* + ** free nodes + */ + (void) fprintf(stderr,"\n---------------[ freeing ]----------\n"); + destroyNodes(&head,freeData); + + exit(0); +} + + +/* +** routine to free the user data +*/ + +static void freeData(void **data) +{ + Addr + **addr=(Addr **) data; + + static int + n=0; + + n++; + if (*addr) + { + if ((*addr)->name) + { + (void) fprintf(stderr," Freeing: %s\n",(*addr)->name); + (void) free((char *) (*addr)->name); + } + if ((*addr)->city) + { + (void) fprintf(stderr," Freeing: %s\n",(*addr)->city); + (void) free ((char *) (*addr)->city); + } + if ((*addr)->state) + { + (void) fprintf(stderr," Freeing: %s\n",(*addr)->state); + (void) free ((char *) (*addr)->state); + } + + (void) fprintf(stderr,"Freeing the node %d itself\n\n",n); + (void) free((char *) (*addr)); + (*addr)=NULL; + } +} + + +static int compFunc(void *a1,void *a2) +{ + Addr + *addr1=(Addr *) a1, + *addr2=(Addr *) a2; + +/* + (void) fprintf(stderr,"name1=%s\n",addr1->name); + (void) fprintf(stderr,"name2=%s\n",addr2->name); +*/ +#ifdef WINNT + return (stricmp(addr1->name,addr2->name)); +#else + return (strcasecmp(addr1->name,addr2->name)); +#endif /* ! WINNT */ +} + diff --git a/coregrade/src/mailsend/libs/libsll/examples/append_sorted/makefile.wnt b/coregrade/src/mailsend/libs/libsll/examples/append_sorted/makefile.wnt new file mode 100755 index 0000000..fee4484 --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/examples/append_sorted/makefile.wnt @@ -0,0 +1,34 @@ +## +# Makefile automatically generated by genmake 1.0, Mar-27-2001 +# genmake 1.0 by muquit@muquit.com http://www.muquit.com/ +## +CC= cl +DEFS= -nologo -G3 +PROGNAME= apend_sorted +LINKER=link -nologo +INCLUDES= -I. -I../../ + + +# replace -O with -g in order to debug + +DEFINES= $(INCLUDES) $(DEFS) -DWINNT=1 -DSYS_WIN32=1 -DHAVE_STRING_H=1 -DHAVE_FCNTL_H=1 +CFLAGS= -O $(DEFINES) +SLL_LIB=../../sll.lib +LIBS=$(SLL_LIB) user32.lib gdi32.lib winmm.lib comdlg32.lib comctl32.lib +RC=rc +RCVARS=-r -DWIN32 + +SRCS = append_sorted.c + +OBJS = append_sorted.obj + +.c.obj: + $(CC) $(CFLAGS) -c $< -Fo$@ + +all: $(PROGNAME) + +$(PROGNAME) : $(OBJS) + $(CC) $(CFLAGS) -o $(PROGNAME) $(OBJS) $(LIBS) + +clean: + del $(OBJS) $(PROGNAME) diff --git a/coregrade/src/mailsend/libs/libsll/examples/delete/Makefile.in b/coregrade/src/mailsend/libs/libsll/examples/delete/Makefile.in new file mode 100755 index 0000000..cd5487a --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/examples/delete/Makefile.in @@ -0,0 +1,31 @@ +## +# Makefile automatically generated by genmake 1.0, Nov-12-98 +# genmake 1.0 by ma_muquit@fccc.edu, RCS +## +CC= @CC@ +DEFS= @DEFS@ +PROGNAME= sll_delete +INCLUDES= -I../.. +LIBS= -L../../ -lsll + + +# replace -O with -g in order to debug + +DEFINES= $(INCLUDES) $(DEFS) -DSYS_UNIX=1 +CFLAGS= -O $(DEFINES) + +SRCS = delete.c + +OBJS = delete.o + +.c.o: + rm -f $@ + $(CC) $(CFLAGS) -c $*.c + +all: $(PROGNAME) + +$(PROGNAME) : $(OBJS) + $(CC) $(CFLAGS) -o $(PROGNAME) $(OBJS) $(LIBS) + +clean: + rm -f $(OBJS) $(PROGNAME) core diff --git a/coregrade/src/mailsend/libs/libsll/examples/delete/delete.c b/coregrade/src/mailsend/libs/libsll/examples/delete/delete.c new file mode 100755 index 0000000..b652933 --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/examples/delete/delete.c @@ -0,0 +1,200 @@ +/* +** first append a node at the end of a list. then dele a node and free the +** memory associated with data. +** +** Development History: +** who when why +** ma_muquit@fccc.edu Aug-09-1998 first cut +*/ + +#include + +typedef struct _addr +{ + char + *name, + *city, + *state; +} Addr; + +static void freeData(void **data); + +int main (int argc,char **argv) +{ + Sll + *node, + *l, + *head=NULL, + *new=NULL; + Addr + *addr; + + int + n=0; + + (void) fprintf(stderr, +"=========================================================================\n"); + (void) fprintf(stderr," Append a node at the beginning of a list\n"); + (void) fprintf(stderr, +"=========================================================================\n"); + + addr=(Addr *) malloc(sizeof(Addr)); + if (addr == NULL) + { + (void) fprintf(stderr," malloc failed\n"); + exit(-1); + } + + (void) fprintf(stderr,"\n---------------[ appending ]----------\n"); + /* + ** it will be the last node + */ + addr->name=strdup("Muhammad A Muquit"); + addr->city=strdup("Philadelphia"); + addr->state=strdup("PA"); + + if ((addr->name == NULL) || + (addr->city == NULL) || + (addr->state == NULL)) + { + (void) fprintf(stderr,"malloc failed\n"); + exit(-1); + } + + new=allocateNode((void *) addr); + appendNode(&head,&new); + (void) fprintf(stderr,"Appending Node: %d\n", ++n); + (void) fprintf(stderr," %s\n",addr->name); + (void) fprintf(stderr," %s\n",addr->city); + (void) fprintf(stderr," %s\n",addr->state); + + /* + ** append node before the last one + */ + addr=(Addr *) malloc(sizeof(Addr)); + if (addr == NULL) + { + (void) fprintf(stderr," malloc failed\n"); + exit(-1); + } + addr->name=strdup("Janet Hunter"); + addr->city=strdup("Santa Clara"); + addr->state=strdup("CA"); + + if ((addr->name == NULL) || + (addr->city == NULL) || + (addr->state == NULL)) + { + (void) fprintf(stderr,"malloc failed\n"); + exit(-1); + } + new=allocateNode((void *) addr); + appendNode(&head,&new); + (void) fprintf(stderr,"Appending Node: %d\n", ++n); + (void) fprintf(stderr," %s\n",addr->name); + (void) fprintf(stderr," %s\n",addr->city); + (void) fprintf(stderr," %s\n",addr->state); + + + /* + ** append node before the last one + */ + addr=(Addr *) malloc(sizeof(Addr)); + if (addr == NULL) + { + (void) fprintf(stderr," malloc failed\n"); + exit(-1); + } + addr->name=strdup("Babs Jensen"); + addr->city=strdup("Cupertino"); + addr->state=strdup("CA"); + + if ((addr->name == NULL) || + (addr->city == NULL) || + (addr->state == NULL)) + { + (void) fprintf(stderr,"malloc failed\n"); + exit(-1); + } + new=allocateNode((void *) addr); + appendNode(&head,&new); + (void) fprintf(stderr,"Appending Node: %d\n", ++n); + (void) fprintf(stderr," %s\n",addr->name); + (void) fprintf(stderr," %s\n",addr->city); + (void) fprintf(stderr," %s\n",addr->state); + + /* + ** print + */ + (void) fprintf(stderr,"\n---------------[ printing ]----------\n"); + n=0; + for (l=head; l; l=l->next) + { + addr=(Addr *) l->data; + (void) fprintf(stderr,"Node: %d\n",++n); + (void) fprintf(stderr," %s\n",addr->name); + (void) fprintf(stderr," %s\n",addr->city); + (void) fprintf(stderr," %s\n",addr->state); + } + + (void) fprintf(stderr,"\n-----------[ delete Node 2 ]---------\n"); + node=getNthNode(head,2); + if (node != NULL) + destroyNode(&head,node,freeData); + else + (void) fprintf(stderr,"No node found at position 2\n"); + (void) fprintf(stderr,"\n-----------[ printing all the nodes again ]--------\n"); + n=0; + for (l=head; l; l=l->next) + { + addr=(Addr *) l->data; + (void) fprintf(stderr,"Node: %d\n",++n); + (void) fprintf(stderr," %s\n",addr->name); + (void) fprintf(stderr," %s\n",addr->city); + (void) fprintf(stderr," %s\n",addr->state); + } + + + /* + ** free nodes + */ + (void) fprintf(stderr,"\n---------------[ freeing ]----------\n"); + destroyNodes(&head,freeData); + + exit(0); +} + + +/* +** routine to free the user data +*/ + +static void freeData(void **data) +{ + Addr + **addr=(Addr **) data; + + if (*addr) + { + if ((*addr)->name) + { + (void) fprintf(stderr," Freeing: %s\n",(*addr)->name); + (void) free((char *) (*addr)->name); + } + if ((*addr)->city) + { + (void) fprintf(stderr," Freeing: %s\n",(*addr)->city); + (void) free ((char *) (*addr)->city); + } + if ((*addr)->state) + { + (void) fprintf(stderr," Freeing: %s\n",(*addr)->state); + (void) free ((char *) (*addr)->state); + } + + (void) fprintf(stderr,"Freeing the node itself\n\n"); + (void) free((char *) (*addr)); + (*addr)=NULL; + } +} + diff --git a/coregrade/src/mailsend/libs/libsll/examples/delete/makefile.wnt b/coregrade/src/mailsend/libs/libsll/examples/delete/makefile.wnt new file mode 100755 index 0000000..2368f42 --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/examples/delete/makefile.wnt @@ -0,0 +1,34 @@ +## +# Makefile automatically generated by genmake 1.0, Mar-27-2001 +# genmake 1.0 by muquit@muquit.com http://www.muquit.com/ +## +CC= cl +DEFS= -nologo -G3 +PROGNAME= delete +LINKER=link -nologo +INCLUDES= -I. -I../../ + + +# replace -O with -g in order to debug + +DEFINES= $(INCLUDES) $(DEFS) -DWINNT=1 -DSYS_WIN32=1 -DHAVE_STRING_H=1 -DHAVE_FCNTL_H=1 +CFLAGS= -O $(DEFINES) +SLL_LIB=../../sll.lib +LIBS=$(SLL_LIB) user32.lib gdi32.lib winmm.lib comdlg32.lib comctl32.lib +RC=rc +RCVARS=-r -DWIN32 + +SRCS = delete.c + +OBJS = delete.obj + +.c.obj: + $(CC) $(CFLAGS) -c $< -Fo$@ + +all: $(PROGNAME) + +$(PROGNAME) : $(OBJS) + $(CC) $(CFLAGS) -o $(PROGNAME) $(OBJS) $(LIBS) + +clean: + del $(OBJS) $(PROGNAME) diff --git a/coregrade/src/mailsend/libs/libsll/examples/insert/Makefile.in b/coregrade/src/mailsend/libs/libsll/examples/insert/Makefile.in new file mode 100755 index 0000000..2562a3a --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/examples/insert/Makefile.in @@ -0,0 +1,31 @@ +## +# Makefile automatically generated by genmake 1.0, Nov-12-98 +# genmake 1.0 by ma_muquit@fccc.edu, RCS +## +CC= @CC@ +DEFS= @DEFS@ +PROGNAME= sll_insert +INCLUDES= -I../.. +LIBS= -L../../ -lsll + + +# replace -O with -g in order to debug + +DEFINES= $(INCLUDES) $(DEFS) -DSYS_UNIX=1 +CFLAGS= -O $(DEFINES) + +SRCS = insert.c + +OBJS = insert.o + +.c.o: + rm -f $@ + $(CC) $(CFLAGS) -c $*.c + +all: $(PROGNAME) + +$(PROGNAME) : $(OBJS) + $(CC) $(CFLAGS) -o $(PROGNAME) $(OBJS) $(LIBS) + +clean: + rm -f $(OBJS) $(PROGNAME) core diff --git a/coregrade/src/mailsend/libs/libsll/examples/insert/insert.c b/coregrade/src/mailsend/libs/libsll/examples/insert/insert.c new file mode 100755 index 0000000..a3700fd --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/examples/insert/insert.c @@ -0,0 +1,186 @@ +/* +** test inserting a node at the beginning of the list. print the result +** and then free the memory. a user defined function is called to free +** the data. +** +** Development History: +** who when why +** ma_muquit@fccc.edu Aug-09-1998 first cut +*/ + + +#include +#include + +typedef struct _addr +{ + char + *name, + *city, + *state; +} Addr; + +static void freeData(void **data); + +int main (int argc,char **argv) +{ + Sll + *l, + *head=NULL, + *new=NULL; + Addr + *addr; + + int + n=0; + + (void) fprintf(stderr, +"=========================================================================\n"); + (void) fprintf(stderr," Testing Insert a node at the beginning of a list\n"); + (void) fprintf(stderr, +"=========================================================================\n"); + + addr=(Addr *) malloc(sizeof(Addr)); + if (addr == NULL) + { + (void) fprintf(stderr," malloc failed\n"); + exit(-1); + } + + /* + ** it will be the last node + */ + addr->name=strdup("Muhammad A Muquit"); + addr->city=strdup("Philadelphia"); + addr->state=strdup("PA"); + + if ((addr->name == NULL) || + (addr->city == NULL) || + (addr->state == NULL)) + { + (void) fprintf(stderr,"malloc failed\n"); + exit(-1); + } + + new=allocateNode((void *) addr); + insertNode(&head,&new); + (void) fprintf(stderr,"Inserting Node: %d\n", ++n); + (void) fprintf(stderr," %s\n",addr->name); + (void) fprintf(stderr," %s\n",addr->city); + (void) fprintf(stderr," %s\n",addr->state); + + /* + ** insert node before the last one + */ + addr=(Addr *) malloc(sizeof(Addr)); + if (addr == NULL) + { + (void) fprintf(stderr," malloc failed\n"); + exit(-1); + } + addr->name=strdup("Janet Hunter"); + addr->city=strdup("Santa Clara"); + addr->state=strdup("CA"); + + if ((addr->name == NULL) || + (addr->city == NULL) || + (addr->state == NULL)) + { + (void) fprintf(stderr,"malloc failed\n"); + exit(-1); + } + new=allocateNode((void *) addr); + insertNode(&head,&new); + (void) fprintf(stderr,"Inserting Node: %d\n", ++n); + (void) fprintf(stderr," %s\n",addr->name); + (void) fprintf(stderr," %s\n",addr->city); + (void) fprintf(stderr," %s\n",addr->state); + + + /* + ** insert node before the last one + */ + addr=(Addr *) malloc(sizeof(Addr)); + if (addr == NULL) + { + (void) fprintf(stderr," malloc failed\n"); + exit(-1); + } + addr->name=strdup("Babs Jensen"); + addr->city=strdup("Cupertino"); + addr->state=strdup("CA"); + + if ((addr->name == NULL) || + (addr->city == NULL) || + (addr->state == NULL)) + { + (void) fprintf(stderr,"malloc failed\n"); + exit(-1); + } + new=allocateNode((void *) addr); + insertNode(&head,&new); + (void) fprintf(stderr,"Inserting Node: %d\n", ++n); + (void) fprintf(stderr," %s\n",addr->name); + (void) fprintf(stderr," %s\n",addr->city); + (void) fprintf(stderr," %s\n",addr->state); + + /* + ** print + */ + (void) fprintf(stderr,"\n\nPrinting........\n"); + n=0; + for (l=head; l; l=l->next) + { + addr=(Addr *) l->data; + (void) fprintf(stderr,"Node: %d\n",++n); + (void) fprintf(stderr," %s\n",addr->name); + (void) fprintf(stderr," %s\n",addr->city); + (void) fprintf(stderr," %s\n\n",addr->state); + } + + /* + ** free nodes + */ + destroyNodes(&head,freeData); + + exit(0); +} + + +/* +** routine to free the user data +*/ + +static void freeData(void **data) +{ + Addr + **addr=(Addr **) data; + + static int + n=0; + + n++; + if (*addr) + { + if ((*addr)->name) + { + (void) fprintf(stderr," Freeing: %s\n",(*addr)->name); + (void) free((char *) (*addr)->name); + } + if ((*addr)->city) + { + (void) fprintf(stderr," Freeing: %s\n",(*addr)->city); + (void) free ((char *) (*addr)->city); + } + if ((*addr)->state) + { + (void) fprintf(stderr," Freeing: %s\n",(*addr)->state); + (void) free ((char *) (*addr)->state); + } + + (void) fprintf(stderr,"Freeing the node %d itself\n\n",n); + (void) free((char *) (*addr)); + (*addr)=NULL; + } +} + diff --git a/coregrade/src/mailsend/libs/libsll/examples/insert/makefile.wnt b/coregrade/src/mailsend/libs/libsll/examples/insert/makefile.wnt new file mode 100755 index 0000000..e1b7390 --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/examples/insert/makefile.wnt @@ -0,0 +1,35 @@ +## +# Makefile automatically generated by genmake 1.0, Mar-27-2001 +# genmake 1.0 by muquit@muquit.com http://www.muquit.com/ +## +CC= cl +DEFS= -nologo -G3 +PROGNAME= insert +LINKER=link -nologo +INCLUDES= -I. -I../../ + + +# replace -O with -g in order to debug + +DEFINES= $(INCLUDES) $(DEFS) -DWINNT=1 -DSYS_WIN32=1 -DHAVE_STRING_H=1 -DHAVE_FCNTL_H=1 + +CFLAGS= -O $(DEFINES) +SLL_LIB= ../../sll.lib +LIBS=$(SLL_LIB) user32.lib gdi32.lib winmm.lib comdlg32.lib comctl32.lib +RC=rc +RCVARS=-r -DWIN32 + +SRCS = insert.c + +OBJS = insert.obj + +.c.obj: + $(CC) $(CFLAGS) -c $< -Fo$@ + +all: $(PROGNAME) + +$(PROGNAME) : $(OBJS) + $(CC) $(CFLAGS) -o $(PROGNAME) $(OBJS) $(LIBS) + +clean: + del $(OBJS) $(PROGNAME) diff --git a/coregrade/src/mailsend/libs/libsll/func.txt b/coregrade/src/mailsend/libs/libsll/func.txt new file mode 100755 index 0000000..4507738 --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/func.txt @@ -0,0 +1,79 @@ +function description of singly linked list library + + +Data structure +-------------- + +typedef struct _Sll +{ + void + *data; /* void pointer for user data */ + + struct _Sll + *next; /* pointer to next node */ +} Sll; + +Functions description +===================== + +void initList (Sll **list); + Initializes *list by setting the list pointer to NULL. + +Sll *allocateNode (void *data); + Allocates space for a new node and initializes the data fields. The user + is responsible for passing a valid pointer to data. The pointer to data + can be anything. If a large amount data needs to used, put all the data + in a structure and send pointer to a structure. + +void appendNode(Sll **head,Sll **new) + Appends a node to the end of a list. list gets modified and new is the + node to be appended. + +void appendNodeSorted(Sll **head,Sll **new,Ifunc compFunc); + Appends a node to the end of a list sorted. The data of two lists are + passwd to the user defined function compFunction for sorting. The function + returns an integer 0 or > 0. + +void insertNode(Sll **head,Sll **new) + Insert a node at the beginning of a list. Insert node new at the beginning + of list "list". Note, the list "list" gets modified. + +Bool emptyList(Sll *list) + Checks if a list is empty. + +void delNode(Sll **head,Sll *node) + Deletes a node from the list. "lsit" is the list to modify and node is the + node to remove. + +void freeNode(Sll **list) + Frees a node. It does not do free the data. It checks before freeing if + the list is NULL or not. If not NULL, it will be freed. Therefore, list + must point to a valid location in memory. + +Sll *getNthNode(Sll *head,int n) + Returns the nth node in a list. Node starts at 1. If there is no such + node, NULL is returned. + +void destroyNode(Sll **head,Sll *node,void (*freeFunc)(void **)) + head -- the entire list, gets modifed + node -- the node to destroy + freeFunc -- the function to call to free the data. + + Frees memory allocated for a node and the data associated with the + node. The caller is responsible to write the function to free the memory + for the data. + +void destroyNodes(Sll **head,void (*freeFunc)(void **)) + head -- the head node of the list + freeFunc - function to free data + + Fress the entire list and the data. The caller is responsible to write the + function to free data and pass it in the function. + +int numNodes(Sll **head) + Returns number of nodes in the list. + +-- +Muhammad A Muquit +Aug-09-1998 +Saturday diff --git a/coregrade/src/mailsend/libs/libsll/makefile.wnt b/coregrade/src/mailsend/libs/libsll/makefile.wnt new file mode 100755 index 0000000..9a7fd8e --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/makefile.wnt @@ -0,0 +1,30 @@ +#-------------------------------------------- +# Makefile for MS Visual C++ +# muquit@muquit.com +#-------------------------------------------- + +CC= cl /MD +DEFS= -DWINNT=1 -DSTRICT_MODE=1 -DHAVE_STRING_H=1 -DHAVE_FCNTL_H=1 + +INCLUDES= -I. +LIBRARY=sll.lib + +# replace -O with -g in order to debug + +DEFINES= $(INCLUDES) $(DEFS) +#CFLAGS= $(cvars) $(cdebug) -nologo -G4 $(DEFINES) + + +SRCS = sll.c +OBJS = sll.obj + +.c.obj: + $(CC) $(CFLAGS) -c $< -Fo$@ + +all: $(LIBRARY) + +$(LIBRARY): $(OBJS) + link /lib /OUT:$(LIBRARY) $(OBJS) + +clean: + del $(OBJS) $(LIBRARY) *.bak diff --git a/coregrade/src/mailsend/libs/libsll/mktar.sh b/coregrade/src/mailsend/libs/libsll/mktar.sh new file mode 100755 index 0000000..a1fac3d --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/mktar.sh @@ -0,0 +1,46 @@ +#!/bin/sh +# +# create a gzip compressed tar archive of the current working directory. +# the name of the file will be dir.tar.gz +# + +. ./VERSION + +pwd=`pwd` +pwd_head=`basename $pwd` + +# +# first check if we'r at the corrent directory +# + +if [ $pwd_head != $SLL_VERSION ]; then + echo "You are in wrong base directory" + echo "Expected: $SLL_VERSION" + echo "Found: $pwd_head" + echo "exiting ..." + exit 1 +fi + + +tar_filename=$pwd_head.tar +# +# remove the tar file if any in the current working directoyr +# +if [ -f ./$tar_filename.gz ]; then + echo "removing $tar_filename.gz" + rm -f ./$tar_filename.gz +fi + +make clean > /dev/null 2>&1 +# +# go up +# + +cd .. +tar -cf /tmp/$tar_filename ./$pwd_head +if [ $? -eq 0 ]; then + gzip -f -v -9 /tmp/$tar_filename + mv /tmp/$tar_filename.gz ./$pwd_head + cd $pwd + ls -l $tar_filename.gz +fi diff --git a/coregrade/src/mailsend/libs/libsll/muquit.css b/coregrade/src/mailsend/libs/libsll/muquit.css new file mode 100755 index 0000000..ae50a61 --- /dev/null +++ b/coregrade/src/mailsend/libs/libsll/muquit.css @@ -0,0 +1,27 @@ +/* + * Styles for the base documents used by the CGI RFC project. + */ + +BODY + { + background-color: #FFFFFF; + } + +/* + * Standard styles for marking up drafts and RFC documents. + */ + +.shabuj + { + color: green; + } + +.lal + { + color: red; + } + +.fuchsia + { + color: fuchsia; + } diff --git a/coregrade/src/mailsend/libs/libsll/sll.c b/coregrade/src/mailsend/libs/libsll/sll.c old mode 100644 new mode 100755 diff --git a/coregrade/src/mailsend/libs/libsll/sll.h b/coregrade/src/mailsend/libs/libsll/sll.h old mode 100644 new mode 100755 diff --git a/coregrade/src/mailsend/mailsend b/coregrade/src/mailsend/mailsend deleted file mode 100755 index a19a47ed8412e2bec5b9cdc7c797c5a716456f63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185752 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 JIwYFr{{niXb*TUV diff --git a/coregrade/src/mailsend/mailsend.h b/coregrade/src/mailsend/mailsend.h old mode 100644 new mode 100755 index d386df8..ff1724c --- a/coregrade/src/mailsend/mailsend.h +++ b/coregrade/src/mailsend/mailsend.h @@ -8,6 +8,7 @@ #include + #include "mutils.h" #include "msock.h" #include "sll.h" @@ -28,6 +29,7 @@ #endif /* HAVE_OPENSSL */ + /* ** header for mailsend - a simple mail sender via SMTP ** $Id: mailsend.h,v 1.3 2002/06/22 21:17:29 muquit Exp $ @@ -37,31 +39,30 @@ ** muquit@muquit.com Mar-23-2001 first cut */ -#define BUFSIZ 32768 - #define MFL __FILE__,__LINE__ -#define MAILSEND_VERSION "@(#) mailsend v1.15b5" +#define MAILSEND_VERSION "@(#) mailsend v1.20b2" #define MAILSEND_PROG "mailsend" #define MAILSEND_AUTHOR "muquit@muquit.com" #define MAILSEND_URL "http://www.muquit.com/" -#define NO_SPAM_STATEMENT "GNU GPL. It is illegal to use this software for Spamming" +#define NO_SPAM_STATEMENT "BSD. It is illegal to use this software for Spamming" -#define MAILSEND_SMTP_PORT 587 // 25 +#define MAILSEND_SMTP_PORT 25 #define MAILSEND_DEF_SUB "" - #define A_SPACE ' ' #define A_DASH '-' #define EMPTY_OK 0x01 #define EMPTY_NOT_OK 0x02 -#define ATTACHMENT_SEP ',' #define FILE_TYPE_DOS 0x00000001 #define FILE_TYPE_UNIX 0x00000002 #define FILE_TYPE_BINARY 0x00000004 +#define DEFAULT_CONNECT_TIMEOUT 5 /* seconds */ +#define DEFAULT_READ_TIMEOUT 5 /* seconds */ + #ifdef EXTERN #undef EXTERN @@ -69,7 +70,7 @@ #ifndef __MAIN__ #define EXTERN extern -#else +#else #define EXTERN #endif /* __MAIN__ */ @@ -113,10 +114,45 @@ do \ }\ }while(0) +#define RETURN_IF_NOT_ZERO(rc) \ +do \ +{ \ + if (rc != 0) \ + { \ + return(rc); \ + } \ +}while(0) + +#define CHECK_WRITE_STATUS(n) \ +do \ +{ \ + if (n <= 0) \ + { \ + goto ExitProcessing; \ + } \ +}while(0) + + #define ERR_STR strerror(errno) +#define CONTENT_DISPOSITION_INLINE 0x01 +#define CONTENT_DISPOSITION_ATTACHMENT 0x02 + +/* only suport base64 at this time */ +/* as of Jul-01-2013 */ +#define ENCODE_7BIT 0x01 /* default for text/plain */ +#define ENCODE_8BIT 0x02 +#define ENCODE_BASE64 0x03 +#define ENCODE_QUOTED_PRINTABLE 0x04 +#define ENCODE_NONE 0x05 + +#define DEFAULT_CHARSET "utf-8" + EXTERN int g_verbose; +EXTERN int g_connect_timeout; +EXTERN int g_read_timeout; EXTERN int g_wait_for_cr; +EXTERN int g_do_ssl; EXTERN int g_do_starttls; EXTERN int g_quiet; EXTERN int g_do_auth; @@ -128,12 +164,25 @@ EXTERN char g_charset[33]; EXTERN char g_username[64]; EXTERN char g_userpass[64]; EXTERN char g_from_name[64]; +EXTERN char g_content_transfer_encoding[32]; +EXTERN FILE *g_log_fp; +EXTERN char g_log_file[MUTILS_PATH_MAX]; +EXTERN int g_show_attachment_in_log; +EXTERN int g_use_protocol; +EXTERN char g_content_type[64]; +EXTERN char g_attach_sep[4]; +EXTERN char g_attach_name[64]; +EXTERN char g_content_disposition[32]; +EXTERN char g_content_id[64]; +EXTERN char g_mime_type[64]; +EXTERN int g_force; + typedef struct _Address { /* - ** label holds strings like "To" "Cc" "Bcc". + ** label holds strings like "To" "Cc" "Bcc". ** The address is the email address. */ @@ -146,11 +195,31 @@ typedef struct _Attachment { char *file_path, - *file_name; + *file_name, + *attachment_name, + *content_id; + + char + *oneline_msg; + char *mime_type; + char *content_disposition; + + char + *content_transfer_encoding, + *charset; + + int + attach_separator; + + FILE + *fp_read; + + char + mime_tmpfile[MUTILS_PATH_MAX]; }Attachment; /* the mail sturct */ @@ -182,34 +251,58 @@ typedef struct _Mailsendrc }Mailsendrc; /* function prototypes */ -char *xStrdup(char *string); +char *xStrdup(const char *string); int addAddressToList(char *a,char *label); TheMail *initTheMail(void); Address *newAddress(void); Sll *getAddressList(void); void printAddressList(void); void print_server_caps(void); +void print_one_lines(void); char *check_server_cap(char *what); -int read_smtp_line(); -void show_smtp_info(char *smtp_server,int port,char *domain); +int read_smtp_line(void); +int read_smtp_multi_lines(void); +int show_smtp_info(char *smtp_server,int port,char *domain); int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub, char *smtp_server,int smtp_port,char *helo_domain, char *attach_file,char *txt_msg_file,char *the_msg, - int is_mime,char *rrr,char *rt,int add_dateh); + int is_mime,char *rrr,char *rt,int add_dateh,char* return_path_addr); TheMail *newTheMail(void); void errorMsg(char *format,...); void showVerbose(char *format,...); void print_info(char *format,...); +void write_log(char *format,...); +void open_log(const char *log_file); +void close_log(void); +void exit_ok(void); +void exit_error(void); +void log_info(const char *fmt, ...); +void log_debug(const char *fmt, ...); +void log_error(const char *fmt, ...); +void log_fatal(const char *fmt, ...); int addAddressesFromFileToList(char *adress_list_file); int validateMusts(char *from,char *to,char *smtp_server, char *helo_domain); char *askFor(char *buf,int buflen,char *label,int loop); int isInConsole(int fd); +int add_one_line_to_list(char *line); +int add_msg_body_files_to_list(char *file_path); +int add_embed_image_to_attachment_list(const char *image_file); +int add_customer_header_to_list(char *line); int add_attachment_to_list(char *file_path_mime); +int add_oneline_to_attachment_list(char *one_line_msg); +int add_msg_body_to_attachment_list(const char *msg_body_file); int add_server_cap_to_list(char *capability); -Sll *get_attachment_list(); -Sll *get_server_caps_list(); -void print_attachemtn_list(); +Sll *get_one_line_list(void); +Sll *get_custom_header_list(void); +Sll *get_attachment_list(void); +Sll *get_oneline_attachment_list(void); +Sll *get_msg_body_attachment_list(void); +Sll *get_embed_image_attachment_list(void); +Sll *get_server_caps_list(void); +Sll *get_msg_body_files_list(void); +void print_attachment_list(void); +void print_oneline_attachment_list(void); char *fix_to(char *to); int isInteractive(void); int get_filepath_mimetype(char *str,char *filename,int fn_size, @@ -221,8 +314,25 @@ int do_tls(int sfd); void initialize_openssl(char *cipher); char *encode_cram_md5(char *challenge,char *user,char *pass); int guess_file_type(char *path,unsigned int *flag); +void generate_encrypted_password(const char *plaintext); +void print_copyright(void); +int get_encoding_type(const char *type); +int get_content_disposition(const char *disposition); +Attachment *allocate_attachment(void); +int write_to_socket(char *str); +int print_content_type_header(const char *boundary); +int send_attachment(Attachment *a, const char *boundary); +int process_attachments(const char *boundary); +int process_oneline_messages(const char *boundary); +int process_embeded_images(const char *boundary); +int encode2base64andwrite2socket(const char *str); +int include_msg_body(void); +int include_image(void); +void show_examples(void); +char *get_mime_type(char *path); #ifdef HAVE_OPENSSL void print_cert_info(SSL *ssl); +void show_mime_types(void); #endif /* HAVE_OPENSSL */ #endif /* ! MAIL_SEND_H */ diff --git a/coregrade/src/mailsend/main.c b/coregrade/src/mailsend/main.c old mode 100644 new mode 100755 index c0c97cb..d275e6a --- a/coregrade/src/mailsend/main.c +++ b/coregrade/src/mailsend/main.c @@ -15,9 +15,7 @@ #define __MAIN__ 1 #include "mailsend.h" -//#include "../cgi.h" -//extern C_Cfg *cfg; /* exits after writing the usage */ static void usage(void) @@ -28,120 +26,172 @@ static void usage(void) static char *options[]= { -" -smtp hostname/IP* - of the SMTP server", -" -port SMTP port - SMTP port", -" -d domain - domain name for SMTP HELO/EHLO", -" -t to,to..* - email address/es of the reciepient/s", -" -cc cc,cc.. - Carbon copy address/es", -" +cc - don't ask for Carbon Copy", -" -bc bcc,bcc.. - Blind carbon copy address/es", -" +bc - don't ask for Blind carbon copy", -" +D - don't add Date header", -" -f address* - email address of the sender", -" -sub subject - subject", -" -l file - a file containing the email addresses", -" -attach file,mime_type,[i/a] (i=inline,a=attachment)", -" - attach this file as attachment or inline", -" -cs character set - for text/plain attachments (default is us-ascii)", -" -M \"one line msg\" - attach this one line text message", -" -name \"Full Name\" - add name in the From header", -" -v - verbose mode", -" -V - show version info", -" -w - wait for a CR after sending the mail", -" -rt email_address - add Reply-To header", -" -rrr email_address - request read receipts to this address", -" -starttls - Check for STARTTLS and if server supports, do it", -" -auth - Try CRAM-MD5,LOGIN,PLAIN in that order", -" -auth-cram-md5 - use AUTH CRAM-MD5 authentication", -" -auth-plain - use AUTH PLAIN authentication", -" -auth-login - use AUTH LOGIN authentication", -" -user username - username for ESMTP authentication", -" -pass password - password for ESMTP authentication", -" -example - show examples", -" -ehlo - force EHLO", -" -info - show SMTP server information", -" -help - shows this help", -" -q - quiet", +" -copyright - show copyright information", +" -4 - Force to use IPv4 address of SMTP server", +" -6 - Force to use IPv6 address of SMTP server", +" -smtp hostname/IP* - Hostname/IP address of the SMTP server", +" -port SMTP port - SMTP port", +" -domain domain - domain name for SMTP HELO/EHLO", +" -t to,to..* - email address/es of the recipient/s", +" -cc cc,cc.. - carbon copy address/es", +" +cc - do not ask for Carbon Copy", +" -ct seconds - Connect timeout. Default is 5 seconds", +#if defined(SO_RCVTIMEO) +" -read-timeout seconds - Read timeout. Default is 5 seconds", +#endif /* SO_RCVTIMEO */ +" -bc bcc,bcc.. - blind carbon copy address/es", +" +bc - do not ask for Blind carbon copy", +" +D - do not add Date header", +" -f address* - email address of the sender", +" -sub subject - subject", +" -list_address file - a file containing a list of email addresses", +" -log file - write log messages to this file", +" -cs character set - for text/plain attachments (default is us-ascii)", +" -separator character - separator used with -attach. Default is comma (,)", +" If used must be specified before -attach", +" -enc-type type - encoding type. base64, 8bit, 7bit etc.", +" Default is base64. Special type is \"none\"", +" -aname name - name of the attachment. Default is filename", +" -content-id id - content-id in the attachment", +" -mime-type type - MIME type", +" -dispostion val - \"attachment\" or \"inline\". Default is \"attachment\"", +" -attach file,mime_type,[i/a] (i=inline,a=attachment)", +" - attach this file as attachment or inline", +" -show-attach - show attachment in verbose mode, default is no", +" -show-mime-types - show the compiled in MIME types", +" -M \"one line msg\" - attach this one line text message", +" -content-type type - Content type. Default: multipart/mixed", +" -msg-body path - Path of the file to include as body of mail", +" -embed-image image - Path of image to embed in HTML", +" -H \"header\" - Add custom Header", +" -name \"Full Name\" - add name in the From header", +" -v - verbose mode", +" -V - show version info", +" -w - wait for a CR after sending the mail", +" -rt email_address - add Reply-To header", +" -rrr email_address - request read receipts to this address", +" -rp - return-path address", +" -ssl - SMTP over SSL", +" -starttls - use STARTTLS if the server supports it", +" -auth - try CRAM-MD5,LOGIN,PLAIN in that order", +" -auth-cram-md5 - use AUTH CRAM-MD5 authentication", +" -auth-plain - use AUTH PLAIN authentication", +" -auth-login - use AUTH LOGIN authentication", +" -user username - username for ESMTP authentication", +" -pass password - password for ESMTP authentication", +" -example - show examples", +" -ehlo - force EHLO", +" -info - show SMTP server information", +" -help - shows this help", +" -q - quiet", (char *) NULL }; (void) printf("\n"); - (void) printf("Version: %.1024s\n\n",MAILSEND_VERSION); - (void) printf("Copyright: %.1024s\n\n",NO_SPAM_STATEMENT); + (void) printf(" Version: %.1024s\n\n",MAILSEND_VERSION); + (void) printf(" Copyright: %.1024s\n\n",NO_SPAM_STATEMENT); #ifdef HAVE_OPENSSL - (void) fprintf(stdout,"(Compiled with %s)\n", + (void) fprintf(stdout," (Compiled with OpenSSL version: %s)\n", SSLeay_version(SSLEAY_VERSION)); #else - (void) fprintf(stdout,"(Not compiled with OpenSSL)\n"); + (void) fprintf(stdout," (Not compiled with OpenSSL)\n"); #endif /* HAVE_OPENSSL */ - (void) printf("usage: mailsend [options]\n"); - (void) printf("Where the options are:\n"); + (void) printf(" usage: mailsend [options]\n"); + (void) printf(" Where the options are:\n"); for (p=options; *p != NULL; p++) (void) printf("%s\n",*p); - (void) fprintf(stdout,"\nThe options with * must the specified\n"); - - exit(0); + (void) fprintf(stdout,"\n The options with * must be specified\n"); + (void) fprintf(stdout, +" Environment variables:\n" +" SMTP_USER_PASS for plain text password (-pass)\n"); } -static void show_examples(void) +#if 0 +static void show_examplesX(void) { - (void) fprintf(stdout,"Example (Note: type without newline):\n"); -(void) fprintf(stderr, -"Show server info:\n" -" mailsend -info -smtp smtp.gmail.com\n\n"); + (void) fprintf(stdout," Example (Note: type without newline):\n"); +(void) fprintf(stdout, +" Show server info\n" +" ================\n" +" mailsend -v -info -port 587 -smtp smtp.gmail.com\n" +" mailsend -v -info -ssl -port 465 -smtp smtp.gmail.com\n" +" mailsend -v -info -smtp smtp.example.com -ct 2\n\n"); +(void) fprintf(stdout, +" STARTTLS + AUTHENTICATION\n" +" =========================\n"); +(void) fprintf(stdout, +" mailsend -to user@gmail.com -from user@gmail.com\n" +" -starttls -port 587 -auth\n" +" -smtp smtp.gmail.com\n" +" -sub test +cc +bc -v\n" +" -user you -pass \"your_password\"\n"); +(void) fprintf(stdout, +" Note: Password can be set by env var SMTP_USER_PASS instead of -pass\n\n"); + +(void) fprintf(stdout, +" SSL + AUTHENTICATION\n" +" ====================\n"); +(void) fprintf(stdout, +" mailsend -to user@gmail.com -from user@gmail.com\n" +" -ssl -port 465 -auth\n" +" -smtp smtp.gmail.com\n" +" -sub test +cc +bc -v\n" +" -user you -pass \"your_password\"\n\n"); +(void) fprintf(stdout, +" As -auth is specified, CRAM-MD5, LOGIN, PLAIN will be tried in that order.\n" +" Use -auth-cram-md5, -auth-plan, -auth-login for specific auth mechanism.\n\n" +" Note: Password can be set by env var SMTP_USER_PASS instead of -pass\n\n"); + +(void) fprintf(stdout, +" Attachments\n" +" ===========\n"); +(void) fprintf(stdout, +" mailsend -f user@example.com -smtp 10.100.30.1\n" +" -t user@example.com -sub test -attach \"file.txt,text/plain\"\n" +" -attach \"/usr/file.gif,image/gif\" -attach \"file.jpeg,image/jpg\"\n\n"); + +(void) fprintf(stdout, +" The name of the attachment will be file.gif and file.jpeg.\n" +" If you want the name to be different, add the fourth argument with -attach.\n" +" Note: you MUST have to give the attachment type in this case\n\n"); + +(void) fprintf(stdout, +" mailsend -f user@example.com -smtp 10.100.30.1\n" +" -t user@example.com -sub test -attach \"file.txt,text/plain\"\n" +" -attach \"/usr/file.gif,image/gif,a,bar.gif\" -attach \"file.jpeg,image/jpg\"\n\n"); + + +(void) fprintf(stdout, +" mailsend -f user@example.com -smtp 192.168.0.2\n" +" -t user@example.com -sub test +cc +bc\n" +" -attach \"c:\\file.gif,image/gif\" -M \"Sending a GIF file\"\n\n"); + +(void) fprintf(stdout, +" mailsend -f user@example.com -smtp 192.168.0.2\n" +" -t user@example.com -sub test +cc +bc -cs \"ISO-8859-1\"\n" +" -attach \"file2.txt,text/plain\"\n\n"); + +(void) fprintf(stdout, +" Inline Attachment\n" +" =================\n"); (void) fprintf(stdout, -" mailsend -f muquit@example.com -d example.com -smtp 10.100.30.1\n" -" -t muquit@muquit.com -sub test -a \"file.txt,text/plain\"\n" -" -a \"/usr/file.gif,image/gif\" -a \"file.jpeg,image/jpg\"\n\n"); - -(void) fprintf(stdout, -" mailsend -f muquit@example.com -d example.com -smtp 192.168.0.2\n" -" -t muquit@muquit.com -sub test +cc +bc\n" -" -a \"c:\\file.gif,image/gif\" -M \"Sending a GIF file\"\n\n"); - -(void) fprintf(stdout, -" mailsend -f muquit@example.com -d example.com -smtp 192.168.0.2\n" -" -t muquit@muquit.com -sub test +cc +bc -cs \"ISO-8859-1\"\n" -" -a \"file2.txt,text/plain\"\n\n"); - - (void) fprintf(stdout,"Change content disposition to inline:\n"); - (void) fprintf(stdout, -" mailsend -f muquit@example.com -d example.com -smtp 10.100.30.1\n" -" -t muquit@muquit.com -sub test -a \"nf.jpg,image/jpeg,i\"\n" -" -M \"content disposition is inline\"\n\n"); - - (void) fprintf(stdout,"STARTTLS+AUTH PLAIN:\n"); -(void) fprintf(stdout, -" mailsend -f muquit@example.com -d example.com -smtp smtp.gmail.com\n" -" -sub test -from muquit@muquit.com +cc +bc -v -starttls -auth-plain\n" -" -user you -pass 'secert'\n\n"); - -(void) fprintf(stdout,"STARTTLS+AUTH CRAM-MD5:\n"); -(void) fprintf(stdout, -" mailsend -f muquit@example.com -d example.com -smtp 1.2.3.4\n" -" -sub test -from muquit@muquit.com +cc +bc -v -starttls -auth-cram-md5\n" -" -user you -pass 'secert'\n\n"); - -(void) fprintf(stdout,"STARTTLS+AUTH LOGIN:\n"); -(void) fprintf(stdout, -" mailsend -f muquit@example.com -d example.com -smtp 1.2.3.4\n" -" -sub test -from muquit@muquit.com +cc +bc -v -starttls -auth-login\n" -" -user you -pass 'secert'\n"); -(void) fprintf(stdout, -"(Password can be set by env var SMTP_USER_PASS instead of -pass)\n\n"); -(void) fprintf(stdout, -"Note: I suggest you always use STARTTLS if your server supports it\n"); - +" mailsend -f user@example.com -d example.com -smtp 10.100.30.1\n" +" -t user@example.com -sub test -attach \"nf.jpg,image/jpeg,i\"\n" +" -M \"body line1: content disposition is inline\"\n" +" -M \"body line2: this is line2 of the body\"\n\n"); } +#endif /* if 0 */ int main(int argc,char **argv) { char *x, + *y, buf[BUFSIZ], + encrypted_pass[128], /* 80 bytes actually */ *cipher=NULL, *option; @@ -150,9 +200,9 @@ int main(int argc,char **argv) is_mime=0, add_dateh=1, port=(-1), - rc, - no_cc=0, - no_bcc=0, + rc = (-1), + no_cc=1, + no_bcc=1, i; char @@ -160,8 +210,9 @@ int main(int argc,char **argv) *helo_domain=NULL, *smtp_server=NULL, *attach_file=NULL, - *msg_body_file=NULL, + *msg_body_file=NULL, /* back in 1.17b15 */ *the_msg=NULL, + *custom_header=NULL, *to=NULL, *save_to=NULL, *save_cc=NULL, @@ -171,9 +222,12 @@ int main(int argc,char **argv) *cc=NULL, *bcc=NULL, *rt=NULL, - *rrr=NULL; + *rrr=NULL, + *return_path_addr=NULL; g_verbose=0; + g_connect_timeout = DEFAULT_CONNECT_TIMEOUT; /* 5 secs */ + g_read_timeout = DEFAULT_READ_TIMEOUT; /* 5 secs */ g_quiet=0; g_wait_for_cr=0; g_do_auth=0; @@ -181,22 +235,46 @@ int main(int argc,char **argv) g_auth_plain=0; g_auth_cram_md5=0; g_auth_login=0; + g_do_ssl=0; g_do_starttls=0; + g_log_fp = NULL; + g_show_attachment_in_log = 0; + g_use_protocol = MSOCK_USE_AUTO; /* detect IPv4 or IPv6 */ + g_force = MUTILS_FALSE; + + memset(g_log_file,0,sizeof(g_log_file)); memset(g_username,0,sizeof(g_username)); memset(g_userpass,0,sizeof(g_userpass)); + memset(encrypted_pass, 0, sizeof(encrypted_pass)); memset(g_from_name,0,sizeof(g_from_name)); + memset(g_content_type,0,sizeof(g_content_type)); + memset(g_attach_sep, 0, sizeof(g_attach_sep)); + memset(g_attach_name, 0, sizeof(g_attach_name)); + memset(g_content_transfer_encoding, 0, sizeof(g_content_transfer_encoding)); + memset(g_mime_type, 0, sizeof(g_mime_type)); + memset(g_content_id, 0, sizeof(g_content_id)); + + /* (void) strcpy(g_content_transfer_encoding,"base64"); */ /* no default */ + (void) strcpy(g_content_disposition,"attachment"); + (void) strcpy(g_attach_sep,","); + (void) strcpy(g_charset,DEFAULT_CHARSET); + /* + No default for mime_type, we will detect from file extensinon + if no mime type is specified with -mime-type + */ + /* + (void) strcpy(g_mime_type,"text/plain"); + */ - (void) strcpy(g_charset,"us-ascii"); for (i=1; i < argc; i++) { option=argv[i]; switch (*(option+1)) { - case 'a': { - if (strncmp("attach",option+1,2) == 0) + if (strncmp("attach",option+1,6) == 0) { if (*option == '-') { @@ -204,12 +282,27 @@ int main(int argc,char **argv) if (i == argc) { errorMsg("Missing file to attach"); - return (1); + rc = 1; + goto ExitProcessing; } attach_file=argv[i]; add_attachment_to_list(attach_file); } } + else if (strncmp("aname",option+1,5) == 0) + { + if (*option == '-') + { + i++; + if (i == argc) + { + errorMsg("Missing attachment name"); + rc = 1; + goto ExitProcessing; + } + mutilsSafeStrcpy(g_attach_name,argv[i],sizeof(g_attach_name)-1); + } + } else if (strncmp("auth-plain",option+1, strlen("auth-plain"))==0) { @@ -239,17 +332,18 @@ int main(int argc,char **argv) { if (*option == '-') { + g_auth_plain=1; g_auth_login=1; g_auth_cram_md5=1; g_auth_login=1; g_do_auth=1; } } - else { errorMsg("Unknown flag: %s\n",option); - return(1); + rc = 1; + goto ExitProcessing; } break; } @@ -264,7 +358,8 @@ int main(int argc,char **argv) if (i == argc) { errorMsg("Missing BCc address/es"); - return (1); + rc = 1; + goto ExitProcessing; } bcc=argv[i]; save_bcc=mutilsStrdup(bcc); @@ -281,11 +376,38 @@ int main(int argc,char **argv) else { errorMsg("Unknown flag: %s\n",option); - return(1); + rc = 1; + goto ExitProcessing; } break; } + case '4': + { + if (strncmp("4", option + 1,1) == 0) + { + if (*option == '-') + { + g_use_protocol = MSOCK_USE_IPV4; + } + } + break; + } + + case '6': + { + if (strncmp("6", option + 1,1) == 0) + { + if (*option == '-') + { + g_use_protocol = MSOCK_USE_IPV6; + } + } + + break; + } + + case 'c': { @@ -297,7 +419,8 @@ int main(int argc,char **argv) if (i == argc) { errorMsg("Missing Cc address/es"); - return (1); + rc = 1; + goto ExitProcessing; } cc=argv[i]; save_cc=mutilsStrdup(cc); @@ -319,16 +442,92 @@ int main(int argc,char **argv) if (i == argc) { errorMsg("Missing character set"); - return (1); + rc = 1; + goto ExitProcessing; } mutilsSafeStrcpy(g_charset,argv[i],sizeof(g_charset)-1); } } + else if (strncmp("ct", option + 1, 2) == 0) + { + if (*option == '-') + { + i++; + if (i == argc) + { + errorMsg("Missing connect timeout with -ct"); + rc = 1; + goto ExitProcessing; + } + g_connect_timeout = atoi(argv[i]); + } + } + else if (strncmp("content-type", option+1, 12)==0) + { + if (*option == '-') + { + i++; + if (i == argc) + { + errorMsg("Missing content-type value"); + rc = 1; + goto ExitProcessing; + } + mutilsSafeStrcpy(g_content_type,argv[i],sizeof(g_content_type)-1); + } + } + else if (strncmp("content-disposition", option + 1, 12) == 0) + { + if (*option == '-') + { + i++; + if (i == argc) + { + errorMsg("Missing content-dispostion value"); + rc = 1; + goto ExitProcessing; + } + if ((strcmp(argv[i],"inline") == 0) || strcmp(argv[i], "attachment") == 0) + { + mutilsSafeStrcpy(g_content_disposition,argv[i], + sizeof(g_content_disposition)-1); + } + else + { + errorMsg("Invalid value for -content-disposition"); + rc = 1; + goto ExitProcessing; + } + } + } + else if (strncmp("content-id", option + 1, 10) == 0) + { + if (*option == '-') + { + i++; + if (i == argc) + { + errorMsg("Missing content-id value"); + rc = 1; + goto ExitProcessing; + } + + mutilsSafeStrcpy(g_content_id,argv[i],sizeof(g_content_id)-1); + } + + } + else if (strncmp("copyright", option + 1, 5) == 0) + { + print_copyright(); + rc = 0; + goto ExitProcessing; + } else { errorMsg("Unknown flag: %s\n",option); - return(1); + rc = 1; + goto ExitProcessing; } break; } @@ -348,7 +547,7 @@ int main(int argc,char **argv) case 'd': { - if (strncmp("domain",option+1,1) == 0) + if (strncmp("domain",option+1,6) == 0) { if (*option == '-') { @@ -356,28 +555,89 @@ int main(int argc,char **argv) if (i == argc) { errorMsg("Missing domain name"); - return (1); + rc = 1; + goto ExitProcessing; } helo_domain=argv[i]; } } + else if (strncmp("disposition", option + 1, 6) == 0) + { + if (*option == '-') + { + i++; + if (i == argc) + { + errorMsg("Missing content dispostion value"); + rc = 1; + goto ExitProcessing; + } + if ((strcmp(argv[i],"inline") == 0) || strcmp(argv[i], "attachment") == 0) + { + mutilsSafeStrcpy(g_content_disposition,argv[i],sizeof(g_content_disposition)-1); + } + else + { + errorMsg("Invalid value for -disposition"); + rc = 1; + goto ExitProcessing; + } + } + } + break; } case 'e': { - if (*option == '-') + if (strncmp("example",option+1,2) == 0) { - if (strncmp("example",option+1,3) == 0) + if (*option == '-') { show_examples(); - return(1); + rc = 1; + goto ExitProcessing; } - if (strncmp("ehlo",option+1,4) == 0) + } + else if (strncmp("ehlo",option+1,4) == 0) + { + if (*option == '-') { g_esmtp=1; } } + else if (strncmp("enc-type",option+1,5) == 0) + { + if (*option == '-') + { + i++; + if (i == argc) + { + errorMsg("Missing encoding type"); + rc = 1; + goto ExitProcessing; + } + mutilsSafeStrcpy(g_content_transfer_encoding, + argv[i], + sizeof(g_content_transfer_encoding)-1); + } + } + else if (strncmp("embed-image", option + 1, 7) == 0) + { + if (*option == '-') + { + i++; + if (i == argc) + { + errorMsg("Missing image for -embded-image"); + rc = 1; + goto ExitProcessing; + } + add_embed_image_to_attachment_list(argv[i]); + /* TODO */ + } + + } break; } @@ -391,7 +651,8 @@ int main(int argc,char **argv) if (i == argc) { errorMsg("Missing From address/es"); - return (1); + rc = 1; + goto ExitProcessing; } from=argv[i]; } @@ -399,11 +660,25 @@ int main(int argc,char **argv) break; } + case 'x': + { + if (strncmp("xforce",option+1,1) == 0) + { + if (*option == '-') + { + g_force = MUTILS_TRUE; + } + } + break; + } + case 'h': { if (strncmp("help",option+1,1) == 0) { usage(); + rc = 0; + goto ExitProcessing; } /* won't be here */ break; @@ -420,23 +695,51 @@ int main(int argc,char **argv) case 'l': { - if (strncmp("list_address",option+1,1) == 0) + if (strncmp("list_address",option+1,3) == 0) { if (*option == '-') { i++; if (i == argc) { - errorMsg("Missing address list file"); - return (1); + errorMsg("Missing address list file"); + rc = 1; + goto ExitProcessing; } address_file=argv[i]; } } + + if (strncmp("log",option+1,3) == 0) + { + if (*option == '-') + { + i++; + if (i == argc) + { + errorMsg("Missing address log file"); + rc = 1; + goto ExitProcessing; + } + g_log_fp = fopen(argv[i], "a"); + if (g_log_fp == NULL) + { + errorMsg("Could not open log file %s for writing (%s)", + argv[i], + strerror(errno)); + rc = 1; + goto ExitProcessing; + } + /* + ** tell msock lib to write error message to log file + */ + msock_set_logfp(g_log_fp); + mutilsSafeStrcpy(g_log_file,argv[i],sizeof(g_log_file)-1); + } + } break; } - case 'p': { if (strncmp("port",option+1,2) == 0) @@ -447,7 +750,8 @@ int main(int argc,char **argv) if (i == argc) { errorMsg("Missing SMTP Port with -port"); - return (1); + rc = 1; + goto ExitProcessing; } port=atoi(argv[i]); } @@ -460,7 +764,8 @@ int main(int argc,char **argv) if (i == argc) { errorMsg("Missing password with -pass"); - return (1); + rc = 1; + goto ExitProcessing; } (void) snprintf(g_userpass,sizeof(g_userpass)-1, "%s",argv[i]); @@ -470,36 +775,39 @@ int main(int argc,char **argv) else { errorMsg("Unknown flag: %s\n",option); - return(1); + rc = 1; + goto ExitProcessing; } break; } - /* -gone- - case 'm': + case 'H': { - if (strncmp("msgbody",option+1,1) == 0) + if (strncmp("Header",option+1,1) == 0) { if (*option == '-') { i++; if (i == argc) { - errorMsg("Missing message body file"); - return (1); + errorMsg("Missing custom header"); + rc = 1; + goto ExitProcessing; } - msg_body_file=argv[i]; + custom_header=argv[i]; + add_customer_header_to_list(custom_header); } } else { errorMsg("Unknown flag: %s\n",option); - return(1); + rc = 1; + goto ExitProcessing; } break; } - */ + case 'M': { @@ -511,20 +819,63 @@ int main(int argc,char **argv) if (i == argc) { errorMsg("Missing text message"); - return (1); + rc = 1; + goto ExitProcessing; } - the_msg=argv[i]; + the_msg=xStrdup(argv[i]); + add_oneline_to_attachment_list(the_msg); } } else { errorMsg("Unknown flag: %s\n",option); - return(1); + rc = 1; + goto ExitProcessing; } break; } + case 'm': + { + if (strncmp("mime-type",option+1,9) == 0) + { + if (*option == '-') + { + i++; + if (i == argc) + { + errorMsg("Missing mime type"); + rc = 1; + goto ExitProcessing; + } + mutilsSafeStrcpy(g_mime_type,argv[i],sizeof(g_mime_type)-1); + } + } + else if (strncmp("msg-body",option+1,5) == 0) + { + if (*option == '-') + { + i++; + if (i == argc) + { + errorMsg("Missing path of message body file"); + rc = 1; + goto ExitProcessing; + } + msg_body_file = argv[i]; + add_msg_body_to_attachment_list(argv[i]); + } + } + else + { + errorMsg("Unknown flag: %s\n",option); + rc = 1; + goto ExitProcessing; + } + break; + } + case 'n': { if (strncmp("name",option+1,3) == 0) @@ -535,7 +886,8 @@ int main(int argc,char **argv) if (i == argc) { errorMsg("Missing Name with -n"); - return (1); + rc = 1; + goto ExitProcessing; } (void) snprintf(g_from_name,sizeof(g_from_name)-1, "%s",argv[i]); @@ -544,7 +896,8 @@ int main(int argc,char **argv) else { errorMsg("Unknown flag: %s\n",option); - return(1); + rc = 1; + goto ExitProcessing; } break; @@ -560,7 +913,8 @@ int main(int argc,char **argv) if (i == argc) { errorMsg("Missing smtp server"); - return (1); + rc = 1; + goto ExitProcessing; } smtp_server=argv[i]; } @@ -573,25 +927,70 @@ int main(int argc,char **argv) if (i == argc) { errorMsg("Missing subject with -sub"); - return (1); + rc = 1; + goto ExitProcessing; } sub=argv[i]; } } + else if (strncmp("ssl", option + 1, 3) == 0) + { +#ifdef HAVE_OPENSSL + g_do_ssl=1; +#else + (void) fprintf(stderr,"Error: '-ssl' not available, not compiled with OpenSSL\n"); + rc = 1; + goto ExitProcessing; +#endif /* HAVE_OPENSSL */ + + } else if (strncmp("starttls",option+1,3) == 0) { #ifdef HAVE_OPENSSL g_do_starttls=1; #else - (void) fprintf(stderr,"Warning: '-starttls' not available, only avaible if compiled with OpenSSL\n"); - + (void) fprintf(stderr,"Error: '-starttls' not available, not compiled with OpenSSL\n"); + rc = 1; + goto ExitProcessing; + #endif /* HAVE_OPENSSL */ } + else if (strncmp("show-attach", option + 1, 9) == 0) + { + g_show_attachment_in_log = 1; + } + else if (strncmp("show-mime-types",option+1,9) == 0) + { + show_mime_types(); + rc = 0; + goto ExitProcessing; + } + else if (strncmp("separator", option + 1, 4) == 0) + { + if (*option == '-') + { + i++; + if (i == argc) + { + errorMsg("Missing separator"); + rc = 1; + goto ExitProcessing; + } + (void) snprintf(g_attach_sep,sizeof(g_attach_sep)-1,"%s",argv[i]); + if (strlen(g_attach_sep) != 1) + { + errorMsg("Invalid separator character specified"); + rc = 1; + goto ExitProcessing; + } + } + } else { errorMsg("Unknown flag: %s\n",option); - return(1); + rc = 1; + goto ExitProcessing; } break; @@ -607,7 +1006,8 @@ int main(int argc,char **argv) if (i == argc) { errorMsg("Missing smtp server"); - return (1); + rc = 1; + goto ExitProcessing; } (void) snprintf(g_username,sizeof(g_username)-1, "%s",argv[i]); @@ -616,7 +1016,8 @@ int main(int argc,char **argv) else { errorMsg("Unknown flag: %s\n",option); - return(1); + rc = 1; + goto ExitProcessing; } break; @@ -631,6 +1032,7 @@ int main(int argc,char **argv) if (*option == '-') { g_verbose=1; + msock_set_debug(g_verbose); } } break; @@ -647,18 +1049,19 @@ int main(int argc,char **argv) } break; } - + case 'V': { (void) fprintf(stderr,"mailsend Version: %.1024s\n",MAILSEND_VERSION); #ifdef HAVE_OPENSSL - (void) fprintf(stderr,"Compiled with %s\n", + (void) fprintf(stderr,"Compiled with OpenSSL: %s\n", SSLeay_version(SSLEAY_VERSION)); #else (void) fprintf(stderr,"Not Compiled OpenSSL, some auth methods will be unavailable\n"); #endif /* ! HAVE_OPENSSL */ - exit(0); + rc = 0; + goto ExitProcessing; break; } @@ -672,14 +1075,16 @@ int main(int argc,char **argv) if (i == argc) { (void) fprintf(stderr,"Error: missing to addresses\n"); - return (1); + rc = 1; + goto ExitProcessing; } to=argv[i]; save_to=mutilsStrdup(to); if (save_to == NULL) { errorMsg("memory allocation problem for -to"); - return(-1); + rc = 1; + goto ExitProcessing; } save_to=fix_to(save_to); to=fix_to(to); @@ -704,13 +1109,15 @@ int main(int argc,char **argv) if (i == argc) { (void) fprintf(stderr,"Error: missing to addresses for -rrr\n"); - return (1); + rc = 1; + goto ExitProcessing; } rrr=mutilsStrdup(argv[i]); if (rrr == NULL) { errorMsg("memory allocation problem for -rrr"); - return(1); + rc = 1; + goto ExitProcessing; } } } @@ -722,20 +1129,51 @@ int main(int argc,char **argv) if (i == argc) { (void) fprintf(stderr,"Error: missing to addresses for -rt\n"); - return (1); + rc = 1; + goto ExitProcessing; } rt=mutilsStrdup(argv[i]); if (rt == NULL) { errorMsg("memory allocation problem for -rt"); - return(1); + rc = 1; + goto ExitProcessing; } } } + else if (strncmp("rp",option+1,2) == 0) + { + if (*option == '-') + { + i++; + if (i == argc) + { + (void) fprintf(stderr,"Error: missing return-path address for -rp\n"); + rc = 1; + goto ExitProcessing; + } + return_path_addr=argv[i]; + } + } + else if (strncmp("read-timeout",option+1,12) == 0) + { + if (*option == '-') + { + i++; + if (i == argc) + { + (void) fprintf(stderr,"Error: missing to addresses for -read_timeout\n"); + rc = 1; + goto ExitProcessing; + } + g_read_timeout = atoi(argv[i]); + } + } else { errorMsg("Unknown flag: %s\n",option); - return(1); + rc = 1; + goto ExitProcessing; } break; @@ -758,13 +1196,39 @@ int main(int argc,char **argv) { (void) fprintf(stderr,"Error: Unrecognized option: %s\n", option); - return (1); + rc = 1; + goto ExitProcessing; } } } + x=getenv("SMTP_USER_PASS"); + y=NULL; + if (x && y) + { + (void) fprintf(stderr,"SMTP_USER_PASS and SMTP_USER_PASS_ENC can not be set. Exiting..\n"); + rc = 1; + goto ExitProcessing; + } + if (x) + { + if (*g_userpass == '\0') + { + (void) snprintf(g_userpass,sizeof(g_userpass)-1,"%s",x); + } + } + +#ifdef HAVE_OPENSSL + if (g_do_ssl && g_do_starttls) + { + (void) fprintf(stderr,"Options -ssl and -starttls are mutually exclusive\n"); + rc = 1; + goto ExitProcessing; + } +#endif /* HAVE_OPENSSL */ + initialize_openssl(cipher); if (port == -1) @@ -778,15 +1242,20 @@ int main(int argc,char **argv) { if (helo_domain == NULL) helo_domain="localhost"; - show_smtp_info(smtp_server,port,helo_domain); - return(1); + rc = show_smtp_info(smtp_server,port,helo_domain); + if (rc < 0) + rc = 1; + goto ExitProcessing; } - print_attachemtn_list(); + /* + print_attachment_list(); + print_oneline_attachment_list(); + */ /* - ** attaching a file or a one line message will make the mail a + ** attaching a file or a one line message will make the mail a ** MIME mail */ if (attach_file || the_msg || msg_body_file) @@ -822,15 +1291,6 @@ int main(int argc,char **argv) from=xStrdup(x); } - x=getenv("SMTP_USER_PASS"); - if (x) - { - if (*g_userpass == '\0') - { - (void) snprintf(g_userpass,sizeof(g_userpass)-1,"%s",x); - } - } - /* if address file specified, add the addresses to the list as well */ if (address_file != NULL) { @@ -840,10 +1300,10 @@ int main(int argc,char **argv) /* ** The To address must be speicifed, even if the file with the list of - ** addresses is specified. The specified To will be shown in the + ** addresses is specified. The specified To will be shown in the ** envelope. None of the To, Cc and Bcc from the address list file will ** be shown anywhre.. that's how I like it. I hate long To, Cc or Bcc. - ** muquit@muquit.com, Thu Mar 29 11:56:45 EST 2001 + ** muquit@muquit.com, Thu Mar 29 11:56:45 EST 2001 */ if (save_to == NULL) @@ -864,7 +1324,7 @@ int main(int argc,char **argv) /* ** if msg file specified, dont ask for unneeded things, as it could ** be used from other programs, and it will wait for input - ** muquit@muquit.com Tue Apr 10 18:02:12 EST 2001 + ** muquit@muquit.com Tue Apr 10 18:02:12 EST 2001 */ #ifdef WINNT @@ -902,28 +1362,70 @@ int main(int argc,char **argv) if (x) sub=xStrdup(x); } + + if (g_do_ssl || g_do_starttls) + { + if (*g_username == '\0') + { + memset(buf,0,sizeof(buf)); + x=askFor(buf,sizeof(buf)-1,"Auth user: ",EMPTY_NOT_OK); + if (x) + { + (void) snprintf(g_username,sizeof(g_username)-1,"%s",x); + } + } + + if (*g_userpass == '\0') + { + (void) fprintf(stderr,"\nPlease specify auth password with -pass\n"); + (void) fprintf(stderr,"Or by environment variable SMTP_USER_PASS\n"); + rc = 1; + goto ExitProcessing; + } + } } - - - /* TODO: read from default file or registry */ rc=validateMusts(from,save_to,smtp_server,helo_domain); - if (rc == -1) - return (1); /* exit */ + if (rc != 0) + { + rc = 1; + goto ExitProcessing; + } #ifdef UNIX signal(SIGPIPE,SIG_IGN); #endif /* UNIX */ +#if 0 + { + MutilsTime + mt; + char + timebuf[64]; + mutils_time_now(&mt); + mutils_time_fmt(&mt, timebuf, sizeof(timebuf)); + (void) fprintf(stderr,"timebuf: %s\n",timebuf); + return 1; + } +#endif /* 0 */ + + write_log("mailsend v%s\n",MAILSEND_VERSION); rc=send_the_mail(from,save_to,save_cc,save_bcc,sub,smtp_server,port, - helo_domain,attach_file,msg_body_file,the_msg,is_mime,rrr,rt,add_dateh); + helo_domain,attach_file,msg_body_file,the_msg,is_mime,rrr,rt,add_dateh,return_path_addr); if (rc == 0) { if (isInteractive()) { - (void) printf("Mail sent successfully\n"); - (void) fflush(stdout); + if (!g_quiet) + { + (void) printf("Mail sent successfully\n"); + (void) fflush(stdout); + } + } + if (!g_quiet) + { + write_log("Mail sent successfully\n"); } } else @@ -932,6 +1434,7 @@ int main(int argc,char **argv) { (void) printf("Could not send mail\n"); } + write_log("Could not send mail\n"); } if (isInteractive()) @@ -939,10 +1442,16 @@ int main(int argc,char **argv) if (g_wait_for_cr) { printf("\nPress Enter to Exit: "); - fgets(buf,sizeof(buf)-1,stdin); + x=fgets(buf,sizeof(buf)-1,stdin); } } + if (rc != 0) + { + rc = 1; + } +ExitProcessing: + close_log(); return (rc); } diff --git a/coregrade/src/mailsend/mime.types b/coregrade/src/mailsend/mime.types new file mode 100755 index 0000000..eede93b --- /dev/null +++ b/coregrade/src/mailsend/mime.types @@ -0,0 +1,831 @@ +############################################################################### +# +# MIME-TYPES and the extensions that represent them +# +# The format of this file is a MIME type on the left and zero or more +# filename extensions on the right. Programs using this file will map +# files ending with those extensions to the associated type. +# +# This file is part of the "mime-support" package. Please send email (not a +# bug report) to mime-support@packages.debian.org if you would like new types +# and/or extensions to be added. +# +# The reason that all types are managed by the mime-support package instead +# allowing individual packages to install types in much the same way as they +# add entries in to the mailcap file is so these types can be referenced by +# other programs (such as a web server) even if the specific support package +# for that type is not installed. +# +# Users can add their own types if they wish by creating a ".mime.types" +# file in their home directory. Definitions included there will take +# precedence over those listed here. +# +# Note: Compression schemes like "gzip", "bzip", and "compress" are not +# actually "mime-types". They are "encodings" and hence must _not_ have +# entries in this file to map their extensions. The "mime-type" of an +# encoded file refers to the type of data that has been encoded, not the +# type of encoding. +# +############################################################################### + + +application/activemessage +application/andrew-inset ez +application/annodex anx +application/applefile +application/atom+xml atom +application/atomcat+xml atomcat +application/atomicmail +application/atomserv+xml atomsrv +application/batch-SMTP +application/bbolin lin +application/beep+xml +application/cals-1840 +application/commonground +application/cu-seeme cu +application/cybercash +application/davmount+xml davmount +application/dca-rft +application/dec-dx +application/dicom dcm +application/docbook+xml +application/dsptype tsp +application/dvcs +application/ecmascript es +application/edi-consent +application/edi-x12 +application/edifact +application/eshop +application/font-tdpfr +application/futuresplash spl +application/ghostview +application/hta hta +application/http +application/hyperstudio +application/iges +application/index +application/index.cmd +application/index.obj +application/index.response +application/index.vnd +application/iotp +application/ipp +application/isup +application/java-archive jar +application/java-serialized-object ser +application/java-vm class +application/javascript js +application/json json +application/m3g m3g +application/mac-binhex40 hqx +application/mac-compactpro cpt +application/macwriteii +application/marc +application/mathematica nb nbp +application/mbox mbox +application/ms-tnef +application/msaccess mdb +application/msword doc dot +application/mxf mxf +application/news-message-id +application/news-transmission +application/ocsp-request +application/ocsp-response +application/octet-stream bin +application/oda oda +application/ogg ogx +application/onenote one onetoc2 onetmp onepkg +application/parityfec +application/pdf pdf +application/pgp-encrypted pgp +application/pgp-keys key +application/pgp-signature sig +application/pics-rules prf +application/pkcs10 +application/pkcs7-mime +application/pkcs7-signature +application/pkix-cert +application/pkix-crl +application/pkixcmp +application/postscript ps ai eps epsi epsf eps2 eps3 +application/prs.alvestrand.titrax-sheet +application/prs.cww +application/prs.nprend +application/qsig +application/rar rar +application/rdf+xml rdf +application/remote-printing +application/riscos +application/rtf rtf +application/sdp +application/set-payment +application/set-payment-initiation +application/set-registration +application/set-registration-initiation +application/sgml +application/sgml-open-catalog +application/sieve +application/sla stl +application/slate +application/smil smi smil +application/timestamp-query +application/timestamp-reply +application/vemmi +application/whoispp-query +application/whoispp-response +application/wita +application/x400-bp +application/xhtml+xml xhtml xht +application/xml xml xsl xsd +application/xml-dtd +application/xml-external-parsed-entity +application/xspf+xml xspf +application/zip zip +application/vnd.3M.Post-it-Notes +application/vnd.accpac.simply.aso +application/vnd.accpac.simply.imp +application/vnd.acucobol +application/vnd.aether.imp +application/vnd.android.package-archive apk +application/vnd.anser-web-certificate-issue-initiation +application/vnd.anser-web-funds-transfer-initiation +application/vnd.audiograph +application/vnd.bmi +application/vnd.businessobjects +application/vnd.canon-cpdl +application/vnd.canon-lips +application/vnd.cinderella cdy +application/vnd.claymore +application/vnd.commerce-battelle +application/vnd.commonspace +application/vnd.comsocaller +application/vnd.contact.cmsg +application/vnd.cosmocaller +application/vnd.ctc-posml +application/vnd.cups-postscript +application/vnd.cups-raster +application/vnd.cups-raw +application/vnd.cybank +application/vnd.dna +application/vnd.dpgraph +application/vnd.dxr +application/vnd.ecdis-update +application/vnd.ecowin.chart +application/vnd.ecowin.filerequest +application/vnd.ecowin.fileupdate +application/vnd.ecowin.series +application/vnd.ecowin.seriesrequest +application/vnd.ecowin.seriesupdate +application/vnd.enliven +application/vnd.epson.esf +application/vnd.epson.msf +application/vnd.epson.quickanime +application/vnd.epson.salt +application/vnd.epson.ssf +application/vnd.ericsson.quickcall +application/vnd.eudora.data +application/vnd.fdf +application/vnd.ffsns +application/vnd.flographit +application/vnd.framemaker +application/vnd.fsc.weblaunch +application/vnd.fujitsu.oasys +application/vnd.fujitsu.oasys2 +application/vnd.fujitsu.oasys3 +application/vnd.fujitsu.oasysgp +application/vnd.fujitsu.oasysprs +application/vnd.fujixerox.ddd +application/vnd.fujixerox.docuworks +application/vnd.fujixerox.docuworks.binder +application/vnd.fut-misnet +application/vnd.google-earth.kml+xml kml +application/vnd.google-earth.kmz kmz +application/vnd.grafeq +application/vnd.groove-account +application/vnd.groove-identity-message +application/vnd.groove-injector +application/vnd.groove-tool-message +application/vnd.groove-tool-template +application/vnd.groove-vcard +application/vnd.hhe.lesson-player +application/vnd.hp-HPGL +application/vnd.hp-PCL +application/vnd.hp-PCLXL +application/vnd.hp-hpid +application/vnd.hp-hps +application/vnd.httphone +application/vnd.hzn-3d-crossword +application/vnd.ibm.MiniPay +application/vnd.ibm.afplinedata +application/vnd.ibm.modcap +application/vnd.informix-visionary +application/vnd.intercon.formnet +application/vnd.intertrust.digibox +application/vnd.intertrust.nncp +application/vnd.intu.qbo +application/vnd.intu.qfx +application/vnd.irepository.package+xml +application/vnd.is-xpr +application/vnd.japannet-directory-service +application/vnd.japannet-jpnstore-wakeup +application/vnd.japannet-payment-wakeup +application/vnd.japannet-registration +application/vnd.japannet-registration-wakeup +application/vnd.japannet-setstore-wakeup +application/vnd.japannet-verification +application/vnd.japannet-verification-wakeup +application/vnd.koan +application/vnd.lotus-1-2-3 +application/vnd.lotus-approach +application/vnd.lotus-freelance +application/vnd.lotus-notes +application/vnd.lotus-organizer +application/vnd.lotus-screencam +application/vnd.lotus-wordpro +application/vnd.mcd +application/vnd.mediastation.cdkey +application/vnd.meridian-slingshot +application/vnd.mif +application/vnd.minisoft-hp3000-save +application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf +application/vnd.mobius.dis +application/vnd.mobius.msl +application/vnd.mobius.plc +application/vnd.mobius.txf +application/vnd.motorola.flexsuite +application/vnd.motorola.flexsuite.adsi +application/vnd.motorola.flexsuite.fis +application/vnd.motorola.flexsuite.gotap +application/vnd.motorola.flexsuite.kmr +application/vnd.motorola.flexsuite.ttc +application/vnd.motorola.flexsuite.wem +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry +application/vnd.ms-asf +application/vnd.ms-excel xls xlb xlt +application/vnd.ms-excel.addin.macroEnabled.12 xlam +application/vnd.ms-excel.sheet.binary.macroEnabled.12 xlsb +application/vnd.ms-excel.sheet.macroEnabled.12 xlsm +application/vnd.ms-excel.template.macroEnabled.12 xltm +application/vnd.ms-fontobject eot +application/vnd.ms-lrm +application/vnd.ms-officetheme thmx +application/vnd.ms-pki.seccat cat +#application/vnd.ms-pki.stl stl +application/vnd.ms-powerpoint ppt pps +application/vnd.ms-powerpoint.addin.macroEnabled.12 ppam +application/vnd.ms-powerpoint.presentation.macroEnabled.12 pptm +application/vnd.ms-powerpoint.slide.macroEnabled.12 sldm +application/vnd.ms-powerpoint.slideshow.macroEnabled.12 ppsm +application/vnd.ms-powerpoint.template.macroEnabled.12 potm +application/vnd.ms-project +application/vnd.ms-tnef +application/vnd.ms-word.document.macroEnabled.12 docm +application/vnd.ms-word.template.macroEnabled.12 dotm +application/vnd.ms-works +application/vnd.mseq +application/vnd.msign +application/vnd.music-niff +application/vnd.musician +application/vnd.netfpx +application/vnd.noblenet-directory +application/vnd.noblenet-sealer +application/vnd.noblenet-web +application/vnd.novadigm.EDM +application/vnd.novadigm.EDX +application/vnd.novadigm.EXT +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +application/vnd.openxmlformats-officedocument.presentationml.presentation pptx +application/vnd.openxmlformats-officedocument.presentationml.slide sldx +application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx +application/vnd.openxmlformats-officedocument.presentationml.template potx +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +application/vnd.openxmlformats-officedocument.wordprocessingml.document docx +application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx +application/vnd.osa.netdeploy +application/vnd.palm +application/vnd.pg.format +application/vnd.pg.osasli +application/vnd.powerbuilder6 +application/vnd.powerbuilder6-s +application/vnd.powerbuilder7 +application/vnd.powerbuilder7-s +application/vnd.powerbuilder75 +application/vnd.powerbuilder75-s +application/vnd.previewsystems.box +application/vnd.publishare-delta-tree +application/vnd.pvi.ptid1 +application/vnd.pwg-xhtml-print+xml +application/vnd.rapid +application/vnd.rim.cod cod +application/vnd.s3sms +application/vnd.seemail +application/vnd.shana.informed.formdata +application/vnd.shana.informed.formtemplate +application/vnd.shana.informed.interchange +application/vnd.shana.informed.package +application/vnd.smaf mmf +application/vnd.sss-cod +application/vnd.sss-dtf +application/vnd.sss-ntf +application/vnd.stardivision.calc sdc +application/vnd.stardivision.chart sds +application/vnd.stardivision.draw sda +application/vnd.stardivision.impress sdd +application/vnd.stardivision.math sdf +application/vnd.stardivision.writer sdw +application/vnd.stardivision.writer-global sgl +application/vnd.street-stream +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +application/vnd.svd +application/vnd.swiftview-ics +application/vnd.symbian.install sis +application/vnd.tcpdump.pcap cap pcap +application/vnd.triscape.mxs +application/vnd.trueapp +application/vnd.truedoc +application/vnd.tve-trigger +application/vnd.ufdl +application/vnd.uplanet.alert +application/vnd.uplanet.alert-wbxml +application/vnd.uplanet.bearer-choice +application/vnd.uplanet.bearer-choice-wbxml +application/vnd.uplanet.cacheop +application/vnd.uplanet.cacheop-wbxml +application/vnd.uplanet.channel +application/vnd.uplanet.channel-wbxml +application/vnd.uplanet.list +application/vnd.uplanet.list-wbxml +application/vnd.uplanet.listcmd +application/vnd.uplanet.listcmd-wbxml +application/vnd.uplanet.signal +application/vnd.vcx +application/vnd.vectorworks +application/vnd.vidsoft.vidconference +application/vnd.visio vsd +application/vnd.vividence.scriptfile +application/vnd.wap.sic +application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo +application/vnd.wordperfect wpd +application/vnd.wordperfect5.1 wp5 +application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf +application/vnd.xara +application/vnd.xfdl +application/vnd.yellowriver-custom-menu +application/x-123 wk +application/x-7z-compressed 7z +application/x-abiword abw +application/x-apple-diskimage dmg +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-cab cab +application/x-cbr cbr +application/x-cbz cbz +application/x-cdf cdf cda +application/x-cdlink vcd +application/x-chess-pgn pgn +application/x-comsol mph +application/x-core +application/x-cpio cpio +application/x-csh csh +application/x-debian-package deb udeb +application/x-director dcr dir dxr +application/x-dms dms +application/x-doom wad +application/x-dvi dvi +application/x-executable +application/x-font pfa pfb gsf pcf pcf.Z +application/x-font-woff woff +application/x-freemind mm +application/x-futuresplash spl +application/x-ganttproject gan +application/x-gnumeric gnumeric +application/x-go-sgf sgf +application/x-graphing-calculator gcf +application/x-gtar gtar +application/x-gtar-compressed tgz taz +application/x-hdf hdf +#application/x-httpd-eruby rhtml +#application/x-httpd-php phtml pht php +#application/x-httpd-php-source phps +#application/x-httpd-php3 php3 +#application/x-httpd-php3-preprocessed php3p +#application/x-httpd-php4 php4 +#application/x-httpd-php5 php5 +application/x-hwp hwp +application/x-ica ica +application/x-info info +application/x-internet-signup ins isp +application/x-iphone iii +application/x-iso9660-image iso +application/x-jam jam +application/x-java-applet +application/x-java-bean +application/x-java-jnlp-file jnlp +application/x-jmol jmz +application/x-kchart chrt +application/x-kdelnk +application/x-killustrator kil +application/x-koan skp skd skt skm +application/x-kpresenter kpr kpt +application/x-kspread ksp +application/x-kword kwd kwt +application/x-latex latex +application/x-lha lha +application/x-lyx lyx +application/x-lzh lzh +application/x-lzx lzx +application/x-maker frm maker frame fm fb book fbdoc +application/x-md5 md5 +application/x-mif mif +application/x-mpegURL m3u8 +application/x-ms-wmd wmd +application/x-ms-wmz wmz +application/x-msdos-program com exe bat dll +application/x-msi msi +application/x-netcdf nc +application/x-ns-proxy-autoconfig pac dat +application/x-nwc nwc +application/x-object o +application/x-oz-application oza +application/x-pkcs7-certreqresp p7r +application/x-pkcs7-crl crl +application/x-python-code pyc pyo +application/x-qgis qgs shp shx +application/x-quicktimeplayer qtl +application/x-rdp rdp +application/x-redhat-package-manager rpm +application/x-rss+xml rss +application/x-ruby rb +application/x-rx +application/x-scilab sci sce +application/x-scilab-xcos xcos +application/x-sh sh +application/x-sha1 sha1 +application/x-shar shar +application/x-shellscript +application/x-shockwave-flash swf swfl +application/x-silverlight scr +application/x-sql sql +application/x-stuffit sit sitx +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-tar tar +application/x-tcl tcl +application/x-tex-gf gf +application/x-tex-pk pk +application/x-texinfo texinfo texi +application/x-trash ~ % bak old sik +application/x-troff t tr roff +application/x-troff-man man +application/x-troff-me me +application/x-troff-ms ms +application/x-ustar ustar +application/x-videolan +application/x-wais-source src +application/x-wingz wz +application/x-x509-ca-cert crt +application/x-xcf xcf +application/x-xfig fig +application/x-xpinstall xpi + +audio/32kadpcm +audio/3gpp +audio/amr amr +audio/amr-wb awb +audio/amr amr +audio/amr-wb awb +audio/annodex axa +audio/basic au snd +audio/csound csd orc sco +audio/flac flac +audio/g.722.1 +audio/l16 +audio/midi mid midi kar +audio/mp4a-latm +audio/mpa-robust +audio/mpeg mpga mpega mp2 mp3 m4a +audio/mpegurl m3u +audio/ogg oga ogg spx +audio/parityfec +audio/prs.sid sid +audio/telephone-event +audio/tone +audio/vnd.cisco.nse +audio/vnd.cns.anp1 +audio/vnd.cns.inf1 +audio/vnd.digital-winds +audio/vnd.everad.plj +audio/vnd.lucent.voice +audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 +audio/vnd.nuera.ecelp7470 +audio/vnd.nuera.ecelp9600 +audio/vnd.octel.sbc +audio/vnd.qcelp +audio/vnd.rhetorex.32kadpcm +audio/vnd.vmx.cvsd +audio/x-aiff aif aiff aifc +audio/x-gsm gsm +audio/x-mpegurl m3u +audio/x-ms-wma wma +audio/x-ms-wax wax +audio/x-pn-realaudio-plugin +audio/x-pn-realaudio ra rm ram +audio/x-realaudio ra +audio/x-scpls pls +audio/x-sd2 sd2 +audio/x-wav wav + +chemical/x-alchemy alc +chemical/x-cache cac cache +chemical/x-cache-csf csf +chemical/x-cactvs-binary cbin cascii ctab +chemical/x-cdx cdx +chemical/x-cerius cer +chemical/x-chem3d c3d +chemical/x-chemdraw chm +chemical/x-cif cif +chemical/x-cmdf cmdf +chemical/x-cml cml +chemical/x-compass cpa +chemical/x-crossfire bsd +chemical/x-csml csml csm +chemical/x-ctx ctx +chemical/x-cxf cxf cef +#chemical/x-daylight-smiles smi +chemical/x-embl-dl-nucleotide emb embl +chemical/x-galactic-spc spc +chemical/x-gamess-input inp gam gamin +chemical/x-gaussian-checkpoint fch fchk +chemical/x-gaussian-cube cub +chemical/x-gaussian-input gau gjc gjf +chemical/x-gaussian-log gal +chemical/x-gcg8-sequence gcg +chemical/x-genbank gen +chemical/x-hin hin +chemical/x-isostar istr ist +chemical/x-jcamp-dx jdx dx +chemical/x-kinemage kin +chemical/x-macmolecule mcm +chemical/x-macromodel-input mmd mmod +chemical/x-mdl-molfile mol +chemical/x-mdl-rdfile rd +chemical/x-mdl-rxnfile rxn +chemical/x-mdl-sdfile sd sdf +chemical/x-mdl-tgf tgf +#chemical/x-mif mif +chemical/x-mmcif mcif +chemical/x-mol2 mol2 +chemical/x-molconn-Z b +chemical/x-mopac-graph gpt +chemical/x-mopac-input mop mopcrt mpc zmt +chemical/x-mopac-out moo +chemical/x-mopac-vib mvb +chemical/x-ncbi-asn1 asn +chemical/x-ncbi-asn1-ascii prt ent +chemical/x-ncbi-asn1-binary val aso +chemical/x-ncbi-asn1-spec asn +chemical/x-pdb pdb ent +chemical/x-rosdal ros +chemical/x-swissprot sw +chemical/x-vamas-iso14976 vms +chemical/x-vmd vmd +chemical/x-xtel xtel +chemical/x-xyz xyz + +image/cgm +image/g3fax +image/gif gif +image/ief ief +image/jpeg jpeg jpg jpe +image/naplps +image/pcx pcx +image/png png +image/prs.btif +image/prs.pti +image/svg+xml svg svgz +image/tiff tiff tif +image/vnd.cns.inf2 +image/vnd.djvu djvu djv +image/vnd.dwg +image/vnd.dxf +image/vnd.fastbidsheet +image/vnd.fpx +image/vnd.fst +image/vnd.fujixerox.edmics-mmr +image/vnd.fujixerox.edmics-rlc +image/vnd.microsoft.icon ico +image/vnd.mix +image/vnd.net-fpx +image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff +image/x-canon-cr2 cr2 +image/x-canon-crw crw +image/x-cmu-raster ras +image/x-coreldraw cdr +image/x-coreldrawpattern pat +image/x-coreldrawtemplate cdt +image/x-corelphotopaint cpt +image/x-epson-erf erf +image/x-icon +image/x-jg art +image/x-jng jng +image/x-ms-bmp bmp +image/x-nikon-nef nef +image/x-olympus-orf orf +image/x-photoshop psd +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd + +inode/chardevice +inode/blockdevice +inode/directory-locked +inode/directory +inode/fifo +inode/socket + +message/delivery-status +message/disposition-notification +message/external-body +message/http +message/s-http +message/news +message/partial +message/rfc822 eml + +model/iges igs iges +model/mesh msh mesh silo +model/vnd.dwf +model/vnd.flatland.3dml +model/vnd.gdl +model/vnd.gs-gdl +model/vnd.gtw +model/vnd.mts +model/vnd.vtu +model/vrml wrl vrml +model/x3d+vrml x3dv +model/x3d+xml x3d +model/x3d+binary x3db + +multipart/alternative +multipart/appledouble +multipart/byteranges +multipart/digest +multipart/encrypted +multipart/form-data +multipart/header-set +multipart/mixed +multipart/parallel +multipart/related +multipart/report +multipart/signed +multipart/voice-message + +text/cache-manifest appcache +text/calendar ics icz +text/css css +text/csv csv +text/directory +text/english +text/enriched +text/h323 323 +text/html html htm shtml +text/iuls uls +text/mathml mml +text/parityfec +text/plain asc txt text pot brf srt +text/prs.lines.tag +text/rfc822-headers +text/richtext rtx +text/rtf +text/scriptlet sct wsc +text/t140 +text/texmacs tm +text/tab-separated-values tsv +text/uri-list +text/vnd.abc +text/vnd.curl +text/vnd.DMClientScript +text/vnd.flatland.3dml +text/vnd.fly +text/vnd.fmi.flexstor +text/vnd.in3d.3dml +text/vnd.in3d.spot +text/vnd.IPTC.NewsML +text/vnd.IPTC.NITF +text/vnd.latex-z +text/vnd.motorola.reflex +text/vnd.ms-mediapackage +text/vnd.sun.j2me.app-descriptor jad +text/vnd.wap.si +text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-bibtex bib +text/x-boo boo +text/x-c++hdr h++ hpp hxx hh +text/x-c++src c++ cpp cxx cc +text/x-chdr h +text/x-component htc +text/x-crontab +text/x-csh csh +text/x-csrc c +text/x-dsrc d +text/x-diff diff patch +text/x-haskell hs +text/x-java java +text/x-lilypond ly +text/x-literate-haskell lhs +text/x-makefile +text/x-moc moc +text/x-pascal p pas +text/x-pcs-gcd gcd +text/x-perl pl pm +text/x-python py +text/x-scala scala +text/x-server-parsed-html +text/x-setext etx +text/x-sfv sfv +text/x-sh sh +text/x-tcl tcl tk +text/x-tex tex ltx sty cls +text/x-vcalendar vcs +text/x-vcard vcf + +video/3gpp 3gp +video/annodex axv +video/dl dl +video/dv dif dv +video/fli fli +video/gl gl +video/mpeg mpeg mpg mpe +video/MP2T ts +video/mp4 mp4 +video/quicktime qt mov +video/mp4v-es +video/ogg ogv +video/parityfec +video/pointer +video/webm webm +video/vnd.fvt +video/vnd.motorola.video +video/vnd.motorola.videop +video/vnd.mpegurl mxu +video/vnd.mts +video/vnd.nokia.interleaved-multimedia +video/vnd.vivo +video/x-flv flv +video/x-la-asf lsf lsx +video/x-mng mng +video/x-ms-asf asf asx +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie +video/x-matroska mpv mkv + +x-conference/x-cooltalk ice + +x-epoc/x-sisx-app sisx +x-world/x-vrml vrm vrml wrl diff --git a/coregrade/src/mailsend/mime_types.h b/coregrade/src/mailsend/mime_types.h new file mode 100644 index 0000000..dc8d1f8 --- /dev/null +++ b/coregrade/src/mailsend/mime_types.h @@ -0,0 +1,542 @@ +/* +** WARNING: This file is auto generated. DO NOT MODIFY +** Generated by ./mk_mime_types_h.rb from /Users/muquit/svndev/mailsend/mime.types +** 2013-12-15 18:17:07 -0500 +*/ +{ "ez","application/andrew-inset"}, +{ "anx","application/annodex"}, +{ "atom","application/atom+xml"}, +{ "atomcat","application/atomcat+xml"}, +{ "atomsrv","application/atomserv+xml"}, +{ "lin","application/bbolin"}, +{ "cu","application/cu-seeme"}, +{ "davmount","application/davmount+xml"}, +{ "dcm","application/dicom"}, +{ "tsp","application/dsptype"}, +{ "es","application/ecmascript"}, +{ "spl","application/futuresplash"}, +{ "hta","application/hta"}, +{ "jar","application/java-archive"}, +{ "ser","application/java-serialized-object"}, +{ "class","application/java-vm"}, +{ "js","application/javascript"}, +{ "json","application/json"}, +{ "m3g","application/m3g"}, +{ "hqx","application/mac-binhex40"}, +{ "cpt","application/mac-compactpro"}, +{ "nb","application/mathematica"}, +{ "nbp","application/mathematica"}, +{ "mbox","application/mbox"}, +{ "mdb","application/msaccess"}, +{ "doc","application/msword"}, +{ "dot","application/msword"}, +{ "mxf","application/mxf"}, +{ "bin","application/octet-stream"}, +{ "oda","application/oda"}, +{ "ogx","application/ogg"}, +{ "one","application/onenote"}, +{ "onetoc2","application/onenote"}, +{ "onetmp","application/onenote"}, +{ "onepkg","application/onenote"}, +{ "pdf","application/pdf"}, +{ "pgp","application/pgp-encrypted"}, +{ "key","application/pgp-keys"}, +{ "sig","application/pgp-signature"}, +{ "prf","application/pics-rules"}, +{ "ps","application/postscript"}, +{ "ai","application/postscript"}, +{ "eps","application/postscript"}, +{ "epsi","application/postscript"}, +{ "epsf","application/postscript"}, +{ "eps2","application/postscript"}, +{ "eps3","application/postscript"}, +{ "rar","application/rar"}, +{ "rdf","application/rdf+xml"}, +{ "rtf","application/rtf"}, +{ "stl","application/sla"}, +{ "smi","application/smil"}, +{ "smil","application/smil"}, +{ "xhtml","application/xhtml+xml"}, +{ "xht","application/xhtml+xml"}, +{ "xml","application/xml"}, +{ "xsl","application/xml"}, +{ "xsd","application/xml"}, +{ "xspf","application/xspf+xml"}, +{ "zip","application/zip"}, +{ "apk","application/vnd.android.package-archive"}, +{ "cdy","application/vnd.cinderella"}, +{ "kml","application/vnd.google-earth.kml+xml"}, +{ "kmz","application/vnd.google-earth.kmz"}, +{ "xul","application/vnd.mozilla.xul+xml"}, +{ "xls","application/vnd.ms-excel"}, +{ "xlb","application/vnd.ms-excel"}, +{ "xlt","application/vnd.ms-excel"}, +{ "xlam","application/vnd.ms-excel.addin.macroEnabled.12"}, +{ "xlsb","application/vnd.ms-excel.sheet.binary.macroEnabled.12"}, +{ "xlsm","application/vnd.ms-excel.sheet.macroEnabled.12"}, +{ "xltm","application/vnd.ms-excel.template.macroEnabled.12"}, +{ "eot","application/vnd.ms-fontobject"}, +{ "thmx","application/vnd.ms-officetheme"}, +{ "cat","application/vnd.ms-pki.seccat"}, +{ "ppt","application/vnd.ms-powerpoint"}, +{ "pps","application/vnd.ms-powerpoint"}, +{ "ppam","application/vnd.ms-powerpoint.addin.macroEnabled.12"}, +{ "pptm","application/vnd.ms-powerpoint.presentation.macroEnabled.12"}, +{ "sldm","application/vnd.ms-powerpoint.slide.macroEnabled.12"}, +{ "ppsm","application/vnd.ms-powerpoint.slideshow.macroEnabled.12"}, +{ "potm","application/vnd.ms-powerpoint.template.macroEnabled.12"}, +{ "docm","application/vnd.ms-word.document.macroEnabled.12"}, +{ "dotm","application/vnd.ms-word.template.macroEnabled.12"}, +{ "odc","application/vnd.oasis.opendocument.chart"}, +{ "odb","application/vnd.oasis.opendocument.database"}, +{ "odf","application/vnd.oasis.opendocument.formula"}, +{ "odg","application/vnd.oasis.opendocument.graphics"}, +{ "otg","application/vnd.oasis.opendocument.graphics-template"}, +{ "odi","application/vnd.oasis.opendocument.image"}, +{ "odp","application/vnd.oasis.opendocument.presentation"}, +{ "otp","application/vnd.oasis.opendocument.presentation-template"}, +{ "ods","application/vnd.oasis.opendocument.spreadsheet"}, +{ "ots","application/vnd.oasis.opendocument.spreadsheet-template"}, +{ "odt","application/vnd.oasis.opendocument.text"}, +{ "odm","application/vnd.oasis.opendocument.text-master"}, +{ "ott","application/vnd.oasis.opendocument.text-template"}, +{ "oth","application/vnd.oasis.opendocument.text-web"}, +{ "pptx","application/vnd.openxmlformats-officedocument.presentationml.presentation"}, +{ "sldx","application/vnd.openxmlformats-officedocument.presentationml.slide"}, +{ "ppsx","application/vnd.openxmlformats-officedocument.presentationml.slideshow"}, +{ "potx","application/vnd.openxmlformats-officedocument.presentationml.template"}, +{ "xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, +{ "xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, +{ "xltx","application/vnd.openxmlformats-officedocument.spreadsheetml.template"}, +{ "xltx","application/vnd.openxmlformats-officedocument.spreadsheetml.template"}, +{ "docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"}, +{ "dotx","application/vnd.openxmlformats-officedocument.wordprocessingml.template"}, +{ "cod","application/vnd.rim.cod"}, +{ "mmf","application/vnd.smaf"}, +{ "sdc","application/vnd.stardivision.calc"}, +{ "sds","application/vnd.stardivision.chart"}, +{ "sda","application/vnd.stardivision.draw"}, +{ "sdd","application/vnd.stardivision.impress"}, +{ "sdf","application/vnd.stardivision.math"}, +{ "sdw","application/vnd.stardivision.writer"}, +{ "sgl","application/vnd.stardivision.writer-global"}, +{ "sxc","application/vnd.sun.xml.calc"}, +{ "stc","application/vnd.sun.xml.calc.template"}, +{ "sxd","application/vnd.sun.xml.draw"}, +{ "std","application/vnd.sun.xml.draw.template"}, +{ "sxi","application/vnd.sun.xml.impress"}, +{ "sti","application/vnd.sun.xml.impress.template"}, +{ "sxm","application/vnd.sun.xml.math"}, +{ "sxw","application/vnd.sun.xml.writer"}, +{ "sxg","application/vnd.sun.xml.writer.global"}, +{ "stw","application/vnd.sun.xml.writer.template"}, +{ "sis","application/vnd.symbian.install"}, +{ "cap","application/vnd.tcpdump.pcap"}, +{ "pcap","application/vnd.tcpdump.pcap"}, +{ "vsd","application/vnd.visio"}, +{ "wbxml","application/vnd.wap.wbxml"}, +{ "wmlc","application/vnd.wap.wmlc"}, +{ "wmlsc","application/vnd.wap.wmlscriptc"}, +{ "wpd","application/vnd.wordperfect"}, +{ "wp5","application/vnd.wordperfect5.1"}, +{ "wk","application/x-123"}, +{ "7z","application/x-7z-compressed"}, +{ "abw","application/x-abiword"}, +{ "dmg","application/x-apple-diskimage"}, +{ "bcpio","application/x-bcpio"}, +{ "torrent","application/x-bittorrent"}, +{ "cab","application/x-cab"}, +{ "cbr","application/x-cbr"}, +{ "cbz","application/x-cbz"}, +{ "cdf","application/x-cdf"}, +{ "cda","application/x-cdf"}, +{ "vcd","application/x-cdlink"}, +{ "pgn","application/x-chess-pgn"}, +{ "mph","application/x-comsol"}, +{ "cpio","application/x-cpio"}, +{ "csh","application/x-csh"}, +{ "deb","application/x-debian-package"}, +{ "udeb","application/x-debian-package"}, +{ "dcr","application/x-director"}, +{ "dir","application/x-director"}, +{ "dxr","application/x-director"}, +{ "dms","application/x-dms"}, +{ "wad","application/x-doom"}, +{ "dvi","application/x-dvi"}, +{ "pfa","application/x-font"}, +{ "pfb","application/x-font"}, +{ "gsf","application/x-font"}, +{ "pcf","application/x-font"}, +{ "pcf.Z","application/x-font"}, +{ "woff","application/x-font-woff"}, +{ "mm","application/x-freemind"}, +{ "spl","application/x-futuresplash"}, +{ "gan","application/x-ganttproject"}, +{ "gnumeric","application/x-gnumeric"}, +{ "sgf","application/x-go-sgf"}, +{ "gcf","application/x-graphing-calculator"}, +{ "gtar","application/x-gtar"}, +{ "tgz","application/x-gtar-compressed"}, +{ "taz","application/x-gtar-compressed"}, +{ "hdf","application/x-hdf"}, +{ "hwp","application/x-hwp"}, +{ "ica","application/x-ica"}, +{ "info","application/x-info"}, +{ "ins","application/x-internet-signup"}, +{ "isp","application/x-internet-signup"}, +{ "iii","application/x-iphone"}, +{ "iso","application/x-iso9660-image"}, +{ "jam","application/x-jam"}, +{ "jnlp","application/x-java-jnlp-file"}, +{ "jmz","application/x-jmol"}, +{ "chrt","application/x-kchart"}, +{ "kil","application/x-killustrator"}, +{ "skp","application/x-koan"}, +{ "skd","application/x-koan"}, +{ "skt","application/x-koan"}, +{ "skm","application/x-koan"}, +{ "kpr","application/x-kpresenter"}, +{ "kpt","application/x-kpresenter"}, +{ "ksp","application/x-kspread"}, +{ "kwd","application/x-kword"}, +{ "kwt","application/x-kword"}, +{ "latex","application/x-latex"}, +{ "lha","application/x-lha"}, +{ "lyx","application/x-lyx"}, +{ "lzh","application/x-lzh"}, +{ "lzx","application/x-lzx"}, +{ "frm","application/x-maker"}, +{ "maker","application/x-maker"}, +{ "frame","application/x-maker"}, +{ "fm","application/x-maker"}, +{ "fb","application/x-maker"}, +{ "book","application/x-maker"}, +{ "fbdoc","application/x-maker"}, +{ "md5","application/x-md5"}, +{ "mif","application/x-mif"}, +{ "m3u8","application/x-mpegURL"}, +{ "wmd","application/x-ms-wmd"}, +{ "wmz","application/x-ms-wmz"}, +{ "com","application/x-msdos-program"}, +{ "exe","application/x-msdos-program"}, +{ "bat","application/x-msdos-program"}, +{ "dll","application/x-msdos-program"}, +{ "msi","application/x-msi"}, +{ "nc","application/x-netcdf"}, +{ "pac","application/x-ns-proxy-autoconfig"}, +{ "dat","application/x-ns-proxy-autoconfig"}, +{ "nwc","application/x-nwc"}, +{ "o","application/x-object"}, +{ "oza","application/x-oz-application"}, +{ "p7r","application/x-pkcs7-certreqresp"}, +{ "crl","application/x-pkcs7-crl"}, +{ "pyc","application/x-python-code"}, +{ "pyo","application/x-python-code"}, +{ "qgs","application/x-qgis"}, +{ "shp","application/x-qgis"}, +{ "shx","application/x-qgis"}, +{ "qtl","application/x-quicktimeplayer"}, +{ "rdp","application/x-rdp"}, +{ "rpm","application/x-redhat-package-manager"}, +{ "rss","application/x-rss+xml"}, +{ "rb","application/x-ruby"}, +{ "sci","application/x-scilab"}, +{ "sce","application/x-scilab"}, +{ "xcos","application/x-scilab-xcos"}, +{ "sh","application/x-sh"}, +{ "sha1","application/x-sha1"}, +{ "shar","application/x-shar"}, +{ "swf","application/x-shockwave-flash"}, +{ "swfl","application/x-shockwave-flash"}, +{ "scr","application/x-silverlight"}, +{ "sql","application/x-sql"}, +{ "sit","application/x-stuffit"}, +{ "sitx","application/x-stuffit"}, +{ "sv4cpio","application/x-sv4cpio"}, +{ "sv4crc","application/x-sv4crc"}, +{ "tar","application/x-tar"}, +{ "tcl","application/x-tcl"}, +{ "gf","application/x-tex-gf"}, +{ "pk","application/x-tex-pk"}, +{ "texinfo","application/x-texinfo"}, +{ "texi","application/x-texinfo"}, +{ "~","application/x-trash"}, +{ "%","application/x-trash"}, +{ "bak","application/x-trash"}, +{ "old","application/x-trash"}, +{ "sik","application/x-trash"}, +{ "t","application/x-troff"}, +{ "tr","application/x-troff"}, +{ "roff","application/x-troff"}, +{ "man","application/x-troff-man"}, +{ "me","application/x-troff-me"}, +{ "ms","application/x-troff-ms"}, +{ "ustar","application/x-ustar"}, +{ "src","application/x-wais-source"}, +{ "wz","application/x-wingz"}, +{ "crt","application/x-x509-ca-cert"}, +{ "xcf","application/x-xcf"}, +{ "fig","application/x-xfig"}, +{ "xpi","application/x-xpinstall"}, +{ "amr","audio/amr"}, +{ "awb","audio/amr-wb"}, +{ "amr","audio/amr"}, +{ "awb","audio/amr-wb"}, +{ "axa","audio/annodex"}, +{ "au","audio/basic"}, +{ "snd","audio/basic"}, +{ "csd","audio/csound"}, +{ "orc","audio/csound"}, +{ "sco","audio/csound"}, +{ "flac","audio/flac"}, +{ "mid","audio/midi"}, +{ "midi","audio/midi"}, +{ "kar","audio/midi"}, +{ "mpga","audio/mpeg"}, +{ "mpega","audio/mpeg"}, +{ "mp2","audio/mpeg"}, +{ "mp3","audio/mpeg"}, +{ "m4a","audio/mpeg"}, +{ "m3u","audio/mpegurl"}, +{ "oga","audio/ogg"}, +{ "ogg","audio/ogg"}, +{ "spx","audio/ogg"}, +{ "sid","audio/prs.sid"}, +{ "aif","audio/x-aiff"}, +{ "aiff","audio/x-aiff"}, +{ "aifc","audio/x-aiff"}, +{ "gsm","audio/x-gsm"}, +{ "m3u","audio/x-mpegurl"}, +{ "wma","audio/x-ms-wma"}, +{ "wax","audio/x-ms-wax"}, +{ "ra","audio/x-pn-realaudio"}, +{ "rm","audio/x-pn-realaudio"}, +{ "ram","audio/x-pn-realaudio"}, +{ "ra","audio/x-realaudio"}, +{ "pls","audio/x-scpls"}, +{ "sd2","audio/x-sd2"}, +{ "wav","audio/x-wav"}, +{ "alc","chemical/x-alchemy"}, +{ "cac","chemical/x-cache"}, +{ "cache","chemical/x-cache"}, +{ "csf","chemical/x-cache-csf"}, +{ "cbin","chemical/x-cactvs-binary"}, +{ "cascii","chemical/x-cactvs-binary"}, +{ "ctab","chemical/x-cactvs-binary"}, +{ "cdx","chemical/x-cdx"}, +{ "cer","chemical/x-cerius"}, +{ "c3d","chemical/x-chem3d"}, +{ "chm","chemical/x-chemdraw"}, +{ "cif","chemical/x-cif"}, +{ "cmdf","chemical/x-cmdf"}, +{ "cml","chemical/x-cml"}, +{ "cpa","chemical/x-compass"}, +{ "bsd","chemical/x-crossfire"}, +{ "csml","chemical/x-csml"}, +{ "csm","chemical/x-csml"}, +{ "ctx","chemical/x-ctx"}, +{ "cxf","chemical/x-cxf"}, +{ "cef","chemical/x-cxf"}, +{ "emb","chemical/x-embl-dl-nucleotide"}, +{ "embl","chemical/x-embl-dl-nucleotide"}, +{ "spc","chemical/x-galactic-spc"}, +{ "inp","chemical/x-gamess-input"}, +{ "gam","chemical/x-gamess-input"}, +{ "gamin","chemical/x-gamess-input"}, +{ "fch","chemical/x-gaussian-checkpoint"}, +{ "fchk","chemical/x-gaussian-checkpoint"}, +{ "cub","chemical/x-gaussian-cube"}, +{ "gau","chemical/x-gaussian-input"}, +{ "gjc","chemical/x-gaussian-input"}, +{ "gjf","chemical/x-gaussian-input"}, +{ "gal","chemical/x-gaussian-log"}, +{ "gcg","chemical/x-gcg8-sequence"}, +{ "gen","chemical/x-genbank"}, +{ "hin","chemical/x-hin"}, +{ "istr","chemical/x-isostar"}, +{ "ist","chemical/x-isostar"}, +{ "jdx","chemical/x-jcamp-dx"}, +{ "dx","chemical/x-jcamp-dx"}, +{ "kin","chemical/x-kinemage"}, +{ "mcm","chemical/x-macmolecule"}, +{ "mmd","chemical/x-macromodel-input"}, +{ "mmod","chemical/x-macromodel-input"}, +{ "mol","chemical/x-mdl-molfile"}, +{ "rd","chemical/x-mdl-rdfile"}, +{ "rxn","chemical/x-mdl-rxnfile"}, +{ "sd","chemical/x-mdl-sdfile"}, +{ "sdf","chemical/x-mdl-sdfile"}, +{ "tgf","chemical/x-mdl-tgf"}, +{ "mcif","chemical/x-mmcif"}, +{ "mol2","chemical/x-mol2"}, +{ "b","chemical/x-molconn-Z"}, +{ "gpt","chemical/x-mopac-graph"}, +{ "mop","chemical/x-mopac-input"}, +{ "mopcrt","chemical/x-mopac-input"}, +{ "mpc","chemical/x-mopac-input"}, +{ "zmt","chemical/x-mopac-input"}, +{ "moo","chemical/x-mopac-out"}, +{ "mvb","chemical/x-mopac-vib"}, +{ "asn","chemical/x-ncbi-asn1"}, +{ "prt","chemical/x-ncbi-asn1-ascii"}, +{ "ent","chemical/x-ncbi-asn1-ascii"}, +{ "val","chemical/x-ncbi-asn1-binary"}, +{ "aso","chemical/x-ncbi-asn1-binary"}, +{ "asn","chemical/x-ncbi-asn1-spec"}, +{ "pdb","chemical/x-pdb"}, +{ "ent","chemical/x-pdb"}, +{ "ros","chemical/x-rosdal"}, +{ "sw","chemical/x-swissprot"}, +{ "vms","chemical/x-vamas-iso14976"}, +{ "vmd","chemical/x-vmd"}, +{ "xtel","chemical/x-xtel"}, +{ "xyz","chemical/x-xyz"}, +{ "gif","image/gif"}, +{ "ief","image/ief"}, +{ "jpeg","image/jpeg"}, +{ "jpg","image/jpeg"}, +{ "jpe","image/jpeg"}, +{ "pcx","image/pcx"}, +{ "png","image/png"}, +{ "svg","image/svg+xml"}, +{ "svgz","image/svg+xml"}, +{ "tiff","image/tiff"}, +{ "tif","image/tiff"}, +{ "djvu","image/vnd.djvu"}, +{ "djv","image/vnd.djvu"}, +{ "ico","image/vnd.microsoft.icon"}, +{ "wbmp","image/vnd.wap.wbmp"}, +{ "cr2","image/x-canon-cr2"}, +{ "crw","image/x-canon-crw"}, +{ "ras","image/x-cmu-raster"}, +{ "cdr","image/x-coreldraw"}, +{ "pat","image/x-coreldrawpattern"}, +{ "cdt","image/x-coreldrawtemplate"}, +{ "cpt","image/x-corelphotopaint"}, +{ "erf","image/x-epson-erf"}, +{ "art","image/x-jg"}, +{ "jng","image/x-jng"}, +{ "bmp","image/x-ms-bmp"}, +{ "nef","image/x-nikon-nef"}, +{ "orf","image/x-olympus-orf"}, +{ "psd","image/x-photoshop"}, +{ "pnm","image/x-portable-anymap"}, +{ "pbm","image/x-portable-bitmap"}, +{ "pgm","image/x-portable-graymap"}, +{ "ppm","image/x-portable-pixmap"}, +{ "rgb","image/x-rgb"}, +{ "xbm","image/x-xbitmap"}, +{ "xpm","image/x-xpixmap"}, +{ "xwd","image/x-xwindowdump"}, +{ "eml","message/rfc822"}, +{ "igs","model/iges"}, +{ "iges","model/iges"}, +{ "msh","model/mesh"}, +{ "mesh","model/mesh"}, +{ "silo","model/mesh"}, +{ "wrl","model/vrml"}, +{ "vrml","model/vrml"}, +{ "x3dv","model/x3d+vrml"}, +{ "x3d","model/x3d+xml"}, +{ "x3db","model/x3d+binary"}, +{ "appcache","text/cache-manifest"}, +{ "ics","text/calendar"}, +{ "icz","text/calendar"}, +{ "css","text/css"}, +{ "csv","text/csv"}, +{ "323","text/h323"}, +{ "html","text/html"}, +{ "htm","text/html"}, +{ "shtml","text/html"}, +{ "uls","text/iuls"}, +{ "mml","text/mathml"}, +{ "asc","text/plain"}, +{ "txt","text/plain"}, +{ "text","text/plain"}, +{ "pot","text/plain"}, +{ "brf","text/plain"}, +{ "srt","text/plain"}, +{ "rtx","text/richtext"}, +{ "sct","text/scriptlet"}, +{ "wsc","text/scriptlet"}, +{ "tm","text/texmacs"}, +{ "tsv","text/tab-separated-values"}, +{ "jad","text/vnd.sun.j2me.app-descriptor"}, +{ "wml","text/vnd.wap.wml"}, +{ "wmls","text/vnd.wap.wmlscript"}, +{ "bib","text/x-bibtex"}, +{ "boo","text/x-boo"}, +{ "h++","text/x-c++hdr"}, +{ "hpp","text/x-c++hdr"}, +{ "hxx","text/x-c++hdr"}, +{ "hh","text/x-c++hdr"}, +{ "c++","text/x-c++src"}, +{ "cpp","text/x-c++src"}, +{ "cxx","text/x-c++src"}, +{ "cc","text/x-c++src"}, +{ "h","text/x-chdr"}, +{ "htc","text/x-component"}, +{ "csh","text/x-csh"}, +{ "c","text/x-csrc"}, +{ "d","text/x-dsrc"}, +{ "diff","text/x-diff"}, +{ "patch","text/x-diff"}, +{ "hs","text/x-haskell"}, +{ "java","text/x-java"}, +{ "ly","text/x-lilypond"}, +{ "lhs","text/x-literate-haskell"}, +{ "moc","text/x-moc"}, +{ "p","text/x-pascal"}, +{ "pas","text/x-pascal"}, +{ "gcd","text/x-pcs-gcd"}, +{ "pl","text/x-perl"}, +{ "pm","text/x-perl"}, +{ "py","text/x-python"}, +{ "scala","text/x-scala"}, +{ "etx","text/x-setext"}, +{ "sfv","text/x-sfv"}, +{ "sh","text/x-sh"}, +{ "tcl","text/x-tcl"}, +{ "tk","text/x-tcl"}, +{ "tex","text/x-tex"}, +{ "ltx","text/x-tex"}, +{ "sty","text/x-tex"}, +{ "cls","text/x-tex"}, +{ "vcs","text/x-vcalendar"}, +{ "vcf","text/x-vcard"}, +{ "3gp","video/3gpp"}, +{ "axv","video/annodex"}, +{ "dl","video/dl"}, +{ "dif","video/dv"}, +{ "dv","video/dv"}, +{ "fli","video/fli"}, +{ "gl","video/gl"}, +{ "mpeg","video/mpeg"}, +{ "mpg","video/mpeg"}, +{ "mpe","video/mpeg"}, +{ "ts","video/MP2T"}, +{ "mp4","video/mp4"}, +{ "qt","video/quicktime"}, +{ "mov","video/quicktime"}, +{ "ogv","video/ogg"}, +{ "webm","video/webm"}, +{ "mxu","video/vnd.mpegurl"}, +{ "flv","video/x-flv"}, +{ "lsf","video/x-la-asf"}, +{ "lsx","video/x-la-asf"}, +{ "mng","video/x-mng"}, +{ "asf","video/x-ms-asf"}, +{ "asx","video/x-ms-asf"}, +{ "wm","video/x-ms-wm"}, +{ "wmv","video/x-ms-wmv"}, +{ "wmx","video/x-ms-wmx"}, +{ "wvx","video/x-ms-wvx"}, +{ "avi","video/x-msvideo"}, +{ "movie","video/x-sgi-movie"}, +{ "mpv","video/x-matroska"}, +{ "mkv","video/x-matroska"}, +{ "ice","x-conference/x-cooltalk"}, +{ "sisx","x-epoc/x-sisx-app"}, +{ "vrm","x-world/x-vrml"}, +{ "vrml","x-world/x-vrml"}, +{ "wrl","x-world/x-vrml"}, diff --git a/coregrade/src/mailsend/misc/addr.txt b/coregrade/src/mailsend/misc/addr.txt new file mode 100755 index 0000000..200df2f --- /dev/null +++ b/coregrade/src/mailsend/misc/addr.txt @@ -0,0 +1,12 @@ +# File can contain address to send mail to +# A line can start with To: email_address, +# Cc: email_address, BCc: email_address or +# just addresses +# Any line starts with a # or ; is considered a comment +#muquit + +#muquit@muquit.com +To: blah@example.com +Cc: foo@bar.com +jdoe@gmail.com +mjane@yahoo.com diff --git a/coregrade/src/mailsend/misc/body.txt b/coregrade/src/mailsend/misc/body.txt new file mode 100755 index 0000000..2fd31f8 --- /dev/null +++ b/coregrade/src/mailsend/misc/body.txt @@ -0,0 +1,5 @@ +1 this is a text file for msg body +2 this is a text file for msg body +3 this is a text file for msg body +4 this is a text file for msg body +5 this is a text file for msg body diff --git a/coregrade/src/mailsend/misc/examples.txt b/coregrade/src/mailsend/misc/examples.txt new file mode 100644 index 0000000..deafe21 --- /dev/null +++ b/coregrade/src/mailsend/misc/examples.txt @@ -0,0 +1,95 @@ + Show server info + ================ + mailsend -v -info -port 587 -smtp smtp.gmail.com + mailsend -v -info -ssl -port 465 -smtp smtp.gmail.com + + STARTTLS + AUTHENTICATION + ========================= + mailsend -to user@gmail.com -from user@gmail.com + -starttls -port 587 -auth + -smtp smtp.gmail.com + -sub test +cc +bc -v + -user you -pass "your_password" + Note: Password can be set by env var SMTP_USER_PASS instead of -pass + + SSL + AUTHENTICATION + ==================== + mailsend -to user@gmail.com -from user@gmail.com + -ssl -port 465 -auth + -smtp smtp.gmail.com + -sub test +cc +bc -v + -user you -pass "your_password" + + As -auth is specified, CRAM-MD5, LOGIN, PLAIN will be tried in that order. + Use -auth-cram-md5, -auth-plan, -auth-login for specific auth mechanism. + + Note: Password can be set by env var SMTP_USER_PASS instead of -pass + + One line messages + ================= + One line messages are specified with -M. Each message can have its own + MIME type, character set and encoding type: + + mailsend -f user@example.com -smtp 10.100.30.1 + -t user@example.com -sub "testing oneline messages" + -cs "us-ascii" + -enc-type "7bit" + -M "This is a test" + + -cs "iso-8859-1" + -enc-type "8bit" + -M "Das Vetter ist schön!" + + -cs "Big5" + -enc-type "base64" + -M "中文測試" + + Attachments + =========== + Only requirement of -attach is the path of the file. All other + attributes can be specified before -attach with appropriate + flags. Note: The flags must be specified correctly for each attachment, + otherwise the one specified in previous attachment will be used. + + By default MIME type is guessed from filename extension, default + encoding type base64 is used: + mailsend -f user@example.com -smtp 10.100.30.1 + -t user@example.com -sub "this is a test" + -attach "file.pdf" -attach "file.jpg" + + But all espects of attachments can be controlled: + mailsend -f user@example.com -smtp 10.100.30.1 + -t user@example.com -sub test + -mime-type "text/plain" + -enc-type "7bit" + -charset "us-ascii" + -attach "file.txt" + + -enc-type "8bit" + -charset "iso-8859-1" + -attach "deutsch.txt" + + -mime-type "image/gif" + -enc-type "base64" + -aname "flower.gif" + -attach "/usr/file.gif" + + -mime-type "image/jpeg" + -enc-type "base64" + -attach "file.jpeg" + + By default, content disposition of all atachments are attachment, use + -disposition "inline" to give hint to the mail reader to display it as + mail body. Look at FAQ# 1 for details. + + Including a body + ================ + Only one file can be included as a body of the mail. If the + file is not us-ascii, the SMTP server has to support it. If you + include a binary file, result is undefined. + + mailsend -f user@gmail -t user@example.com -smtp smtp.gamil.com + -port 587 -starttls -auth -user user@gmail.com -pass secret + -charset "utf-8" + -mime-type "text/plain" + -msg-body "file.txt" diff --git a/coregrade/src/mailsend/misc/msg.txt b/coregrade/src/mailsend/misc/msg.txt new file mode 100755 index 0000000..c1d8493 --- /dev/null +++ b/coregrade/src/mailsend/misc/msg.txt @@ -0,0 +1,14 @@ +bfish +muquit.com +muquit@muquit.com +muquit@localhost +This is the subject +Mail body starts here. +This file can be used to feed to the mailsend program. + +The first line is the smtp server addess or IP address. +The second line is the domain used in SMTP HELO. +The third line is the From address. +The fourth line the To address/es. They can be command separated. +Right after the From, the mail body starts. + diff --git a/coregrade/src/mailsend/misc/nf.jpg b/coregrade/src/mailsend/misc/nf.jpg new file mode 100755 index 0000000000000000000000000000000000000000..1c5e18b9ab0c850ef7bd3bcac3860eabad276ebb GIT binary patch literal 2306 zcmb7;XE@u98pi)gNMi4m8j+;-p@=#0JHN0Xp4Y80Ea?hPuZ00;aW$r}Pf0bmXggabqy1_S{BME{5OAJG9| z2t5=Af}gu8>;M=Hf`I8E5HOhOPXq*paL@sqqV)1mE|jhnw?{BqA**BtKM3RD)e8xY zBQ{gE&x-;e0P;Vp|83IKom=7@02l(otsq?T9>H0tlEDw#v;}|} z0y^h}Z~!=9H9*4hbY|8r%k5ODm))QAo;h*O&HJd3w1`a-$nqto`41c*zxd9)N#WH?u%M4nFDJp3ZXFt#fY~>V ze)rz6o{3h-o0iC21P4|{C5?7J_qkRtQvX6QoKq;w4NNdUtIQ`WVkWZ!7`hGPZyrH5 z>!JQ1(>#(<2MF&B$HF!&$&1+MP&BFe)whf}{KP0XHv6KoEVqCJm#7fKPdJJdIPL69 z&sGE@H50J(b~zvs%?$-_7xL*Vzfyv`teIA9FXbXh^K@=vFf4Vr_l^uc;Vi6K(Rc)G zA*=QV>LZdoFEs1c5AlhHtYslipd$nhaV-GzUTS(Je#qW? zw6L5S>|jp=9>m5JTAWo+(s8isFY&tTOv?=6D8g(7!eRjiiY4+UZS%-o+|2UwT zQuV62!NQh6;`$AMEs$p|QIB`8-!#&e&#T#apjZ4$n%#u`S&!_xcx_BJQMwa zkYUS@FEDPG#=pIi(Nb1x3Vs+Nf8>rfIiBchW((SK$RG!8;lRm45!VP$o>snBWT_;1 zWLibf?XE+Al}RUAdz0Q@{p(hH;LbqxGy^+hpm?OP@pQeaGK4U}`LMp})9z)QUH{Ydiq%^{FGZB>e8s z@+Nc)v3`8#Vo*mV)hVlrG+#)CboYWBQL@%M4XInE2=2GJ zm6X}ICvMN}i9cCO9x?N`tf>vWL{BVtv*j!rQ!n4HD0BZ&v*y3bSGHe$s_~FwQ2T_6 zpXxGQTxy(C-YlPEBd101;FWf58W_b;ikI;Q-|6Rj-ic=(~XwI#JmsZQ?U3z0<4RU-H=^(C7yv!7>*If_T&Z}?On!v zFRx;($*S|cmu*@Du4=J>bc=VZ@7cx=YlJ!nMeaaeT^ZcdO~`mBSm%0|^U4cIOKU)@ zYel=*voR6GW}&d4M02p$$bB*7DD;v9C%AwHH2fYuC0eL7FmWj#d_Fih32h*+e9vFs zKEvfpD{0sk_4ROX`+vl=x+03C8;j<#ts$jKY1ER+WTBcl*PdVfalgZ;Yix9rqg!=F zJ8lQh?1;A;)g#0yGSi>hZ9EjF#;=hhTdZzA>p78=N7o;eDp_u~SsVMOAi55xBMXy0 myHa%K(x**k$?*9S@f literal 0 HcmV?d00001 diff --git a/coregrade/src/mailsend/misc/x.gif b/coregrade/src/mailsend/misc/x.gif new file mode 100644 index 0000000000000000000000000000000000000000..29172b0e8a3d312e416be608129c935481e53727 GIT binary patch literal 584 zcmV-O0=NA~Nk%w1VfqBZ1MmR=00960|NkNR1ONa4001n<03`xl06qW!0{)B*r>hz1 z-UHM@#4_G8a(hi8r!AI*Mdw+Xhf2bt+_cR4qB^b7e*W1tDxMNC_(L2sm0EDZLN#sF zs#Q6?YPa03_X`e-$Km*sLX3Aaer2sJlo=m(KW`8hVK$=AZ_NKz?Ec>AUki94%X>#J0C z$&0$w=a|~WhV@c<2DbcsV=P^5eT|*1y)BigYUez)tcFKT8JpGXhMX(67o|R}6$RY> z3s=fMw{H_~6vG77J%OGQ6^s*ZUJOohlmTIAu#zWEH;fERRqqE6{(CdNLHc)vMLdmw zIPxP_Bw9U?g776Gw(gg|bFprzOp?x-Jz1pks6?leo6w;|iyA$OR9dp2p}K)k=5c9F zMk@)v*R9Jb_x?Fp8 zYL`!^LbXxTH10-)00rv{>x-4(!3@nceTr{y;htd%|4a(4Bl{i z?)Wyghjrh9xH~W2yllYaxIglI&s-S!EyKc!+s%wK>Y<+@_xt}3V1U>`frK{>VdC0s Wa*4*Ea>3*h(|KA!c!(7R002AB?;1z| literal 0 HcmV?d00001 diff --git a/coregrade/src/mailsend/mkinstalldirs b/coregrade/src/mailsend/mkinstalldirs new file mode 100755 index 0000000..4992567 --- /dev/null +++ b/coregrade/src/mailsend/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs,v 1.1 2000/09/20 19:05:51 gson Exp $ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" 1>&2 + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/coregrade/src/mailsend/scripts/changelog2wiki.rb b/coregrade/src/mailsend/scripts/changelog2wiki.rb new file mode 100755 index 0000000..b27f54d --- /dev/null +++ b/coregrade/src/mailsend/scripts/changelog2wiki.rb @@ -0,0 +1,89 @@ +#!/usr/bin/env ruby + +require 'iconv' + +######################################################################## +# convert ChangeLog to google code wiki +# muquit@muquit.com Mar-17-2013 +######################################################################## +class ChangeLogToWiki + ME = $0 + ME_SHORT = File.basename(ME) + def initialize + $stdout.sync = true + @url = "https://mailsend.googlecode.com/svn/trunk/changelog2wiki.rb" + end + + def kprint(line) + Kernel.print line + end + + def escape_html(line) + line = line.gsub(//,">`") + return line + end + + def doit + file = '' + file = Dir.pwd + "/ChangeLog" if File.exists?(Dir.pwd + "/ChangeLog") + file = Dir.pwd + "/ChangeLog.txt" if File.exists?(Dir.pwd + "/ChangeLog.txt") + f = File.open(file) + list_found = false + project=File.basename(Dir.pwd) + puts < +EOD + while ((line = f.gets)) + line.chomp! if line + line.strip! if line + line = Iconv.conv('UTF-8', 'iso8859-1',line) + if line =~ /^=/ + puts line + next + end + if line =~ /^[0-9]+\..*$/ + puts "=#{line}=" + next + end + if line =~ /^-/ + line.gsub!(/^-/,"") + line = line.gsub("/\n","") + line = escape_html(line) + if list_found + kprint "\n *#{line}" + else + kprint " *#{line}" + end + list_found = true + else + if line =~ /^\([a-zA-Z]+-[0-9]+-[0-9]+\)$/ + puts "\n_#{line}_" + list_found = false + else + next if line.length == 0 + line = line.gsub("/\n","") + line = escape_html(line) + if list_found + kprint " #{line}" + else + puts " #{line}" + end + end + end + end + t = Time.new + puts <&1` + lines = l.split("\n") + lines.each do |line| + line = line.chomp + line = line.strip + if line =~ /.*mailsend v(.*)$/ + version = $1 + end + end + + if version + to_dir = "../mailsend_bins/#{version}" + if !File.exists?(to_dir) + puts "Creating dir: #{to_dir}" + FileUtils.mkdir_p(to_dir) + end + files = [] + files << "mailsend-#{version}.tar.gz" + files << "mailsend#{version}.exe.zip" + files << "mailsend_#{version}-ubuntu_i386.deb" + + files.each do |file| + if !File.exists?(file) + puts "Error: File #{file} does not exist" + exit 1 + end + puts "File: #{file} -> #{to_dir}" + FileUtils.cp(file,to_dir) + end + else + puts "Could not determine version" + end +rescue => e + puts "Error: #{e}" +end diff --git a/coregrade/src/mailsend/scripts/ex2wiki.rb b/coregrade/src/mailsend/scripts/ex2wiki.rb new file mode 100755 index 0000000..7116d06 --- /dev/null +++ b/coregrade/src/mailsend/scripts/ex2wiki.rb @@ -0,0 +1,135 @@ +#!/usr/bin/env ruby + +######################################################################## +# Generate google code wiki from mailsend -ex output +# Mar-17-2013 +######################################################################## +class GenerateMailsendExample + ME = $0 + ME_SHORT = File.basename(ME) + PROG = Dir.pwd + "/mailsend" + + def initialize + $stdout.sync = true + @url = "https://mailsend.googlecode.com/svn/trunk/ex2wiki.rb" + end + + def error(msg) + puts "Error: #{msg}" + exit 1 + end + + def doit + if !File.exists?(PROG) + error "Program mailsend does not exist" + end + mhash = {} + a = [] + last_header = nil + block_found = false + mailsend_found = false + header = nil + headers = [] + o = `#{PROG} -ex` + new_lines = [] + last_h = '' + + lines = o.split("\n") + lines.each_index do |i| + line = lines[i] + line.chomp! + line.strip! + if line =~ /^Example .*$/ + next + end + + line1 = line + line1.chomp! if line1 + line1.strip! if line1 + + line2 = lines[i + 1] + line2.chomp! if line2 + line2.strip! if line2 + if line2 =~ /^==.*$/ + last_h = line1 + if last_header && a + headers << last_header + mhash[last_header] = a + a = [] + end + block_found = true + last_header = line1 + header = line1 + next + end + x = lines[i] + x.chomp! if x + x.strip! if x + if x !~ /^==.*$/ + a << x; + end + end + # handle last one + headers << last_h + mhash[last_h] = a + + puts < +EOD +# print version info first + v = `mailsend -V 2>&1`.chomp + v = v.gsub('^\s+','') + puts <<-EOS +=VERSION= +These examples are generated using +{{{ + $ mailsend -V +#{v} +}}} +EOS + + + headers.each do |h| + puts "=#{h}=" + a = mhash[h] + a.each do |line| + next if line =~ /^==.*$/ + if line =~ /^mailsend .*$/ + puts "}}}" if mailsend_found + mailsend_found = true + puts "{{{" + puts " $ #{line}" + next + end + if line =~ /^-.*$/ + puts " #{line}" + else + if mailsend_found && line.length == 0 + puts "}}}" + mailsend_found = false + elsif mailsend_found && line !~ /^-.*$/ + puts "}}}" + mailsend_found = false + else + puts " #{line}" + end + end + end + end + t = Time.new + puts < +Installed-Size: 104 +Homepage: http://muquit.com/muquit/software/mailsend/mailsend.html +Priority: optional +Architecture: i386 +Depends: #{@depends} +Description: Send mail via SMTP protocol + mailsend is a simple command line program to send mail via SMTP protocol. + Among other things it supports ESMTP authentication and MIME attachments. + STARTTLS and SMTP over SSL is also supported. It was originally written + for Microsoft Windows but later on ported to Linux/Unix. The Homepage of + mailsend is at: http://muquit.com/muquit/software/mailsend/mailsend.html + License is BSD. + + +EOD + f.close + rescue => ex + log "Could not create '#{@control_file}' (#{ex})" + end + end + + def gen_copyright + f = File.open("./debian/usr/share/doc/mailsend/COPYRIGHT", "w") + year = Time.new.year + f.puts < + +License: BSD + +On Debian systems, the full text of the BSD can be found at +/usr/share/common-licenses/BSD + +EOD + f.close + end + + def compress(file) + cmd = "gzip --force --best #{file}" + system(cmd) + end + + def strip_binary(file) + cmd = "strip #{file}" + system(cmd) + end + + + def copy_files + FileUtils.copy("./mailsend", "./debian/usr/bin") + strip_binary("./debian/usr/bin/mailsend") + FileUtils.copy("./doc/mailsend.1.gz", "./debian/usr/share/man/man1") + + file = "./debian/usr/share/doc/mailsend/changelog" + FileUtils.copy("./changelog.debian", file) + compress(file) + + file = "./debian/usr/share/doc/mailsend/changelog.Debian" + FileUtils.copy("./changelog.debian", file) + compress(file) + end + + def make_dirs + @dirs.each do |dir| + log "Make directory: #{dir}" + FileUtils.mkdir_p(dir) + end + end + + def lintian + package_name = get_package_name + log "Running lintian on #{package_name}" + cmd = "lintian #{package_name}" + system(cmd) + end + + def mailsend_version + ver = `./mailsend -V 2>&1` + a = ver.split("\n") + l = a[0].to_s.chomp + if l =~ /.*v(.*)$/ + @mailsend_ver = $1 + log "mailsend version: '#{@mailsend_ver}'" + else + log "Could not determine mailsend version" + exit(1) + end + end + + def get_package_name + pname = "mailsend_#{@mailsend_ver}-ubuntu_i386.deb" + @package_name = pname + return pname + end + + def make_package + package_name = get_package_name + FileUtils.remove("./debian.deb") if File.exists?("./debian.deb") + cmd = "fakeroot dpkg-deb --build debian" + log "Running: #{cmd}" + system(cmd) + FileUtils.mv("debian.deb", package_name) + log "Package: #{package_name}" + end + + def print_install_inst + puts <&1` + a = ver.split("\n") + l = a[0].to_s.chomp + if l =~ /.*v(.*)$/ + @mailsend_ver = $1 + log "mailsend version: '#{@mailsend_ver}'" + else + log "Could not determine mailsend version" + exit(1) + end + end + + def check_binary + if !File.exists?("#{PROG}") + log "#{PROG} does not exist. exiting" + exit + end + end + + def gen_pod + synopsis = `#{PROG} -h` + ex = `#{PROG} -ex` + f = File.open(Dir.pwd + "/doc/mailsend.pod", "w") + f.puts < + +=head1 EXAMPLES + +#{ex} + +=head1 SEE ALSO + +Please look at the web page for latest version and documentation: +L + + +=head1 LICENSE + +#{@copyright} + +=head1 AUTHOR + +mailsend is written by Muhammad Muquit Emuquit@muquit.comE. +Homepage: L. + +EOD +; + f.close + end + + def read_copyright + @copyright = File.read("./COPYRIGHT") + end + + def gen_man + cmd = "pod2man --release \"mailsend #{@mailsend_ver}\" -c \"User Commands\" doc/mailsend.pod > doc/mailsend.1" + system(cmd) + # compress + cmd = "gzip --best -c doc/mailsend.1 > doc/mailsend.1.gz" + system(cmd) + end + + def doit + check_binary + mailsend_version + read_copyright + gen_pod + gen_man + end +end + +if __FILE__ == $0 + MakeMailsendPod.new.doit +end diff --git a/coregrade/src/mailsend/scripts/mk_examples.rb b/coregrade/src/mailsend/scripts/mk_examples.rb new file mode 100755 index 0000000..6fd9e1a --- /dev/null +++ b/coregrade/src/mailsend/scripts/mk_examples.rb @@ -0,0 +1,59 @@ +#!/usr/bin/env ruby + +################################################## +# make examples.c file from misc/examples. +# muquit@muquit.com Dec-14-2013 +################################################## +# +require 'fileutils' + + +class MakeExamples + ME = __FILE__ + EXAMPLE_FILE = Dir.pwd + "/misc/examples.txt" + PROG = Dir.pwd + "/mailsend" + + def initialize + end + + def log(msg) + t = Time.new + puts "#{t}: #{msg}" + end + + def make_examples + v = `#{PROG} -V 2>&1` + va = v.split("\n") + puts <<-EOF +#include "mailsend.h" +void show_examples(void) +{ + (void) fprintf(stdout, "Examples of #{va[0]}\\n\\n"); + (void) fprintf(stdout, +EOF + lines = File.read(EXAMPLE_FILE) + lines.each do |line| + line = line.chomp + line = line.gsub(/\"/,'\"') + if line.length == 0 + puts " \"\\n\"" + else + puts " \" #{line}\\n\"" + end + end + puts <<-EOF +); +} +EOF + end + + def doit + make_examples + end + +end + +if __FILE__ == $0 + MakeExamples.new.doit +end + diff --git a/coregrade/src/mailsend/scripts/mk_mime_types_h.rb b/coregrade/src/mailsend/scripts/mk_mime_types_h.rb new file mode 100755 index 0000000..f0b9ad2 --- /dev/null +++ b/coregrade/src/mailsend/scripts/mk_mime_types_h.rb @@ -0,0 +1,57 @@ +#!/usr/bin/env ruby + +################################################## +# make mime_types.h file from mime.types file +# muquit@muquit.com Dec-14-2013 +################################################## +# +require 'fileutils' + +class MakeMimeTypesH + ME = __FILE__ + MIME_TYPES_FILE = Dir.pwd + "/mime.types" + + def initialize + end + + def log(msg) + t = Time.new + puts "#{t}: #{msg}" + end + + def make_mime_types_h + lines = File.read(MIME_TYPES_FILE) if File.exists?(MIME_TYPES_FILE) + t = Time.new + puts <<-EOF +/* +** WARNING: This file is auto generated. DO NOT MODIFY +** Generated by #{ME} from #{MIME_TYPES_FILE} +** #{t} +*/ +EOF + linesa = lines.split("\n") + linesa.each do |line| + line.chomp if line + next if line =~ /^#/ || line.length == 0 + if line =~ /(.+)\t+(.+)$/ + type = $1 + exts = $2 + type = type.gsub(/\t+/,'') + extsa = exts.split("\s") + extsa.each do |e| + puts "{ \"#{e}\",\"#{type}\"}," + end + end + end + end + + def doit + make_mime_types_h + end + +end + +if __FILE__ == $0 + MakeMimeTypesH.new.doit +end + diff --git a/coregrade/src/mailsend/scripts/print_date.rb b/coregrade/src/mailsend/scripts/print_date.rb new file mode 100755 index 0000000..ba22f2d --- /dev/null +++ b/coregrade/src/mailsend/scripts/print_date.rb @@ -0,0 +1,13 @@ +#!/usr/bin/env ruby + +# print the date in debian changelog format +# Example: Wed, 28 Mar 2012 20:45:31 -0400 +# muquit@muquit.com Mar-28-2012 + +require 'date' + +offset = DateTime.now.zone.to_s +offset = offset.sub(/:/,'') +t = Time.new +d = t.strftime("%a, %d %b %Y %H:%M:%S #{offset}") +puts " -- Muhammad Muquit #{d}" diff --git a/coregrade/src/mailsend/scripts/run_configure.rb b/coregrade/src/mailsend/scripts/run_configure.rb new file mode 100755 index 0000000..341c7a7 --- /dev/null +++ b/coregrade/src/mailsend/scripts/run_configure.rb @@ -0,0 +1,33 @@ +#!/usr/bin/env ruby + +# If config.log exists, try to determine how the configure was run last time +# and generate Makefiles. +# muquit@muquit.com Apr-18-2012 +class RunConfigure + + def doit + cmd = "sh ./configure" + file = "./config.log" + if File.exists?(file) + f = File.open(file, "r") + while (line = f.gets) + line = line.chomp + # $ ./configure --with-openssl=/usr + if line =~ /^\s+\$ (.*configure.*)$/ + cmd = $1 + puts "line: #{line}\n"; + break + end + end + f.close + end + puts cmd + system(cmd) + end + +end + +if __FILE__ == $0 + r = RunConfigure.new + r.doit +end diff --git a/coregrade/src/mailsend/scripts/ss.sh b/coregrade/src/mailsend/scripts/ss.sh new file mode 100644 index 0000000..d3ed401 --- /dev/null +++ b/coregrade/src/mailsend/scripts/ss.sh @@ -0,0 +1 @@ +$ ./configure --target=mipsel-linux --host=mipsel-linux --build=i686-pc-linux-gnu diff --git a/coregrade/src/mailsend/scripts/t.sh b/coregrade/src/mailsend/scripts/t.sh new file mode 100755 index 0000000..c3d1914 --- /dev/null +++ b/coregrade/src/mailsend/scripts/t.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# test +to="muquit@gmail.com" +from="muquit@muquit.com" +mailsend="./mailsend" +date=`date` +#$mailsend -v -d localhost -t $to +cc +bc -sub test \ +# -from $from -a nf.jpg,image/jpeg,a -sub test +$mailsend -d localhost -t $to +cc +bc \ + -from $from -sub "test-$date" ${1+"$@"} + + diff --git a/coregrade/src/mailsend/scripts/update_deb_changelog.rb b/coregrade/src/mailsend/scripts/update_deb_changelog.rb new file mode 100755 index 0000000..b09c7bb --- /dev/null +++ b/coregrade/src/mailsend/scripts/update_deb_changelog.rb @@ -0,0 +1,32 @@ +#!/usr/bin/env ruby + +######################################################## +# update the debian changelog file with dch. +# To udpdate the changelog file: +# ./update_deb_changelog.rb +# To increment the version: +# ./update_deb_changelog.rb blah +# muquit@muquit.com May-11-2012 +######################################################## +class UpdateDebianChangelog + + def initialize + ENV['CHANGELOG'] = Dir.pwd + '/changelog.debian' + ENV['DEBFULLNAME'] = 'Muhammad Muquit' + ENV['DEBEMAIL'] = 'muquit@muquit.com' + ENV['VISUAL'] = 'vi' + end + + def doit + if ARGV.length > 0 + system("dch -i") + else + system("dch") + end + end +end + +if __FILE__ == $0 + dcl = UpdateDebianChangelog.new.doit +end + diff --git a/coregrade/src/mailsend/scripts/upload.rb b/coregrade/src/mailsend/scripts/upload.rb new file mode 100755 index 0000000..6c58dbf --- /dev/null +++ b/coregrade/src/mailsend/scripts/upload.rb @@ -0,0 +1,40 @@ +#!/usr/bin/env ruby + +# muquit@muquit.com May-05-2013 +# a helper script to upload files +begin + ME = $0 + if ARGV.length != 2 + puts <" " +EOD + exit + end + if !ENV['GOOGLECODE_PASS'] + puts "Set GOOGLECODE_PASS" + exit 1 + end + comment = ARGV[0] + file = ARGV[1] + cmd = "googlecode_upload.pl" + cmd << " " + cmd << "-s=" + cmd << '"' + cmd << comment + cmd << '"' + cmd << " " + cmd << "-project=" + cmd << '"mailsend"' + cmd << " " + cmd << '-user="muquit"' + cmd << " " + cmd << '-labels="Featured"' + cmd << " " + cmd << "--file=" + cmd << file + puts cmd + system(cmd) + +rescue => e + puts "Error: #{e}" +end diff --git a/coregrade/src/mailsend/setget.c b/coregrade/src/mailsend/setget.c old mode 100644 new mode 100755 index 8fc92a8..15fdb1c --- a/coregrade/src/mailsend/setget.c +++ b/coregrade/src/mailsend/setget.c @@ -13,7 +13,12 @@ #include "mailsend.h" static Sll + *one_line_head = NULL, + *custom_headers_head = NULL, *attachment_head=NULL, + *oneline_attachment_head = NULL, + *msg_body_attachment_head = NULL, + *embed_image_attachment_head = NULL, *server_caps=NULL, *addr_head=NULL; @@ -31,9 +36,21 @@ void print_server_caps(void) } } +void print_one_lines(void) +{ + Sll + *l; + for (l = one_line_head; l; l = l->next) + { + (void) fprintf(stdout,"LINE: '%s'\n",(char *) l->data); + (void) fflush(stdout); + } +} + void printAddressList2(Sll *list) { +/* Sll *l; @@ -44,9 +61,37 @@ void printAddressList2(Sll *list) { addr=(Address *) l->data; } +*/ } -void print_attachemtn_list() +void print_oneline_attachment_list(void) +{ + Sll + *l; + + Attachment + *a; + + if (!g_verbose) + { + return; + } + for (l=oneline_attachment_head; l; l=l->next) + { + a=(Attachment *) l->data; + (void) fprintf(stderr,"Message: %s\n",a->oneline_msg); + (void) fprintf(stderr,"Mime type: %s\n",a->mime_type); + (void) fprintf(stderr,"Disposition: %s\n",a->content_disposition); + if (a->content_transfer_encoding) + (void) fprintf(stderr,"Encoding type: %s\n",a->content_transfer_encoding); + else + (void) fprintf(stderr,"Encoding type: none\n"); + (void) fprintf(stderr,"\n"); + } +} + + +void print_attachment_list(void) { Sll *l; @@ -57,13 +102,19 @@ void print_attachemtn_list() for (l=attachment_head; l; l=l->next) { a=(Attachment *) l->data; - /* (void) fprintf(stderr,"File path: %s\n",a->file_path); (void) fprintf(stderr,"File name: %s\n",a->file_name); + if (a->attachment_name) + (void) fprintf(stderr,"Attachment name: %s\n",a->attachment_name); (void) fprintf(stderr,"Mime type: %s\n",a->mime_type); (void) fprintf(stderr,"Disposition: %s\n",a->content_disposition); + if (a->content_id) + (void) fprintf(stderr,"Content-ID: %s\n",a->content_id); + if (a->content_transfer_encoding) + (void) fprintf(stderr,"Encoding type: %s\n",a->content_transfer_encoding); + else + (void) fprintf(stderr,"Encoding type: none\n"); (void) fprintf(stderr,"\n"); - */ } } @@ -133,6 +184,56 @@ int add_server_cap_to_list(char *cap) return(0); } +/* +** Add each line entered with -H to list of lines +** they represent custom headers in the mail. +** For example X-Priority etc. can be added that way +*/ +int add_customer_header_to_list(char *line) +{ + Sll + *nl = NULL; + + char + *l; + + if (line == NULL || *line == '\0') + { + return (-1); + } + l = strdup(line); + CHECK_MALLOC(l); + nl = allocateNode((void *) l); + CHECK_MALLOC(nl); + appendNode(&custom_headers_head, &nl); + + return(0); +} + +/* +** Add each line entered with -M to a list of lines +** return 0 on success, -1 otherwise +*/ +int add_one_line_to_list(char *line) +{ + Sll + *nl = NULL; + + char + *l; + + if (line == NULL || *line == '\0') + { + return (-1); + } + l = strdup(line); + CHECK_MALLOC(l); + nl = allocateNode((void *) l); + CHECK_MALLOC(nl); + appendNode(&one_line_head, &nl); + + return(0); +} /** @@ -141,6 +242,8 @@ int add_server_cap_to_list(char *cap) int add_attachment_to_list(char *file_path_mime) { int + rc, + separator, ntokens; Sll @@ -150,7 +253,7 @@ int add_attachment_to_list(char *file_path_mime) **tokens=NULL, *file_path=NULL, *file_name=NULL, - *mime_type=NULL, + *mime_type, *content_disposition="attachment"; Attachment @@ -160,13 +263,17 @@ int add_attachment_to_list(char *file_path_mime) return(-1); /* Tokenize the string "file,mime_type,something" */ - tokens=mutilsTokenize(file_path_mime,',',&ntokens); + separator = *g_attach_sep; + showVerbose("Separator: %c\n",separator); + tokens=mutilsTokenize(file_path_mime,separator,&ntokens); if (tokens == NULL) { errorMsg("Could not parse attachment string: \"%s\"",file_path_mime); - exit(1); + exit_error(); } + showVerbose("ntokens: %d\n",ntokens); + /* get the file name out */ file_path=tokens[0]; if ((file_name=strrchr(file_path,'/')) || @@ -179,9 +286,7 @@ int add_attachment_to_list(char *file_path_mime) file_name=file_path; } - a=(Attachment *) malloc(sizeof(Attachment)); - CHECK_MALLOC(a); - + a = allocate_attachment(); a->file_path=xStrdup(file_path); a->file_name=xStrdup(file_name); @@ -190,9 +295,11 @@ int add_attachment_to_list(char *file_path_mime) case 1: /* Only File_path/name given */ { + /* mime_type="application/octet-stream"; a->mime_type=xStrdup(mime_type); a->content_disposition=xStrdup("attachment"); + */ break; } @@ -200,75 +307,228 @@ int add_attachment_to_list(char *file_path_mime) { mime_type=tokens[1]; a->mime_type=xStrdup(mime_type); - a->content_disposition=xStrdup("attachment"); break; } - case 3: + case 3: /* filepath/name, mime_type, disposition given */ + case 4: /* filepath/name, mime_type, disposition, attchment name given */ + case 5: /* content-id */ + case 6: /* encoding type */ { mime_type=tokens[1]; a->mime_type=xStrdup(mime_type); content_disposition=tokens[2]; if (*content_disposition == 'a') + { a->content_disposition=xStrdup("attachment"); + } else if (*content_disposition == 'i') + { a->content_disposition=xStrdup("inline"); + } else + { a->content_disposition=xStrdup("attachment"); + } + + if (ntokens == 4) + { + a->attachment_name = xStrdup(tokens[3]); + } + if (ntokens == 5) + { + a->attachment_name = xStrdup(tokens[3]); + if (strncmp(tokens[4],"none",4) != 0) + a->content_id = xStrdup(tokens[4]); + } + if (ntokens == 6) + { + a->attachment_name = xStrdup(tokens[3]); + if (strncmp(tokens[4],"none",4) != 0) + a->content_id = xStrdup(tokens[4]); + a->content_transfer_encoding = xStrdup(tokens[5]); + } break; } - + default: { errorMsg("Invalid string specified with -a \"%s\"",file_path_mime); - exit(1); + exit_error(); break; } } + + rc = mutils_file_is_binary(a->file_path); + if (rc == -1) + { + errorMsg("Could not determine file type of %s",a->file_path); + } + if (rc == MUTILS_TRUE) + { + mime_type = get_mime_type(a->file_path); + if (*g_mime_type != '\0') + { + if ((mutilsStrcasecmp(g_mime_type,"text/html") == 0) || + (mutilsStrcasecmp(g_mime_type,"text/plain") == 0)) + { + a->charset = xStrdup("none"); + a->mime_type = xStrdup(mime_type); + a->content_transfer_encoding = xStrdup("base64"); + } + } + } + + + if (a->mime_type == NULL) + { + if (*g_mime_type != '\0') + { + a->mime_type = xStrdup(g_mime_type); + } + else + { + a->mime_type = xStrdup(get_mime_type(a->file_path)); + } + } + if (a->content_transfer_encoding == NULL) + { + if (*g_content_transfer_encoding == '\0') + { + a->content_transfer_encoding = xStrdup("base64"); + } + } + + if (a->content_id == NULL) + { + if (*g_content_id != '\0') + { + a->content_id = xStrdup(g_content_id); + } + } + + if (a->attachment_name == NULL) + { + a->attachment_name = xStrdup(file_name); + } + na=allocateNode((void *) a); CHECK_MALLOC(na); appendNode(&attachment_head,&na); - /* - print_attachemtn_list(); - */ -#if 0 - if ((mime_type=strchr(file_path_mime,ATTACHMENT_SEP))) - { - *mime_type++='\0'; - } - else - { - mime_type="application/octet-stream"; - } - - - /* get the file name out */ - if ((file_name=strrchr(file_path_mime,'/')) || (file_name=strrchr(file_path_mime,'\\'))) - { - file_name++; - } - else - { - file_name=file_path_mime; - } - - a=(Attachment *) malloc(sizeof(Attachment)); - CHECK_MALLOC(a); - - a->file_path=xStrdup(file_path_mime); - a->file_name=xStrdup(file_name); - a->mime_type=xStrdup(mime_type); - na=allocateNode((void *) a); - CHECK_MALLOC(na); - - appendNode(&attachment_head,&na); -#endif /* 0 */ - + /*print_attachemtn_list();*/ return(0); } +int add_embed_image_to_attachment_list(const char *image_file) +{ + Sll + *na=NULL; + + Attachment + *a=NULL; + + if (image_file == NULL || *image_file == '\0') + { + return(-1); + } + a=allocate_attachment(); /* defaults will be set */ + + a->file_path = xStrdup(image_file); + if (a->charset) + { + (void) free((char *) a->charset); + a->charset = xStrdup("none"); + } + + if (a->mime_type == NULL) + { + if (*g_mime_type != '\0') + { + a->mime_type = xStrdup(g_mime_type); + } + else + { + a->mime_type = xStrdup(get_mime_type(a->file_path)); + } + } + + if (a->content_transfer_encoding == NULL) + { + if (*g_content_transfer_encoding == '\0') + { + a->content_transfer_encoding = xStrdup("base64"); + } + } + + + na=allocateNode((void *) a); + CHECK_MALLOC(na); + appendNode(&embed_image_attachment_head,&na); + return(0); + +} + +int add_msg_body_to_attachment_list(const char *msg_body_file) +{ + Sll + *na=NULL; + + Attachment + *a=NULL; + + if (msg_body_file == NULL || *msg_body_file == '\0') + { + return(-1); + } + a=allocate_attachment(); /* defaults will be set */ + + a->file_path = xStrdup(msg_body_file); + + na=allocateNode((void *) a); + CHECK_MALLOC(na); + appendNode(&msg_body_attachment_head,&na); + return(0); +} + + +/* +** create a list of Attachment for one line messages +** it uses -mime-type and -enc-type, so these two flags +** must specified first before -M +*/ +int add_oneline_to_attachment_list(char *oneline_msg) +{ + Sll + *na=NULL; + + Attachment + *a=NULL; + + if (oneline_msg == NULL || *oneline_msg == '\0') + { + return(-1); + } + a=allocate_attachment(); /* defaults will be set */ + + a->oneline_msg=xStrdup(oneline_msg); + a->content_disposition=xStrdup("inline"); + if (*g_mime_type == '\0') + { + a->mime_type = xStrdup("text/plain"); + } + + if (a->content_transfer_encoding == NULL) + { + a->content_transfer_encoding = xStrdup("none"); + } + na=allocateNode((void *) a); + CHECK_MALLOC(na); + + appendNode(&oneline_attachment_head,&na); + return(0); +} @@ -421,7 +681,7 @@ int addAddressesFromFileToList(char *address_file) if (addr == NULL) { errorMsg("addAddressToList: malloc problem for newAddress()"); - return (-1); + goto ExitProcessing; } /* fill with data */ showVerbose("Label: %s\n",label); @@ -434,7 +694,7 @@ int addAddressesFromFileToList(char *address_file) { errorMsg("addAddressToList: malloc problem with allocateNode()"); (void) free ((char *) addr); - return (-1); + goto ExitProcessing; } appendNode(&addr_head,&list); } @@ -443,6 +703,10 @@ int addAddressesFromFileToList(char *address_file) (void) fclose(fp); return (0); +ExitProcessing: + if (fp != (FILE *) NULL) + (void) fclose(fp); + return (-1); } @@ -451,15 +715,66 @@ Sll *getAddressList(void) return (addr_head); } +Sll *get_one_line_list(void) +{ + return (one_line_head); +} + +Sll *get_custom_header_list(void) +{ + return (custom_headers_head); +} + Sll *get_attachment_list(void) { return(attachment_head); } +Sll *get_oneline_attachment_list(void) +{ + return(oneline_attachment_head); +} Sll *get_server_cap_list(void) { return(server_caps); } +Sll *get_msg_body_attachment_list(void) +{ + return(msg_body_attachment_head); +} + +Sll *get_embed_image_attachment_list(void) +{ + return (embed_image_attachment_head); +} + +Attachment *allocate_attachment(void) +{ + Attachment + *a; + a = (Attachment *) malloc(sizeof(Attachment)); + CHECK_MALLOC(a); + memset(a,0,sizeof(Attachment)); + + a->charset = xStrdup(g_charset); /* default is "utf-8" */ + if (*g_mime_type != '\0') + { + a->mime_type = xStrdup(g_mime_type); + } + + if (*g_content_transfer_encoding != '\0') + a->content_transfer_encoding = xStrdup(g_content_transfer_encoding); + + a->attach_separator = *g_attach_sep; + a->content_disposition = xStrdup(g_content_disposition); + if (*g_attach_name != '\0') + { + a->attachment_name = xStrdup(g_attach_name); + } + + return(a); +} + /* just a debug routine */ diff --git a/coregrade/src/mailsend/smtp.c b/coregrade/src/mailsend/smtp.c old mode 100644 new mode 100755 index d04c20b..f9145d3 --- a/coregrade/src/mailsend/smtp.c +++ b/coregrade/src/mailsend/smtp.c @@ -15,6 +15,7 @@ #include "mailsend.h" static char buf[BUFSIZ]; +static int bufsz = sizeof(buf) - 1; static int break_out=0; static char smtp_line[BUFSIZ]; @@ -40,7 +41,20 @@ static SOCKET smtpConnect(char *smtp_server,int port) SOCKET sfd; - sfd=clientSocket(smtp_server,port); + if (g_use_protocol == MSOCK_USE_IPV4) + { + showVerbose("Forcing to use IPv4 address of SMTP server\n"); + } + else if (g_use_protocol == MSOCK_USE_IPV6) + { + showVerbose("Forcing to use IPv6 address of SMTP server\n"); + } + else + { + showVerbose("Will detect IPv4 or IPv6 automatically\n"); + } + + sfd=clientSocket(g_use_protocol, smtp_server,port, g_connect_timeout); if (sfd == INVALID_SOCKET) { errorMsg("Could not connect to SMTP server \"%s\" at port %d", @@ -54,6 +68,35 @@ static SOCKET smtpConnect(char *smtp_server,int port) return (sfd); } +int read_smtp_multi_lines(void) +{ + int + rc, + lcnt = 0; + if (smtp_sep == A_DASH) + { + for (;;) + { + rc=read_smtp_line(); + if (rc < 0) + break; + lcnt++; + if (lcnt >= 100) + { + errorMsg("Too many lines from server\n"); + rc=(-1); + goto ExitProcessing; + } + if (smtp_sep != A_DASH) + break; + } + } + smtp_sep = A_SPACE; + return(0); +ExitProcessing: + return(1); +} + /* * sfd socket * @@ -78,10 +121,10 @@ int read_smtp_line(void) memset(lbuf,0,sizeof(lbuf)); /* read a line */ - n=msock_gets(lbuf,sizeof(lbuf)-1); + n=msock_gets(lbuf,sizeof(lbuf)-1, g_read_timeout); if (n < 3 ) { - //errorMsg("Error reading SMTP line, read %d bytes",n); + /*errorMsg("Error reading SMTP line, read %d bytes",n);*/ return(-1); } showVerbose("[S] %s\n",lbuf); @@ -158,7 +201,8 @@ int smtp_start_tls(int sfd) rc=(-1); } #else - errorMsg("Not Compiled with OpenSSL, could not do STARTTLS"); + errorMsg("Not Compiled with OpenSSL, will not try STARTTLS"); + rc=(-1); #endif /*HAVE_OPENSSL */ return(rc); } @@ -197,6 +241,7 @@ static int say_helo(char *helo_domain) break; } } + smtp_sep = A_SPACE; return(rc); } @@ -222,11 +267,9 @@ static int smtp_MAIL_FROM(char *from) /* SMTP: quit */ static int smtp_QUIT(void) { - int - rc; showVerbose("[C] QUIT\r\n"); msock_puts("QUIT\r\n"); - rc=read_smtp_line(); + read_smtp_line(); /* ** google does not seem to write anything back in response to QUIT ** command. I'll ignore it anyway @@ -325,13 +368,30 @@ static int smtp_DATA(void) } /* SMTP: EOM */ +/* return 0 on success, -1 on failure */ int smtpEom(int sfd) { + int + rc; + msock_puts("\r\n.\r\n"); showVerbose("\r\n[C] .\r\n"); - return (read_smtp_line()); + /* + ** Bug# 1 + ** we want to see smtp code 250 now + ** if mail is too big, it can mail with 552 message too large + */ + rc = read_smtp_line(); + if (smtp_code != 250) + { + read_smtp_multi_lines(); + errorMsg("Expected smtp code 250, got %d\n",smtp_code); + rc = (-1); + } + + return(rc); } void doCleanup(void) @@ -353,7 +413,7 @@ static BOOL WINAPI CntrlHandler(DWORD CtrlEvent) { break_out=1; (void) fprintf(stderr,"\nNot sending mail. Exiting.......\n"); - exit(1); /* XXXXXXXXXXXXXXXXXXXXXX */ + exit_error(); break; } } @@ -362,6 +422,645 @@ static BOOL WINAPI CntrlHandler(DWORD CtrlEvent) } #endif /* WINNT */ +int write_to_socket(char *str) +{ + int + n; + if (str == NULL) + { + return (-1); + } + n = msock_puts(str); + /*showVerbose("%d bytes: %s\n",n, str);*/ + return(n); +} + +/* +** return 0 on success +*/ +int encode2base64andwrite2socket(const char *str) +{ + FILE + *tfp1 = NULL, + *tfp2 = NULL; + char + mbuf[1000], + oneline_tempfile1[MUTILS_PATH_MAX], + oneline_tempfile2[MUTILS_PATH_MAX]; + + memset(oneline_tempfile1, 0, sizeof(oneline_tempfile1)); + /* write the text to a tmp file */ + tfp1 = mutils_get_tempfileFP(oneline_tempfile1, + sizeof(oneline_tempfile1)-1); + if (tfp1 == NULL) + { + errorMsg("%s (%d) - Could not open temp file1 for writing (%s)", + MFL, + ERR_STR); + return (-1); + } + (void) fprintf(tfp1,"%s",str); + (void) fclose(tfp1); + + /* open another tmp file to write the base64 of the first tmp file to */ + memset(oneline_tempfile2, 0, sizeof(oneline_tempfile2)); + tfp2 = mutils_get_tempfileFP(oneline_tempfile2, + sizeof(oneline_tempfile2)-1); + showVerbose("Oneline temp file2: * %s\n",oneline_tempfile2); + if (tfp2 == NULL) + { + errorMsg("%s (%d) - Could not open temp file2 for writing (%s)", + MFL, + ERR_STR); + return (-1); + } + + tfp1 = fopen(oneline_tempfile1,"rb"); + if (tfp1 == NULL) + { + errorMsg("%s (%d) - Could not open temp file for reading (%s)", + MFL, + ERR_STR); + return(-1); + } + + mutilsBase64Encode(tfp1,tfp2); + (void) fclose(tfp1); + (void) fclose(tfp2); + + /* open the file with base64 and write the content to socket */ + tfp2 = fopen(oneline_tempfile2,"r"); + if (tfp2 == NULL) + { + errorMsg("%s (%d) - Could not open temp file for reading (%s)", + MFL, + ERR_STR); + return(-1); + } + while(fgets(mbuf, sizeof(mbuf)-1, tfp2)) + { + write_to_socket(mbuf); + if (g_show_attachment_in_log) + { + showVerbose("[C] %s",mbuf); + } + } + (void) fclose(tfp2); + unlink(oneline_tempfile1); + unlink(oneline_tempfile2); + + return(0); +} + +/* +** send one line messages, each one is an inline attachment +** return 0 if mail is sent, -1 otherwise +*/ +int process_oneline_messages(const char *boundary) +{ + Attachment + *a = NULL; + Sll + *l, + *oneline_attachment_list; + + oneline_attachment_list = get_oneline_attachment_list(); + if (oneline_attachment_list == NULL) + { + return(0); + } + print_oneline_attachment_list(); + + for (l = oneline_attachment_list; l; l = l->next) + { + a = (Attachment *) l->data; + (void) snprintf(buf, bufsz, "\r\n--%s\r\n",boundary); + write_to_socket(buf); + + if (strcmp(a->charset,"none") != 0) + { + (void) snprintf(buf, bufsz, "Content-Type: %s; charset=%s\r\n", + a->mime_type, + a->charset); + } + else + { + (void) snprintf(buf, bufsz, "Content-Type: %s\r\n",a->mime_type); + } + write_to_socket(buf); + + (void) strcpy(buf,"Content-Disposition: inline\r\n"); + write_to_socket(buf); + + /* add encoding type if needed */ + if (strncmp(a->content_transfer_encoding,"none",4) != 0) + { + (void) snprintf(buf, bufsz, "Content-Transfer-Encoding: %s\r\n\r\n", + a->content_transfer_encoding); + write_to_socket(buf); + } + + + if (strncmp(a->content_transfer_encoding,"base64",6) == 0) + { + /* encode the mssage to base 64 and write to socket */ + encode2base64andwrite2socket(a->oneline_msg); + } + else + { + /* + ** no encoding type, so last \r\n was no added, we must + ** add it or some mailer will thing the mail is invalid + */ + if (strncmp(a->content_transfer_encoding,"none",4) == 0) + { + write_to_socket("\r\n"); + } + write_to_socket(a->oneline_msg); + if (g_show_attachment_in_log) + { + showVerbose("[C] %s\n",a->oneline_msg); + + } + } + write_to_socket("\r\n"); + } + return(0); +} + +/* +** include the content of the file as body of the message +** No encoding will be done. +*/ +int include_msg_body(void) +{ + Sll + *l, + *msg_body_attachment_head; + + FILE + *fp = NULL; + + Attachment + *a; + + msg_body_attachment_head = get_msg_body_attachment_list(); + if (msg_body_attachment_head == NULL) + { + return(-1); + } + + l = msg_body_attachment_head; + a = (Attachment *) l->data; + + (void) snprintf(buf,bufsz,"MIME-Version: 1.0\r\n"); + write_to_socket(buf); + + if (strcmp(a->charset,"none") != 0) + { + (void) snprintf(buf,bufsz,"Content-Type: %s; charset=%s\r\n\r\n", + a->mime_type, + a->charset); + } + else + { + (void) snprintf(buf,bufsz,"Content-Type: %s\r\n\r\n",a->mime_type); + } + write_to_socket(buf); + + fp=fopen(a->file_path,"r"); + if (fp == (FILE *) NULL) + { + errorMsg("Could not open message body file: %s",a->file_path); + return (-1); + } + + while (fgets(buf,bufsz,fp)) + { + write_to_socket(buf); + if (g_show_attachment_in_log) + { + showVerbose("[C] %s",buf); + } + } + (void) fclose(fp); + + (void) snprintf(buf,bufsz,"\r\n\r\n"); + msock_puts(buf); + showVerbose(buf); + return(0); +} + +int include_image(void) +{ + return(0); +} + +static void cleanup_attachment(Attachment *a) +{ + if (a == NULL) + return; + if (a->fp_read) + { + (void) fclose(a->fp_read); + } + if (*a->mime_tmpfile != '\0') + { + unlink(a->mime_tmpfile); + } +} + + +/* +** return the attachment with fp_read member open. +** If encoding type requires some kind of encoding, +** mime_tmpfile will contain the file which holds the +** encoded content. The caller must close the file pointer +** and unlik the tmp_filename +** return NULL on error +*/ +static Attachment *get_encoded_attachment(Attachment *a) +{ + FILE + *fp_read = NULL, + *tfp_write = NULL; + int + tempfile_opened = 0; + + if (strncmp(a->content_transfer_encoding, "base64", 6) == 0) + { + tfp_write = mutils_get_tempfileFP(a->mime_tmpfile,sizeof(a->mime_tmpfile)-1); + if (tfp_write == NULL) + { + errorMsg("%s (%d) - Could not create temp file for MIME (%s)", + MFL, + ERR_STR); + return(NULL); + } + tempfile_opened = 1; + showVerbose("%s (%d) - MIME temp file: %s created successfully, FILE pointer=%x\n", + MFL, + a->mime_tmpfile, + tfp_write); + + /* open the file to attach */ + fp_read = fopen(a->file_path,"rb"); + if (fp_read == (FILE *) NULL) + { + errorMsg("%s (%d) - Could not open file for %s reading (%s)", + MFL, + a->file_path, + ERR_STR); + goto ExitProcessing; + } + + showVerbose("%s (%d) - Writing Content to FILE pointer: %x\n", + MFL, + tfp_write); + /* write base64 content to tmp file */ + mutilsBase64Encode(fp_read,tfp_write); + (void) fclose(fp_read); + fp_read = NULL; + + (void) fclose(tfp_write); + tfp_write = NULL; + a->fp_read = fopen(a->mime_tmpfile, "r"); + if (a->fp_read == (FILE *) NULL) + { + errorMsg("%s (%d) - Could not open file for %s reading (%s)", + MFL, + a->file_path, + ERR_STR); + goto ExitProcessing; + } + if (tempfile_opened) + { + unlink(a->mime_tmpfile); + } + return(a); + } + /* no tmp file */ + memset(a->mime_tmpfile, 0, sizeof(a->mime_tmpfile)); + + /* open the attachment. caller must close it */ + a->fp_read = fopen(a->file_path, "r"); + if (a->fp_read == (FILE *) NULL) + { + errorMsg("%s (%d) - Could not open file for %s reading (%s)", + MFL, + a->file_path, + ERR_STR); + return (NULL); + } + return(a); + +ExitProcessing: + if (tempfile_opened) + { + unlink(a->mime_tmpfile); + } + return(NULL); +} + +/* +** write MIME headers, encode attachment if needed +** and write to socket +** returns 0 on success -1 on failure +*/ +int send_attachment(Attachment *a, const char *boundary) +{ + Attachment + *encoded_attachment; + + encoded_attachment = get_encoded_attachment(a); + if (encoded_attachment == NULL) + { + errorMsg("%s (%d) - Could not encode attachment %s", + MFL, + a->file_path); + return(-1); + } + + (void) snprintf(buf, bufsz,"\r\n--%s\r\n",boundary); + write_to_socket(buf); + + if (a->charset && strncmp(a->charset,"none", 4) != 0) + { + (void) snprintf(buf, bufsz, "Content-Type: %s; charset=%s\r\n", + a->mime_type, + a->charset); + } + else + { + if (a->attachment_name) + { + (void) snprintf(buf, bufsz, "Content-Type: %s; name=\"%s\"\r\n", + a->mime_type, + a->attachment_name); + } + else + { + (void) snprintf(buf, bufsz, "Content-Type: %s\r\n",a->mime_type); + } + } + write_to_socket(buf); + + if (a->content_id == NULL) + { + if (strncmp(a->content_disposition, "inline", 6) == 0) + { + (void) snprintf(buf, bufsz, "Content-Disposition: %s\r\n",a->content_disposition); + } + else + { + if (a->attachment_name) + { + (void) snprintf(buf, bufsz, "Content-Disposition: %s; filename=\"%s\"\r\n", + a->content_disposition, + a->attachment_name); + + } + else if (a->file_name) + { + (void) snprintf(buf, bufsz, "Content-Disposition: %s; filename=\"%s\"\r\n", + a->content_disposition, + a->file_name); + } + else + { + (void) snprintf(buf, bufsz, "Content-Disposition: %s\r\n",a->content_disposition); + } + } + write_to_socket(buf); + } + + if (a->content_id) + { + (void) snprintf(buf, bufsz, "Content-ID: <%s>\r\n",a->content_id); + write_to_socket(buf); + (void) snprintf(buf, bufsz, "X-Attachment-Id: %s\r\n",a->content_id); + write_to_socket(buf); + } + + if (strncmp(a->content_transfer_encoding,"none",4) != 0) + { + (void) snprintf(buf, bufsz, "Content-Transfer-Encoding: %s\r\n\r\n", + a->content_transfer_encoding); + write_to_socket(buf); + } + else + { + write_to_socket("\r\n"); + } + + /* our FILE pointer is already open and read to read from */ + while (fgets(buf, bufsz, a->fp_read)) + { + write_to_socket(buf); + } + /* close file, remove tmp file if needed */ + cleanup_attachment(a); + return(0); +} + +int process_attachments(const char *boundary) +{ + Attachment + *a; + + Sll + *attachment_list, + *al; + + int + rc; + + attachment_list = get_attachment_list(); + if (attachment_list == NULL) + { + return(0); + } + + for (al=attachment_list; al; al=al->next) + { + a=(Attachment *) al->data; + if (a == NULL) + continue; + + rc = send_attachment(a, boundary); + if (rc == -1) + { + errorMsg("%s (%d) - failed to send attachment %s\n", + MFL, + a->file_path); + return(-1); + } + } + + (void) snprintf(buf,sizeof(buf)-1,"\r\n--%s--\r\n",boundary); + msock_puts(buf); + showVerbose(buf); + + return(0); +} + +/* +** Print multipart/mixed or multipart/related header +** if mixed and embedded images are specified, make +** to use multipart/alternative for the embedded images. +*/ +int print_content_type_header(const char *boundary) +{ + Sll + *oneline_attachment_list, + *attachment_list, + *embed_image_list; + + (void) snprintf(buf, bufsz,"MIME-Version: 1.0\r\n"); + write_to_socket(buf); + + if (*g_content_type!='\0') + { + (void) snprintf(buf,sizeof(buf)-1,"Content-Type: %s; boundary=\"%s\"\r\n", + g_content_type, + boundary); + write_to_socket(buf); + return(0); + } + + oneline_attachment_list = get_oneline_attachment_list(); + attachment_list = get_attachment_list(); + embed_image_list = get_embed_image_attachment_list(); + if (oneline_attachment_list || attachment_list) + { + (void) snprintf(buf,sizeof(buf)-1, + "Content-Type: multipart/mixed; boundary=\"%s\"\r\n", boundary); + write_to_socket(buf); + return(0); + } + if (embed_image_list) + { + (void) snprintf(buf,sizeof(buf)-1, + "Content-Type: multipart/related; boundary=\"%s\"\r\n", boundary); + write_to_socket(buf); + return(0); + } + write_to_socket("\r\n"); + return(0); +} + +int process_embeded_images(const char *boundary) +{ + char + *ib, + *b, + related[17], + cid[17], + tbuf[24], + alternative[17]; + + Attachment + *a; + + Sll + *il, + *oneline_attachment_list, + *attachment_list, + *embed_image_list; + + int + rc, + ic = 1; + + oneline_attachment_list = get_oneline_attachment_list(); + attachment_list = get_attachment_list(); + + embed_image_list = get_embed_image_attachment_list(); + if (embed_image_list == NULL) + { + return(0); + } + memset(related, 0, sizeof(related)); + memset(alternative, 0, sizeof(alternative)); + + mutilsGenerateMIMEBoundary(related,sizeof(related)); + mutilsGenerateMIMEBoundary(alternative,sizeof(alternative)); + b = boundary; + ib = boundary; + + (void) snprintf(buf, bufsz, "\r\n--%s\r\n",boundary); + write_to_socket(buf); + + if (attachment_list || oneline_attachment_list) + { + b = related; + ib = b; + (void) snprintf(buf, bufsz, "Content-Type: multipart/related; boundary=%s\r\n",b); + write_to_socket(buf); + + (void) snprintf(buf, bufsz, "Content-Type: multipart/alternative; boundary=%s\r\n\r\n", + alternative); + write_to_socket(buf); + + (void) snprintf(buf, bufsz, "\r\n--%s\r\n",b); + write_to_socket(buf); + } + else + { + ib = alternative; + (void) snprintf(buf, bufsz, "Content-Type: multipart/alternative; boundary=%s\r\n\r\n", + alternative); + write_to_socket(buf); + + (void) snprintf(buf, bufsz, "\r\n--%s\r\n",alternative); + write_to_socket(buf); + } + + write_to_socket("Content-Type: text/html; charset=ISO-8859-1\r\n\r\n"); + + /* write the img tags with cid */ + embed_image_list = get_embed_image_attachment_list(); + for (il = embed_image_list; il; il = il->next) + { + a = (Attachment *) il->data; + mutilsGenerateMIMEBoundary(cid,sizeof(cid)); + (void) snprintf(tbuf,sizeof(tbuf)-1,"ii%d_%s",ic,cid); + a->content_id = xStrdup(tbuf); + (void) snprintf(buf, bufsz, "\"inline
\n", + tbuf, + ic); + write_to_socket(buf); + ic++; + } + write_to_socket("\r\n"); + (void) snprintf(buf, bufsz, "\r\n--%s--\r\n",ib); + write_to_socket(buf); + + for (il = embed_image_list; il; il = il->next) + { + a = (Attachment *) il->data; + if (a == NULL) + continue; + rc = send_attachment(a,b); + RETURN_IF_NOT_ZERO(rc); + } + (void) snprintf(buf, bufsz, "\r\n--%s--\r\n",b); + write_to_socket(buf); + return(0); +} + +static void print_end_boundary(const char *boundary) +{ + if (get_attachment_list() == NULL) + { + (void) snprintf(buf,sizeof(buf)-1,"\r\n--%s--\r\n",boundary); + msock_puts(buf); + showVerbose(buf); + return; + } + /* process_attachments(boundary) already printed the end bounday */ +} + /* SMTP: mail */ static int smtpMail(int sfd,char *to,char *cc,char *bcc,char *from,char *rrr,char *rt, char *subject,char *attach_file,char *msg_body_file, @@ -370,13 +1069,17 @@ static int smtpMail(int sfd,char *to,char *cc,char *bcc,char *from,char *rrr,cha char *os="Unix", boundary[17], - mbuf[1000]; + related[17], + alternative[17], + mbuf[1024]; int newline_before; Sll - *attachment_list; + *oneline_attachment_list, + *attachment_list, + *embed_image_list; #ifdef WINNT os="Windows"; @@ -384,8 +1087,14 @@ static int smtpMail(int sfd,char *to,char *cc,char *bcc,char *from,char *rrr,cha os="Unix"; #endif /* WINNT */ + memset(boundary, 0, sizeof(boundary)); + memset(related, 0, sizeof(related)); + memset(alternative, 0, sizeof(alternative)); + attachment_list=get_attachment_list(); - if (attachment_list) + embed_image_list = get_embed_image_attachment_list(); + oneline_attachment_list = get_oneline_attachment_list(); + if (attachment_list || embed_image_list || oneline_attachment_list) { is_mime=1; } @@ -483,6 +1192,28 @@ static int smtpMail(int sfd,char *to,char *cc,char *bcc,char *from,char *rrr,cha showVerbose(buf); } + /* add custom headers if any. No verification is done */ + { + Sll + *l, + *custom_header_list; + custom_header_list = get_custom_header_list(); + if (custom_header_list) + { + for (l = custom_header_list; l; l = l->next) + { + if (l->data) + { + msock_puts((char *) l->data); + msock_puts("\r\n"); + showVerbose((char *) l->data); + showVerbose("\r\n"); + } + } + } + } + + memset(buf,0,sizeof(buf)); (void) snprintf(buf,sizeof(buf)-1,"X-Mailer: %s (%s)\r\n",MAILSEND_VERSION,os); msock_puts(buf); @@ -493,278 +1224,41 @@ static int smtpMail(int sfd,char *to,char *cc,char *bcc,char *from,char *rrr,cha msock_puts(buf); showVerbose(buf); - /* - if (is_mime && msg_file) - */ if (is_mime) { + int + rc; srand(time(NULL)); memset(boundary,0,sizeof(boundary)); mutilsGenerateMIMEBoundary(boundary,sizeof(boundary)); - (void) snprintf(buf,sizeof(buf)-1,"Content-type: multipart/mixed; boundary=\"%s\"\r\n",boundary); - msock_puts(buf); - showVerbose(buf); - (void) snprintf(buf,sizeof(buf)-1,"Mime-version: 1.0\r\n"); - msock_puts(buf); - showVerbose(buf); - } + /* if msg body file is specified, include and return */ + if (msg_body_file) + { + return (include_msg_body()); + } - msock_puts("\r\n"); - showVerbose("\r\n"); + rc = print_content_type_header(boundary); + RETURN_IF_NOT_ZERO(rc); - /* - if (is_mime && msg_file) - */ - if (is_mime) - { - char - mime_tmpfile[BUFSIZ]; + rc = process_oneline_messages(boundary); + RETURN_IF_NOT_ZERO(rc); - FILE - *tfp=NULL, - *fp=NULL; - int - tfwd; + rc = process_embeded_images(boundary); + RETURN_IF_NOT_ZERO(rc); + + rc = process_attachments(boundary); + RETURN_IF_NOT_ZERO(rc); /* - ** If there a txt file or a one line messgae, attach them first + ** if there were other kind of MIME types but no attachments, + ** we have to print the last boundary */ - /* Part added by Smeeta Jalan -- starts */ - if (the_msg) - { - (void) snprintf(buf,sizeof(buf)-1,"\r\n--%s\r\n",boundary); - msock_puts(buf); - showVerbose(buf); + print_end_boundary(boundary); - (void) snprintf(buf,sizeof(buf)-1,"Content-Type: text/html; charset=%s\r\n",g_charset); - msock_puts(buf); - showVerbose(buf); - - (void) strcpy(buf,"Content-Disposition: inline\r\n"); - msock_puts(buf); - showVerbose(buf); - - msock_puts("\r\n"); - showVerbose("\r\n"); - - /* (void) strcpy(buf,the_msg); */ - mutilsSafeStrcpy(buf,the_msg,sizeof(buf)-1); - msock_puts(buf); - showVerbose("[C] %s",the_msg); - - (void) snprintf(buf,sizeof(buf)-1,"\r\n\r\n"); - msock_puts(buf); - showVerbose(buf); - } - - if (msg_body_file) - { - int - rc; - char - mime_type[32], - filename[1024]; - - FILE - *fp; - - rc=get_filepath_mimetype(msg_body_file,filename, - sizeof(filename)-1,mime_type,sizeof(mime_type)-1); - /* - * The file should not have binary characters it it. - * It's user's responsibilty to make sure file is not binary. - * If file is binary mail will have garbage as I'll not convert - * the content to base64 - */ - fp=fopen(filename,"r"); - if (fp == (FILE *) NULL) - { - errorMsg("Could not open message body file: %s",filename); - return (-1); - } - - (void) snprintf(buf,sizeof(buf)-1,"\r\n--%s\r\n",boundary); - msock_puts(buf); - showVerbose(buf); - - (void) snprintf(buf,sizeof(buf)-1,"Content-Type: %s; charset=%s\r\n",mime_type,g_charset); - msock_puts(buf); - showVerbose(buf); - - (void) strcpy(buf,"Content-Disposition: inline\r\n"); - msock_puts(buf); - showVerbose(buf); - - msock_puts("\r\n"); - showVerbose("\r\n"); - - while (fgets(mbuf,sizeof(mbuf)-1,fp)) - { - msock_puts(mbuf); - showVerbose("[C] %s",mbuf); - } - (void) fclose(fp); - - (void) snprintf(buf,sizeof(buf)-1,"\r\n\r\n"); - msock_puts(buf); - showVerbose(buf); - } - /* Part added by Smeeta Jalan --ends --*/ - - /* open a tmp file writing MIME content */ - (void) strcpy(mime_tmpfile,"./mailsendXXXXXX"); - - /* handle mime */ - { - Attachment - *a; - Sll - *al; - - for (al=attachment_list; al; al=al->next) - { - a=(Attachment *) al->data; - if (a == NULL) - continue; - - /* open the mime input file */ - fp=fopen(a->file_path,"rb"); - if (fp == (FILE *) NULL) - { - errorMsg("%s (%d) - Could not open file for reading: %s (%s)",MFL,a->file_path,ERR_STR); - return (-1); - } - - (void) strcpy(mime_tmpfile,"./mailsendXXXXXX"); -#ifdef HAVE_MKSTEMP - tfwd=mkstemp(mime_tmpfile); - if (tfwd == -1) - { - errorMsg("%s (%d) - Could not open tmp file \"%s\" for writing (for %s)\n",MFL,mime_tmpfile,a->file_name); - return (-1); - } - tfp=fdopen(tfwd,"w"); - if (tfp == NULL) - { - (void) fprintf(stderr,"fdopen() failed on %s\n",mime_tmpfile); - close(tfwd); - unlink(mime_tmpfile); - return(-1); - } -#else - mktemp(mime_tmpfile); - - tfp=fopen(mime_tmpfile,"w"); - if (tfp == NULL) - { - (void) fprintf(stderr,"Could not open tmp file \"%s\" for writing (for %s)\n",mime_tmpfile,a->file_name); - return (-1); - } -#endif /* HAVE_MKSTEMP */ - - /* base64 encode only if it is not mime type of text/plain */ - - if (mutilsStrcasecmp(a->mime_type,"text/plain") != 0) - { - mutilsBase64Encode(fp,tfp); - if (tfp) - { - (void) fclose(tfp); - } - } - else - { - FILE - *ttp; - char - xbuf[BUFSIZ]; - - /* write the text file to tmp file */ - ttp=fopen(a->file_path,"r"); - if (ttp == NULL) - - { - errorMsg("%s (%d) - could not open file %s for reading (%s)\n",MFL,a->file_path,ERR_STR); - continue; - } - while(fgets(xbuf,sizeof(xbuf)-1,ttp)) - { - fputs(xbuf,tfp); - } - fclose(ttp); - (void) fclose(tfp); - - } - if (fp) - (void) fclose(fp); - - (void) snprintf(buf,sizeof(buf)-1,"--%s\r\n",boundary); - msock_puts(buf); - showVerbose(buf); - - - if (mutilsStrcasecmp(a->mime_type,"text/plain") == 0) - { - /* - ** Guess the file type first. - ** If binary, change my type and base64 encode it. - ** If the file is text and in Unix format, write it - ** back as Dos file (with \r\n - ** TODO - ** muquit@muquit.com Mar-21-2007 - */ - - (void) snprintf(buf,sizeof(buf)-1,"Content-Type: text/plain; charset=%s\r\n",g_charset); - msock_puts(buf); - showVerbose(buf); - - (void) snprintf(buf,sizeof(buf)-1,"Content-Disposition: %s; filename=\"%s\"\r\n", - a->content_disposition, - a->file_name); - msock_puts(buf); - showVerbose(buf); - - msock_puts("\r\n"); - showVerbose("\r\n"); - } - else - { - (void) snprintf(buf,sizeof(buf)-1,"Content-Type: %s; name=%s\r\n",a->mime_type,a->file_name); - msock_puts(buf); - showVerbose(buf); - - (void) snprintf(buf,sizeof(buf)-1,"Content-Disposition: %s; filename=\"%s\"\r\n", - a->content_disposition, - a->file_name); - msock_puts(buf); - showVerbose(buf); - - msock_puts("Content-Transfer-Encoding: base64\r\n\r\n"); - showVerbose("Content-Transfer-Encoding: base64\r\n\r\n"); - } - - fp=fopen(mime_tmpfile,"r"); - if (fp == (FILE *) NULL) - { - (void) fprintf(stderr,"Could not open tmp file \"%s\" for reading\n",mime_tmpfile); - return (-1); - } - while (fgets(mbuf,sizeof(mbuf)-1,fp)) - { - msock_puts(mbuf); - showVerbose("[C] %s",mbuf); /* new line is there */ - } - (void) fclose(fp); - unlink(mime_tmpfile); - } - - (void) snprintf(buf,sizeof(buf)-1,"\r\n--%s--\r\n",boundary); - msock_puts(buf); - showVerbose(buf); - } + /* handle MIME attachments ends */ goto done; - } + } /* is_mime */ /* mail body */ if (attach_file == NULL && the_msg == NULL) /* read from stdin */ @@ -783,6 +1277,8 @@ static int smtpMail(int sfd,char *to,char *cc,char *bcc,char *from,char *rrr,cha #endif /* WINNT */ newline_before=1; + msock_puts("\r\n"); /* RFC822 sec 3.1 */ + showVerbose("\r\n"); while (fgets(mbuf,sizeof(mbuf)-1,stdin) && (break_out == 0)) { if (newline_before && *mbuf == '.') @@ -830,10 +1326,11 @@ static int read_greetings(void) if (rc < 0) goto cleanup; - s_esmtp=g_esmtp; /* if foreced with -ehlo */ + s_esmtp=g_esmtp; /* if forced with -ehlo */ if (smtp_code != 220) { + read_smtp_multi_lines(); errorMsg("Expected smtp code 220, got %d\n",smtp_code); rc=(-1); goto cleanup; @@ -866,9 +1363,46 @@ static int read_greetings(void) } } cleanup: + smtp_sep = A_SPACE; return(rc); } +static int turn_on_raw_ssl(SOCKET sfd) +{ +#ifdef HAVE_OPENSSL + int + rc=(-1); + + SSL + *ssl; + + ssl=msock_get_ssl(); + if (ssl) + { + if (!SSL_set_fd(ssl,sfd)) + { + errorMsg("turn_on_raw_ssl: failed to set socket %d to SSL\n",sfd); + return(-1); + } + /* must set back to msock's static */ + msock_set_ssl(ssl); + rc=SSL_connect(ssl); + if (rc < 1) + { + errorMsg("turn_on_raw_ssl: SSL connection failed\n"); + ERR_print_errors_fp(stderr); + return(-1); + } + print_cert_info(ssl); + /* tell msock everything is ssl after that */ + msock_turn_ssl_on(); + rc=0; + return(0); + } +#endif /* HAVE_OPENSSL */ + return(-1); +} + /* It's stupid, I need to change all the args to a struct, one of those * days! I'll do it */ @@ -877,7 +1411,7 @@ cleanup: int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub, char *smtp_server,int smtp_port,char *helo_domain, char *attach_file,char *txt_msg_file,char *the_msg,int is_mime,char *rrr,char *rt, - int add_dateh) + int add_dateh,char* return_path_addr) { SOCKET sfd; @@ -885,6 +1419,7 @@ int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub, TheMail *mail; + Sll *al; @@ -893,11 +1428,14 @@ int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub, char *mech=NULL, - *b64=NULL, *auth=NULL; - unsigned long - b64len=0; + /* + unsigned char + *b64=NULL; + */ + char + *b64 = NULL; int authenticated=0; @@ -949,10 +1487,11 @@ int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub, mail=newTheMail(); if (mail == (TheMail *) NULL) { - (void) fprintf(stderr,"Error: malloc failed in createTheMail()\n"); + errorMsg("Error: malloc failed in createTheMail()\n"); return (-1); } + showVerbose("Connecting to %s:%d\n",smtp_server,smtp_port); /* open the network connection */ sfd=smtpConnect(smtp_server,smtp_port); if (sfd == INVALID_SOCKET) @@ -961,6 +1500,11 @@ int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub, goto cleanup; } + if (g_do_ssl) /* smtp.gmail:465 supports it for example */ + { + turn_on_raw_ssl(sfd); + } + /* read greeting */ rc=read_greetings(); if (rc < 0) @@ -984,21 +1528,31 @@ int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub, } } - auth=check_server_cap("AUTH"); + if (g_do_auth || g_auth_cram_md5 || g_auth_login || g_auth_plain) + { + auth=check_server_cap("AUTH"); + } if (!auth) goto MailFrom; + /* + (void) fprintf(stderr,"auth=%s\n",auth); + (void) fprintf(stderr," g_auth_cram_md5=%d; g_auth_login=%d; g_auth_plain=%d\n", g_auth_cram_md5, g_auth_login, g_auth_plain); + */ + + /* if (auth && g_do_auth) { g_auth_cram_md5=1; g_auth_login=1; g_auth_plain=1; } + */ /* Try CRAM-MD5 first */ mech="CRAM-MD5"; if (g_auth_cram_md5 && check_server_cap(mech)) { char - *cmd5; + *cmd5 = NULL; CHECK_USERNAME(mech); CHECK_USERPASS(mech); @@ -1022,7 +1576,13 @@ int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub, rc=(-1); goto cleanup; } - cmd5=encode_cram_md5(smtp_line,g_username,g_userpass); + cmd5 = encode_cram_md5(smtp_line,g_username,g_userpass); + if (cmd5 == NULL) + { + errorMsg("Could not encode CRAM-MD5"); + rc = (-1); + goto cleanup; + } memset(buf,0,sizeof(buf)); (void) snprintf(buf,sizeof(buf)-1,"%s\r\n",cmd5); showVerbose("[C] %s",buf); @@ -1039,7 +1599,15 @@ int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub, showVerbose("%s Authentication succeeded\n",mech); authenticated++; - + if (cmd5) + { + (void) free((char *) cmd5); + } + } + else + { + if (g_auth_cram_md5) + showVerbose("Server does not support AUTH CRAM-MD5\n"); } if (authenticated) goto MailFrom; @@ -1065,19 +1633,21 @@ int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub, rc=(-1); goto cleanup; } - + /* b64=mutils_encode_base64(g_username,strlen(g_username),&b64len); + b64[b64len-2]='\0'; + */ + b64=mutils_encode_base64_noformat(g_username,strlen(g_username)); if (b64 == NULL) { - errorMsg("Could not base64 encode user: %s",buf); + errorMsg("Could not base64 encode user: %s",g_username); rc=(-1); goto cleanup; } - /* mutils_encode_base64 adds CRLF */ - b64[b64len-2]='\0'; memset(buf,0,sizeof(buf)); (void) snprintf(buf,sizeof(buf)-1,"%s\r\n",b64); + showVerbose("[C] %s",buf); msock_puts(buf); read_smtp_line(); if (smtp_code != 334) @@ -1089,19 +1659,23 @@ int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub, goto cleanup; } + /* b64=mutils_encode_base64(g_userpass,strlen(g_userpass),&b64len); + b64[b64len-2]='\0'; + */ + b64=mutils_encode_base64_noformat(g_userpass,strlen(g_userpass)); if (b64 == NULL) { - errorMsg("Could not base64 encode user: %s",buf); + errorMsg("Could not base64 encode passworf of user: %s",g_username); rc=(-1); goto cleanup; } - /* mutils_encode_base64 adds CRLF */ - b64[b64len-2]='\0'; memset(buf,0,sizeof(buf)); (void) snprintf(buf,sizeof(buf)-1,"%s\r\n",b64); + showVerbose("[C] %s",buf); msock_puts(buf); + read_smtp_line(); if (smtp_code != 235) { @@ -1113,6 +1687,12 @@ int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub, } authenticated++; } + else + { + if (g_auth_login) + showVerbose("Server does not support AUTH LOGIN\n"); + } + if (authenticated) goto MailFrom; @@ -1131,6 +1711,7 @@ int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub, CHECK_USERNAME(mech); CHECK_USERPASS(mech); + showVerbose("Using AUTH %s\n",mech); memset(buf,0,sizeof(buf)); /* ** authzid\0authid\0pass @@ -1143,9 +1724,19 @@ int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub, memcpy(buf + ulen + 2,g_userpass,plen); len=ulen + plen + 2; +#if 0 b64=mutils_encode_base64(buf,len,&b64len); /* mutils_encode_base64 adds CRLF */ b64[b64len-2]='\0'; +#endif + b64=mutils_encode_base64_noformat(buf,len); + if (b64 == NULL) + { + errorMsg("Could not base64 for AUTH-PLAIN for user: %s",g_username); + rc=(-1); + goto cleanup; + } + (void) snprintf(buf,sizeof(buf)-1,"AUTH PLAIN %s\r\n",(char *) b64); showVerbose("[C] %s",buf); @@ -1163,6 +1754,11 @@ int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub, showVerbose("PLAIN Authentication succeeded\n"); authenticated++; } + else + { + if (g_auth_plain) + showVerbose("Server does not support AUTH PLAIN\n"); + } if (authenticated) goto MailFrom; @@ -1173,22 +1769,16 @@ int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub, { if (check_server_cap("CRAM-MD5")) { - (void) fprintf(stderr, -" *Server supports AUTH CRAM-MD5."); - (void) fprintf(stderr, -" Enable with -auth-cram-md5 or -auth\n"); + (void) fprintf(stderr, +" * Server supports AUTH CRAM-MD5."); } } if (!g_auth_login) { if (check_server_cap("LOGIN")) { - (void) fprintf(stderr, -" *Server supports AUTH LOGIN."); - (void) fprintf(stderr, -" Enable with -auth-login or -auth\n"); - (void) fprintf(stderr, -" AUTH LOGIN should be used if server supports STARTTLS (-starttls)\n"); + (void) fprintf(stderr, +" * Server supports AUTH LOGIN.\n"); } } @@ -1196,18 +1786,23 @@ int send_the_mail(char *from,char *to,char *cc,char *bcc,char *sub, { if (check_server_cap("PLAIN")) { - (void) fprintf(stderr, -" *Server supports AUTH PLAIN."); - (void) fprintf(stderr, -" Enable with -auth-plain or -auth\n"); - (void) fprintf(stderr, -" AUTH PLAIN should be used if server supports STARTTLS (-starttls)\n"); + (void) fprintf(stderr, +" * Server supports AUTH PLAIN.\n"); } } + if (!authenticated) + { + (void) fprintf(stderr, +" Use -auth or specify a mechanism that server supports. exiting.\n"); + exit_error(); + } } MailFrom: - rc=smtp_MAIL_FROM(from); + if (return_path_addr) + rc=smtp_MAIL_FROM(return_path_addr); + else + rc=smtp_MAIL_FROM(from); if (rc != 0) goto cleanup; @@ -1220,8 +1815,10 @@ MailFrom: goto cleanup; rc=smtpMail(sfd,to,cc,bcc,from,rrr,rt,sub,attach_file,txt_msg_file,the_msg,is_mime,add_dateh); + RETURN_IF_NOT_ZERO(rc); rc=smtpEom(sfd); + RETURN_IF_NOT_ZERO(rc); smtp_QUIT(); cleanup: @@ -1230,35 +1827,64 @@ cleanup: /* ** print info about SMTP server on stdout +** return 0 on success -1 on error */ -void show_smtp_info(char *smtp_server,int port,char *domain) +int show_smtp_info(char *smtp_server,int port,char *domain) { int fd, - rc; - char - *x; + rc = (-1); +#ifdef HAVE_OPENSSL + SSL + *ssl=NULL; +#endif /* HAVE_OPENSSL */ + g_verbose=1; - x="localhost"; - if (mutilsStrncasecmp(smtp_server,x,strlen(x)) == 0) - { - print_info("SMTP serve: localhost, specify different one with -smtp \n"); - } - else - { - print_info("SMTP server: %s\n",smtp_server); - } + print_info("Connecting to SMTP server: %s at Port: %d\n",smtp_server,port); + print_info("Connection timeout: %d secs\n",g_connect_timeout); /* connect */ fd=smtpConnect(smtp_server,port); if (fd == INVALID_SOCKET) { + rc = (-1); goto ExitProcessing; } +#ifdef HAVE_OPENSSL + if (g_do_ssl) + { + ssl=msock_get_ssl(); + if (ssl) + { + if (!SSL_set_fd(ssl,fd)) + { + errorMsg("failed to set socket to SSL\n"); + goto ExitProcessing; + } + /* must set back to msock's static */ + msock_set_ssl(ssl); + rc=SSL_connect(ssl); + if (rc < 1) + { + errorMsg("SSL connection failed\n"); + ERR_print_errors_fp(stderr); + goto ExitProcessing; + } + print_cert_info(ssl); + /* tell msock everything is ssl after that */ + msock_turn_ssl_on(); + rc=0; + } + } +#endif /* HAVE_OPENSSL */ + /* read greeting */ rc=read_greetings(); if (rc < 0) + { + errorMsg("Could not read greetings\n"); goto ExitProcessing; + } /* say HELO/EHLO */ say_helo(domain); @@ -1277,6 +1903,6 @@ void show_smtp_info(char *smtp_server,int port,char *domain) smtpDisconnect(); ExitProcessing: - return; + return (rc); } diff --git a/coregrade/src/mailsend/test/blue.png b/coregrade/src/mailsend/test/blue.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0a0a240b909205746601ec16cd5785b8af7375 GIT binary patch literal 3166 zcmbVPc{CIZ_nw8ZjHO<(h3U0MS)z#~lwIh}PPVa*7{XX;GE7AFcVwwSC{&h=vF}S| zl&zGpG+7EmgTV-6ET7;1zjMBGzI)DdpL3sc&;9Q{=icOhtWEiOC3pb<0Kd7JkYL;)jkx zg!uxZqM}p-f&;_75qEu6L&E&?*K{QS0O)sfqic521*?UD|Jd7~CLeKGo@g)c{#%nb zMBIk(uZZ)sNo_tM!0yu21ab;3o_}ZaT_7w>d8qtsM7cslkVTzIweS;5OK(#Bde%eU z*WA3lJy6ikx!rcyAp<);xnk&w4i{*}YGQ_`N8B-m4LhtlN*x7D=>_g9!pwN%O~S|e ztL_-yO3&Dgx^;0}SpM3fDsFMg2ztXC>f$7E`*ZK;#6ywXK9PFj#m3@CWwo3t=hIb? zh=8DL|8L7(H|RNC$rE#tb0E~}l+tbcoY(9;GQs-G!u3rY6&Z}uUA zB1%dZX!b738eR!4R3#;uQ>PZur?pb*QI(_FIbX2zkNZEDD0h%$HDX#V#!KS+8&S$d zX?*xW%ZP%4m7|%DJB=;P_T2QXfJy@aDVrA>PHhfuMMWVUeY2@*1cjGLqL_p1%d9!NVryI78`kozbEiXs6|;5gfR&6yxYZKVV5~v$x}jB(%Td-+c{v+X zdND?-?xm~Wl<@D3@Ch6g?!L@%VFbTKX;4V}weJr(W$2XT^Dc5>11d5CN&SZh%0Jrg z?GJmCvsM1?Ie$KW)P@=AD*3_pv2%h~WJ^8qZ7UHXFfVAk)3Z(YZ+w)nem^OG$Tz6U z4Eeg>_GYr3Lj@XvNEglBi7L=jA^9ZtH;2j;>b%+9UMd-tyjrmW6*&IXH?(D z-N=grb7iZ@aXij&AaedV0F|S=~g$Vm$(3Fw;pbu=Zt8CkY`~J$?GNDt)>VSL2R6 zGpd|0X1CTRD0U^6-4+S#z<|HLs#8F!k~4s^Cd5kw4bF*L!@|>=kcqau2DxsRvKylG zODF=|;}@Y-_|%&NAXuB~$>&`U0YysEEzB(K*j)z@VG&TKZZE9qvSpzKVtWZ#1AvNdwmt-TE?8tV!4rG0Q;61zpF6J-5#S^BwDQhV zCw7O~IB@-=M@snvWuwpaYgVLmo)$i6x-EBZU}Y=iF`7<^rX7?dWe@#2IoV?S$Kh$5cT?YfJYuDPq|P6=@e8Nv zPl$wtbfF?Cb)>kPdI2udhrK-#=hj6ydH6XK`R1^`@-bz_XJ&C+$nZAYpyk?3Y}fCF z)ro8VdKZPov@(Wf)_&~YDzM(W4Zz%!msi%$Od7u*n}pC@8W(J)N$)vNP6{)Yzfwr1 zCLnY3AW&*bToLx?RWUjFFCL({)$hx%$zVomF&z_Oz+&zebtip4puZk4{)V*G`OGd9;D7IDX z>!Hy!UwG|D7h|FlO<}soVcEZNzRQ$!;6qMMzBBFUj|IW&o{0{$MUeg>H=ks`E^s>5 zihoB+z@$k*VN`K&*v~nQiS6yeVGr2(2NliQOxE_QaVLBDcdV4o`(iy=H;WWAt91Ae z3}a(ob7Xh>SGi>XArl^ubvcA#UaOkdzuJ_#GWjxyHWIEwz|+_awyJ4lqnTZ{g%*l% zS^L6OH#rq6DN`eLH*$uI{=Vl>$PpG|vNu5HjYh=mmgvwT^JyY)T|QhCNJ{y1UimNQ zPO9YGWZkQ)y%p6Bi~fWDTYXQfBt-oii*!Hs+sCt*&s62!@5s3^7@7$UKFK7vR=Ke4 zDjoMuYHTkr5>^@LXx#vcOW}3+bK$}rm4s~JJ*y5(<(Za0^vMD}mfZSOVE6mv_DhOM zLs>n^LfvFo-6T@=*e}$&o{sx*^8h2)E^7UXn*Mn6)f205#NWgRm&dc$pU-(;tQFKl zx;J@E>n@5*1|1$QA^U!U)2ut#!PXb9+{qJy%jlFU zr;-)5&VKC(hM&6HO`i=fJde=eP)|Qzc_>$fKd-t(qOv%yF!}cG3nlBok!iyb# z&M$cxqu^ROIz7O&oW1FAzkoS z%#4>>KflY$488z0b7bKLJ}5M*9yv%~;XxvNecv3sOB$Q!O?tQQE%AWKzrK)1ErO?Z z@^sT}Y=_kC5vib$@}t;&$B(+tn#fYA9D=DM5mQq*H1G_J0ZH+zeLL@5oPiZ{+#s&VqUq z$27w<{-G0es3^p$3DflZ1bS`InmqW7f^KP%*>ti|xFC)xOH2jRymb5JvSM|m4FO#m3V)&1juH&Y5W z;y(ZL!y>a&^3XtbHl~V>AIMvF6vvB078be()V{{@qS5K6is$Fo3lUCY2Yo3i=WgSP zWnX%E?^aYyoD4uMmH+d<-M*h8{jVVvG5e-s>E$geRflSQZn8hE%#J=B{{jGWV{4 + testing embedded image in mail + + This is a test of embedding an image in HTML and relate the img + tag in the HTML document with the image by mailsend while sending + mail. We will create an img tag in the HTML document with: +

+            <img src="cid:xx_deadbeefcafe" alt="inline imge">
+        
+

+ inline imge +

+The real HTML file is test/embed_image1.html, available with the source distribution. +

+Notice: only content id is specified with cid, no path of image is specified. +

+ While sending mail with mailsend, we will specify the content id + xx_deadbeefcafe with flag -content-id for the image. +

+Example: +

+Note: Requires mailsend v1.17b15+. The following command was used to +send this mail: +

+    mailsend -v -sub "Testing embedding image in HTML" 
+    -from example@gmail.com -to example@gmail.com 
+    -smtp smtp.gmail.com -port 587 -starttls -auth 
+    -user mailsend.test@gmail.com 
+    -cs ISO-8859-1 
+    -content-type "multipart/related" 
+    -mime-type text/html 
+    -disposition inline 
+    -enc-type "none" 
+    -attach "test/embedded_image1.html" 
+    -mime-type image/png 
+    -enc-type "base64" 
+    -disposition inline 
+    -content-id "xx_deadbeefcafe" 
+    -cs "none" 
+    -attach "test/blue.png"
+        
+

+

+ Any mail reader that understands multipart-related Content-type will + display the html and the image together. Without the content id, the HTML + and the image will show up as 2 separate attachments. +

+ Tested with gmail, outlook and yahoo mail which can display HTML + file with embedded image. + + diff --git a/coregrade/src/mailsend/test/embed_image2.html b/coregrade/src/mailsend/test/embed_image2.html new file mode 100644 index 0000000..73d3f0c --- /dev/null +++ b/coregrade/src/mailsend/test/embed_image2.html @@ -0,0 +1,69 @@ + + testing embedded image in mail + +This is a test of embedding multiple images in HTML and relate the img +tags in the HTML document with the images by mailsend while sending +mail. We will embed two images side by side inside a HTML table. + +The real HTML file is in test/embed_image2.html, available with source distribution. The mail is sent with the script test/test_emded2.sh. + +The Table will look like: +

+
+

+<table border="1">
+    <tr>
+        <td> <img src="cid:img1_deadbeefcafe" alt="inline image 1"></td>
+        <td> <img src="cid:img2_deadbeefcafe" alt="inline image 2"></td>
+    </tr>
+</table>
+
+Notice: For the img tag, only the content id is specified with cid but no +path of the image is specified. +

+
+ + + + + +
inline imge 1 inline imge 2
+

+
+

+ While sending mail with mailsend, we will specify the content ids + ith flag -content-id for the specfic image. +

+Example: +

+Note: Requires mailsend v1.17b15+. The following command is used to send this mail: +

+    mailsend -v -sub "Testing embedding image in HTML" 
+    -from example@gmail.com -to example@gmail.com 
+    -smtp smtp.gmail.com -port 587 -starttls -auth 
+    -user mailsend.test@gmail.com 
+    -cs ISO-8859-1 
+    -content-type "multipart/related" 
+    -mime-type text/html 
+    -disposition inline 
+    -enc-type "none" 
+    -attach "test/embedded_image2.html" 
+    -mime-type image/png 
+    -enc-type "base64" 
+    -disposition inline 
+    -content-id "img1_deadbeefcafe" 
+    -cs "none" 
+    -attach "test/blue.png"
+    -content-id "img2_deadbeefcafe" 
+    -cs "none" 
+    -attach "test/green.png"
+        
+

+ Any mail reader that understands multipart-related Content-type will + display the html and the image together. Without the content id, the HTML + and the image will show up as 2 separate attachments. +

+ Tested with gmail, outlook and yahoo mail which can display HTML + file with embedded image. + + diff --git a/coregrade/src/mailsend/test/green.png b/coregrade/src/mailsend/test/green.png new file mode 100644 index 0000000000000000000000000000000000000000..19dd7d454f1957622daf69dc1a82d46f2832507b GIT binary patch literal 4227 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 LY|jV+4xIQugUT*~ literal 0 HcmV?d00001 diff --git a/coregrade/src/mailsend/test/test.png b/coregrade/src/mailsend/test/test.png new file mode 100644 index 0000000000000000000000000000000000000000..803790cebd94d635fa8246736053a77b22564aa8 GIT binary patch literal 545 zcmeAS@N?(olHy`uVBq!ia0vp^(}387i5WNn{1`8HhxtXGb2o2DwBbqF!QbjuUz7Qd=Wu07V?g~IgWvd6%kEc}{b}4xx<|L8)2HRXYV23g5iLLqs)t=xv$uGA_<3!Y " +EOF + exit 1 + end + @to = ARGV[0] + @from = ARGV[1] + end + + def check_pass + @pass = ENV['SMTP_USER_PASS'] + if !@pass + puts <<-EOF + Error: SMTP_USER_PASS env var is not set +EOF + exit + end + end + + def send_mail + html_file = Dir.pwd + "/test/embed_image1.html" + image = Dir.pwd + "/test/blue.png" + content_id = "xx_deadbeefcafe" + + cmd = "" + cmd << PROG + cmd << " " + cmd << "-v" + cmd << " " + cmd << "-sub" + cmd << " " + cmd << "\"Testing embedding image in HTML\"" + cmd << " " + cmd << "-from" + cmd << " " + cmd << @from + cmd << " " + cmd << "-to" + cmd << " " + cmd << @to + cmd << " " + cmd << "-smtp smtp.gmail.com -port 587 -starttls -auth" + cmd << " " + cmd << "-user" + cmd << " " + cmd << @from + cmd << " " + cmd << "-cs" + cmd << " " + cmd << "ISO-8859-1" + cmd << " " + cmd << "-content-type \"multipart/related\"" + cmd << " " + cmd << "-mime-type text/html" + cmd << " " + cmd << "-disposition inline" + cmd << " " + cmd << "-enc-type \"none\"" + cmd << " " + cmd << "-attach \"#{html_file}\"" + cmd << " " + cmd << "-mime-type image/png" + cmd << " " + cmd << "-enc-type \"base64\"" + cmd << " " + cmd << "-disposition inline" + cmd << " " + cmd << "-content-id \"#{content_id}\"" + cmd << " " + cmd << "-cs \"none\"" + cmd << " " + cmd << "-attach \"#{image}\"" + + log "run: #{cmd}" + system(cmd) + end + + def doit + check_args + check_pass + send_mail + end +end + +if __FILE__ == $0 + TestEmbeddedImage.new.doit +end diff --git a/coregrade/src/mailsend/test/test_emded2.sh b/coregrade/src/mailsend/test/test_emded2.sh new file mode 100755 index 0000000..f0a809b --- /dev/null +++ b/coregrade/src/mailsend/test/test_emded2.sh @@ -0,0 +1,35 @@ +#!/bin/sh +# +# +# muquit@muquit.com Dec-27-2013 +TO=$TO +if [ x"$TO" = x ]; then + echo "TO environment variable is not not" + exit 1 +fi +FROM=$FROM +if [ x"$FROM" = x ]; then + echo "FROM environment variable is not not" + exit 1 +fi + +pass=$SMTP_USER_PASS +if [ x"$pass" = x ]; then + echo "SMTP_USER_PASS environment variable is not not" + exit 1 +fi + +./mailsend -v -sub "Embed images in a HTML table. Uses explicit Conteny-Type header" \ + -from $FROM -to $TO \ + -smtp smtp.gmail.com -port 587 -starttls -auth \ + -user $FROM -cs ISO-8859-1 \ + -content-type "multipart/related" \ + -mime-type text/html \ + -disposition inline -enc-type "none" \ + -attach "test/embed_image2.html" \ + -mime-type "image/png" -enc-type "base64" \ + -disposition inline \ + -content-id "img1_deadbeefcafe" -cs "none" \ + -attach "test/blue.png" \ + -content-id "img2_deadbeefcafe" \ + -attach "test/green.png" diff --git a/coregrade/src/mailsend/test/test_emded3.sh b/coregrade/src/mailsend/test/test_emded3.sh new file mode 100755 index 0000000..83bfbe7 --- /dev/null +++ b/coregrade/src/mailsend/test/test_emded3.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +# +# muquit@muquit.com Dec-27-2013 +set -x + +TO=$TO +if [ x"$TO" = x ]; then + echo "TO environment variable is not not" + exit 1 +fi +FROM=$FROM +if [ x"$FROM" = x ]; then + echo "FROM environment variable is not not" + exit 1 +fi + +pass=$SMTP_USER_PASS +if [ x"$pass" = x ]; then + echo "SMTP_USER_PASS environment variable is not not" + exit 1 +fi + +./mailsend -sub "Embed 2 images in HTML, one below the other" \ + -from $FROM -to $TO \ + -smtp smtp.gmail.com -port 587 -starttls -auth \ + -user $FROM -cs ISO-8859-1 \ + -embed-image "test/blue.png" \ + -embed-image "test/green.png" diff --git a/coregrade/src/mailsend/test/test_gmail.bat b/coregrade/src/mailsend/test/test_gmail.bat new file mode 100755 index 0000000..66ed4e2 --- /dev/null +++ b/coregrade/src/mailsend/test/test_gmail.bat @@ -0,0 +1 @@ +mailsend.exe -to %1 -from %2 -sub "test from windows" -starttls -port 587 -auth -smtp smtp.gmail.com -user "%2" -pass %SMTP_USER_PASS% -M "hello one liner" -log "c:\Users\mqt\Downloads\m.log" diff --git a/coregrade/src/mailsend/test/test_gmail.sh b/coregrade/src/mailsend/test/test_gmail.sh new file mode 100755 index 0000000..b09a986 --- /dev/null +++ b/coregrade/src/mailsend/test/test_gmail.sh @@ -0,0 +1,81 @@ +#!/bin/sh + +# muquit@muquit.com Jan-21-2013 +#set -x +ME=`basename $0` +TO=$TO +if [ x"$TO" = x ]; then + echo "TO environment variable is not not" + exit 1 +fi +FROM=$FROM +if [ x"$FROM" = x ]; then + echo "FROM environment variable is not not" + exit 1 +fi + +if [ x"$Cc" != x ]; then + CC="-cc $Cc" +fi + +if [ x"$bcc" != x ]; then + bcc="-bc ${bcc}" +fi +echo "BCc: $bcc" + +pass=$SMTP_USER_PASS +if [ x"$pass" = x ]; then + echo "SMTP_USER_PASS environment variable is not not" + exit 1 +fi + +#SMTP=smtp.comcast.net +SMTP=smtp.gmail.com + +BINARY="./mailsend" +echo "$OS" +if [ x"$OS" = x"Windows_NT" ]; then + BINARY="./mailsend.exe" +fi +os=`uname` +os="foo" +if [ x"$os" = x"Linux" ]; then +VALGRIND_LOG=/tmp/valgrind.log +VALGRIND="valgrind -v --tool=memcheck --leak-check=yes --error-limit=yes --log-file=$VALGRIND_LOG" +/bin/rm -f $VALGRIND_LOG +else +VALGRIND="" +fi +set -x + +$VALGRIND $BINARY -to $TO ${CC} ${bcc} -from $FROM \ + -v \ + -starttls -port 587 -auth \ + -smtp $SMTP \ + -cs "utf-8" \ + -H "X-Priority: 1" -H "Importance: high" \ + -sub "testing mailsend" \ + -user "$FROM" -pass "$PASS" \ + -enc-type "none" \ + -mime-type "text/plain" \ + -M "one line attachment 1" \ + -enc-type "none" \ + -mime-type "text/plain" \ + -M "one line attachment 2" \ + -mime-type "text/html" \ + -enc-type "none" \ + -M "this is a test
" \ + -cs "utf-8" \ + -mime-type "text/plain" \ + -enc-type "base64" \ + -M "Ich lerne seit ungefähr zwei Jahren Deutsch" \ + -cs "iso-8859-1" \ + -enc-type "8bit" \ + -mime-type "text/plain" \ + -content-disposition "inline" \ + -attach "test/test.txt" \ + -attach "test/test.gif" \ + -cs "Big5" \ + -enc-type "base64" \ + -mime-type "text/plain" \ + -M "中文測試" diff --git a/coregrade/src/mailsend/test/test_gmail3.bat b/coregrade/src/mailsend/test/test_gmail3.bat new file mode 100644 index 0000000..fd94592 --- /dev/null +++ b/coregrade/src/mailsend/test/test_gmail3.bat @@ -0,0 +1 @@ +mailsend.exe -to %1 -from %2 -sub "test from windows" -starttls -port 587 -auth -smtp smtp.gmail.com -user "%2" -pass %SMTP_USER_PASS% -separator "|" -attach "c:\File,with,comma.txt|text/plain" -v diff --git a/coregrade/src/mailsend/test/test_gmail4.bat b/coregrade/src/mailsend/test/test_gmail4.bat new file mode 100644 index 0000000..e1febbe --- /dev/null +++ b/coregrade/src/mailsend/test/test_gmail4.bat @@ -0,0 +1 @@ +mailsend.exe -to %1 -from %2 -sub "test from windows" -starttls -port 587 -auth -smtp smtp.gmail.com -user "%2" -pass %SMTP_USER_PASS% -separator "|" -enc-type "base64" -attach "c:\blue,comma space.png|image/png" -v diff --git a/coregrade/src/mailsend/test/test_gmail_html.sh b/coregrade/src/mailsend/test/test_gmail_html.sh new file mode 100755 index 0000000..05c9987 --- /dev/null +++ b/coregrade/src/mailsend/test/test_gmail_html.sh @@ -0,0 +1,58 @@ +#!/bin/sh + +# muquit@muquit.com Jan-21-2013 +#set -x +ME=`basename $0` +TO=$TO +if [ x"$TO" = x ]; then + echo "TO environment variable is not not" + exit 1 +fi +FROM=$FROM +if [ x"$FROM" = x ]; then + echo "FROM environment variable is not not" + exit 1 +fi + +if [ x"$Cc" != x ]; then + CC="-cc $Cc" +fi + +if [ x"$bcc" != x ]; then + bcc="-bc ${bcc}" +fi +echo "BCc: $bcc" + +pass=$SMTP_USER_PASS +if [ x"$pass" = x ]; then + echo "SMTP_USER_PASS environment variable is not not" + exit 1 +fi + +#SMTP=smtp.comcast.net +SMTP=smtp.gmail.com + +BINARY="./mailsend" +echo "$OS" +if [ x"$OS" = x"Windows_NT" ]; then + BINARY="./mailsend.exe" +fi +os=`uname` +os="foo" +if [ x"$os" = x"Linux" ]; then +VALGRIND_LOG=/tmp/valgrind.log +VALGRIND="valgrind -v --tool=memcheck --leak-check=yes --error-limit=yes --log-file=$VALGRIND_LOG" +/bin/rm -f $VALGRIND_LOG +else +VALGRIND="" +fi +set -x + +$VALGRIND $BINARY -to $TO ${CC} ${bcc} -from $FROM \ + -v \ + -starttls -port 587 -auth \ + -smtp $SMTP \ + -sub "Hello" \ + -mime-type "text/html" \ + -M "Hello world" \ +-user "$FROM" -pass "$PASS" diff --git a/coregrade/src/mailsend/test/test_gmail_list.sh b/coregrade/src/mailsend/test/test_gmail_list.sh new file mode 100755 index 0000000..6fd4ae2 --- /dev/null +++ b/coregrade/src/mailsend/test/test_gmail_list.sh @@ -0,0 +1,86 @@ +#!/bin/sh + +# muquit@muquit.com Jan-21-2013 +#set -x +ME=`basename $0` +ARGC=$# +if [ $ARGC != 1 ]; then + echo "USage: ${ME} " + exit 1 +fi +LIST_FILE=$1 + +if [ ! -f ${LIST_FILE} ]; then + echo "File '${LIST_FILE}' does not exist" + exit 1 +fi + +TO=$TO +if [ x"$TO" = x ]; then + echo "TO environment variable is not not" + exit 1 +fi + + +FROM=$FROM +if [ x"$FROM" = x ]; then + echo "FROM environment variable is not not" + exit 1 +fi + +pass=$SMTP_USER_PASS +if [ x"$pass" = x ]; then + echo "SMTP_USER_PASS environment variable is not not" + exit 1 +fi + +#SMTP=smtp.comcast.net +SMTP=smtp.gmail.com + +BINARY="./mailsend" +echo "$OS" +if [ x"$OS" = x"Windows_NT" ]; then + BINARY="./mailsend.exe" +fi +os=`uname` +os="foo" +if [ x"$os" = x"Linux" ]; then +VALGRIND_LOG=/tmp/valgrind.log +VALGRIND="valgrind -v --tool=memcheck --leak-check=yes --error-limit=yes --log-file=$VALGRIND_LOG" +/bin/rm -f $VALGRIND_LOG +else +VALGRIND="" +fi +set -x + +$VALGRIND $BINARY -t "${TO}" -list-address ${LIST_FILE} -from $FROM \ + -v \ + -starttls -port 587 -auth \ + -smtp $SMTP \ + -cs "utf-8" \ + -H "X-Priority: 1" -H "Importance: high" \ + -sub "testing mailsend" \ + -user "$FROM" -pass "$PASS" \ + -enc-type "none" \ + -mime-type "text/plain" \ + -M "one line attachment 1" \ + -enc-type "none" \ + -mime-type "text/plain" \ + -M "one line attachment 2" \ + -mime-type "text/html" \ + -enc-type "none" \ + -M "this is a test
" \ + -cs "utf-8" \ + -mime-type "text/plain" \ + -enc-type "base64" \ + -M "Ich lerne seit ungefähr zwei Jahren Deutsch" \ + -cs "iso-8859-1" \ + -enc-type "8bit" \ + -mime-type "text/plain" \ + -content-disposition "inline" \ + -attach "test/test.txt" \ + -attach "test/test.gif" \ + -cs "Big5" \ + -enc-type "base64" \ + -mime-type "text/plain" \ + -M "中文測試" diff --git a/coregrade/src/mailsend/test/test_gmail_quiet.sh b/coregrade/src/mailsend/test/test_gmail_quiet.sh new file mode 100755 index 0000000..bd4d85b --- /dev/null +++ b/coregrade/src/mailsend/test/test_gmail_quiet.sh @@ -0,0 +1,72 @@ +#!/bin/sh + +# muquit@muquit.com Jan-21-2013 +#set -x +ME=`basename $0` +TO=$TO +if [ x"$TO" = x ]; then + echo "TO environment variable is not not" + exit 1 +fi +FROM=$FROM +if [ x"$FROM" = x ]; then + echo "FROM environment variable is not not" + exit 1 +fi + +pass=$SMTP_USER_PASS +if [ x"$pass" = x ]; then + echo "SMTP_USER_PASS environment variable is not not" + exit 1 +fi + +#SMTP=smtp.comcast.net +SMTP=smtp.gmail.com + +BINARY="./mailsend" +echo "$OS" +if [ x"$OS" = x"Windows_NT" ]; then + BINARY="./mailsend.exe" +fi +os=`uname` +os="foo" +if [ x"$os" = x"Linux" ]; then +VALGRIND_LOG=/tmp/valgrind.log +VALGRIND="valgrind -v --tool=memcheck --leak-check=yes --error-limit=yes --log-file=$VALGRIND_LOG" +/bin/rm -f $VALGRIND_LOG +else +VALGRIND="" +fi +#set -x + +$VALGRIND $BINARY -to $TO -from $FROM \ + -q \ + -starttls -port 587 -auth \ + -smtp $SMTP \ + -cs "utf-8" \ + -H "X-Priority: 1" -H "Importance: high" \ + -sub "testing mailsend" +cc +bc \ + -user "$FROM" -pass "$PASS" \ + -enc-type "none" \ + -mime-type "text/plain" \ + -M "one line attachment 1" \ + -enc-type "none" \ + -mime-type "text/plain" \ + -M "one line attachment 2" \ + -mime-type "text/html" \ + -enc-type "none" \ + -M "this is a test
" \ + -cs "utf-8" \ + -mime-type "text/plain" \ + -enc-type "base64" \ + -M "Ich lerne seit ungefähr zwei Jahren Deutsch" \ + -cs "iso-8859-1" \ + -enc-type "8bit" \ + -mime-type "text/plain" \ + -content-disposition "inline" \ + -attach "test/test.txt" \ + -attach "test/test.gif" \ + -cs "Big5" \ + -enc-type "base64" \ + -mime-type "text/plain" \ + -M "中文測試" diff --git a/coregrade/src/mailsend/test/test_issue108.sh b/coregrade/src/mailsend/test/test_issue108.sh new file mode 100755 index 0000000..4001cd3 --- /dev/null +++ b/coregrade/src/mailsend/test/test_issue108.sh @@ -0,0 +1,64 @@ +#!/bin/sh + +# muquit@muquit.com Jan-21-2013 +#set -x +ME=`basename $0` +TO=$TO +if [ x"$TO" = x ]; then + echo "TO environment variable is not not" + exit 1 +fi +FROM=$FROM +if [ x"$FROM" = x ]; then + echo "FROM environment variable is not not" + exit 1 +fi + +if [ x"$Cc" != x ]; then + CC="-cc $Cc" +fi + +if [ x"$bcc" != x ]; then + bcc="-bc ${bcc}" +fi +echo "BCc: $bcc" + +pass=$SMTP_USER_PASS +if [ x"$pass" = x ]; then + echo "SMTP_USER_PASS environment variable is not not" + exit 1 +fi + +#SMTP=smtp.comcast.net +SMTP=smtp.gmail.com + +BINARY="./mailsend" +echo "$OS" +if [ x"$OS" = x"Windows_NT" ]; then + BINARY="./mailsend.exe" +fi +os=`uname` +os="foo" +if [ x"$os" = x"Linux" ]; then +VALGRIND_LOG=/tmp/valgrind.log +VALGRIND="valgrind -v --tool=memcheck --leak-check=yes --error-limit=yes --log-file=$VALGRIND_LOG" +/bin/rm -f $VALGRIND_LOG +else +VALGRIND="" +fi +set -x + +$VALGRIND $BINARY -to $TO ${CC} ${bcc} -from $FROM \ + -v \ + -starttls -port 587 -auth \ + -smtp $SMTP \ + -cs "utf-8" \ + -sub "testing issue 108" \ + -user "$FROM" -pass "$PASS" \ + -cs "utf-8" \ + -mime-type "text/plain" \ + -enc-type "base64" \ + -content-disposition "inline" \ + -M "one line attachment base64 encoding" \ + -mime-type "application/pdf" \ + -attach "/home/muquit/junk/test.pdf" diff --git a/coregrade/src/mailsend/test/test_onelines1.sh b/coregrade/src/mailsend/test/test_onelines1.sh new file mode 100755 index 0000000..eb835b9 --- /dev/null +++ b/coregrade/src/mailsend/test/test_onelines1.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +# test online messages with -M +# Issue# 45 +# muquit@muquit.com Feb-01-2014 +TO=$TO +if [ x"$TO" = x ]; then + echo "TO environment variable is not not" + exit 1 +fi +FROM=$FROM +if [ x"$FROM" = x ]; then + echo "FROM environment variable is not not" + exit 1 +fi + +pass=$SMTP_USER_PASS +if [ x"$pass" = x ]; then + echo "SMTP_USER_PASS environment variable is not not" + exit 1 +fi + +./mailsend -v -sub "testing oneline messages no encoding type" \ + -from $FROM -to $TO \ + -smtp smtp.gmail.com -port 587 -starttls -auth \ + -user $FROM \ + -M "Three one line messages including this one" \ + -M "one line message 1" \ + -M "one line message 2" diff --git a/coregrade/src/mailsend/test/test_readtimeout.sh b/coregrade/src/mailsend/test/test_readtimeout.sh new file mode 100755 index 0000000..b91ff2b --- /dev/null +++ b/coregrade/src/mailsend/test/test_readtimeout.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +# test read timeout, use -startls and specify port 465 +# Issue #61 +# muquit@muquit.com Aug-17-2014 +TO=$TO +if [ x"$TO" = x ]; then + echo "TO environment variable is not not" + exit 1 +fi +FROM=$FROM +if [ x"$FROM" = x ]; then + echo "FROM environment variable is not not" + exit 1 +fi + +pass=$SMTP_USER_PASS +if [ x"$pass" = x ]; then + echo "SMTP_USER_PASS environment variable is not not" + exit 1 +fi +OS=`uname -s` +if [ x"$OS" = x"MINGW32_NT-6.1" ]; then +MAILSEND=mailsend.exe +else +MAILSEND=./mailsend +fi + +N=3 +echo "mailsend should timeout after $N seconds" +# It should timeout after N seconds +$MAILSEND -v -sub "testing read timeout" \ + -from $FROM -to $TO \ + -smtp smtp.gmail.com -port 465 -starttls -auth \ + -user $FROM \ + -read-timeout $N \ + -M "This mail will never be sent" +echo "Exit code: $?" diff --git a/coregrade/src/mailsend/test/testimage.svg b/coregrade/src/mailsend/test/testimage.svg new file mode 100644 index 0000000..2795140 --- /dev/null +++ b/coregrade/src/mailsend/test/testimage.svg @@ -0,0 +1,114 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + mailsendTest Image + + + diff --git a/coregrade/src/mailsend/utils.c b/coregrade/src/mailsend/utils.c old mode 100644 new mode 100755 index 793462b..ae6948f --- a/coregrade/src/mailsend/utils.c +++ b/coregrade/src/mailsend/utils.c @@ -8,10 +8,22 @@ */ #include "mailsend.h" +#include "copyright.h" + #define DAY_MIN (24 * HOUR_MIN) /* minutes in a day */ #define HOUR_MIN 60 /* minutes in an hour */ #define MIN_SEC 60 /* seconds in a minute */ +static struct _MimeType +{ + char + *ext, + *val; +} s_mime_type[] = +{ +#include "mime_types.h" +}; + /* ** returns a positive number if the file descriptor is connected to @@ -42,10 +54,50 @@ int isInteractive(void) return(0); } + +/* +** arg: type +** at this time valid types are: "base64", "none" +*/ +int get_encoding_type(const char *type) +{ + if (type == NULL || *type == '\0') + { + return ENCODE_BASE64; + } + if (strncmp("base64", type, 6) == 0) + { + return ENCODE_BASE64; + } + else if (strncmp("none", type, 4) == 0) + { + return ENCODE_NONE; + } + + return ENCODE_BASE64; +} + +int get_content_disposition(const char *disposition) +{ + if (disposition == NULL || *disposition == '\0') + { + return CONTENT_DISPOSITION_ATTACHMENT; + } + if (strncmp("attachment", disposition, 10) == 0) + { + return CONTENT_DISPOSITION_ATTACHMENT; + } + else if (strncmp("inline", disposition, 6) == 0) + { + return CONTENT_DISPOSITION_INLINE; + } + return CONTENT_DISPOSITION_ATTACHMENT; +} + /* ** duplicate a string. exits on failure */ -char *xStrdup (char *string) +char *xStrdup (const char *string) { char *tmp; @@ -59,13 +111,34 @@ char *xStrdup (char *string) if (tmp == (char *) NULL) { (void) fprintf(stderr,"Error: mystrdup(): memory allocation problem\n"); - exit(0); + exit_error(); } /* it's safe to copy this way */ (void) strcpy(tmp, string); return (tmp); } +void log_info(const char *fmt, ...) +{ + va_list + args; + + va_start(args, fmt); + va_end(args); +} + +void log_debug(const char *fmt, ...) +{ +} + +void log_error(const char *fmt, ...) +{ +} + +void log_fatal(const char *fmt, ...) +{ +} + void errorMsg(char *format,...) { va_list @@ -75,6 +148,21 @@ void errorMsg(char *format,...) (void) fprintf (stderr,"Error: "); vfprintf(stderr,format,args); (void) fprintf(stderr,"\n"); + (void) fflush(stderr); + + if (g_log_fp != NULL) + { + MutilsTime + mt; + char + timebuf[64]; + mutils_time_now(&mt); + mutils_time_fmt(&mt,timebuf,sizeof(timebuf)); + (void) fprintf (g_log_fp,"%s: Error: ",timebuf); + vfprintf(g_log_fp,format,args); + (void) fprintf(g_log_fp,"\n"); + (void) fflush(g_log_fp); + } va_end(args); } @@ -82,15 +170,35 @@ void showVerbose(char *format,...) { va_list args; + if (g_quiet) return; if (g_verbose == 1) { - va_start(args,format); - vfprintf(stdout,format,args); - (void) fflush(stdout); - va_end(args); + if (isInConsole(_fileno(stdout))) + { + va_start(args,format); + vfprintf(stdout,format,args); + (void) fflush(stdout); + va_end(args); + } + + if (g_log_fp != NULL) + { + MutilsTime + mt; + char + timebuf[64]; + mutils_time_now(&mt); + mutils_time_fmt(&mt,timebuf,sizeof(timebuf)); + (void) fprintf(g_log_fp,"%s: " ,timebuf); + va_start(args,format); + vfprintf(g_log_fp,format,args); + (void) fflush(g_log_fp); + va_end(args); + } + } } @@ -106,7 +214,50 @@ void print_info(char *format,...) vfprintf(stdout,format,args); (void) fflush(stdout); va_end(args); +} +void write_log(char *format,...) +{ + va_list + args; + + MutilsTime + mt; + char + timebuf[64]; + + if (g_log_fp == NULL) + return; + + mutils_time_now(&mt); + mutils_time_fmt(&mt,timebuf,sizeof(timebuf)); + + va_start(args,format); + (void) fprintf(g_log_fp,"%s: " ,timebuf); + vfprintf(g_log_fp,format,args); + (void) fflush(g_log_fp); + va_end(args); +} + +void close_log(void) +{ + if (g_log_fp != NULL) + { + (void) fclose(g_log_fp); + g_log_fp = NULL; + } +} + +void exit_ok(void) +{ + close_log(); + exit(0); +} + +void exit_error(void) +{ + close_log(); + exit(1); } @@ -188,6 +339,7 @@ int validateMusts(char *from,char *to,char *smtp_server,char *helo_domain) char *askFor(char *buf,int buflen,char *label,int ask) { + char *s; if (label == NULL || *label == '\0') return (NULL); @@ -195,13 +347,13 @@ char *askFor(char *buf,int buflen,char *label,int ask) again: if (isInConsole(_fileno(stdin))) { - (void) fprintf(stdout,label); + (void) fprintf(stdout,"%s",label); (void) fflush(stdout); (void) fflush(stderr); } - (void) fgets(buf,buflen,stdin); - if (*buf == '\0' || *buf == '\n') + s = fgets(buf,buflen,stdin); + if (s == NULL || *buf == '\0' || *buf == '\n') { if (ask == EMPTY_NOT_OK) goto again; @@ -259,11 +411,13 @@ int get_filepath_mimetype(char *str,char *filepath,int fp_size,char *mype_type,i { int + separator, rc=0; char *fp, *mt; - if ((mt=strchr(str,ATTACHMENT_SEP))) + separator = *g_attach_sep; + if ((mt=strchr(str,separator))) { *mt++='\0'; } @@ -272,11 +426,11 @@ int get_filepath_mimetype(char *str,char *filepath,int fp_size,char *mype_type,i errorMsg("Could not determine mime-type from input: %s\n",str); return(-1); } - mutilsSafeStrcpy(mype_type,mt,mt_size); + mutilsSafeStrcpy(mype_type,mt,mt_size-1); /* get the filepath out */ fp=str; - mutilsSafeStrcpy(filepath,fp,fp_size); + mutilsSafeStrcpy(filepath,fp,fp_size-1); return(rc); } @@ -289,6 +443,7 @@ void initialize_openssl(char *cipher) SSL_library_init(); SSL_load_error_strings(); RAND_seed(rnd_seed,sizeof(rnd_seed)); + OpenSSL_add_all_algorithms(); ssl_ctx=SSL_CTX_new(SSLv23_client_method()); if (ssl_ctx == NULL) { @@ -403,11 +558,15 @@ int rfc822_date(time_t when,char *datebuf,int bufsiz) /* ** return 0 on success, -1 on failure +** super simple naive funtion to detect if a file is +** binary or not.. it's just to prevent attaching binary file +** if no encoding type is specified. It's not a simple task +** to detect if a file is binary or not correctly. */ int guess_file_type(char *file,unsigned int *flag) { char - buf[BUFSIZ]; + buf[513]; int i, @@ -474,6 +633,7 @@ ExitProcessing: } +/* static int unix2dos(FILE *ifp,FILE *ofp) { int @@ -489,7 +649,7 @@ static int unix2dos(FILE *ifp,FILE *ofp) return(-1); #ifdef WINNT _setmode(_fileno(ofp),_O_BINARY); -#endif /* WINNT */ +#endif while(!feof(ifp)) { n=fread(buf,1,BUFSIZ,ifp); @@ -513,7 +673,82 @@ static int unix2dos(FILE *ifp,FILE *ofp) } } } +*/ +void print_copyright(void) +{ + char + **p; + + for (p = mailsend_copyright; *p != NULL; p++) + { + (void) fprintf(stdout,"%s\n",*p); + } + (void) fflush(stdout); +} + +/* +** Return the MIME type of the file +** Parameters: +** path - path of the file +** Return Values: +** mime type +** Side Effects: +** none +** Comments: +** If no extension is found, "text/plain" will be returned +** Development History: +*/ +char *get_mime_type(char *path) +{ + char + *npath = NULL, + *ext = NULL; + + char + *text_plain = "text/plain"; + int + i; + + if (path == NULL || *path == '\0') + { + return(text_plain); + } + + /* Issue #140. path was modified */ + npath = xStrdup(path); + ext = mutilsExtensionLower(npath); + for (i=0; i < sizeof(s_mime_type)/sizeof(*s_mime_type); i++) + { + if (strcmp(s_mime_type[i].ext, ext) == 0) + { + if (npath != NULL) + { + (void) free((char *) npath); + } + return (s_mime_type[i].val); + } + } + if (npath != NULL) + { + (void) free((char *) npath); + } + + return(text_plain); +} + +void show_mime_types() +{ + int + i; + for (i=0; i < sizeof(s_mime_type)/sizeof(*s_mime_type); i++) + { + (void) fprintf(stdout,"%s\t%s\n", + s_mime_type[i].val, + s_mime_type[i].ext); + } + +} #ifdef HAVE_OPENSSL void print_cert_info(SSL *ssl) @@ -576,8 +811,19 @@ char *encode_cram_md5(char *challenge,char *user,char *secret) unsigned char hmac_md5[16]; +#ifdef LIBRESSL_VERSION_NUMBER HMAC_CTX ctx; +#else +#if OPENSSL_VERSION_NUMBER < 0x10100000L + HMAC_CTX + ctx; +#else + /* OpenSSL 1.1.x*/ + HMAC_CTX + *ctx; +#endif +#endif const EVP_MD *md5=NULL; @@ -591,9 +837,10 @@ char *encode_cram_md5(char *challenge,char *user,char *secret) char *b64; + /* unsigned long b64len=0; - + */ char hex[33], buf[BUFSIZ]; @@ -602,22 +849,41 @@ char *encode_cram_md5(char *challenge,char *user,char *secret) secret == NULL || *secret == '\0') return(NULL); + showVerbose("Server Challenge: %s\n",challenge); OpenSSL_add_all_digests(); /* decode the challenge */ - data=mutils_decode_base64(challenge,strlen(challenge),&data_len); + data=mutils_decode_base64((unsigned char *) challenge,strlen(challenge),&data_len); if (data == NULL) { errorMsg("Could not base64 decode CRAM-MD5 challenge: %s",challenge); return(NULL); } + showVerbose("Challenge After decoding: %s\n",data); /* take HMAC-MD5 of the challenge*/ + +#ifdef LIBRESSL_VERSION_NUMBER md5=EVP_get_digestbyname("md5"); HMAC_CTX_init(&ctx); HMAC_Init(&ctx,secret,strlen(secret),md5); HMAC_Update(&ctx,data,data_len); HMAC_Final(&ctx,hmac_md5,&hmac_len); +#else +#if OPENSSL_VERSION_NUMBER < 0x10100000L + md5=EVP_get_digestbyname("md5"); + HMAC_CTX_init(&ctx); + HMAC_Init(&ctx,secret,strlen(secret),md5); + HMAC_Update(&ctx,data,data_len); + HMAC_Final(&ctx,hmac_md5,&hmac_len); +#else + /* OpenSSL 1.1.x */ + ctx = HMAC_CTX_new(); + HMAC_Init_ex(ctx,secret,strlen(secret),EVP_md5(),NULL); + HMAC_Update(ctx,data,data_len); + HMAC_Final(ctx,hmac_md5,&hmac_len); +#endif +#endif /* LIBRESSL_VERSION_NUMBER */ /* convert the digest to hex */ memset(hex,0,sizeof(hex)); @@ -625,22 +891,36 @@ char *encode_cram_md5(char *challenge,char *user,char *secret) { (void) sprintf(hex+2*i,"%02x",hmac_md5[i]); } + showVerbose("HMAC-MD5 of challenge: %s\n",hex); (void) snprintf(buf,sizeof(buf)-1,"%s %s",user,hex); + showVerbose("base64 encode: %s\n",buf); + showVerbose("Taking base64 of \"%s\"\n",buf); /* base64 encode "user hex_digest" */ - b64=mutils_encode_base64(buf,strlen(buf),&b64len); +#if 0 + b64=mutils_encode_base64((unsigned char *) buf,strlen(buf),&b64len); if (b64len <= 0) return(NULL); /* mutils_encode_base64 adds CRLF */ if (b64len > 2) b64[b64len-2]='\0'; +#endif + b64 = mutils_encode_base64_noformat(buf,strlen(buf)); + if (b64 == NULL) + { + errorMsg("Could not base64 encode: %s",buf); + return (NULL); + } + showVerbose("base64: %s\n",b64); + return(b64); } #else char *encode_cram_md5(char *challenge,char *user,char *secret) { - errorMsg("Must be compiled with OpenSSL in order to get CRAM-MD5 support\n"); + errorMsg("Must be compiled with OpenSSL in order to get CRAM-MD5 support\n"); return(NULL); } #endif /* HAVE_OPENSSL */ +