From 25697a35b189e7a51ea2eee8edd11e3d3059a110 Mon Sep 17 00:00:00 2001 From: Guido Serassio Date: Sun, 17 Jul 2005 19:30:28 +0000 Subject: [PATCH] This commit was generated by cvs2svn to compensate for changes in r2, which included commits to RCS files with non-trunk default branches. --- BETA-TESTERS | 6 + CONTRIBUTORS | 51 + COPYING | 339 ++ ChangeLog | 753 +++++ DONATIONS | 3 + LICENSE | 339 ++ Makefile.in | 104 + README | 74 + auth.c | 63 + authfail.c | 199 ++ cfgaux/config.guess | 696 ++++ cfgaux/config.sub | 930 ++++++ cfgaux/install-sh | 250 ++ cfgaux/ll.novo | 0 charset.c | 66 + configure | 4662 +++++++++++++++++++++++++++ configure.in | 123 + convlog.c | 71 + css.c | 98 + css.tpl | 14 + dansguardian_log.c | 155 + dansguardian_report.c | 214 ++ datafile.c | 222 ++ decomp.c | 96 + denied.c | 192 ++ download.c | 190 ++ email.c | 323 ++ exclude.c | 77 + exclude_codes | 1 + fonts/FreeSans.ttf | Bin 0 -> 264075 bytes fonts/README | 3 + fonts/license | 341 ++ getconf.c | 747 +++++ grepday.c | 455 +++ htaccess | 6 + html.c | 718 +++++ images/datetime.png | Bin 0 -> 263 bytes images/graph.png | Bin 0 -> 130 bytes images/sarg-squidguard-block.png | Bin 0 -> 320 bytes images/sarg.png | Bin 0 -> 7943 bytes include/conf.h | 316 ++ include/defs.h | 8 + include/extern.h | 112 + include/info.h | 3 + index.c | 193 ++ indexonly.c | 50 + ip2name.c | 81 + language.c | 56 + languages/.new | 0 languages/Bulgarian_windows1251 | 130 + languages/Catalan | 130 + languages/Czech | 130 + languages/Dutch | 130 + languages/English | 130 + languages/French | 130 + languages/German | 130 + languages/Greek | 129 + languages/Hungarian | 130 + languages/Indonesian | 130 + languages/Italian | 130 + languages/Japanese | 130 + languages/Latvian | 130 + languages/Polish | 130 + languages/Portuguese | 130 + languages/Romanian | 130 + languages/Russian_koi8 | 130 + languages/Russian_windows1251 | 130 + languages/Serbian | 131 + languages/Slovak | 130 + languages/Spanish | 130 + languages/Turkish | 130 + languages/Ukrainian_windows1251 | 130 + lastlog.c | 112 + log.c | 1534 +++++++++ patches/oleg | 541 ++++ patches/oleg1 | 322 ++ patches/oleg2 | 322 ++ patches/oleg4 | 740 +++++ repday.c | 233 ++ report.c | 654 ++++ sarg-php/COPYING | 339 ++ sarg-php/INSTALL | 9 + sarg-php/LANGUAGES | 16 + sarg-php/language.php | 58 + sarg-php/sarg-block-it.php | 52 + sarg-php/sarg-squidguard-block.php | 89 + sarg-php/sarg-squidguard-block2.php | 58 + sarg-php/style.php | 42 + sarg-php/translate.this | 68 + sarg.1 | 144 + sarg.conf | 563 ++++ siteuser.c | 213 ++ smartfilter.c | 223 ++ sort.c | 155 + splitlog.c | 76 + squidguard_log.c | 190 ++ squidguard_report.c | 214 ++ topsites.c | 244 ++ topuser.c | 678 ++++ totday.c | 128 + totger.c | 104 + usage.c | 58 + useragent.c | 310 ++ util.c | 1114 +++++++ 104 files changed, 25993 insertions(+) create mode 100644 BETA-TESTERS create mode 100644 CONTRIBUTORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 DONATIONS create mode 100644 LICENSE create mode 100644 Makefile.in create mode 100644 README create mode 100644 auth.c create mode 100644 authfail.c create mode 100755 cfgaux/config.guess create mode 100755 cfgaux/config.sub create mode 100755 cfgaux/install-sh create mode 100755 cfgaux/ll.novo create mode 100644 charset.c create mode 100755 configure create mode 100644 configure.in create mode 100644 convlog.c create mode 100644 css.c create mode 100644 css.tpl create mode 100644 dansguardian_log.c create mode 100644 dansguardian_report.c create mode 100644 datafile.c create mode 100644 decomp.c create mode 100644 denied.c create mode 100644 download.c create mode 100644 email.c create mode 100644 exclude.c create mode 100644 exclude_codes create mode 100644 fonts/FreeSans.ttf create mode 100644 fonts/README create mode 100644 fonts/license create mode 100644 getconf.c create mode 100644 grepday.c create mode 100644 htaccess create mode 100644 html.c create mode 100644 images/datetime.png create mode 100644 images/graph.png create mode 100644 images/sarg-squidguard-block.png create mode 100644 images/sarg.png create mode 100755 include/conf.h create mode 100755 include/defs.h create mode 100755 include/extern.h create mode 100755 include/info.h create mode 100644 index.c create mode 100644 indexonly.c create mode 100644 ip2name.c create mode 100644 language.c create mode 100755 languages/.new create mode 100644 languages/Bulgarian_windows1251 create mode 100644 languages/Catalan create mode 100644 languages/Czech create mode 100644 languages/Dutch create mode 100644 languages/English create mode 100644 languages/French create mode 100644 languages/German create mode 100644 languages/Greek create mode 100644 languages/Hungarian create mode 100644 languages/Indonesian create mode 100644 languages/Italian create mode 100644 languages/Japanese create mode 100644 languages/Latvian create mode 100644 languages/Polish create mode 100644 languages/Portuguese create mode 100644 languages/Romanian create mode 100644 languages/Russian_koi8 create mode 100644 languages/Russian_windows1251 create mode 100644 languages/Serbian create mode 100644 languages/Slovak create mode 100644 languages/Spanish create mode 100644 languages/Turkish create mode 100644 languages/Ukrainian_windows1251 create mode 100644 lastlog.c create mode 100644 log.c create mode 100644 patches/oleg create mode 100644 patches/oleg1 create mode 100644 patches/oleg2 create mode 100644 patches/oleg4 create mode 100644 repday.c create mode 100644 report.c create mode 100644 sarg-php/COPYING create mode 100644 sarg-php/INSTALL create mode 100644 sarg-php/LANGUAGES create mode 100755 sarg-php/language.php create mode 100755 sarg-php/sarg-block-it.php create mode 100755 sarg-php/sarg-squidguard-block.php create mode 100755 sarg-php/sarg-squidguard-block2.php create mode 100755 sarg-php/style.php create mode 100644 sarg-php/translate.this create mode 100644 sarg.1 create mode 100644 sarg.conf create mode 100644 siteuser.c create mode 100644 smartfilter.c create mode 100644 sort.c create mode 100644 splitlog.c create mode 100644 squidguard_log.c create mode 100644 squidguard_report.c create mode 100644 topsites.c create mode 100644 topuser.c create mode 100644 totday.c create mode 100644 totger.c create mode 100644 usage.c create mode 100644 useragent.c create mode 100644 util.c diff --git a/BETA-TESTERS b/BETA-TESTERS new file mode 100644 index 0000000..4fdd88e --- /dev/null +++ b/BETA-TESTERS @@ -0,0 +1,6 @@ +Special thanks to this friends that have spent time to test sarg before the final release: + +Francesco Collini +Renato Leon +Guilherme Veloso Neves Oliveira +Michael da Silva Pereira diff --git a/CONTRIBUTORS b/CONTRIBUTORS new file mode 100644 index 0000000..225739a --- /dev/null +++ b/CONTRIBUTORS @@ -0,0 +1,51 @@ +Francesco Collini +Renato Leon +Alp +Andreas Piesk +Andrew +Andrew Barnes +Carlos Canau +Carlos Santillana +Csaba Kabai +Dima I. Allaverdov +Eugeny Kuzakov +Evren Yurtesen +Hanni Daniel +Ilya V. Komarov +Jose Luiz +Lee Shakespeare +Leonardo A. D'Angelo +Manon Goo +Matteo Colombo +Maxim Berlin +Palamarchuk Eugen +Patrick Darden +Rick_Barzilli@xircom.com +Ryan Roehrich +Steve Chan +Tony Lorimes +Wayne Bastow +drdivano@mail.axon.ru +Seth Mos +Carlo Marcelo Arenas Belon +Milos Prudek +Pavel Jezek +Kenneth Ingham +Schlosser, Carsten ECOFIS +Andrew Katkov +Andy Parfenov +Bernd Kossmann +Ivan Minchev +Olivier Rousselot +Akira Kitamura Takamatsu-City Kagawa Japan. +Radovan Drobnjakovic +Brad Guillory +Andrew Okhmat +Nikolai V. Ivanyushin +Wszebor Boksa +Adi Cretu +Roman Vynar +Andreu Sanchez +Joe Cooper +Guilherme Veloso Neves Oliveira +Filippo Grassilli diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..a43ea21 --- /dev/null +++ b/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..7c1c55a --- /dev/null +++ b/ChangeLog @@ -0,0 +1,753 @@ +SARG ChangeLog + +May/29/2005 version 2.0.8 + - verdana.ttf font removed to avoid patent infringement issues. + Now sarg uses a GPL FreeSans font from http://savannah.gnu.org + - ISA report with wrong date in date/time report. + Thanks to Richard Berndt + - connect records ignored when using emulate_http_log on in squid.conf file. + Thanks to Dusan Woletz + - bug that prevents the correct usage of switch -d when using + an "emulate_httpd_log on" logfile and some performance improvements + added. + Thanks to Filippo Grassilli + - Spanish language fixed by José Luis Hernández López. Thanks. + - url variable size changed to acomodate big urls with coded symbols and some + minor changes in util.c file. + Thanks to Oleg + - download suffixes improved by Oleg . Thanks. + Now sarg uses these suffixes: + 7z,ace,arj,avi,bat,bin,bz2,bzip,cab,com,cpio,dll,doc,dot,exe,gz,iso, + lha,lzh,mdb,mov,mp3,mpeg,mpg,mso,nrg,ogg,ppt,rar,rtf,shs,src,sys,tar, + tgz,vcd,vob,wma,wmv,zip + +May/02/2005 version 2.0.7 + - DansGuardian report added. + Thanks to Adolfas Kupliauskas for the access.log + - Slovak language added by Dusan Woletz + Thank you + - wrong usertab user on topuser report. + Thanks to Marcos Favoretto + - ntlm_user_format added to sarg.conf. Now you can choose the following formats + for the username on reports: user|domainname+user + Suggested by Roger Favero + - exclude_users ignored in some situations. + - Fixes by Sapon Oleg from Russia: + . there are two equal lines about Evren Yurtesen in CONTRIBUTORS file. + . Internationalisation of SARG user graph added, using iconv function, which + is presented only in Linux, so I add required #ifdef and other stuff to clean + compile code on other platforms. + . Fixed two issues: + - '?' symbol problems for apache and other cgi-supporting web server which + doesn't support '?' symbol in links (all of them interprete this like + parameter to cgi script); + - some good optimization to all three similar cicles in these files by + reducing false checks in 'if ...' strings. + . Fixes segfault, produced by inproper use of strncpy functions, look - strncpy + doesn't copy leading '\0' symbol! + . Just localisation support for repday report. + . Support usertab IP->USERNAME change in siteuser report. + . Just proper Russian koi8 localisation. + +Apr/22/2005 version 2.0.6 + - Greek language by Antonis Maglaras + Thank you. + - time period added to -t option. Now you can use -t HH-HH, HH:MM-HH:MM + - support to isa proxy 2004 log added. + Thanks to William da Rocha Lima + - French language fixed by Alexey Znamerovskiy + Thanks + - internal LC_ALL=C removed to avoid errors on Solaris. + Thanks to Hraska, Frantisek + - non authenticated records removed from Topuser report. + Thanks to Brian + - Compilation error on FreeBSD > 5 - log.c:645: error: `RLIMIT_OFILE' undeclared + - Sarg abbreviation values improved. + +Mar/21/2005 version 2.0.5 + - fixed: some changes to avoid segmentation fault. + - fixed: some changes to avoid compilation errors on freeBSD. + - fixed: exclude_hosts not excluding correctly. + +Feb/17/2005 version 2.0.4 + - exclude hosts not excluding correctly. + Thanks to Oleg + - download report showing jpeg files. + - support to Microsoft isa proxy log files added. + Thanks to Trankov Vladislav + - fixed: error when using relative paths in -o and -w options. Just absolute paths + can be used now. + Thanks to Andreas Grosse + - fixed: segfault fix in vrfydir() in util.c + Prevent buffer overflow in subs(); replace one constant with sizeof() in my_lltoa(). + vrfydir(): fix segfault if sub-directory "images" is not exists + function builddia() don't check the parameters. Result: segmentation fault in some cases. + Thanks to Stas Degteff stas_degteff@users.sourceforge.net for the fixes. + - fixed: wrond date period in squidguard_log when using european date format. + Thanks to Guenther Mair + - ulimit tag added on sarg.conf to avoid "Too many open files" error. + Thanks to Paulo Pires + + +Feb/02/2005 verion 2.0.3 + - squidguard parse logs method changed. + Thanks to Joao Mendes + Thanks to Guenther Mair + - wrong results in -v option. + - fixed: error when using -u (include user) + Thanks to Bochkarev Vladimi + - export LC_ALL=C will be issued before sort to avoid high cpu usage + +Nov/22/2004: version 2.0.2 + - grepday with invalid font path. + Thanks to Marcelo Ricardo Leitner + - -v option added to display Sarg version on console + - Segmenation fault caused by an unclosed file. + Thanks to Pustovalov Leonid + - SquidGuard log formats added. + Thanks to Kolotov Alexandr + - time field added to topsites report + Thanks to Miles Roper + - fixtime function with wrong definition, changed to long long + Thanks to Valery from Russia + - Solaris 9 compiling error: error: conflicting types for 'my_mkdir' + Thanks to Brad Larden + - segfaults if the denied report is disabled in sarg.conf. + Thanks to Filippo Carletti + - reading performance improved by Francesco Perrillo + Thanks + - Russian sarg-php translation added. + Thanks to Michael Stepanenko + + +Oct/04/2004: version 2.0.1 + - configure error with no gd installed. + - graph with no text when using --enable-sysconfdir + - graph day incorrect when using dd/mm/yy date format + - show_sarg_logo yes|no added + - site_user_time_date with wrong patch. + Thanks to Ricardo R. Hoffmann + + +Sep/29/2004: - version 2.0 + - Internal/External css implemented + - User authentication access (htaccess) implemented + - large file support added + - Report limits implemented + - Download report implemented + - Sarg logo by Osamu Matsuzaki added. + - Internal mkdir added to easy port to various plataform. + - long url now show only accessed site and module name. + - now you can add a user report url to a flat file to be blocked + by some Squid acl. + Request by Francesco Collini + - remove temporary files, if already exist, to avoid conflits with a + previous sarg process.. + Thanks to Renato Leon + - squidGuard improved + - now only records with the same period from access.log + will be in squidGuard report. + - squidGuard limit report + - now you can save some urls in squidGuard db using + sarg-squidguard PHP utility. + + bug fixed: fault caused by rewinddir after closedir. + Thanks to Lucas Bocchi + and to Freek + Fixed: - missing tags in all HTML pages + - missing tag in some HTML pages + - missing DOCTYPE in all HTML pages + - grammar in man page + - URL Links to SourceForge http://sarg.sourceforge.net/ + Added: - Included more detailed information in man the page + Thanks to Billy Newsom of U.S. + To Do: - There are still major validation problems in the HTML generated + + +Apr/25/2003: - fixed: - link error to denied site in squidGuard report + - resolve name error in squidGuard report + - some fixes to HPUX. Thanks to Miles Roper + - index_sort_order tag don't work correctly. + - too many open files fixed. Thanks to Francesco Perrillo + - Ukrainian_windows1251 included in sarg.conf file + - exclude_string don´t work correctly. Thanks to Modric Kristijan + + +Mar/17/2003: - Release 1.4 + Added: Now you can choose the fields that will be in User Reports. + Look at user_report_fields tag in sarg.conf file + Implementation requested by Daniel T. Joye + + Added: Now sarg saves the processed log in a sarg format after parsing + the squid log file. This allow futures sarg reprocess and data + will be smaller than Squid the log files + Look at parsed_output_log directory and + parsed_output_log_compress tags in sarg.conf file + Implementation requested by Joe Cooper . + Many thanks for the donation. + + Added: Now sarg can display the report values in abbreviation format. + Look at displayed_values in sarg.conf + + Added: Ukrainian_windows1251 language by Roman Vynar + Thank you. + + Added: Catalan language by Andreu Sanchez + Thank you. + +Nov/16/2002: - Fixed: squidGuard report fail with non authenticated users. + Thanks to Dan Ratzlaff + Fixed: Turkish language by Evren Yurtesen + . Thanks + Fixed: English language by Luigi Gangitano + . Thanks + Fixed: "CONNECT" average values are incorrectly calculated. + Arvids . Thanks + +Oct/15/2002: - Added: sarg man page created by Luigi Gangitano + + Added: Reading statistics, show_read_statistics tag + Added: Index sort order. See index_sort_order tag + Added: squidGuard report - squidguard_log_path tag + Added: show_sarg_info on report bottom optional - show_sarg_info tag + Changed: gzipped file will be decompressed using zcat + bzipped file will be decompressed using bzcat + Changed: new sort routine added. + Changed: strsep changed to getnumlist function by Robert Tiismus + +Jun/02/2002: - Added: save the results in a flat file to use to populate some + database. Look at these tags in sarg.conf file: + TAG: datafile file + TAG: datafile_delimiter ";" + TAG: datafile_fields all + Added: logic to detect a broken record in access.log file + and ignore it. + Added: now you can select the records to be processed by + week and/or time using these tags in sarg.conf file: + TAG: weekdays + TAG: hours + Thanks to Robert Tiismus from Institute of Physics, + University of Tartu, Estonia. + , and for the repday.c + improvements. + +Apr/03/2002: - bug fixed: cannot create temporary file when url contain '/' + and using long_url + Thanks to Enrico Sorge + +Dez/10/2001: - Added: sarg now shows statistics when readding the log file + if running with -x option + +Dez/05/2001: - bug fixed: - loop proccess when using "tmp" chars in usernames + Thanks to Jasper vd Heijden + new tag added: show_successful_message yes + Show "Successful report generated on dir" message at end of process. + Requested by: Wendell Schubert + Mauricio Felizardo dos Santos + bug fixed: core dump when removing auth_failures report from + report_type tag. + Thanks to Leonardo Rodrigues + bug fixed: core dump with a big number of users. + Thanks to Zverev, Alexandr V. + new tags added: topuser_fields + topuser_num + Now you can choose which fields must be in Topuser report and how many users. + Requested by Hidde Beumer + bug fiexed: auth_failures report missing + Thanks to Clary Harridge + Polish language added by Wszebor Boksa + Thank you. + Romanian language added by Adi Cretu + Thank you. + +Jul/03/2001: - new report added: site/user/date/time + Now report_type tag has the following default setup: + report_type topsites sites_users date_time denied auth_failures site_user_date_time + - bug fixed - error when using squid-ntlm authenticator (domain\user) + Thanks to Jakob Curdes + - ignoring changes in report_type tag + - Site&Users report with users shifted down one row. + Thanks to Jason Urkow + - some temporary files not removed. + - site/user/date/time report without and + +May/30/2001: - bug fixed: - user table garbage + - chmod 644 removed from makefile + - ignoring first user in usertable + - ignoring users names with dots (".") + Thanks to Daniel Malmgren + - same values for connect and bytes fields in reports on Solaris 8 + Thanks to Craig Brockmeier + New tag added: user_invalid_char "&/" + To avoid core dumps, records that contain invalid characters + in userid will be ignored by Sarg. + New tag added: privacy yes|no + privacy_string "***.***.***.***" + privacy_string_color blue + In some countries the sysadm cannot see the visited sites by a restrictive law. + Using privacy yes the visited url will be changed by privacy_string and + the link will be removed from reports. + Requested by Diaolin (Natali Giuliano) + New tag added: include_users "user1:user2:...:usern" + Reports will be generated only for listed users. + exclude_string "string1:string2:...:stringn" + Records from access.log file that contain one of listed strings will be ignored. + Requested by Michael Koptyaev + + +Apr/02/2001: - implementation of --enable-bindir and --enable-sysconfdir in configure script. + Thanks to Sergei Dushenkov + - bug fixed: getword excessive long string detection function fixed. + Thanks to Junghausz Norbert + - bug fixed: wrong charset for windows-1251 and koi8 Russian languages. + Thanks to Alexey Zhigayev + - bug fixed: - Help page (-h) is empty because at start (log.c) program doesn't + load definitions to text[][] array. + - Definitions for Russian language doesn't have last 2 lines. + - Definitions of Charset field for Russian language is not so correct. + Better is 'windows-1251' or 'koi8-r' + - I think in topuser.c the definition of wheader[] is too short for words + on some languages + - Initialization and use of variables TopuserSortField and + TopuserSortOrder is mismatch + Thanks to Alex Voronin + - bug fixed: core dump with big user table. + Thanks to Jorge Cuellar Martinez + - Latvian languages by Juris Valdovskis + Thank you + +Mar/22/2001: - Now te user can choose the language using the language TAG in /usr/local/sarg/sarg.conf file. + There is no more --enable-language in configure script. + - New report added: Autentication Failures + Requested by Sergei Dushenkov + - NONE/400 (bad request) is excluded by default (/usr/local/sarg/exclude_codes) + - Now sarg support big numbers (64 bits) in any platform. + - Date/Time report now use bytes or elapsed time as specified in date_time_by tag in sarg.conf + Requested by Inters + - bug fixed: sites&users report sorted on the User field rather than the Site field + Thanks to Simon Bryan + - sites&users report was changed. + - Russian_windows125 language fixed. + Thanks to Dima I. Allaverdov (rasa) + - bug fixed: getconf was catching a wrong value in replace_index tag + Thanks to vrush_22@softhome.net + - bug fixed: per_user_limit file with duplicate users. + - Russian languages fixed by Nikolai V. Ivanyushin . Thank you. + - charset TAG added to sarg.conf file. The following charsets are avaiable: + Latin1 (West European), Latin2 (East European), Latin3 (South European) + Latin4 (North European), Cyrillic, Arabic, Greek, Hebrew + Latin5 (Turkish), Latin6 (Nordic) + Requested by Nikolai V. Ivanyushin + - configure now accept only two options: + --enable-bindir - where sarg binary will be saved + --enable-sysconfdir - where the configuration directory is + +Mar/09/2001: Sqmgrlog has gained a new name: SARG - Squid Analysis Report Generator. + Many people have asked me about why sqmgrlog. I really don´t know. + No inspiration I think. + SARG was suggested by an user from Philippines, but, I lost his email + and don´t remember his name. + + Thank you anyway. + + + +sqmgrlog ChangeLog + +Feb/06/2001: Version 3.0 released: + - Denied report added. + Request by Jason Staudenmayer + - User table added. You can override your userid or IP Address with + a real user name. + TAG usertab added to sqmgrlog.conf + - Now you can have the long url in reports + TAG long_url added to sqmgrlog.conf + - Now you can choose the report types + TAG report_type added to sqmgrlog.conf + - sqmgrlog.conf file now will be in 644 mod. + Request by Michail Vidiassov + - sqmgrlog coredumps if there is a very long line in the config file. + Thank you to Michail Vidiassov + - Url parser changed to get connect records from a better way + Thanks to Sergey Erokhin + - Michail Vidiassov made gcc -Wall ... happy on FreeBSD 4.1 + Thank you + - Russian_Koi8 language fixed by + Andrew Okhmat . Thank you. + Maks Nefedchenko . Thank you. + - Russian and Bulgarian language fixed by + Nikolai V. Ivanyushin + + + +Nov/09/2000: Two patches form Brad Guillory added: + 1. max-elapsed tag added to sqmgrlog.conf file: + # TAG: max_elapsed milliseconds + # If elapsed time is recorded in log is greater than max_elapsed use 0 for elapsed time. + # Use 0 for no checking + # + #max_elapsed 0 + # 8 Hours + max_elapsed 28800000 + 2. day report (the one that looks like a calendar) changed: + Every minute that a request is logged your time is incremented by the smaller + of 1 minute or the total time for the requests. + + Thank you Brad. Brad Guillory is the newest sqmgrlog contributor. + + Changed: sort now compare according to arithmetic value. + +Jul/11/2000: Dutch language fixed by Pieter Kooistra + Thank you. + Changed: Russian_koi8 changed to Russian_Koi8. + Thank you to Eugene AKA Kevin Kevin + Slightly changed Czech language + Added: TAG: replace_index + Replace "index.html" in the main index file with this string + Vladimir Smelhaus + Bug fixed: For some reason, Squid occasionally logs a blank line. Running sqmgrlog + against a log containing a blank line causes sqmgrlog to take 99+% CPU + Thanks to Giese, Bill + Added: now every squid code that contain the MISS word will be counted as out cache. + Thanks to Kostya Panov + +Jun/09/2000: Bug fixed: abnormal end if userid contain ';' + Thanks to Victor Feoktistov + Japanese language fixed by + Akira Kitamura Takamatsu-City Kagawa Japan + Bug fixed: Wrong date when setting date_format u in sqmgrlog.conf file + Thanks to Dale Perkel , + Marcio Rodrigo Bordignon + +Mar/15/2000: Japanese language added by + Akira Kitamura Takamatsu-City Kagawa Japan + Thank you. + Serbian language added by + Radovan Drobnjakovic + Thank you. + Bug fixed: wrong sort field when lower case used in + sort tags. + Thaks to Scott Larsen + and to WOLETZ, Dusan + Abuse report removed. + Changed: report1_sort_field TAG in sqmgrlog.conf + changed to topuser_sort_field + Changed: report2_sort_field TAG in sqmgrlog.conf + changed to user_sort_field + Added: topsites sort field options added: + # TAG: topsites_sort_order CONNECT|BYTES A|D + # Sort for topsites report, where A=Ascendent, D=Descendent + # + #topsite_sort_oder CONNECT D + Implementation requested by + Michael G. Koch + +Feb/26/2000: Bulgarian-windows1251 language added by + Ivan Minchev . + Thank you. + French language updated by + Olivier Rousselot + Thank you. + +Feb/15/2000: SmarfFilter report added. + Implementation requested by Andrew Bradshaw + Bug fixed: files created with 09Feb2000-09022000 instead 09Feb2000-09Feb2000 + Thanks to Andy Parfenov + Changed: ignore records with HTTP/0.0 string. + Implementation requested by Bernd Kossmann + Changed: some code added to ignore broken records in access.log file + Bug fixed: removing old file with lastlog dont work. + Thanks to Evren Yurtesen + +Jan/20/2000: Indonesian language added by V Gatut Harijoso + Thank you. + Fixed: change in conf.h to compile on OpenBSD 2.6 system. + Thanks to Kenneth Ingham + Fixed: small bug, which fills the "periodo" with + "01Jan2000-20000101" instead of "01Jan2000-01Jan2000". + Thanks to Schlosser, Carsten ECOFIS + Fixed: After calling system function malloc, variable excludecode + have some symbols inside (excludecode wasn't zeroed). + Thanks to Andrew Katkov + +Dec/29/1999: Czech language added by Milos Prudek + Thank you. + Russian-windows1251 language added by Dima I. Allaverdov + Thank you. + Changed: Russian language changed to Russian_koi8 language. + Bug fixed: Sites&Users report dont resolve ip address. + Thanks to Pavel Jezek + +Nov/29/1999: Bug fixed: DENIED word translated to another language never printed. + Thanks to Rodolphe SIBERT + New report added: Sites & Users + Implementation requested by Rodolphe SIBERT + Added: The date format now also has the option "w" for week. + The report is then 1999.47-1999.47 for instance. + Implemented by Seth Mos , thank you for the patch. + Dutch language added by Seth Mos + Thank you. + Added: new tag on sqmgrlog.conf, named user_ip, for setting a system wire -p, use ip address + instead userid. + Implemented by Carlo Marcelo Arenas Belon + Thank you for the patch. + Added: new tag on sqmgrlog.conf, exclude_codes pointing to a file with codes to be + ignored by sqmgrlog. Eg.: NONE/400 + Implementation asked by Doug Burks + +Sep/28/1999: Bug fixed: -split and -convert dont work with multiples -l options. + Thanks to G. Kelana Sudibyo" + Bug fixed: Bytes and Average corrupted in index.html after second execution. + Thanks to Rob Glasser + +Sep/13/1999: Bug fixed: get wrong access.log file when using access_log in sqmgrlog.conf file. + Thanks to Michael G. Koch + +Sep/10/1999: Spanish language added by Leonardo A. D'Angelo + Thank you. + New report added: topsites. This report show the top n sites accessed. + You can set the top num sites in topuser_num tag in sqmgrlog.conf file. + Bug fixed: wrong userid when using Samba authenticator. + Thanks to klaubert@bcb.gov.br (Klaubert Herr da Silveira) + Changed: -v option removed. No more suport for Squid-1 log format. + Thanks to Nik Oxley + +Aug/18/1999: New fields added to sqmgrlog.conf: + - lastlog n + With lastlog you can tell to sqmgrlog to remove old reports files. + Usage: lastlog 0 - no remove nothing + lastlog 10 - maintain only the last 10 reports + Implementation requested by Evren Yurtesen + Thank you for your help. + - remove_temp_files yes|no + Remove temporary files: geral, usuarios, top, periodo from root report directory. + Impementation requested by Fred Pacquier + - index yes|no|only + Usage: index yes - will genereate the main index.html in reports + index no - dont generate the main index.html in reports + index only - generate only the main index.html in reports + Implementation asked by Fred Pacquier + - overwrite_report yes|no + If yes and the report already exist for that date, the reports will be overwrited. + If no and the report alread exist, that report will be renamed to filename.n, filename.n+1 + Implementation requested by Eugeny Kuzakov + - records_without_userid ignore|ip|everybody + What can I do with records without user id (no authentication) in access.log file ? + ignore - This record will be ignored. + ip - Use ip address instead. (default) + everybody - Use "everybody" instead. + - use_comma + Use comma instead point in reports. + Eg.: use_comma yes => 23,450,110 + use_comma no => 23.450.110 + - mail_utility mail|mailx + Which mail command must I use to send reports ? + + Added: now every squid code that contain the MISS word will be counted as out cache. + Implementation requested by Eugeny Kuzakov + Thank you for your help and for share your FreeBSD with me. + Changed: the field url was changed to 8192 bytes to suport big urls. + Thanks to Eugeny Kuzakov + Changed: the header "TIME SPENT" changed to "USED TIME" in topuser report. + Changed: no more nouser will be in reports but IP address instead. + Changed: no more squid 1 log format supported. + Bug fixed: wrong reports when using common log format (emulate_http on). + Thanks to Patrick LIN + +Aug/06/1999: French language added by Fred Pacquier + Thank you + Bug fixed: negative percentage in IN-CACHE-OUT. + Thanks to brad@baileylink.net + Bug fixed: wrong directory name created when using -g e and -d + Thanks to Fred Pacquier + Changed: atol use to get total bytes changed to atoll. + Thanks to brad@baileylink.net for the patch. + Changed: now use ',' as separator instead '.' when using US date (-g u) + Implementations requested by brad@baileylink.net + Changed: added -convert and -split to usage help (-h) + new messages added to easy translation. + Implementations requested by Fred Pacquier + +Jul/29/1999: Changed: convert userid to lowercase to disable username case-sensitivity + when using auth_smb. + Implementations requested by Doug Burks + Changed: the sqmgrlog.conf now installs into /usr/local/etc + Implementations requested by Daniel L Sjvsvdrd + +Jul/06/1999: Y2K bug fixes. + Thanks to askat@crimea.net (JSC CRELCOM) + Bug fixed: special character in userid cause core dump. + Thanks to Rick_Barzilli@xircom.com + Splitlog function added: -split will split the log file by date in -d parameter. + Eg.: sqmgrlog -split -d 01/07/1999-02/07/1999 [-convert] [-g e] + +Jun/14/1999: German language added by Andreas Piesk + Thank you + Some minor changes made by Andreas Piesk, thanks for the patches. + +Jun/09/1999: Bug fixed: to send reports via mail, use mail instead mailx in FreeBSD. + Thanks to Evren Yurtesen to share your FreeBSD with me. + Bug fixed: wrong userid when using smb_auth autenticator. + The userid will be changed from NTDOMAIN\username to NTDOMAIN.username. + Thanks to Jouko Ylikulju + +Jun/04/1999: Y2K compliance implemented. + Bug fixed: wrong report created when using common log format. + Thanks to Carlos Santillana + Bug fixed: wrong fopen with "rt", must be "r". + Thanks to Wayne Bastow + +May/31/1999: Turkish language added by Evren Yurtesen + Thank you + Bug fixed: users in exclude_users file were not removed from reports. + Thanks to Arthur S. Petrossian + Thanks to Evren Yurtesen + Bug fixed: core dump when using output_email parm and mailx not installed. + Thanks to Evren Yurtesen + Thanks to Evren Yurtesen to share your FreeBSD with me. + +May/20/1999: New report field added: IN CACHE and OUT CACHE. + This field show how many bytes (percent) was retrieved from the cache. + Implementations requested by Arthur S. Petrossian + +May/14/1999: Bug fixed. Abnormal End when using -i option + Thanks to Carlos Canau for the patch. + Bug fixed. Sqmgrlog freeze if some records are broken in access.log file. + Thanks to Rick_Barzilli@xircom.com + Bugfix that prevents sqmgrlog from freezing up if a log file has "holes" (sequences of zeros) + (caused by filesystem crash). + Thanks to drdivano@mail.axon.ru for the patch. + +Apr/14/1999: Per user limit added. + If the user exceed the limit, userid will be saved in a file that can + be used in squid acl. + Field per_user_limit added to sqmgrlog.conf: per_user_limit file limit + file : where userid must be saved + limit: in MB Eg. 40 will limit in 40 MB. + Implementation requested by Csaba Kabai + +Mar/11/1999: Field exclude_users now accept indexonly to create only index.html report. + Implementation requested by Hanni Daniel + Bug fixed for FreeBSD. Missing \n on topuser. + Thanks to Andrew for share your FreeBSD-3.1 + Some minors fixes and changes in html layout. + Thanks to Andrew Barnes + +Mar/03/1999: Bug fixed. Wrong href link if userid in format userid.name... + Thanks to Manon Goo + Some changes on variable translations. + Thanks to Matteo Colombo + Russian language (KOI8-R) added by Palamarchuk Eugen + Thank you + Field exclude_users added to sqmgrlog.conf. + Users within the file will be excluded from reports. + Implementation requested by Hanni Daniel + +Feb/26/1999: New date/time report added. + Look at http://www.orso.x5.net/squid-reports/1999Feb01-1999Feb08/duser24.html + -d option now accept from-until (dd/mm/yy-dd/mm/yy) dates. + Requested by Eric V. Pino + +Feb/10/1999: Italian language added by Matteo Colombo + Thank you. + -convert option added. Convert the access.log file to a legible date + and time format. May be used with -l and/or -g options. + +Feb/05/1999: Field date_format added to sqmgrlog.conf. + date_format u: reports with USA format mm/dd/yy + date_format e: reports with Europe format dd/mm/yy + Implementation requested by Matteo Colombo + Bug fixed: temporary file cannot be created if not run in root. + Thanks to Carlos Canau for the patch. + Changes from Tony Lorime : use atoll instead atol in Solaris + : ignore .htaccess when selecting files + Thank you. + +Dec/21/1998: -b option added. Generate useragent report. + field useragent_log added to sqmgrlog.conf + Implementation requested by Alp + -j option added. Generate a kind of abuse report. + Implementation requested by Alp + To use this feature you must apply a patch (http://www.orso.x5.net/patches) on Squid. + -c exclude option improved. Now you can exclude B classes + Implementation requested by Yin Jun + Bug fixed for Solaris. Must user -lsocket and -lnsl to resolve names. + Thanks to Ryan Roehrich + +Dec/11/1998: Bug fixed for long long int in Alpha Digital + Thanks to Ilya V. Komarov for share your Digital server. + +Dec/10/1998: Version 2.2 released + -n option added. Resolve domain name for reports with IP Address. + Field resolve_ip added to sqmgrlog.conf + Sort report by header fields implemented + Fields report1_sort_field and report2_sort_field added to sqmgrlog.conf + -f option added. Allow config file override + Exclude hosts implemented + Field exclude_hosts file added to sqmgrlog.conf. Exclude ips, names, subnets + from reports. + Implementations requested by Arthur S. Petrossian + +Dec/07/1998: Version 2.1 released + sqmgrlog now can read log file in gzip or compress format. + Implementation requested by Alp + +Nov/09/1998: Version 2.0 released + -p option added. Allow redirect output report to email address. + sqmgrlog.conf with colors, headers, title, font size, backgound color, text color, + background image, font face, etc... added. + Reports will be generated only for users in passwd file (tag password in sqmgrlog.conf). + Many changes in html output layout. + Thanks to Alp + +Oct/19/1998: Bug fixed by Maxim Berlin for long long int in FreeBsd. + Many thanks. + Thanks to Ilya V. Komarov to share your FreeBSD 3.0 server to help on fixing. + +Sep/28/1998: Bug fixed for log with emulate http on (Squid 1.2.beta) + Thanks to Alp + -p option added. Generated reports with IP Address insted Userid. + Use this option if you do not use Proxy authentication on Squid. + Implementation requested by Szalma Zoltan + +Aug/11/1998: Bug fixed for memory slack. + Thanks to kevin@mcpeake.net + Jose Luiz + Patrick Darden + Steve Chan + +Jul/07/1998: Spent time added for native Squid log format (emulate_httpd_log off). + Connect added. + Layout change in html reports. + +Jun/02/1998: -o option added. Allow output dir override. + Implemented index.html on root output dir. + Implemented auto rename if output dir already exist. + bug fixed, link error if user change output dir in conf.h + Thanks to Alp + +May/28/1998: -v option added. Allow Squid version override. + +May/28/1998: Bug fixed in common log format + Thanks to Tony Lorimer + Alp + Carlos Santillana + +Apr/15/1998: -z option added (debug) + +Apr/07/1998: top.html changed to index.html + +Mar/31/1998: index.html added + +Mar/25/1998: sqmgrlog was created diff --git a/DONATIONS b/DONATIONS new file mode 100644 index 0000000..6b678e9 --- /dev/null +++ b/DONATIONS @@ -0,0 +1,3 @@ +If you like SARG and want to contribute, please email me: orso@brturbo.com + +Thank you diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a43ea21 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..fbed350 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,104 @@ +# Makefile.in for sarg + +CC = @CC@ +BINDIR = @BINDIR@ +IBINDIR = -DBINDIR=\"@BINDIR@\" +MANDIR = @MANDIR@ +SYSCONFDIR = @SYSCONFDIR@ +HTMLDIR = @HTMLDIR@ +ISYSCONFDIR = -DSYSCONFDIR=\"@SYSCONFDIR@\" +IHTMLDIR = -DHTMLDIR=\"@HTMLDIR@\" +CFLAGS = @CFLAGS@ +LDFLAGS = @LDFLAGS@ +DEFS = @DEFS@ +LIBS = @LIBS@ +SRCDIR = . +VPATH = . +INSTALL = cp + +INSTALL_PROGRAM = $(INSTALL) + +SRCS = util.c log.c report.c topuser.c email.c sort.c html.c \ + totger.c index.c getconf.c usage.c decomp.c ip2name.c \ + useragent.c exclude.c convlog.c totday.c repday.c datafile.c\ + indexonly.c splitlog.c lastlog.c topsites.c siteuser.c css.c \ + smartfilter.c denied.cauthfail.c language.c charset.c \ + squidguard_log.c squidguard_report.c auth.c download.c grepday.c \ + dansguardian_log.c dansguardian_report.c +OBJS = util.o log.o report.o topuser.o email.o sort.o html.o \ + totger.o index.o getconf.o usage.o decomp.o ip2name.o \ + useragent.o exclude.o convlog.o totday.o repday.o datafile.o \ + indexonly.o splitlog.o lastlog.o topsites.o siteuser.o css.o \ + smartfilter.o denied.o authfail.o language.o charset.o \ + squidguard_log.o squidguard_report.o auth.o download.o grepday.o \ + dansguardian_log.o dansguardian_report.o + +DISTFILES = $(SRCS) + +all: sarg + +.c.o: + $(CC) -c -I. $(CPPFLAGS) $(DEFS) $(CFLAGS) $(IBINDIR) $(ISYSCONFDIR) $(IHTMLDIR) $< + +sarg: $(OBJS) + $(CC) $(LDFLAGS) $(LIBS) $(OBJS) $(LIBCRYPT) -o $@ + +install: all + -@if test ! -d $(BINDIR); then \ + echo "creating $(BINDIR)"; \ + mkdir $(BINDIR); \ + fi + -@if test ! -d $(MANDIR); then \ + echo "creating $(MANDIR)"; \ + mkdir -p $(MANDIR); \ + fi + -@if test ! -d $(SYSCONFDIR); then \ + echo "creating $(SYSCONFDIR)"; \ + mkdir $(SYSCONFDIR); \ + fi + -@if test ! -d $(SYSCONFDIR)/languages; then \ + echo "Creating $(SYSCONFDIR)/languages"; \ + mkdir $(SYSCONFDIR)/languages; \ + fi + -@if test ! -d $(SYSCONFDIR)/fonts; then \ + echo "Creating $(SYSCONFDIR)/fonts"; \ + mkdir $(SYSCONFDIR)/fonts; \ + fi + $(INSTALL_PROGRAM) sarg $(BINDIR)/sarg + chmod 755 $(BINDIR)/sarg + $(INSTALL_PROGRAM) sarg.1 $(MANDIR)/sarg.1 + chmod 755 $(MANDIR)/sarg.1 + @if test ! -f $(SYSCONFDIR)/sarg.conf; then \ + echo "cp $(SYSCONFDIR)/sarg.conf"; \ + cp sarg.conf $(SYSCONFDIR)/sarg.conf; \ + else \ + cp sarg.conf $(SYSCONFDIR)/sarg.conf.default; \ + fi + cp -r ./languages $(SYSCONFDIR); + cp ./exclude_codes $(SYSCONFDIR); + cp -r ./images $(SYSCONFDIR); + cp -r ./sarg-php $(SYSCONFDIR); + cp -r ./fonts $(SYSCONFDIR); + cp -r ./css.tpl $(SYSCONFDIR); + -@if test -d $(HTMLDIR); then \ + cp -r ./sarg-php $(HTMLDIR); \ + fi + +uninstall: + rm -f $(BINDIR)/sarg + rm -f $(MANDIR)/sarg.1 + +TAGS: $(SRCS) + etags $(SRCS) + +clean: + rm -f sarg *.o core + +mostlyclean: clean + +distclean: clean + rm -f Makefile config.status config.cache config.log + +realclean: distclean + rm -f TAGS + diff --git a/README b/README new file mode 100644 index 0000000..34aa3da --- /dev/null +++ b/README @@ -0,0 +1,74 @@ +Sarg is a Squid Analysis Report Generator that allow you to view "where" your users +are going to on the Internet. +Sarg generate reports in html, with many fields, like: users, IP Addresses, bytes, sites and times. + +Support to SmartFilter added - 09/02/2000 + +Special thanks to: +Matteo Colombo - Italian language +Palamarchuk Eugen - Russian language +Csaba Kabai - Hungarian language +Evren Yurtesen - Turkish language +Andreas Piek - German language +Fred Pacquier - French language +Leonardo A. D'Angelo - Spanish language +Seth Mos - Dutch language +Milos Prudek - Czech language +Dima I. Allaverdov - Russian_windows1251 language +V Gatut Harijiso - Indonesian language +Ivan Minchev - Bulgarian_windows1251 language +Akira Kitamura - Japanese language +Radovan Drobnjakovic - Serbian language +Pieter Kooistra - Dutch language fix +Andrew Okhmat - Russian Koi8 language fixed +Nikolai V. Ivanyushin - Russian and Bulgarian language fix +Juris Valdovskis - Latvian language +Jordan Kanev - Bulgarian language fix +Wszebor Boksa - Polish language +Adi Cretu - Romanian language +Roman Vynar - Ukrainian_windows1251 language +Andreu Sanchez - Catalan language +Antonis Maglaras - Greek language +Dusan Woletz - Slovak Language + +Translating + . Copy include/English to YourLanguage + . Translate YourLanguage + . Send YourLanguage to orso@brturbo.com to implement + + +If you use native squid log format, the elapsed time will be in reports (emulate_httpd_log off). + +1. run ./configure + + configure options: --enable-bindir=where sarg binary will be saved + default: /usr/bin + + --enable-sysconfdir - where the configuration directory is + default: /usr/local/sarg + + --enable-htmldir - where the www html root dir is + default: /var/www/html + + --enable-mandir - where the sarg man page will be saved + default: /usr/local/man/man1 + + +3. make + +4. make install + +5. Go to /usr/local/sarg (or file entered with --sysconfdir on configure) + and change sarg.conf as you need. + +6. Notes about sarg: + + Date/Time report: + Every minute that a request is logged your time is incremented by the smaller + of 1 minute or the total time for the requests. + +Usage: sarg -h + +Source: http://www.sarg-squid.org + +Any suggests and/or comments, please: orso@brturbo.com diff --git a/auth.c b/auth.c new file mode 100644 index 0000000..a1906f2 --- /dev/null +++ b/auth.c @@ -0,0 +1,63 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void htaccess(char *name) +{ + FILE *fp_auth; + + if(strncmp(UserAuthentication,"yes",3) !=0 ) + return; + + sprintf(warea,"%s/%s/.htaccess",dirname,name); + if((fp_auth=fopen(warea,"w"))==NULL) { + fprintf(stderr, "SARG: (auth) %s: %s\n",text[45],warea); + exit(1); + } + + strcpy(warea,Require); + getword(buf,warea,'%'); + fputs("AuthUserFile ",fp_auth); + fputs(AuthUserFile,fp_auth); + fputs("\n",fp_auth); + fputs("AuthName ",fp_auth); + if(strstr(AuthName,"\"") == 0) + fputs("\"",fp_auth); + fputs(AuthName,fp_auth); + if(strstr(AuthName,"\"") == 0) + fputs("\"",fp_auth); + fputs("\n",fp_auth); + fputs("AuthType ",fp_auth); + fputs(AuthType,fp_auth); + fputs("\n\n",fp_auth); + fputs(buf,fp_auth); + fputs(name,fp_auth); + fputs("\n\n",fp_auth); + + fclose(fp_auth); + + return; +} diff --git a/authfail.c b/authfail.c new file mode 100644 index 0000000..b73d262 --- /dev/null +++ b/authfail.c @@ -0,0 +1,199 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com + * 1998, 2004 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void authfail_report() +{ + + FILE *fp_in = NULL, *fp_ou = NULL; + + char url[MAXLEN]; + char html[MAXLEN]; + char html2[MAXLEN]; + char authfail_in[MAXLEN]; + char per[MAXLEN]; + char report[MAXLEN]; + char periodo[100]; + char ip[MAXLEN]; + char oip[MAXLEN]; + char user[MAXLEN]; + char ouser[MAXLEN]; + char ouser2[MAXLEN]; + char data[15]; + char hora[15]; + char ftime[128]; + char *str; + int z=0; + int count=0; + + if(strlen(DataFile) > 0) return; + + ouser[0]='\0'; + + sprintf(tmp4,"%s/authfail.log.unsort",TempDir); + + if(!authfail_count) { + unlink(tmp4); + return; + } + + sprintf(authfail_in,"%s/authfail.log",TempDir); + sprintf(per,"%s/periodo",dirname); + sprintf(report,"%s/authfail.html",dirname); + + sprintf(csort,"sort -b -T %s -k 3,3 -k 5,5 -o %s %s", TempDir, authfail_in, tmp4); + system(csort); + unlink(tmp4); + + if ((fp_in = fopen(per, "r")) == 0) { + fprintf(stderr, "SARG: (authfail) %s: %s\n",text[45],per); + exit(1); + } + + fgets(periodo,sizeof(periodo),fp_in); + fclose(fp_in); + + if((fp_in=fopen(authfail_in,"r"))==NULL) { + fprintf(stderr, "SARG: (authfail) %s: %s\n",text[45],authfail_in); + exit(1); + } + + if((fp_ou=fopen(report,"w"))==NULL) { + fprintf(stderr, "SARG: (authfail) %s: %s\n",text[45],report); + exit(1); + } + + fputs("\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + sprintf(html," \n",CharSet); + fputs(html,fp_ou); + css(fp_ou); + fputs("\n",fp_ou); + + if(strlen(FontFace) > 0) { + sprintf(url,"\n",FontFace); + fputs(url,fp_ou); + } + + sprintf(url,"\n",BgColor,TxColor,BgImage); + fputs(url,fp_ou); + + if(strlen(LogoImage) > 0) { + fputs("
\n",fp_ou); + sprintf(url,"
%s\n",LogoImage,Width,Height,LogoTextColor,LogoText); + fputs(url,fp_ou); + fputs("
\n",fp_ou); + } + + show_sarg(fp_ou,".."); + fputs("
\n",fp_ou); + sprintf(url,"\n",Title); + fputs(url,fp_ou); + + sprintf(url,"\n",text[89],periodo); + fputs(url,fp_ou); + sprintf(url,"\n",text[117],text[55]); + fputs(url,fp_ou); + fputs("
%s
%s: %s
%s %s
\n",fp_ou); + + fputs("
\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + sprintf(url,"\n",text[98],text[111],text[110],text[91]); + fputs(url,fp_ou); + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(data,buf,' '); + getword(hora,buf,' '); + getword(user,buf,' '); + getword(ip,buf,' '); + getword(url,buf,' '); + + if((str=(char *) strstr(user, "_")) != (char *) NULL ) { + if((str=(char *) strstr(str+1, "_")) != (char *) NULL ) + fixip(user); + } + + if(strcmp(Ip2Name,"yes") == 0) + ip2name(ip); + + if(!z) { + strcpy(ouser,user); + strcpy(oip,ip); + z++; + } else { + if(strcmp(ouser,user) == 0) + user[0]='\0'; + if(user[0] != '\0') + strcpy(ouser,user); + if(strcmp(oip,ip) == 0) + ip[0]='\0'; + if(ip[0] != '\0') + strcpy(oip,ip); + } + + if(UserTabFile[0] != '\0') { + sprintf(warea,":%s:",user); + if((str=(char *) strstr(userfile,warea)) != (char *) NULL ) { + z1=0; + str2=(char *) strstr(str+1,":"); + str2++; + bzero(name, MAXLEN); + while(str2[z1] != ':') { + name[z1]=str2[z1]; + z1++; + } + } else strcpy(name,user); + } else strcpy(name,user); + + if(AuthfailReportLimit) { + if(strcmp(ouser2,name) == 0) { + count++; + } else { + count=1; + strcpy(ouser2,name); + } + if(count >= AuthfailReportLimit) + continue; + } + + sprintf(html2,"\n",name,ip,data,hora,BlockImage,url,url); + fputs(html2,fp_ou); + } + + fputs("
%s%s%s%s
%s%s%s-%s%s%s
\n",fp_ou); + + show_info(fp_ou); + + fputs("\n\n",fp_ou); + + fclose(fp_in); + fclose(fp_ou); + + unlink(authfail_in); + + return; +} diff --git a/cfgaux/config.guess b/cfgaux/config.guess new file mode 100755 index 0000000..b0f5dca --- /dev/null +++ b/cfgaux/config.guess @@ -0,0 +1,696 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 93, 94, 95, 1996 Free Software Foundation, Inc. +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Written by Per Bothner . +# The master version of this file is at the FSF in /home/gd/gnu/lib. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit system type (host/target name). +# +# Only a few systems have been added to this list; please add others +# (but try to keep the structure clean). +# + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 8/24/94.) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15 + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + alpha:OSF1:*:*) + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//'` + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-cbm-sysv4 + exit 0;; + amiga:NetBSD:*:*) + echo m68k-cbm-netbsd${UNAME_RELEASE} + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-cbm-openbsd${UNAME_RELEASE} + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + Pyramid*:OSx*:*:*|MIS*:OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + atari*:NetBSD:*:*) + echo m68k-atari-netbsd${UNAME_RELEASE} + exit 0 ;; + atari*:OpenBSD:*:*) + echo m68k-atari-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3*:NetBSD:*:*) + echo m68k-sun-netbsd${UNAME_RELEASE} + exit 0 ;; + sun3*:OpenBSD:*:*) + echo m68k-sun-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:NetBSD:*:*) + echo m68k-apple-netbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-apple-openbsd${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + sed 's/^ //' << EOF >dummy.c + int main (argc, argv) int argc; char **argv; { + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + ${CC-cc} dummy.c -o dummy \ + && ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm dummy.c dummy && exit 0 + rm -f dummy.c dummy + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \ + -o ${TARGET_BINARY_INTERFACE}x = x ] ; then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i?86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + sed 's/^ //' << EOF >dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0 + rm -f dummy.c dummy + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:4) + if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=4.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[3478]??:HP-UX:*:*) + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/7?? | 9000/8?[1679] ) HP_ARCH=hppa1.1 ;; + 9000/8?? ) HP_ARCH=hppa1.0 ;; + esac + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + sed 's/^ //' << EOF >dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0 + rm -f dummy.c dummy + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i?86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*X-MP:*:*:*) + echo xmp-cray-unicos + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} + exit 0 ;; + CRAY-2:*:*:*) + echo cray2-cray-unicos + exit 0 ;; + F300:UNIX_System_V:*:*) + FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + F301:UNIX_System_V:*:*) + echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'` + exit 0 ;; + hp3[0-9][05]:NetBSD:*:*) + echo m68k-hp-netbsd${UNAME_RELEASE} + exit 0 ;; + hp3[0-9][05]:OpenBSD:*:*) + echo m68k-hp-openbsd${UNAME_RELEASE} + exit 0 ;; + i?86:BSD/386:*:* | *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:NetBSD:*:*) + echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + i*:CYGWIN*:*) + echo i386-pc-cygwin32 + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin32 + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + *:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. + ld_help_string=`ld --help 2>&1` + if echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf_i.86"; then + echo "${UNAME_MACHINE}-pc-linux-gnu" ; exit 0 + elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86linux"; then + echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0 + elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86coff"; then + echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0 + elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68kelf"; then + echo "${UNAME_MACHINE}-unknown-linux-gnu" ; exit 0 + elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68klinux"; then + echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 + elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf32ppc"; then + echo "powerpc-unknown-linux-gnu" ; exit 0 + elif test "${UNAME_MACHINE}" = "alpha" ; then + echo alpha-unknown-linux-gnu ; exit 0 + elif test "${UNAME_MACHINE}" = "sparc" ; then + echo sparc-unknown-linux-gnu ; exit 0 + else + # Either a pre-BFD a.out linker (linux-gnuoldld) or one that does not give us + # useful --help. Gcc wants to distinguish between linux-gnuoldld and linux-gnuaout. + test ! -d /usr/lib/ldscripts/. \ + && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 + # Determine whether the default compiler is a.out or elf + cat >dummy.c </dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0 + rm -f dummy.c dummy + fi ;; +# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions +# are messed up and put the nodename in both sysname and nodename. + i?86:DYNIX/ptx:4*:*) + echo i386-sequent-sysv4 + exit 0 ;; + i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*) + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} + fi + exit 0 ;; + i?86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + i?86:LynxOS:2.*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + news*:NEWS-OS:[56].*:*) + echo mips-sony-newsos${UNAME_RELEASE} + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +cat >dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +#if !defined (ultrix) + printf ("vax-dec-bsd\n"); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0 +rm -f dummy.c dummy + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +#echo '(Unable to guess system type)' 1>&2 + +exit 1 diff --git a/cfgaux/config.sub b/cfgaux/config.sub new file mode 100755 index 0000000..67d8f39 --- /dev/null +++ b/cfgaux/config.sub @@ -0,0 +1,930 @@ +#! /bin/sh +# Configuration validation subroutine script, version 1.1. +# Copyright (C) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc. +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +if [ x$1 = x ] +then + echo Configuration name missing. 1>&2 + echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 + echo "or $0 ALIAS" 1>&2 + echo where ALIAS is a recognized configuration type. 1>&2 + exit 1 +fi + +# First pass through any local machine types. +case $1 in + *local*) + echo $1 + exit 0 + ;; + *) + ;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + linux-gnu*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple) + os= + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + tahoe | i860 | m68k | m68000 | m88k | ns32k | arm \ + | arme[lb] | pyramid \ + | tron | a29k | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 \ + | alpha | we32k | ns16k | clipper | i370 | sh \ + | powerpc | powerpcle | 1750a | dsp16xx | mips64 | mipsel \ + | pdp11 | mips64el | mips64orion | mips64orionel \ + | sparc | sparclet | sparclite | sparc64) + basic_machine=$basic_machine-unknown + ;; + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i[3456]86) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + vax-* | tahoe-* | i[3456]86-* | i860-* | m68k-* | m68000-* | m88k-* \ + | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \ + | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \ + | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \ + | hppa-* | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \ + | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \ + | pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \ + | mips64el-* | mips64orion-* | mips64orionel-* | f301-* | iE86-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-cbm + ;; + amigados) + basic_machine=m68k-cbm + os=-amigados + ;; + amigaunix | amix) + basic_machine=m68k-cbm + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | ymp) + basic_machine=ymp-cray + os=-unicos + ;; + cray2) + basic_machine=cray2-cray + os=-unicos + ;; + [ctj]90-cray) + basic_machine=c90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + os=-mvs + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i[3456]86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i[3456]86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i[3456]86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i[3456]86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + mab-next) + os=-nextstep3 + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + miniframe) + basic_machine=m68000-convergent + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + np1) + basic_machine=np1-gould + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5) + basic_machine=i586-intel + ;; + pentiumpro | p6) + basic_machine=i686-intel + ;; + pentium-* | p5-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + k5) + # We don't have specific support for AMD's K5 yet, so just call it a Pentium + basic_machine=i586-amd + ;; + nexen) + # We don't have specific support for Nexgen yet, so just call it a Pentium + basic_machine=i586-nexgen + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=rs6000-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + xmp) + basic_machine=xmp-cray + os=-unicos + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + mips) + basic_machine=mips-mips + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sparc) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -unixware* | svr4*) + os=-sysv4 + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigados* | -msdos* | -newsos* | -unicos* | -aof* | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -linux-gnu* | -uxpv*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -ctix* | -uts*) + os=-sysv + ;; + -ns2 ) + os=-nextstep2 + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -xenix) + os=-xenix + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-semi) + os=-aout + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-ibm) + os=-aix + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigados + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f301-fujitsu) + os=-uxpv + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -hpux*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os diff --git a/cfgaux/install-sh b/cfgaux/install-sh new file mode 100755 index 0000000..ebc6691 --- /dev/null +++ b/cfgaux/install-sh @@ -0,0 +1,250 @@ +#! /bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/cfgaux/ll.novo b/cfgaux/ll.novo new file mode 100755 index 0000000..e69de29 diff --git a/charset.c b/charset.c new file mode 100644 index 0000000..7b54ab6 --- /dev/null +++ b/charset.c @@ -0,0 +1,66 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void ccharset() +{ + + if(strcmp(CharSet,"Latin2") == 0) + strcpy(CharSet,"ISO-8859-2"); + + if(strcmp(CharSet,"Latin3") == 0) + strcpy(CharSet,"ISO-8859-3"); + + if(strcmp(CharSet,"Latin4") == 0) + strcpy(CharSet,"ISO-8859-4"); + + if(strcmp(CharSet,"Cyrillic") == 0) + strcpy(CharSet,"ISO-8859-5"); + + if(strcmp(CharSet,"Arabic") == 0) + strcpy(CharSet,"ISO-8859-6"); + + if(strcmp(CharSet,"Greek") == 0) + strcpy(CharSet,"ISO-8859-7"); + + if(strcmp(CharSet,"Hebrew") == 0) + strcpy(CharSet,"ISO-8859-8"); + + if(strcmp(CharSet,"Latin5") == 0) + strcpy(CharSet,"ISO-8859-9"); + + if(strcmp(CharSet,"Latin6") == 0) + strcpy(CharSet,"ISO-8859-10"); + + if(strcmp(CharSet,"Windows-1251") == 0) + strcpy(CharSet,"Windows-1251"); + + if(strcmp(CharSet,"Koi8-r") == 0) + strcpy(CharSet,"KOI8-R"); + + return; + +} diff --git a/configure b/configure new file mode 100755 index 0000000..5b213d6 --- /dev/null +++ b/configure @@ -0,0 +1,4662 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.59. +# +# Copyright (C) 2003 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 Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; 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 + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + 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 + + ;; + 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 + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # 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 sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# 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'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="log.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP BINDIR MANDIR SYSCONFDIR HTMLDIR LIBOBJS LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# 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. +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' + +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 + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # 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_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 | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) 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 | -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 ;; + + -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 | -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 ;; + + -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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + 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 "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + 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'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +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 + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + 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 + + +# 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_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + 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 + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# 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 \`..'] + +_ACEOF + + cat <<_ACEOF +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] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --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] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-bindir=bindir + Select bindir + --enable-mandir=mandir + Select mandir + --enable-sysconfdir=sysconfdir + Select sysconfdir + --enable-htmldir=htmldir + Select htmldir + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --without-gcc use CC to compile + +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 + CPPFLAGS 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. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style 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 + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF + +Copyright (C) 2003 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 0 +fi +exec 5>config.log +cat >&5 <<_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.59. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +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` +hostinfo = `(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=. + echo "PATH: $as_dir" +done + +} >&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_sep= +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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$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 + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# 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 + +# 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 + + +# Let the site file select an alternate cache file if it wants to. +# 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 "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + 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. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +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 `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; 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,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +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 + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`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. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +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 + + + + + + + + + + + + + + + + + + + +ac_aux_dir= +for ac_dir in cfgaux $srcdir/cfgaux; 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 + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in cfgaux $srcdir/cfgaux" >&5 +echo "$as_me: error: cannot find install-sh or install.sh in cfgaux $srcdir/cfgaux" >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + + +LDFLAGS="-g" + +# Make sure we can run config.sub. +$ac_config_sub sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 +echo "$as_me: error: cannot run $ac_config_sub" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6 +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_build_alias=$build_alias +test -z "$ac_cv_build_alias" && + ac_cv_build_alias=`$ac_config_guess` +test -z "$ac_cv_build_alias" && + { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6 +build=$ac_cv_build +build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6 +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_host_alias=$host_alias +test -z "$ac_cv_host_alias" && + ac_cv_host_alias=$ac_cv_build_alias +ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6 +host=$ac_cv_host +host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + + + +# Check whether --with-gcc or --without-gcc was given. +if test "${with_gcc+set}" = set; then + withval="$with_gcc" + +fi; + +test -n "$CC" && cc_specified=yes +case ${with_gcc} in + yes ) CC=gcc ;; + no ) CC=cc ;; + * ) 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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_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" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +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 + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + 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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out 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. +echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$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 +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* 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 -std1 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 -std1. */ +int osf4_cc_array ['\x00' == 0 ? 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 +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +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 +;; +esac + +if test "${CC}" = "cc" ; then + CFLAGS="${CFLAGS} -w -g -O2 -Aa" +else + CFLAGS="${CFLAGS} -w" +fi + +case "$host" in + *-solaris*) + LDFLAGS="${LDFLAGS} -lsocket -lnsl" + CFLAGS="-DSOLARIS ${CFLAGS}" + ;; +esac + +#dnl Checks for programs. +#AC_PROG_CC + + + + + + + +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do + as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5 +echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include <$ac_hdr> + +int +main () +{ +if ((DIR *) 0) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 +_ACEOF + +ac_header_dirent=$ac_hdr; break +fi + +done +# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. +if test $ac_header_dirent = dirent.h; then + echo "$as_me:$LINENO: checking for library containing opendir" >&5 +echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 +if test "${ac_cv_search_opendir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_opendir=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir (); +int +main () +{ +opendir (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_opendir="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_opendir" = no; then + for ac_lib in dir; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir (); +int +main () +{ +opendir (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_opendir="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 +echo "${ECHO_T}$ac_cv_search_opendir" >&6 +if test "$ac_cv_search_opendir" != no; then + test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" + +fi + +else + echo "$as_me:$LINENO: checking for library containing opendir" >&5 +echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 +if test "${ac_cv_search_opendir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_opendir=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir (); +int +main () +{ +opendir (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_opendir="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_opendir" = no; then + for ac_lib in x; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir (); +int +main () +{ +opendir (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_opendir="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 +echo "${ECHO_T}$ac_cv_search_opendir" >&6 +if test "$ac_cv_search_opendir" != no; then + test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" + +fi + +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 +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f 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 +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +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 + + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#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)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +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=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +for ac_header in stdio.h stdlib.h string.h strings.h sys/time.h time.h unistd.h sys/dirent.h \ + dirent.h sys/socket.h netdb.h arpa/inet.h sys/types.h netinet/in.h sys/stat.h \ + ctype.h gd.h gdfontl.h gdfontt.h gdfonts.h gdfontmb.h gdfontg.h errno.h \ + sys/resource.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +echo "$as_me:$LINENO: checking for gdImagePng in -lgd" >&5 +echo $ECHO_N "checking for gdImagePng in -lgd... $ECHO_C" >&6 +if test "${ac_cv_lib_gd_gdImagePng+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgd $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gdImagePng (); +int +main () +{ +gdImagePng (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_gd_gdImagePng=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_gd_gdImagePng=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_gd_gdImagePng" >&5 +echo "${ECHO_T}$ac_cv_lib_gd_gdImagePng" >&6 +if test $ac_cv_lib_gd_gdImagePng = yes; then + LIBS="-lgd ${LIBS}"; HAVE_GD="yes" +else + HAVE_GD="" +fi + + +echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 +if test "${ac_cv_c_const+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset x; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *ccp; + char **p; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + ccp = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++ccp; + p = (char**) ccp; + ccp = (char const *const *) p; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + } +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_const=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_c_const=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +echo "${ECHO_T}$ac_cv_c_const" >&6 +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const +_ACEOF + +fi + +echo "$as_me:$LINENO: checking whether struct tm is in sys/time.h or time.h" >&5 +echo $ECHO_N "checking whether struct tm is in sys/time.h or time.h... $ECHO_C" >&6 +if test "${ac_cv_struct_tm+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include + +int +main () +{ +struct tm *tp; tp->tm_sec; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_struct_tm=time.h +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_struct_tm=sys/time.h +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_struct_tm" >&5 +echo "${ECHO_T}$ac_cv_struct_tm" >&6 +if test $ac_cv_struct_tm = sys/time.h; then + +cat >>confdefs.h <<\_ACEOF +#define TM_IN_SYS_TIME 1 +_ACEOF + +fi + + +# Check whether fopen64 is available and whether _LARGEFILE64_SOURCE +# needs to be defined for it +echo "$as_me:$LINENO: checking for fopen64" >&5 +echo $ECHO_N "checking for fopen64... $ECHO_C" >&6 +if test "${bu_cv_have_fopen64+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen64 ("/tmp/foo","r"); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + bu_cv_have_fopen64=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +saved_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$CPPFLAGS -D_LARGEFILE64_SOURCE" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen64 ("/tmp/foo","r"); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + bu_cv_have_fopen64="need -D_LARGEFILE64_SOURCE" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +bu_cv_have_fopen64=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CPPFLAGS=$saved_CPPFLAGS +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + +echo "$as_me:$LINENO: result: $bu_cv_have_fopen64" >&5 +echo "${ECHO_T}$bu_cv_have_fopen64" >&6 +if test "$bu_cv_have_fopen64" != no; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_FOPEN64 1 +_ACEOF + + if test "$bu_cv_have_fopen64" = "need -D_LARGEFILE64_SOURCE"; then + +cat >>confdefs.h <<\_ACEOF +#define _LARGEFILE64_SOURCE 1 +_ACEOF + + fi +fi + + +# Check whether --enable-bindir or --disable-bindir was given. +if test "${enable_bindir+set}" = set; then + enableval="$enable_bindir" + + if test "$enableval"; then + BINDIR=$enableval + fi + +else + BINDIR="/usr/bin" +fi; +echo "using $BINDIR as the SARG binary" + + +# Check whether --enable-mandir or --disable-mandir was given. +if test "${enable_mandir+set}" = set; then + enableval="$enable_mandir" + + if test "$enableval"; then + MANDIR=$enableval + fi + +else + MANDIR="/usr/local/man/man1" +fi; +echo "using $MANDIR as the SARG man page" + + +# Check whether --enable-sysconfdir or --disable-sysconfdir was given. +if test "${enable_sysconfdir+set}" = set; then + enableval="$enable_sysconfdir" + + if test "$enableval"; then + SYSCONFDIR=$enableval + fi + +else + SYSCONFDIR="/usr/local/sarg" +fi; +echo "using $SYSCONFDIR as the SARG configuration dir" + + +# Check whether --enable-htmldir or --disable-htmldir was given. +if test "${enable_htmldir+set}" = set; then + enableval="$enable_htmldir" + + if test "$enableval"; then + HTMLDIR=$enableval + fi + +else + HTMLDIR="/var/www/html" +fi; +echo "using $HTMLDIR as the WWW Document Root dir" + + + + ac_config_files="$ac_config_files 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, 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 | grep ac_space) 2>&1` in + *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 \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + 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}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ 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[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +# 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 we branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +cat >confdef2opt.sed <<\_ACEOF +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +t quote +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +t quote +d +: quote +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,\[,\\&,g +s,\],\\&,g +s,\$,$$,g +p +_ACEOF +# We use echo to avoid assuming a particular line-breaking character. +# The extra dot is to prevent the shell from consuming trailing +# line-breaks from the sub-command output. A line-break within +# single-quotes doesn't work because, if this script is created in a +# platform that uses two characters for line-breaks (e.g., DOS), tr +# would break. +ac_LF_and_DOT=`echo; echo .` +DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` +rm -f confdef2opt.sed + + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $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} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; 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 + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + 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 + + ;; + 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 + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # 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 sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# 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'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.59. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet 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 ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.59, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2003 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +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=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + 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 +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + + + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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 to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# 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. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@BINDIR@,$BINDIR,;t t +s,@MANDIR@,$MANDIR,;t t +s,@SYSCONFDIR@,$SYSCONFDIR,;t t +s,@HTMLDIR@,$HTMLDIR,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # 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_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # 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" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # 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. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;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,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# 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 || { (exit 1); exit 1; } +fi + diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..9a9afc5 --- /dev/null +++ b/configure.in @@ -0,0 +1,123 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(log.c) +AC_CONFIG_AUX_DIR(cfgaux) + +LDFLAGS="-g" + +AC_CANONICAL_HOST + +AC_ARG_WITH(gcc, +[ --without-gcc use CC to compile]) + +test -n "$CC" && cc_specified=yes +case ${with_gcc} in + yes ) CC=gcc ;; +dnl yes ) CC=g++ ;; + no ) CC=cc ;; + * ) AC_PROG_CC;; +dnl * ) AC_PROG_CXX ;; +esac + +if test "${CC}" = "cc" ; then + CFLAGS="${CFLAGS} -w -g -O2 -Aa" +else + CFLAGS="${CFLAGS} -w" +fi + +case "$host" in + *-solaris*) + LDFLAGS="${LDFLAGS} -lsocket -lnsl" + CFLAGS="-DSOLARIS ${CFLAGS}" + ;; +esac + +#dnl Checks for programs. +#AC_PROG_CC + +dnl Check for headers +AC_HEADER_DIRENT +AC_HEADER_STDC + +AC_CHECK_HEADERS(stdio.h stdlib.h string.h strings.h sys/time.h time.h unistd.h sys/dirent.h \ + dirent.h sys/socket.h netdb.h arpa/inet.h sys/types.h netinet/in.h sys/stat.h \ + ctype.h gd.h gdfontl.h gdfontt.h gdfonts.h gdfontmb.h gdfontg.h iconv.h errno.h) + +AC_CHECK_LIB(gd, gdImagePng,LIBS="-lgd ${LIBS}"; HAVE_GD="yes", HAVE_GD="") + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_STRUCT_TM + +# Check whether fopen64 is available and whether _LARGEFILE64_SOURCE +# needs to be defined for it +AC_MSG_CHECKING([for fopen64]) +AC_CACHE_VAL(bu_cv_have_fopen64, +[AC_TRY_LINK([#include ], [FILE *f = fopen64 ("/tmp/foo","r");], +bu_cv_have_fopen64=yes, +[saved_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$CPPFLAGS -D_LARGEFILE64_SOURCE" + AC_TRY_LINK([#include ], [FILE *f = fopen64 ("/tmp/foo","r");], +bu_cv_have_fopen64="need -D_LARGEFILE64_SOURCE", +bu_cv_have_fopen64=no) + CPPFLAGS=$saved_CPPFLAGS])]) +AC_MSG_RESULT($bu_cv_have_fopen64) +if test "$bu_cv_have_fopen64" != no; then + AC_DEFINE([HAVE_FOPEN64], 1, + [Is fopen64 available?]) + if test "$bu_cv_have_fopen64" = "need -D_LARGEFILE64_SOURCE"; then + AC_DEFINE([_LARGEFILE64_SOURCE], 1, + [Enable LFS]) + fi +fi + + +dnl Select bindir +AC_ARG_ENABLE(bindir, +[ --enable-bindir=bindir + Select bindir ], +[ + if test "$enableval"; then + BINDIR=$enableval + fi +],[BINDIR="/usr/bin"]) +echo "using $BINDIR as the SARG binary" +AC_SUBST(BINDIR) + +dnl Select mandir +AC_ARG_ENABLE(mandir, +[ --enable-mandir=mandir + Select mandir ], +[ + if test "$enableval"; then + MANDIR=$enableval + fi +],[MANDIR="/usr/local/man/man1"]) +echo "using $MANDIR as the SARG man page" +AC_SUBST(MANDIR) + +dnl Select sysconfdir +AC_ARG_ENABLE(sysconfdir, +[ --enable-sysconfdir=sysconfdir + Select sysconfdir ], +[ + if test "$enableval"; then + SYSCONFDIR=$enableval + fi +],[SYSCONFDIR="/usr/local/sarg"]) +echo "using $SYSCONFDIR as the SARG configuration dir" +AC_SUBST(SYSCONFDIR) + +dnl Select htmldir +AC_ARG_ENABLE(htmldir, +[ --enable-htmldir=htmldir + Select htmldir ], +[ + if test "$enableval"; then + HTMLDIR=$enableval + fi +],[HTMLDIR="/var/www/html"]) +echo "using $HTMLDIR as the WWW Document Root dir" +AC_SUBST(HTMLDIR) + + +AC_OUTPUT(Makefile) diff --git a/convlog.c b/convlog.c new file mode 100644 index 0000000..dd1b918 --- /dev/null +++ b/convlog.c @@ -0,0 +1,71 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void convlog(char *arq, char *df, int dfrom, int duntil) +{ + + FILE *fp_in; + char buf[MAXLEN]; + char data[30]; + char dia[11]; + char hora[9]; + char wdata[20]; + time_t tt; + int idata=0; + struct tm *t; + + if(arq[0] == '\0') + strcpy(arq,"/usr/local/squid/logs/access.log"); + + if((fp_in=fopen(arq,"r"))==NULL) { + fprintf(stderr, "SARG: (convlog) %s: %s\n",text[8],arq); + exit(1); + } + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(data,buf,' '); + tt=atoi(data); + t=localtime(&tt); + + if(dfrom) { + strftime(wdata, 127, "%Y%m%d", t); + idata=atoi(wdata); + if(idata < dfrom || idata > duntil) + continue; + } + + if(strncmp(df,"e",1) == 0) + strftime(dia, 127, "%d/%m/%Y", t); + else + strftime(dia, 127, "%m/%d/%Y", t); + sprintf(hora,"%02d:%02d:%02d",t->tm_hour,t->tm_min,t->tm_sec); + + printf("%s %s %s",dia,hora,buf); + } + + fclose(fp_in); +} diff --git a/css.c b/css.c new file mode 100644 index 0000000..28ea8a9 --- /dev/null +++ b/css.c @@ -0,0 +1,98 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +int css(FILE *fp_css) +{ + FILE *fp_in, *fp_ou; + char csstext[512]; + + fp_ou = fp_css; + if(strlen(ExternalCSSFile) > 0) { + if((fp_in=fopen(ExternalCSSFile,"r"))==NULL) { + fprintf(stderr, "SARG: (css) %s: %s\n",text[45],ExternalCSSFile); + exit(1); + } + fputs("\n",fp_ou); + return; + } + + fputs("\n",fp_ou); + fflush(fp_ou); + + return; +;} diff --git a/css.tpl b/css.tpl new file mode 100644 index 0000000..d6b6be7 --- /dev/null +++ b/css.tpl @@ -0,0 +1,14 @@ +.body {font-family:Verdana,Tahoma,Arial;color:#000000;background-color:#FFFFFF;} +.info {font-family:Verdana,Tahoma,Arial;font-size:9px;} +.info a:link,a:visited {font-family:Verdana,Tahoma,Arial;color:#0000FF;font-size:9px;text-decoration:none;} +.title {font-family:Verdana,Tahoma,Arial;font-size:11px;color:darkblue;background-color:#FFFFFF;} +.header {font-family:Verdana,Tahoma,Arial;font-size:9px;color:darkblue;background-color:#DDDDDD;text-align:left;border-right:1px solid #6A5ACD;border-bottom:1px solid #6A5ACD;} +.header2 {font-family:Verdana,Tahoma,Arial;font-size:9px;color:darkblue;background-color:#DDDDDD;text-align:right;border-right:1px solid #6A5ACD;border-bottom:1px solid #6A5ACD;} +.header3 {font-family:Verdana,Tahoma,Arial;font-size:9px;color:darkblue;background-color:#DDDDDD;text-align:center;border-right:1px solid #6A5ACD;border-bottom:1px solid #6A5ACD;} +.text {font-family:Verdana,Tahoma,Arial;color:#000000;font-size:9px;} +.data {font-family:Verdana,Tahoma,Arial;color:#000000;font-size:9px;background-color:lavender;text-align:right;border-right:1px solid #6A5ACD;border-bottom:1px solid #6A5ACD;} +.data a:link,a:visited {font-family:Verdana,Tahoma,Arial;color:#0000FF;font-size:9px;background-color:lavender;text-align:right;text-decoration:none;} +.data2 {font-family:Verdana,Tahoma,Arial;color:#000000;font-size:9px;background-color:lavender;border-right:1px solid #6A5ACD;border-bottom:1px solid #6A5ACD;} +.data2 a:link,a:visited {font-family:Verdana,Tahoma,Arial;color:#0000FF;font-size:9px;background-color:lavender;text-decoration:none;} +.link {font-family:Verdana,Tahoma,Arial;font-size:9px;color:#0000FF;} +.link a:link,a:visited {font-family:Verdana,Tahoma,Arial;font-size:9px;color:#0000FF;text-decoration:none;} diff --git a/dansguardian_log.c b/dansguardian_log.c new file mode 100644 index 0000000..e80cb1e --- /dev/null +++ b/dansguardian_log.c @@ -0,0 +1,155 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +int dansguardian_log() +{ + + FILE *fp_in = NULL, *fp_ou = NULL, *fp_guard = NULL; + char guard_in[MAXLEN]; + char guard_ou[MAXLEN]; + char loglocation[MAXLEN] = "/var/log/dansguardian/access.log"; + char year[10], mon[10], day[10]; + char hour[15]; + char user[MAXLEN], code1[255], code2[255]; + char ip[30]; + char wdata[127]; + int idata=0; + int x, y; + + if(strlen(DansGuardianConf) < 1) + return; + + bzero(day, 3); + bzero(mon, 4); + bzero(year, 5); + + if(strcmp(df,"e") == 0) { + strncpy(day,periodo,2); + strncpy(mon,periodo+2,3); + strncpy(year,periodo+5,4); + conv_month(mon); + sprintf(warea,"%s%s%s",year,mon,day); + dfrom=atoi(warea); + strncpy(day,periodo+10,2); + strncpy(mon,periodo+12,3); + strncpy(year,periodo+15,4); + conv_month(mon); + sprintf(warea,"%s%s%s",year,mon,day); + duntil=atoi(warea); + } else { + strncpy(day,periodo+7,2); + strncpy(mon,periodo+4,3); + strncpy(year,periodo,4); + conv_month(mon); + sprintf(warea,"%s%s%s",year,mon,day); + dfrom=atoi(warea); + strncpy(day,periodo+17,2); + strncpy(mon,periodo+14,3); + strncpy(year,periodo+10,4); + conv_month(mon); + sprintf(warea,"%s%s%s",year,mon,day); + duntil=atoi(warea); + } + + sprintf(guard_in,"%s/dansguardian.unsort",tmp); + sprintf(guard_ou,"%s/dansguardian.log",tmp); + + if(access(DansGuardianConf, R_OK) != 0) { + sprintf(msg,"Cannot open DansGuardian config file: %s",DansGuardianConf); + debuga(msg); + exit(1); + } + + if((fp_guard=fopen(DansGuardianConf,"r"))==NULL) { + fprintf(stderr, "SARG: (dansguardian) %s: %s\n",text[8],DansGuardianConf); + exit(1); + } + + if((fp_ou=fopen(guard_in,"a"))==NULL) { + fprintf(stderr, "SARG: (dansguardian) %s: %s\n",text[8],guard_in); + exit(1); + } + + while(fgets(buf,sizeof(buf),fp_guard)!=NULL) { + if(strstr(buf,"\n") != 0) + buf[strlen(buf)-1]='\0'; + if(strncmp(buf,"#",1) == 0) + continue; + if(strstr(buf,"loglocation ") != 0) { + getword(loglocation,buf,'\''); + getword(loglocation,buf,'\''); + break; + } + } + + if(debug) { + strcpy(buf,text[7]); + getword(urly,buf,' '); + getword(href,buf,' '); + sprintf(msg,"%s DansGuardian %s: %s",urly,buf,loglocation); + debuga(msg); + } + + if((fp_in=fopen(loglocation,"r"))==NULL) { + fprintf(stderr, "SARG: (dansguardian) %s: %s\n",text[8],loglocation); + exit(1); + } + + while(fgets(buf,sizeof(buf),fp_in) != NULL) { + if(strstr(buf," *DENIED* ") == 0) + continue; + getword(year,buf,'.'); + getword(mon,buf,'.'); + getword(day,buf,' '); + getword(hour,buf,' '); + getword(user,buf,' '); + getword(ip,buf,' '); + getword(url,buf,'/'); + getword(url,buf,'/'); + getword(url,buf,' '); + getword(code1,buf,' '); + getword(code1,buf,' '); + getword(code2,buf,' '); + sprintf(wdata,"%s%02d%s",year,atoi(mon),day); + idata = atoi(wdata); + + if(idata >= dfrom && idata <= duntil) { + if(strcmp(user,"-") == 0) + strcpy(user,ip); + sprintf(tmp6,"%s %d %s %s %s %s %s\n",user,idata,hour,ip,url,code1,code2); + fputs(tmp6, fp_ou); + dansguardian_count++; + } + } + fclose(fp_in); + fclose(fp_guard); + fclose(fp_ou); + sprintf(tmp6,"sort -k 1,1 -k 2,2 -k 4,4 %s -o %s",guard_in, guard_ou); + system(tmp6); + unlink(guard_in); + return; +} diff --git a/dansguardian_report.c b/dansguardian_report.c new file mode 100644 index 0000000..836d060 --- /dev/null +++ b/dansguardian_report.c @@ -0,0 +1,214 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void dansguardian_report() +{ + + FILE *fp_in = NULL, *fp_ou = NULL; + + char url[MAXLEN]; + char html[MAXLEN]; + char html2[MAXLEN]; + char dansguardian_in[MAXLEN]; + char dansguardian_ou[MAXLEN]; + char per[MAXLEN]; + char report[MAXLEN]; + char periodo[100]; + char ip[MAXLEN]; + char rule[255]; + char oip[MAXLEN]; + char user[MAXLEN]; + char ouser[MAXLEN]; + char date[15]; + char date2[15]; + char hour[15]; + char ftime[128]; + char *str; + int z=0; + int count=0; + + ouser[0]='\0'; + + sprintf(dansguardian_in,"%s/dansguardian.log",tmp); + if(!dansguardian_count) { + unlink(dansguardian_in); + return; + } + + sprintf(per,"%s/periodo",dirname); + sprintf(report,"%s/dansguardian.html",dirname); + + if ((fp_in = fopen(per, "r")) == 0) { + fprintf(stderr, "SARG: (dansguardian_report) %s: %s\n",text[45],per); + exit(1); + } + + fgets(periodo,sizeof(periodo),fp_in); + fclose(fp_in); + + if((fp_in=fopen(dansguardian_in,"r"))==NULL) { + fprintf(stderr, "SARG: (dansguardian_report) %s: %s\n",text[8],dansguardian_in); + exit(1); + } + + if((fp_ou=fopen(report,"w"))==NULL) { + fprintf(stderr, "SARG: (dansguardian_report) %s: %s\n",text[8],report); + exit(1); + } + + fputs("\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + sprintf(html," \n",CharSet); + fputs(html,fp_ou); + css(fp_ou); + fputs("\n",fp_ou); + + if(strlen(FontFace) > 0) { + sprintf(url,"\n",FontFace); + fputs(url,fp_ou); + } + + sprintf(url,"\n",BgColor,TxColor,BgImage); + fputs(url,fp_ou); + + if(strlen(LogoImage) > 0) { + fputs("
\n",fp_ou); + sprintf(url,"
\ + %s\n",LogoImage,Width,Height,LogoTextColor,LogoText); + fputs(url,fp_ou); + fputs("
\n",fp_ou); + } + + show_sarg(fp_ou,".."); + fputs("
\n",fp_ou); + sprintf(url,"\n",Title); + fputs(url,fp_ou); + + sprintf(url,"\n",text[89],periodo); + fputs(url,fp_ou); + sprintf(url,"\n",text[128],text[55]); + fputs(url,fp_ou); + fputs("
%s
%s: %s
%s %s
\n",fp_ou); + + fputs("
\n",fp_ou); + fputs("\n",fp_ou); + sprintf(url,"\n",text[98],text[111],text[110],text[91],text[129]); + fputs(url,fp_ou); + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(user,buf,' '); + getword(date2,buf,' '); + getword(hour,buf,' '); + getword(ip,buf,' '); + getword(url,buf,' '); + getword(rule,buf,'\n'); + + if(strcmp(UserIp,"yes") == 0) + strcpy(user,ip); + + bzero(date, 15); + if(strncmp(df,"u",1) != 0) { + strncpy(date,date2+6,2); + strcat(date,"/"); + strncat(date,date2+4,2); + strcat(date,"/"); + strncat(date,date2,4); + } else { + strncpy(date,date2+4,2); + strcat(date,"/"); + strncat(date,date2+6,2); + strcat(date,"/"); + strncat(date,date2,4); + } + + if((str=(char *) strstr(user, "_")) != (char *) NULL ) { + if((str=(char *) strstr(str+1, "_")) != (char *) NULL ) + fixip(user); + } + + if(strcmp(Ip2Name,"yes") == 0) + ip2name(ip); + + if(!z) { + strcpy(ouser,user); + strcpy(oip,ip); + z++; + } else { + if(strcmp(ouser,user) == 0) + user[0]='\0'; + if(user[0] != '\0') + strcpy(ouser,user); + if(strcmp(oip,ip) == 0) + ip[0]='\0'; + if(ip[0] != '\0') + strcpy(oip,ip); + } + + if(UserTabFile[0] != '\0') { + sprintf(warea,":%s:",user); + if((str=(char *) strstr(userfile,warea)) != (char *) NULL ) { + z1=0; + str2=(char *) strstr(str+1,":"); + str2++; + bzero(name, MAXLEN); + while(str2[z1] != ':') { + name[z1]=str2[z1]; + z1++; + } + } else strcpy(name,user); + } else strcpy(name,user); + + if(DansGuardianReportLimit) { + if(strcmp(ouser2,name) == 0) { + count++; + } else { + count=1; + strcpy(ouser2,name); + } + if(count >= DansGuardianReportLimit) + continue; + } + + sprintf(html2,"\n",name,ip,date,hour,url,url,rule); + fputs(html2,fp_ou); + } + + fputs("
%s%s%s%s%s
%s%s%s-%s%s%s
\n",fp_ou); + + show_info(fp_ou); + + fputs("\n\n",fp_ou); + + fclose(fp_in); + fclose(fp_ou); + + unlink(dansguardian_in); + + return; +} diff --git a/datafile.c b/datafile.c new file mode 100644 index 0000000..08ed1f9 --- /dev/null +++ b/datafile.c @@ -0,0 +1,222 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void saverecs(char *dirname, char *user, long long int nacc, char *url, long long int nbytes, char *ip, char *hora, char *dia, long long int nelap, long long int incache, long long int oucache); +void grava_SmartFilter(char *dirname, char *user, char *ip, char *data, char *hora, char *url, char *smart); + +void data_file(char *tmp) +{ + + FILE *fp_in; + + char accdia[11], acchora[9], accuser[MAXLEN], accip[MAXLEN], accurl[MAXLEN], accbytes[12], accelap[10]; + char oldaccdia[11], oldacchora[9], oldaccip[MAXLEN], wdir[MAXLEN], per1[MAXLEN]; + char dirname[MAXLEN], wdirname[MAXLEN], oldurl[MAXLEN], oldaccuser[MAXLEN]; + char olduser[MAXLEN], oldmsg[50], acccode[50], oldaccelap[10], oldacccode[50]; + char ipantes[MAXLEN], nameantes[MAXLEN]; + char accsmart[MAXLEN]; + char Msg[MAXLEN]; + int smartfilter=0; + char wcrc[50]; + char crc2[50]; + char wdname[MAXLEN]; + char wname2[MAXLEN]; + DIR *dirp; + struct dirent *direntp; + long long int nbytes=0; + long long int nelap=0; + long long int nacc=0; + long long int rtotal=0; + long long int incache=0; + long long int oucache=0; + char *s; + + ipantes[0]='\0'; + nameantes[0]='\0'; + + olduser[0]='\0'; + strncat(tmp,"/sarg",5); + + dirp = opendir(tmp); + while ( (direntp = readdir( dirp )) != NULL ) { + if(strstr(direntp->d_name,".log") == 0) + continue; + sprintf(tmp3,"%s/%s",tmp,direntp->d_name); + + if((fp_in=fopen(tmp3,"r"))==NULL){ + fprintf(stderr, "SARG: (datafile) %s: %s\n",text[45],tmp); + exit(1); + } + strcpy(wdname,direntp->d_name); + strip_prefix: + getword(wname2,wdname,'.'); + strcat(user,wname2); + + ttopen=0; + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(accdia,buf,' '); + getword(acchora,buf,' '); + getword(accuser,buf,' '); + getword(accip,buf,' '); + getword(accurl,buf,' '); + getword(accbytes,buf,' '); + getword(acccode,buf,' '); + getword(accelap,buf,' '); + getword(accsmart,buf,' '); + getword(accsmart,buf,'"'); + + if(strcmp(Ip2Name,"yes") == 0) { + if(strcmp(accip,ipantes) != 0) { + strcpy(ipantes,accip); + ip2name(accip); + strcpy(nameantes,accip); + } else strcpy(accip,nameantes); + } + + if(!rtotal){ + strcpy(oldurl,accurl); + strcpy(oldacccode,acccode); + strcpy(oldaccelap,accelap); + strcpy(oldaccuser,accuser); + strcpy(oldaccip,accip); + strcpy(oldaccdia,accdia); + strcpy(oldacchora,acchora); + rtotal++; + } + + if(strcmp(oldurl,accurl) != 0 || strcmp(oldaccuser,accuser) != 0){ + strcpy(oldmsg,"OK"); + if(strstr(oldacccode,"DENIED") != 0) + sprintf(oldmsg,"%s",text[46]); + strcpy(wdirname,dirname); + gravatmp(oldaccuser,wdirname,oldurl,nacc,nbytes,oldmsg,nelap,indexonly,incache,oucache); + strcpy(wdirname,dirname); + saverecs(wdirname,oldaccuser,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache); + nacc=0; + nbytes=0; + nelap=0; + incache=0; + oucache=0; + if(strcmp(oldaccuser,accuser) != 0) + ind2=0; + } + + nacc++; + nbytes+=my_atoll(accbytes); + nelap+=my_atoll(accelap); + + strcpy(wcrc,acccode); + getword(crc2,wcrc,'/'); + + if(strstr(crc2,"MISS") != 0) + oucache+=my_atoll(accbytes); + else incache+=my_atoll(accbytes); + + strcpy(oldurl,accurl); + strcpy(oldaccuser,accuser); + strcpy(oldacccode,acccode); + strcpy(oldaccelap,accelap); + strcpy(oldaccip,accip); + strcpy(oldaccdia,accdia); + strcpy(oldacchora,acchora); + } + + fclose(fp_in); +} + + (void)closedir( dirp ); + if(debug) { + sprintf(Msg,"Datafile %s successfully",DataFile); + debuga(Msg); + } + return; +} + +void saverecs(char *dirname, char *user, long long int nacc, char *url, long long int nbytes, char *ip, char *hora, char *dia, long long int nelap, long long int incache, long long int oucache) +{ + + FILE *fp_ou; + char reg[MAXLEN]; + + if((fp_ou=fopen(DataFile,"a"))==NULL){ + fprintf(stderr, "SARG: (datafile) %s: %s\n",text[45],DataFile); + exit(1); + } + + my_lltoa(nacc,val1,0); + my_lltoa(nbytes,val2,0); + my_lltoa(nelap,val3,0); + my_lltoa(incache,val4,0); + my_lltoa(oucache,val5,0); + + if(strstr(DataFileFields,"user") != 0) { + strcpy(reg,user); + strncat(reg,DataFileDelimiter,1); + } + if(strstr(DataFileFields,"date") != 0) { + strncat(reg,dia,strlen(dia)); + strncat(reg,DataFileDelimiter,1); + } + if(strstr(DataFileFields,"time") != 0) { + strncat(reg,hora,strlen(hora)); + strncat(reg,DataFileDelimiter,1); + } + if(strstr(DataFileFields,"url") != 0) { + strcpy(name,url); + name2ip(name); + strncat(reg,name,strlen(name)); + strncat(reg,DataFileDelimiter,1); + } + if(strstr(DataFileFields,"connect") != 0) { + strncat(reg,val1,strlen(val1)); + strncat(reg,DataFileDelimiter,1); + } + if(strstr(DataFileFields,"bytes") != 0) { + strncat(reg,val2,strlen(val2)); + strncat(reg,DataFileDelimiter,1); + } + if(strstr(DataFileFields,"in_cache") != 0) { + strncat(reg,val4,strlen(val4)); + strncat(reg,DataFileDelimiter,1); + } + if(strstr(DataFileFields,"out_cache") != 0) { + strncat(reg,val5,strlen(val5)); + strncat(reg,DataFileDelimiter,1); + } + if(strstr(DataFileFields,"elapsed") != 0) { + strncat(reg,val3,strlen(val3)); + strncat(reg,DataFileDelimiter,1); + } + + reg[strlen(reg)-1]='\n'; + fputs(reg,fp_ou); + + fclose(fp_ou); + + return; + +} diff --git a/decomp.c b/decomp.c new file mode 100644 index 0000000..956e816 --- /dev/null +++ b/decomp.c @@ -0,0 +1,96 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void decomp(char *arq, char *zip, char *tmp) +{ + + char cmd[1024]; + + if(access(arq, R_OK) != 0) { + sprintf(cmd,"%s: %s",text[64],arq); + debuga(cmd); + exit(1); + } + + if(strstr(arq,".gz") !=0) { + sprintf(cmd,"%s: %s > %s/sarg-file.in (zcat)",text[62],arq,tmp); + debuga(cmd); + sprintf(cmd,"zcat %s > %s/sarg-file.in",arq,tmp); + system(cmd); + strcpy(zip,"zcat"); + sprintf(arq,"%s/sarg-file.in",tmp); + return; + } + + if(strstr(arq,".bz2") != 0) { + sprintf(cmd,"%s: %s > %s/sarg-file.in (bzcat)",text[62],arq,tmp); + debuga(cmd); + sprintf(cmd,"bzcat %s > %s/sarg-file.in",arq,tmp); + system(cmd); + strcpy(zip,"zcat"); + sprintf(arq,"%s/sarg-file.in",tmp); + return; + } + + if(strstr(arq,".Z")) { + sprintf(cmd,"%s: %s (uncompress)",text[62],arq); + debuga(cmd); + sprintf(cmd,"uncompress %s",arq); + system(cmd); + arq[strlen(arq)-2]='\0'; + strcpy(zip,"compress"); + } + + return; + +} + + +void recomp(char *arq, char *zip) +{ + + char cmd[1024]; + + if(access(arq, R_OK) != 0) { + sprintf(cmd,"%s: %s",text[64],arq); + debuga(cmd); + exit(1); + } + + sprintf(cmd,"%s: %s",text[63],arq); + debuga(cmd); + + if(strcmp(zip,"gzip") == 0) + sprintf(cmd,"%s %s",zip,arq); + + if(strcmp(zip,"compress") == 0) + sprintf(cmd,"%s %s",zip,arq); + + system(cmd); + return; + +} diff --git a/denied.c b/denied.c new file mode 100644 index 0000000..954d0e4 --- /dev/null +++ b/denied.c @@ -0,0 +1,192 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void gen_denied_report() +{ + + FILE *fp_in = NULL, *fp_ou = NULL; + + char url[MAXLEN]; + char html[MAXLEN]; + char html2[MAXLEN]; + char denied_in[MAXLEN]; + char denied_ou[MAXLEN]; + char per[MAXLEN]; + char report[MAXLEN]; + char periodo[100]; + char ip[MAXLEN]; + char oip[MAXLEN]; + char user[MAXLEN]; + char ouser[MAXLEN]; + char ouser2[MAXLEN]; + char data[15]; + char hora[15]; + char ftime[128]; + char *str; + int z=0; + int count=0; + + ouser[0]='\0'; + + sprintf(denied_in,"%s/denied.log",TempDir); + if(!denied_count) { + unlink(denied_in); + return; + } + + sprintf(per,"%s/periodo",dirname); + sprintf(report,"%s/denied.html",dirname); + + if ((fp_in = fopen(per, "r")) == 0) { + fprintf(stderr, "SARG: (denied) %s: %s\n",text[45],per); + exit(1); + } + + fgets(periodo,sizeof(periodo),fp_in); + fclose(fp_in); + + if((fp_in=fopen(denied_in,"r"))==NULL) { + fprintf(stderr, "SARG: (denied) %s: %s\n",text[8],denied_in); + exit(1); + } + + if((fp_ou=fopen(report,"w"))==NULL) { + fprintf(stderr, "SARG: (denied) %s: %s\n",text[8],report); + exit(1); + } + + fputs("\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + sprintf(html," \n",CharSet); + fputs(html,fp_ou); + css(fp_ou); + fputs("\n",fp_ou); + + sprintf(url,"\n",BgColor,TxColor,BgImage); + fputs(url,fp_ou); + + fputs("
\n",fp_ou); + + if(strlen(LogoImage) > 0) { + sprintf(url,"\n",Title); + fputs(url,fp_ou); + + sprintf(url,"\n",text[89],periodo); + fputs(url,fp_ou); + sprintf(url,"\n",text[46],text[55]); + fputs(url,fp_ou); + fputs("
%s\n",LogoImage,Width,Height,LogoTextColor,LogoText); + fputs(url,fp_ou); + } + + show_sarg(fp_ou, ".."); + sprintf(url,"
%s
%s: %s
%s %s
\n",fp_ou); + + fputs("
\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + sprintf(url,"\n",text[98],text[111],text[110],text[91]); + fputs(url,fp_ou); + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(data,buf,' '); + getword(hora,buf,' '); + getword(user,buf,' '); + getword(ip,buf,' '); + getword(url,buf,' '); + + if((str=(char *) strstr(user, "_")) != (char *) NULL ) { + if((str=(char *) strstr(str+1, "_")) != (char *) NULL ) + fixip(user); + } + + if(strcmp(Ip2Name,"yes") == 0) + ip2name(ip); + + if(!z) { + strcpy(ouser,user); + strcpy(oip,ip); + z++; + } else { + if(strcmp(ouser,user) == 0) + user[0]='\0'; + if(user[0] != '\0') + strcpy(ouser,user); + if(strcmp(oip,ip) == 0) + ip[0]='\0'; + if(ip[0] != '\0') + strcpy(oip,ip); + } + + if(UserTabFile[0] != '\0') { + sprintf(warea,":%s:",user); + if((str=(char *) strstr(userfile,warea)) != (char *) NULL ) { + z1=0; + str2=(char *) strstr(str+1,":"); + str2++; + bzero(name, MAXLEN); + while(str2[z1] != ':') { + name[z1]=str2[z1]; + z1++; + } + } else strcpy(name,user); + } else strcpy(name,user); + + if(DeniedReportLimit) { + if(strcmp(ouser2,name) == 0) { + count++; + } else { + count=1; + strcpy(ouser2,name); + } + if(count >= DeniedReportLimit) + continue; + } + + if(strlen(BlockIt) > 0) + sprintf(BlockImage," ",wwwDocumentRoot,BlockIt,url); + else BlockImage[0]='\0'; + + sprintf(html2,"\n",name,ip,data,hora,BlockImage,url,url); + fputs(html2,fp_ou); + } + + fputs("
%s%s%s%s
%s%s%s-%s%s%s
\n",fp_ou); + + show_info(fp_ou); + fputs("\n",fp_ou); + + fclose(fp_in); + fclose(fp_ou); + + unlink(denied_in); + + return; +} diff --git a/download.c b/download.c new file mode 100644 index 0000000..7d18d58 --- /dev/null +++ b/download.c @@ -0,0 +1,190 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void download_report() +{ + + FILE *fp_in = NULL, *fp_ou = NULL; + + char url[MAXLEN]; + char html[MAXLEN]; + char html2[MAXLEN]; + char report_in[MAXLEN]; + char report_ou[MAXLEN]; + char wdirname[MAXLEN]; + char report[MAXLEN]; + char periodo[100]; + char ip[MAXLEN]; + char oip[MAXLEN]; + char user[MAXLEN]; + char ouser[MAXLEN]; + char ouser2[MAXLEN]; + char data[15]; + char hora[15]; + char ftime[128]; + char *str; + int z=0; + int count=0; + + ouser[0]='\0'; + + sprintf(report_in,"%s/sarg/download.log",TempDir); + if(access(report_in, R_OK) != 0) + return; + + strcpy(wdirname,dirname); + sprintf(report,"%s/download.html",wdirname); + strcat(wdirname,"/"); + strcat(wdirname,"periodo"); + + if ((fp_in = fopen(wdirname, "r")) == 0) { + fprintf(stderr, "SARG: (download) %s: %s\n",text[45],wdirname); + exit(1); + } + + fgets(periodo,sizeof(periodo),fp_in); + fclose(fp_in); + + if((fp_in=fopen(report_in,"r"))==NULL) { + fprintf(stderr, "SARG: (download) %s: %s\n",text[8],report_in); + exit(1); + } + + if((fp_ou=fopen(report,"w"))==NULL) { + fprintf(stderr, "SARG: (download) %s: %s\n",text[8],report); + exit(1); + } + + fputs("\n",fp_ou); + fputs("\n",fp_ou); + sprintf(html," \n",CharSet); + fputs(html,fp_ou); + css(fp_ou); + fputs("\n",fp_ou); + + sprintf(url,"\n",BgColor,TxColor,BgImage); + fputs(url,fp_ou); + + fputs("
\n",fp_ou); + + if(strlen(LogoImage) > 0) { + sprintf(url,"\n",Title); + fputs(url,fp_ou); + + sprintf(url,"\n",text[89],periodo); + fputs(url,fp_ou); + sprintf(url,"\n",text[125],text[55]); + fputs(url,fp_ou); + fputs("
%s\n",LogoImage,Width,Height,LogoTextColor,LogoText); + fputs(url,fp_ou); + } + + show_sarg(fp_ou, ".."); + sprintf(url,"
%s
%s: %s
%s %s
\n",fp_ou); + + fputs("
\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + sprintf(url,"\n",text[98],text[111],text[110],text[91]); + fputs(url,fp_ou); + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(data,buf,' '); + getword(hora,buf,' '); + getword(user,buf,' '); + getword(ip,buf,' '); + getword(url,buf,' '); + + if((str=(char *) strstr(user, "_")) != (char *) NULL ) { + if((str=(char *) strstr(str+1, "_")) != (char *) NULL ) + fixip(user); + } + + if(strcmp(Ip2Name,"yes") == 0) + ip2name(ip); + + if(!z) { + strcpy(ouser,user); + strcpy(oip,ip); + z++; + } else { + if(strcmp(ouser,user) == 0) + user[0]='\0'; + if(user[0] != '\0') + strcpy(ouser,user); + if(strcmp(oip,ip) == 0) + ip[0]='\0'; + if(ip[0] != '\0') + strcpy(oip,ip); + } + + if(UserTabFile[0] != '\0') { + sprintf(warea,":%s:",user); + if((str=(char *) strstr(userfile,warea)) != (char *) NULL ) { + z1=0; + str2=(char *) strstr(str+1,":"); + str2++; + bzero(name, MAXLEN); + while(str2[z1] != ':') { + name[z1]=str2[z1]; + z1++; + } + } else strcpy(name,user); + } else strcpy(name,user); + + if(DeniedReportLimit) { + if(strcmp(ouser2,name) == 0) { + count++; + } else { + count=1; + strcpy(ouser2,name); + } + if(count >= DeniedReportLimit) + continue; + } + + if(strlen(BlockIt) > 0) + sprintf(BlockImage," ",wwwDocumentRoot,BlockIt,url); + else BlockImage[0]='\0'; + + sprintf(html2,"\n",name,ip,data,hora,BlockImage,url,url); + fputs(html2,fp_ou); + } + + fputs("
%s%s%s%s
%s%s%s-%s%s%s
\n",fp_ou); + + show_info(fp_ou); + fputs("\n",fp_ou); + + fclose(fp_in); + fclose(fp_ou); + + unlink(report_in); + + return; +} diff --git a/email.c b/email.c new file mode 100644 index 0000000..e4cbbe2 --- /dev/null +++ b/email.c @@ -0,0 +1,323 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +int geramail(const char *dirname, int debug, const char *outdir, int userip, char *email, char *TempDir) +{ + + FILE *fp_in, *fp_top1, *fp_top2, *fp_top3; + long long int ttnbytes=0, ttnacc=0, tnacc=0; + long long int tnbytes=0, ttnelap=0, tnelap=0; + float perc=0.00; + float perc2=0.00; + int posicao=0; + char olduser[MAXLEN], csort[MAXLEN], periodo[MAXLEN], arqper[MAXLEN]; + char wger[MAXLEN], top1[MAXLEN], top2[MAXLEN], top3[MAXLEN], user[MAXLEN], nacc[20], nbytes[20], url[1024], preg[MAXLEN], tusr[MAXLEN]; + char ip[MAXLEN], hora[9], data[11], elap[15], user2[MAXLEN], wperc[8], wperc2[8]; + char strip1[MAXLEN], strip2[MAXLEN], strip3[MAXLEN], strip4[MAXLEN], strip5[MAXLEN], strip6[MAXLEN], strip7[MAXLEN]; + char incac[16], oucac[16]; + int totuser=0; + time_t t; + struct tm *local; + + strcpy(wger,dirname); + strcpy(top1,dirname); + strcpy(top2,dirname); + strcpy(top3,dirname); + strcpy(tusr,dirname); + strcat(wger,"/geral"); + strcat(top1,"/top"); + strcat(top2,"/top.tmp"); + strcat(top3,"/report"); + strcat(tusr,"/usuarios"); + + if((fp_in=fopen(wger,"r"))==NULL) { + fprintf(stderr, "SARG: (email) %s: %s\n",text[45],wger); + exit(1); + } + + if((fp_top1=fopen(top1,"w"))==NULL) { + fprintf(stderr, "SARG: (email) %s: %s\n",text[45],top1); + exit(1); + } + + if((fp_top2=fopen(top2,"w"))==NULL) { + fprintf(stderr, "SARG: (email) %s: %s\n",text[45],top2); + exit(1); + } + + fscanf(fp_in,"%s",user); + fscanf(fp_in,"%s",nacc); + fscanf(fp_in,"%s",nbytes); + fscanf(fp_in,"%s",url); + fscanf(fp_in,"%s",ip); + fscanf(fp_in,"%s",hora); + fscanf(fp_in,"%s",data); + fscanf(fp_in,"%s",elap); + fscanf(fp_in,"%s",incac); + fscanf(fp_in,"%s",oucac); + + strcpy(olduser,user); + totuser=1; + + while(!feof(fp_in)) + { + + if(strcmp(olduser,user) != 0) + { + if(strcmp(user,"TOTAL") != 0) + totuser++; + +#if defined(__FreeBSD__) + sprintf(preg,"%s %15qu %15qu %15qu\n",olduser,tnbytes,tnacc,tnelap); +#elif defined(__alpha) || __ALPHA + sprintf(preg,"%s %15ld %15ld %15ld\n",olduser,tnbytes,tnacc,tnelap); +#else + sprintf(preg,"%s %15lld %15lld %15lld\n",olduser,tnbytes,tnacc,tnelap); +#endif + fputs(preg,fp_top2); + strcpy(olduser,user); + ttnbytes=ttnbytes+tnbytes; + ttnacc=ttnacc+tnacc; + ttnelap=ttnelap+tnelap; + tnbytes=0; + tnacc=0; + tnelap=0; + } + + tnbytes=tnbytes+atol(nbytes); + tnacc=tnacc+atol(nacc); + tnelap=tnelap+atol(elap); + + fscanf(fp_in,"%s",user); + fscanf(fp_in,"%s",nacc); + fscanf(fp_in,"%s",nbytes); + fscanf(fp_in,"%s",url); + fscanf(fp_in,"%s",ip); + fscanf(fp_in,"%s",hora); + fscanf(fp_in,"%s",data); + fscanf(fp_in,"%s",elap); + fscanf(fp_in,"%s",incac); + fscanf(fp_in,"%s",oucac); + + if(strcmp(user,"TOTAL") == 0) + continue; + } +#if defined(__FreeBSD__) + sprintf(preg,"%s %15qu %15qu %15qu\n",olduser,tnbytes,tnacc,tnelap); +#elif defined(__alpha) || __ALPHA + sprintf(preg,"%s %15ld %15ld %15ld\n",olduser,tnbytes,tnacc,tnelap); +#else + sprintf(preg,"%s %15lld %15lld %15lld\n",olduser,tnbytes,tnacc,tnelap); +#endif + fputs(preg,fp_top2); + ttnbytes=ttnbytes+tnbytes; + ttnacc=ttnacc+tnacc; + ttnelap=ttnelap+tnelap; + +#if defined(__FreeBSD__) + sprintf(preg,"TOTAL %15qu %15qu %15qu\n",ttnbytes,ttnacc,ttnelap); +#elif defined(__alpha) || __ALPHA + sprintf(preg,"TOTAL %15ld %15ld %15ld\n",ttnbytes,ttnacc,ttnelap); +#else + sprintf(preg,"TOTAL %15lld %15lld %15lld\n",ttnbytes,ttnacc,ttnelap); +#endif + + fclose(fp_in); + fclose(fp_top2); + + sprintf(csort,"sort -n -T %s -r -k 2,2 -o %s %s", TempDir, top1, top2); + system(csort); + + unlink(top2); + + if((fp_top1=fopen(top1,"a"))==NULL) { + fprintf(stderr, "SARG: (email) %s: %s\n",text[45],top1); + exit(1); + } + fputs(preg,fp_top1); + fclose(fp_top1); + + if((fp_top1=fopen(top1,"r"))==NULL) { + fprintf(stderr, "SARG: (email) %s: %s\n",text[45],top1); + exit(1); + } + + if((fp_top3=fopen(top3,"w"))==NULL) { + fprintf(stderr, "SARG: (email) %s: %s\n",text[45],top3); + exit(1); + } + + /* + * Obtem o periodo + */ + + strcpy(arqper,dirname); + strcat(arqper,"/periodo"); + + if ((fp_in = fopen(arqper, "r")) == 0){ + fprintf(stderr, "SARG: (email) %s: %s\n",text[45],arqper); + exit(1); + } + + fgets(periodo,sizeof(periodo),fp_in); + fclose(fp_in); + + sprintf(strip1,"%s",text[88]); + strip_latin(strip1); + sprintf(preg,"%s\n",strip1); + fputs(preg,fp_top3); + + sprintf(strip1,"%s",text[97]); + strip_latin(strip1); + sprintf(preg,"%s\n",strip1); + fputs(preg,fp_top3); + + sprintf(strip1,"%s",text[89]); + strip_latin(strip1); + sprintf(preg,"%s %s\n\n",strip1,periodo); + fputs(preg,fp_top3); + + sprintf(strip1,"%s",text[100]); + strip_latin(strip1); + sprintf(strip2,"%s",text[98]); + strip_latin(strip2); + sprintf(strip3,"%s",text[92]); + strip_latin(strip3); + sprintf(strip4,"%s",text[93]); + strip_latin(strip4); + sprintf(strip5,"%s",text[94]); + strip_latin(strip5); + sprintf(strip6,"%s",text[95]); + strip_latin(strip6); + sprintf(strip7,"%s",text[99]); + strip_latin(strip7); + + sprintf(preg,"%-7s %-20s %-8s %-15s %%%-6s %-10s %-10s %%%-7s\n------- -------------------- -------- --------------- ------- ---------- ---------- -------\n",strip1,strip2,strip3,strip4,strip4,strip5,strip6,strip7); + fputs(preg,fp_top3); + + fscanf(fp_top1,"%s",user); + fscanf(fp_top1,"%s",nbytes); + fscanf(fp_top1,"%s",nacc); + fscanf(fp_top1,"%s",elap); + + while(!feof(fp_top1)) + { + + if(strstr(user,"_") != 0) + fixip(user); + + strcpy(user2,user); + + tnbytes=atol(nbytes); + + if(tnbytes) { + perc=ttnbytes / 100; + perc=tnbytes / perc; + } else perc = 0; + + if(atol(elap)) { + perc2=ttnelap / 100; + perc2=atol(elap) / perc2; + } else perc2 = 0; + + posicao++; + tnelap=atol(elap); + + sprintf(wperc,"%3.2f%%",perc); + sprintf(wperc2,"%3.2f%%",perc2); + +#if defined(__FreeBSD__) + sprintf(preg,"%7d %20s %8s %15s %7s %10s %10qu %7s%%\n",posicao,user2,nacc,fixnum(tnbytes,1),wperc,buildtime(tnelap),tnelap,wperc2); +#elif defined(__alpha) || __ALPHA + sprintf(preg,"%7d %20s %8s %15s %7s %10s %10ld %7s%%\n",posicao,user2,nacc,fixnum(tnbytes,1),wperc,buildtime(tnelap),tnelap,wperc2); +#else + sprintf(preg,"%7d %20s %8s %15s %7s %10s %10lld %7s\n",posicao,user2,nacc,fixnum(tnbytes,1),wperc,buildtime(tnelap),tnelap,wperc2); +#endif + + if(strstr(user,"TOTAL") != 0){ + sprintf(preg,"------- -------------------- -------- --------------- ------- ---------- ---------- -------\n"); + fputs(preg,fp_top3); +#if defined(__FreeBSD__) + sprintf(preg,"%-7s %20s %8qu %15s %8s %9s %10qu\n",text[107]," ",ttnacc,fixnum(ttnbytes,1)," ",buildtime(ttnelap),ttnelap); +#elif defined(__alpha) || __ALPHA + sprintf(preg,"%-7s %20s %8ld %15s %8s %9s %10ld\n",text[107]," ",ttnacc,fixnum(ttnbytes,1)," ",buildtime(ttnelap),ttnelap); +#else + sprintf(preg,"%-7s %20s %8lld %15s %8s %9s %10lld\n",text[107]," ",ttnacc,fixnum(ttnbytes,1)," ",buildtime(ttnelap),ttnelap); +#endif + } + + fputs(preg,fp_top3); + + fscanf(fp_top1,"%s",user); + fscanf(fp_top1,"%s",nbytes); + fscanf(fp_top1,"%s",nacc); + fscanf(fp_top1,"%s",elap); + } + + if(ttnbytes) { + tnbytes=ttnbytes / totuser; + } else tnbytes=0; + + sprintf(strip1,"%s",text[96]); + strip_latin(strip1); +#if defined(__FreeBSD__) + sprintf(preg,"%-7s %20s %8qu %15s %8s %9s %10qu\n",strip1," ",ttnacc/totuser,fixnum(tnbytes,1)," ",buildtime(ttnelap/totuser),ttnelap/totuser); +#elif defined(__alpha) || __ALPHA + sprintf(preg,"%-7s %20s %8ld %15s %8s %9s %10ld\n",strip1," ",ttnacc/totuser,fixnum(tnbytes,1)," ",buildtime(ttnelap/totuser),ttnelap/totuser); +#else + sprintf(preg,"%-7s %20s %8lld %15s %8s %9s %10lld\n",strip1," ",ttnacc/totuser,fixnum(tnbytes,1)," ",buildtime(ttnelap/totuser),ttnelap/totuser); +#endif + fputs(preg,fp_top3); + + fclose(fp_top1); + unlink(top1); + + t = time(NULL); + local = localtime(&t); + sprintf(preg, "\n%s\n", asctime(local)); + fputs(preg,fp_top3); + + fclose(fp_top3); + + if(strcmp(email,"stdout") == 0) { + if((fp_top3=fopen(top3,"r"))==NULL) { + fprintf(stderr, "SARG: (email) %s: %s\n",text[45],top3); + exit(1); + } + + while(fgets(buf,sizeof(buf),fp_top3)!=NULL) + printf("%s",buf); + } else { + sprintf(buf,"%s -s 'SARG %s, %s' %s <%s",MailUtility,text[55],asctime(local),email,top3); + system(buf); + } + + sprintf(csort,"rm -r %s/sarg_tmp",TempDir); + system(csort); + + return (0); +} diff --git a/exclude.c b/exclude.c new file mode 100644 index 0000000..89de2e1 --- /dev/null +++ b/exclude.c @@ -0,0 +1,77 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +int vhexclude(char *excludefile, char *ip) +{ + + char whost[1024]; + char wip1[1024], wip2[1024]; + char sn1[4], sn2[4], sn3[4]; + char str[strlen(excludefile)]; + + whost[0]='\0'; + strcpy(str,excludefile); + getword(whost,str,' '); + + while(strcmp(whost,"*FIM*") != 0) { + if(strcmp(ip,whost) ==0) + return(0); + + strcpy(wip1,ip); + getword(sn1,wip1,'.'); + getword(sn2,wip1,'.'); + getword(sn3,wip1,'.'); + + sprintf(wip1,"%s.%s.%s.0",sn1,sn2,sn3); + sprintf(wip2,"%s.%s.0.0",sn1,sn2); + + if(strstr(whost,wip1) !=0) + return(0); + + if(strstr(whost,wip2) !=0) + return(0); + + getword(whost,str,' '); + } + + return(1); +} + + +int vuexclude(char *excludeuser, char *user) +{ + + char wuser[MAXLEN]; + + strcpy(wuser,user); + strcat(wuser," "); + + if(strstr(excludeuser,wuser) != 0 ) + return(0); + + return(1); +} diff --git a/exclude_codes b/exclude_codes new file mode 100644 index 0000000..cae078b --- /dev/null +++ b/exclude_codes @@ -0,0 +1 @@ +NONE/400 diff --git a/fonts/FreeSans.ttf b/fonts/FreeSans.ttf new file mode 100644 index 0000000000000000000000000000000000000000..46f5532d307c3c7bb61710de841ea3a606cf9d57 GIT binary patch literal 264075 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

MP z)uh$Lt$!gF-cGN8nfFEcQIoaLBmyY1hJzBAG0MOE{xKsF_Kto3FGa!D%4_iTD}1qS z8Li-G2`z4MXn9N9NO`|V%r1&@zt^c|Ak-iST*gvD5U=ehgA{H-ikO$yynK-7IWSYC!5ubFx52E}cYiU==~hxBdU14Dw_>Ay`lrOd!LQ(T=k99U&4x3C61G(J zAX&|VCY_lpGMBH$N6ab?IE~wCx$V`8daB=gQp>70ubD>GJ~x7*S8ElI)3lPwgRaF| zL=S`UQ5Q|`=D=jBCuuo0d0=61qnopv!akQyYvS1%(YWKm*3p;70mU<5@$2K6WTybN zR$Hi>R)j?c%=UKiP!i1LqRsG5geVgJ=e5sYozIN4FZ_o=9NXU6w}i_`p84(CmrU|M z%(8Ubod{m!X2Al(&hK3Z-m`C@12b}0*a7`!Eu}Z<+d25Jee0x)5knp`FIij^F7!*5 z8BR~I2pnnAS-l3{kTS^+ARUP+-~4{By_6e1W(Hu_JBBicXa+(1k8N&oh2sWW6{joA z{Z7Ie_*Kn)iY7y2iVUwtGtHdi{Gf-`Eb+admLFNk@-3@DMFRfjBpQui_8qlgW2!)< z_&u7XYWNYwd#~Dd5j2IjYzSqF^GgogVB7#KVbS0h0D#aB0U$z!urDBJ*T)2kpiE2g zJb`EmL7i<>iKG#k0Lz<NGIs{D1s^YRpD9(ptW8^*gPc!$(C-T0U8eYf-dfV(4H)pF- zfSF~sv)tmPsgSrtXNx!M9~f%~%FXD}jqX;XZf$1@EcBQ^&oUR!W!k6a7kEI++MZ00 zUq?7E8t6#qjE+!kUh54V)PY3SYF|TA<;itPGHNzss-nQw8)Ms|cKuLiiBToJ(}%&E z@Uxn%>T}){`?T)yD66b28?J?;Q93JE7niEzXg^vYRDU6_{1eQ#{p-&56D6irrwe^?9mhSFSPZd|HW5(ag>B zIgrlRC4@BaBQ+=_?Di25{~KBpv4-YbGJ5w{F7Y|m(jd9*7dv`)Trx5=8I&O*FfhL{ z5i!l}q1aush8ua`Mw+LFmS(yZIr-j#ttGpXuH4r(TIw6Lk&_HEhJXB-g%kx}r67SI zg}PmVOl!YQfWX>qEK^jj|IWaj3%!nl-GdlFtVzlwh(jVB<_t+_?wY+4^g4s7&dI2J zYB(VWu_g!L2P>ZrT``bs!;;`6M%vf0-SzJBWca9)E>S1>m@s&bQuG>@q}lC^LQdd$8oXOC9hX{^eu zsWYOZox402)rFu=mW|{~c-hFOEoWq2YJ?(CKa?;J?RE9LiX2lw4{~sa&Ac|(YTdI- z=i@lZAMJ=Cf@fjp+JMby=rB?GwMi2A{o^Bt*N<)X3RX+N=N7aEmYmZWmXEj`8-%;> z>N&puvdfEkK=->s?!dH5Qmo>H$Ur@TTz;fD9snI$ul6oZuDw6OO!} z09LS{^9&bq5y$Maa^*vM4hCbr%1oF}TUb7<)yd|AMH@lWm+UO3V>*-FZ%3H7k&Kp2 zvfyT4=vtom)UJ3>&${UjA?LEBceKd3kH+*)!k7Y~?<$%9}2jFKk&uCt*MUPSNnyvXJ_rj)ZZI*g?)`m}Il@29KJ4SJX z|Fx^pb(Dc%>^1YtCx?GWY! z;DA~k%X0uCz)yq|c8csZ=y?ty4sw9f(pGIGK|-B@vwDm&$Ax48LO|&U{INbG2|AN> zfU)G|gn+=(Ru<@Jy&wi`EN+d}fx!*~fwVyh+VvuZkYLp+LBnGZNdif^+C!oQNRFZ1 z`Bp77LFg7p=>68XN#tpOnY)!IZ$Yr<7)^g2j~KuLiVS+!K3Vc02m>@8Ljn*2WMqfQ zj71IvM4FZT0jmy?g>d?CvHOXHy)5d&5icExn&dv3>elHlDNrOkViR}|$6csP) z2!iN+n4i#?pJ;%3%H)$k04dzU0W$atxCS2qM*$Z81~%Pz!-fI)OyzoTbv}JDU`6)C4c)v?uq=0p%uZ7zUIZx~Fbk{f~X zgLgTZQ0S3M?%S|78rtw8V6O4=lf}tBW7{{)OonGBr*4kKH>_E^>+)T9Y#bjfOwM%Q z(%N?8+Ck;bhSP_@8+e7k1Wxw4tgzipMOKbhJY{{O4=N;z*vChD7kIHVNXSRB@*A}M6}ys(IdzM zEO^OLDNF%h-YjeRgqh*-GB%e%gv*@_#+PEW!EMhCBxn-PdaZ?mhP2*QCP<^b+#b(` z+Pnrl52o?B-wR(iP@1Yuf{3r*fj)+>@p$01%YXV;=qdPl%{w&j)I6*3pE|l!zAl}e zL#&yvSJ`>v^UMJF=SU8W=vop-!iZcP=gqoWE~wevJX8C~ZqBDX|Oz zC}cF-W8Mf2LZ0GCu2l+A+jjM55<1c8ugTCxK23ug0?}8O*A*jOor{xxHqf0-v^b_; zL{0~Ak?QL4Yq*T5>$tMsD@iG<0dH#bl2++JNgvi&G@u%zNmkBUBFef@9SkKmNk=WH zw7Rg=Xs({-MYc$FC8S1Xt5ZT1u!|5kkZo4?&LrJC?RqW80?G>r+Te=XF+UG@SAf>D z$scYDiM#+gWZbROiPYsjCk+vnxfu#D1nDy97&2(WqsR9dkuMpxnZt1b(O5f_7GaoR zCZ_~FRtgIRlPPJW0UNbM82GdiNGQNjTE^)2+6)FPtV@#EO#^<5amA%Xj^TA2Pq|HI z!HU1IKDzg@&f>|G!KT$>!I= z&yAH43DfD?p@|HBmWhQ~ERmDpuq_dc(WLV-l5A~ji55t=lr@tr3{wm_%!P2@M%k7v zbOasq6diB%&;miT`9$kQZqAz6&{w!IZp`HO81#mf`Hed5Rv(9Q?d=&Ynl;jt&Tr70 z!LL)vFrx_P8Nbcj#?oQ`FyV7`&m?plY2u)b0ZyLxcdqN1G!i~fHt6XfyINBu$qscU zIz-9qFGd`r?#RH%M1&&Df#umTEzC-Swi5%z9^)WxS=7MOpEw;?tdlf8B`yV)(@}N1 zB40(CDUi+NbB$;edWZrhpR#j?sqg9uQ?hF+XcBGqAuE7u4qhc25}8sU?)I8TEP`od z)1%-gV&!leY!Ja$hbxy~l*&VH-msNnz~jTaXX0(9Y2($y*H=CSU!VQSEM5=S;~^iw z>%5ZSUd)KTtnv^1Xr*EScUGPQ?*NmhBGo%xr@u{n8h%a5cAC#L!Uk6JUC8YUi>*ej z%A`RK(_f}3#4p{v304pFAL(dJ0E&i6Nj)0j*;@>m8iU8z%G5f+PArPMJht(7zpIBJ zAr|HUJY4yChebeopdWa|^i5y8F%mV;%Z{?cN zf|DgdY5Eq=Ll7a70QYr0zpZa7uNBPEST}(uQC~7uAPJH$6*I3o5YZflw#rWp5$Z=^zj_*aTwO8E zXVr%_hpH=kXvoN}D?{$;iP&GWur zJiA^w6FKYoZEF2n=Y8IAPW|C?+CQWItoG$veONhXY20plYx{2Sh;!qHv7J`0XU`32zUZbWC0)OJ!eoB5x> zcflXx>#%yg4%a`b)<@Lq34Hwr^}0>H?#K9kP`#e4UxP#H`zAHtRo~MnhqKjk@QMn@ zx%Hn{>(`x8&Z$-v0=`~XzlOKh+WC!oU!xrDu9jncMRUG-Vz^q5K3J_k?|lj!A5rhy za0VQT?ab>c92*)E@tJTm$}a#%wH_-snuk??Q(?0>haTDyIF<(HLigkz{waRX z6)JQYQ3XtW5Llbvb44?#_$lk@w+Ib>Q$UGb7OqD6l`Zv{OFkvqzEWD>aJU1(<)qFM zx^&PR+IMjPhH530TPXs@jeRDs_vW(4x8fPn<$ z>7ODK#*A_fC)QtCPm&Z78)4GxV1Zwq-HNN}J=KyG_^Gp@ah~dLg1K6zMp64ETn`T` zek2%QJ}Huyd@zu&YTC0t9+=1Xx$#)M072D0)JI!cH4YYMkap88VL)fMob`T0`^=D}5){Wq3fk)2yC3IFD%-<8iT zE-uzJV@$6j$_#?9mo%>``f(6baRvSm_b8xRLMh3lRzMAt{8SvTxmfAo^4itgZMBbmuffd@LS zD{pxBNaX0i<`;)UQybe#x3!s;Q~mcO4Vs!PIbXH^230}QrwEkb_m%D7@yZVHhYAHA z2a{Nw#4;uBP3!4zg8x?ctR)4niba?yZ8|gkOWNWW4JzygaJaj2y8Fq0*Mi$)9UpAf z4&^q}^j&uzkx2OZ+i$~PRz4!hmA8h>|JFbMxs?%mP33!)Z@-%C1j^E?^7l`w@1iuC z49Ktm`8W{X0iu=XzX9G2Uq2OryHEYJwi0|&!8|?Nz`V-oz#qUj6k8~jKg!)$aK}KZ zp@gg9v2p+Q=~~)LKmYl`@nCTL;Lm?vYH!g2GB+Gb=Juo?OYg}gL&F$?`03ZcA7Cr) zb6D94Q>>S2&EfgfP+7YHroarY%d4$t@V5;9@NY9l-)~Px?TL6iXEMv_t#;{9donP% zeaW@b)e%Eau9U77@H^ijb=Z`rC3-Cvl1qFDZ z5&~0|_kdrYIt(tVya&F%rSe4Orp@D6jo7b78vO$F0>0th;H@x#A0Eb|lRo`hD8mD| zMLp)1H6!(GMp6|LD1UAEYxu9?1poPY<;T~6XIS+&(A*5(4_h>ssd4bLReiI1%1_l# z5>_LXXPbi5S!!F#xC~PZexO}R4A!)pEmiXgC?^YwQc6oy#Giu7{&h8eBK12j2@C?s zCBj->Z)K5VO8_85C8Anh;t8zqN=DLT4srwmp+F!S>udxvAP5P93tKtHsL&{)MUv=i z6A)wD;y|ob&$qe+0qdF!1kBB(SFek>gCa!sHa!arH0$P^98V)8Q4mpPhUGXxN7x-E zievKhTwj{s@*8z`N?ae6(AfMBL5nxUPH#{dj~ZMQKrf?_ys7A2Ki z(x<--HRv8?MgR*B@KiK`ZwDWKYm@Q*&!BtAw`agxN#9uIkQ#+oa~xg+9?;~~sIhcC z)pH{lXZ^5#^%&;tRFwEPS&Nz8*c*z3;g!y?)ocwVWJ;T7nV82YTD_rsG7*m$ll=_k z^^C==SkG(=r98fH3rtN1INoWGRo>yW*y9Ez6lJTyXqHn$Z60taY-Y4^Gi3=_xJ)l2mm-z{?~sk11s26 zc?OpQRiEhx-%;((^A6mQJN}~|#Vfx6uevI?fupX9>ItQ!&;B+zrFa1O0`)ENs^xJ5 zp%VOde#6qigG(FoE1PfS`P+AGWx%KQPft!x@Bh??uG+Gl0h>1*=Qy>!({JMTex|es zGR>RCimy$55rpr`uawufrPYRNO@p7|mIm!QwWSZ$T31@!ahe0K!P6RtMq?41V}#OT zy?JHd=0}l^wI-k5rDcdg7zz#AY+4SQ^qYKeZaP0g&#^#z?WynXE)>iRT2!naal7!t zYP%SrXtiy5GDaR@BsA0h^*o(S=&UJ$p7>2}lOhw}9ALCy92=^lR7xW`y z0g*r7m*eTmuQGqKLmzThTrS+J%^E*=1H7QhyH#Hi)o%oRxc%Py()Znq|Jv^bFQnCr zcKmk_o(E|~jspKy_kdI6AX2f^!2d%TOE}@(yLSWq@bJ6w*QL96VZ`tUlaDzmVBh~Q?}$Y>Y0?f_R=b^gCq7^I;KW)vkuE}s3m&B?h6%NvidVQ449GJ zTCY6fX|dnp41@+e(un7K_hGRzWBr=--+1mXUaC_y5^28Oj zClsyXE%+VyEXJ-&lU3(i!|jo5_HV1&UsYpZtC<&?EYCZ@#kuc&FZZ4ARDQp_aP;`% z+_GnC%kf2fXLjq>J1FYT9XrUz4_N-Ta<4B@hPxBiXfFUk{v2386M5{h`d{U%=Yo+zS(m^4?9oD>DCAzZ-QE8~lYuG_fb)a&3QO9!vp=q$qPgBv#P z+;I=b-?3|JXzM!l=dHV8tTH^lal>_oE1v@&8QbWcyZ9jZL14p0ciy*mHv=|o3vJtV zoBDH|YDI{F|0;Y#^$F4d6AB;)+)>S_2!<<82T;1D=;Y916oq4Fi% zTSc(?75uQ0SrUk6=D-tG;YF2;umUd?Z0?d*k3Vx>+iml<+rn7G-k7#<5wjJ4x?m#j z+&^%Cq2S!_#_jIXEP-W^QnfX8Q-%sC#tFL~9IygJ8hpXQFi1^JIYpL6$%QzEe@3$t zI6+QbtNyIF?T2$7F==<_-D1k-PRM+VC?zahixK2fc5lHWrtF?hk7#W%$w@00HA-z3 zMZwlQta%?Qp-os$?5WDu4avIxZ`D#aq^31Hvo@fr-pW7t_u3H0lOz`G0kqDTdHa-8 z&j=(D8@1VVl~?saBSm@uR=phS47_{MXQWwzB$G>yfQZDbkpyho!!WZi#q3>2V|D>+ zP!v7>a^L;4@wASBY@3Io*SzSHdygfZJb+qy>ecT175x)1nyn}RKdtESpx25kMFSPH=wL#paRTcgcZq9q;q^2czqM zaPem7~y{#?QrC@Wr<^(#4_Gx5wl~~Pg zy=ot4ku6Qf;hAQ07x0^7d$yYixM}4I$$aIW9VUc~+xB01>yZOadgs=g0{)Jh_U_Sw zo!f7Wd;qMQ+bdi4t*jW((%c@CF}inQeFxmO;R>(!#Qr@_2AOv4x>BdTa{nF|i!t;y zjTJ4U|4`-;3sk2mMX_dq+&BbO%w@Amx;5|%V3HgxEg*ua{1kZgfIuY8IOWQB%@nY} z6gcSxByEy;zOtvX(<1R$e#)+1)^NGS&Kzv2zO-4-+49bTI zYKiIl^1PTvE~Si zi<3;~+trJ=pH?ab9lD4&%A5n^>rAa z{&C*UQj+A@h|n8vTi-kFu&v*+W##fOP#Ev;JN@7AcjynwnH8vRD6QHXTO@Hc`hRsC zu*3;IX|nyuV$&&h{=&Dwmn{sfwc0*NQ5gRS6aA+Nv%~tj#Lzsi)e8TBKqdQSi%rWg z)|V8d+6k!4<1d{49rzvkxnds>GOgxGt#6><(MMI{RqdCmwlB)GegyuFjb?OK%fk@A z5CR?$G!!M)Mxy5}GE0*LMbO4?!RXUgE6+00JAjX(4F;BGDtg8wnSBu4WCR2xX-+ii z6b9Mr9Imb_7lF#BC%6PLhPNERgN{^v62Ma<|o*&WDqp zk}JHYQ@kv|P-4v9x-w1Y*7Va%my<&Df=Ldh!3T%>`!*sTzP58nXUI&N4Lswb0n~vf zKpEV}F1J#SqMPoB8qk_Rm+0=>Qfx2z#iA$3aIW}d)F!-RKFm)5Cd&!3b^V;lV3*qz zyxgc+j}D`EX(){a>j71~1kQsNO2JC?utzyjITtPGL5x3pE^1yO45Q?_KL) z5bq&LDbp3X4LqXLQihU_8oa`A((k3lMm?VHd@3Iv6Buplp<&~Rn1Pkjp4^pd*&vYflmfJnLm*-LfoC9>HR&RA|+hCX7cI8-5^Ht5Q$P3?xDb@$o4^nA$R#@=RQc?whhmeaexh=3ScS(HL@K*~Q=V)@q(p<-Ll-#p-Lb zIe1TIjg25=JR6YKGzBZe#S|h_?pS9cIaJiqkb+mY?C25r^4@N6X;-9kCwf}^z+7zk zn%ObW5#vFPI>dMHGRm482nzm2CGBbNJiW=$kmN!Oe~aoh@|Li3jG2`Ix^87 zyKNv(S`Q*3cPVAs-7)HAFwgL|UDFR?f5K6^3lrstl=69VDh9b)(!(qt2qFF>;=w_@Vr)#HkwN!IdEpcbvkf)mF3yTb> z4x2g=zi+;FCExbMR4<@xM>%fb2Gh|TK`exLf@mo`Fh&ydUiU(qzdbNOuJLt5yCBuq zDo}&jbvEmPC7O=6^o9Hgzu&H>)bVrJA3$7j$H6DMvwdKc;r9`hVEDxra;0?fFS8Mw`A_(?=Kv}QV;;{jL43EwiWz%Y4b(Uxsoc~3mzHC!^=uW z;Oeb>w1p*t7H@k`h^4J1TfeP)15H9FOU6&OgFom2*VQT*FwmkFbFEu7EodkFCDxW? z&Hg%lDChN*nqJdVouNoQlFqGia{9d4eUxqf2BT|a)2#}fmUA31@*VJDPmfD(&$NwI zUOeaofQ!2*B0&L|ImYhpBQOOL=|kERT@W7MkZ#=)!P9GWU<=DldrcHw7{Uh20wji#Ke6B%vpGPt(WV>Nb12O^c9kacXp9kQcR&S4$Blw`*+1|a-^PqC9pgF2JhVDRjVGcgg z;NTWonUM+yuW!Ism(+Zd8iP5y;(w=-VFP<9KnLnP4ql#E?-%%3vg1jecVjRRuIvuA z6*}pGSSG??3ZasFIs}Foc$@-h`mHKrz8 z8YhQU5mm=})JaGb+0{g=(}A+GFn+a+&bP|odhna#HhJHj*XH$7Qy+vIs{ zZBKS0mn74Lu}tUYmqAr)WCfISa&HF-f(pL<>W21%fkuy9Hh&b96FDP z*LLGIhwO`Sy%|HMFQw1Sb%*t)7N5@%3X9q{2#akb;-z@5udlOBHVV;%fiH1@9mm|~ z%F}P5kD@PPUT)ItY~ntv^Cm*7R#F#60^M|M+dzZ9b~N5N3~%58w}YadUW-oGqjg;2 zE{G%{@;!pR@|C><2Z@`DUY8sy`rN~JbByV}DR=AU4;i0aN?qc9@A`7rOiu>^+Y#)V zE%aUVafTN^vU#+#W7EJK()JIn46hlODnxc%zvno4*M=Qa8FYQ8*QWQYv&C&7NRuDW zmTM4D@z!&r@v0dnu9(>JL!G8vF=ftd>xluq6b}bHApoN$T?V3J8q4`wYpO8d%B0%u zCVf6>6iU3H*ggGP(+wX)PpNvHg;MiI)?5v$HevO2rVS@%m?-S(wXYKui{5$N)Z=98 zi6MlheR`e-hCaVAyceRUynj38-j0Q6mgB7heBU!<@|jKqOKy+FZZ<*KS`28XUqQ;s z@qLXA9YUW~>Av#s&+ zy}%d;gTlyu0{-~C_vw$_Y{xwHW3vrSh|Pun&}T$#QhFc}Ia`%@o~! z{TlPhc9ReRr~bL*hY3__!-5c8VSrRJGoO2z^Yr<&x8Imf1$b^S<>+e*>&3#m!Ij)s zcMHP4Z|HPCxMJfn#_T$c8GR8wj;TV;wzx_aSahg?X^|RscxM7kpAD}>R|x?X>a+fq zj_&mju}@5NXUb6tPkyZcQR`mwu0dYw&EAHE#>cXujD+3P^It0RGq{OtRfyN^A$cY}?0!wvk^ zw@ob(SN8c_!{9;dfRCqIWg3!rCHJ|q7Dr%`1ecfWOqqoQUZrlptJD|KZ7QcpC^Gu_ zcn$bd@F=zq)uL5YHZhP>_x896=k3u*p?lj0>4$H8>ChI3;0K$9n}>F_?;~#N4|)dB z%z0Qs4-3Y^_g&RT;NN z^UYhO&0UDBGD1*^r*=NTKEC4hh=!6`H+<4~axl25D{}9o)9&+(m_R`ZBB?{S19y#s1n0@c9e(imt~kP&%bn)a;>FdxbW+`(%ZMxQ@8G zF*niadId-2OKq8hPjVlfh)0a3veC5RZsQZ{e2T9 zhhy8|5&?CWba%I9)-H~s_u#=&*o)EE<&q&319-4LNdkMxK@J_`j*N+|#iVZAzQydM zo&tP~wEU5q(SMA`Lg7!9pDgq@>pWII5h z44~p^PVn~GaI7oSGs9c5YZ8I*z~tpq0i(@;H4wDzA14N$bMyqP{Z1{g`}XO5p-W?a zDKO%TcFsml3heH?Ja`O#uR-W0bgeoD-RB>JP`(MS%!T2CJ?F!A1p`YPFtCDeDcV}< z99Y!J+1X@E>&VQ}`KZ|;0>C5Vd64=E@Xf`EzX=q>jxo2+9Xw+4h7KoMEaCBBvS)ql zom&3j<6eb#T&u~U%g~Kjs#e@!Rb^Ca=o+R-jfLaSb`@-knQn-Zk(v;c%Qv4%MWAfi z+U>F+lDGATFlA~_9C(rW(H^gxEwk%C%zt1Hf;8h?V!7N}*C7{9lk*1<{p}K1FB2`lW(&(AL}l~ z)BgRKD{aG^{v`U6IwnEQmh+Das;b?qYL$sz?P`@!EYxaO1CfSMt-2wdk;t|K{>sy1 zRd|={h`UPyP~rcMmu&mWUK=1u!8sIho5I>-$Nqu&$$jM^lmOIv6U%0vhIxW#iDpuzas^ z_{8l6tbFA|VfUcKvW&CGLl8ioiKR@RNcf88c4aRT@ezvhuO-N}2Lg)xRMgC)|AQ`5 z$A0BPvagbHyV22(yv1x$ZF%HcpcOS`Z~YjPUX8?}_O)R&il0Q2=UcKqd_UHdpN7iB zeCZ<;C{fEx;L-vG2%*(%^-KO?`{poBTd4)w_4_U$-2}<~d?GQ#5 z31aGaR2l18O%xqPTUFVtzAHtl#|KSY(`0otv$Z`*ij0IJfk+sL>>XnyIr6YnNq+jr zOY7(#&fe`6D2VX#Zg@6%NyH3Hv6H-ZD(&8V_6Qq-CFaCl-gc3JaL!sx<303kPy^!P^THQ_aoe6hcaI3P@NC0d1 zWCY-$MAq|4!WE8vVvHo#KP;d6!`A_~aSQs<=7(Bk3`^^8?HhT^?O?^5<`#m(R3*)CB~!auJmF%EpYKZz)?_* zVbh|SM7!`THERNzzFJ?a{i5g;Qo3P^)M95Sl0EGYHE+DtmyfC#4Q?+QEv_Yo8GeX+ zVx&Lmw@1nsf#Djq|YB$~TK93G=iqG&A`u z`@YGMu_%Hu;~sWTLNbrvZMv(sxS{gBk!9irAJ3E-ZhDvL>OqD!`eT=S3YSIof*Tdj z$6bBeB^f~%bd)hNDKCVfW#BLCAeHEglk65im*|zli0{SoKS58nq&*_o%)lBQ*!3$;)*s^QPl@%%#9c-yOp72?8@hV%xvax>v>` zVaqf`&+b}Nn#?Dl<&KtwKXB;>bYA&=OMQ0x=57y7+2cL!#qF=^jIA@R@Ux_)Bvb7> z!NCwr!eW#ruDqQf3r^o~cR}E{C$tpVM+m*W90Ew2v^r&PAm@+=2|9bHdU~-%BcVIc z$MN_sHH|EJM%S9??@xEKApkY^QW@R1>!Vw-Or8|(8^$XZB=>w-tPQoEfar6BnUr}A zqkZ|n{LoxJ4dn;o>0tQS$HjpB@@AjcC+QnXv0eHkmuSSh5# z(A=WA9^C|AQzN9F4;tD}p97BSvVRM@VWxO@$eoOA=u8k-yL`JoASU3uC&S*YEh0dM zlFx6)GvVOWwg_BXMnLPQ_1@*-F+?0%Fzee`EKx|jJ~`%bdq=vx0xQ_{3TNA+xd?q0 zeOToN{TEn&&kHAY4xF`#gEHq^WY@#Hmj)kg@wG*_^tKZ>c|(_cN{Yjm7bE_i2^oVw z5N>e=I=JH|{oG!3)p-`wZ{R-ZLbN`xGCoa^S8kAv9V`H4%E}wsCPP8rWGSrU2cMo4W&y2-6~!vnlnsU~7hHLAdEy$-4IbqFYtyvP%`<%LK37V2XJI517dYe4&dTrM z^JT2;_jI%t()|&iZ0L#5e9>+9<@)AZqXEz5NyQ3pE9N3EB2mR-+XeKBv*BohfV$-0ya74*C4?NBjl-{oT{iWNhq~%2(la=V635m9Sn~%%+Qlk+HUNl+hNw zj$qfo`lYcG1qNf~W14AX#oA9uwbZf@O&VqG__6_!V$G8`gMT0XCvD~QuJr*oFoYiL zS?;+8erc}vg)W4gvHbPEG90odik*Wy+t3|q%*&9!Y1OQ*n^hJBb2@#0%q^L<6l9`0 zeP*89=UN93<}+)wn>N_>q^@|tdmv=!h<4f?Tb&%pF^s>hb52LNU6q$Yd#FvFf><(e znJuzjzHuphWq;u!ThHIoq)ia4JjWVzBtobkyg=ffY6U!Yl*iRJa7gl$3q{kQOD4sF zS<1K4r0nG{DV3w)%~%2KImGSD5dntmO*1e5>p|b&rH?CExdro$1+)&2rb~@|kw0g% zC2Xp7GvHUIeN{HXLzn}TT}dCy#Wzjd%|2foPCMkTHe!k%8Q8s#yY#Zr%0HB_P(T={ zvJ-)B*G3mZ*-a&j$Y=vAGB$Cbs5p$Z3lfGnn0kpytp|# zPd{%;q-)^|L6NhvfbcVnwJS}LL`8?nC>)&)?jXrSOJ3Ld zhz$JBuHc|9F&6L|#iEl%fXb4D%~!m{&fB_qy=h|m!dCoLa!2k%JO>BXOESDD`$w5{ zP(nb0ULy$snWHEQ{NWyWBi(fy?<@aRc>!DRLhVD((r*FV)3 z+vp)lP|WXs`DNe*xvPUvq`rX0MLkGKkklZcZ@Dn2U9T{?#99-LhuH;oN+5_q@>&w_Te3qVHN6_^qUt#_fY zu6GO|aRWRpC$!viARn}-fB{vG+Xi(=s;iWan4vj+V=UI{tOzk-^L z3daD=n@s`#nI4Tf6JCH)VAXG^`Pf<^3Z?7nMlE$#Or-PR26eBhxG&!@!!jKX3P7#D zZH?7hG%|f%67Pt>fv(Zfqr{Qnk#0zpAgrmvUQxF`3m|)Q&^k?PeH+}aE&bETcqvV{ z&0I{M`bjBD0iZ97kU~AH+V81Xh5_NC2wl+PBN#gme#w(=gOuCNa3z)*xD^ctI;;Az zK$J}EyLN7#&l}q9#*~gobPVvqxPr-!JqJ=?lK;QAT(j$AEX(urpcggcwLaJWVtkH!c;sYQw?McUHfm-=dSldtKW{r1xnwg|DbJR_ z7@KQc$_tQ#;XDGe1`Wn2X6<@otBE;v2#k^0(jIJK^&k&P9rY z_ily%Q3kf&JJ)79cF(4r7%p?my)=FNhoK4WZ=duXKK}lzUdh`?aj<=4*H-zR z7X35YizT?xX8COu6uQ|)hzdl~`DSUiDO_US(nM+fb!}mO;G)ir85GLiJ+k)JS)(>O zIQ#@boVXs`@|yeJzLclS7Tn|U45#;`5DI{jURzTxv<8%}>kFB`eUI<)!(Y1fAMtY6 zuQzl|ZoBc;X9+?qJA3b$>+3tXocCl5q}=)#%ia2`wkaWEujvv@~g4X&~7|`Y#fKDsgoIq@BVAL8;3$3PdI>Qb_kJpuDb;M$+-k#{_qF>sy-ib zq{twK2a^ewo3Koa{svvHVKtH_*Vx-qRg;>sqUw33{GZqxP_Tijb21Fy7aMo9Oy;M2 zwo16r6{g6RjqZ70`2M!*;^TnnG|8f=HQPELnuNLomBM+pskEv+Cq=o{mmonkmn283; z#EW6RY0&*I5%scDtWp3bDQifg$Qp6rumAqv;tSwe^C9#M{5r-P=EBW!k*obmfoc{E zJvg4)*5&T(F_}jfx6D39>0<93l}uL*1T7Air-uSB#`g_blZ1Kq6-6#UqEcg#4C!%h+t~9g=xs!`|iR zSYzzzNxS8`u@*t=_W1|MAR^DZLtgoH{36{DV>5V3dH;QI4$e-^CtXyz?uH66Ud!xw1&!F9yYfNaC|D-%z+Y#4; z>Y3wt1Y$*9#A8^sVZ;jm8DjBMmydB=yNyJ=OprCP7)4sA4>LzfJU9KYuxKN)ml?0= zLXa$7>)+Qw>g#f`@o@Y2dJ-;NwoIKYM|`kiSe1`Y<*M?ri9o7+4AX?6q=&Aeh+gBo zeL?O-qSrr@?{~VShIl+70HUSsPDC38=n+|TLjAbM8mRRlmBdp-kTU0{Pg%Mc{Y45(oy^>#J z^I6&y;jZ5@tph~zGb~F0T}cNJ82;rMB3>1*pT~Grc=2u}=HXeC^OxZ^QcZEF9I5>e zk-O2$qbkWbKl$g8>nsFNST9Ne4gr?^YmxiU_(fIP_6QZ{g|SQOLz2z@GC;7)-4Os8nXqG&KkV_6){<3`+4pOD(Zgs2V?zlQ zRTbyVnKnzV5%yJ`T9&iTNh3`={LP9+HPyzUJv{=$LTEBHy8b|B zJiPO1hALC6V~eG;(_m{qVGMis+UG1U>~6ONQa!H&)nm_HuMf2OI2_&DoYUqr6lonu=QrXqUI$?vyQly=XGuin;b0O%}Ze zJ&2`OyJlar>`FHB2&wxl7R9Trs$O<9&cPIGk%rWsZ-}z_+MZ3I-eo1~^%+iF>c&?N zzUl9EID*|ytLfA~6O2w27~0GcfFVsS#d&F%7>m2?WSM|nSD3FGChZ8=xe$cG&B4sm z*#aaWUDC6`kL@6)om=ulfW!pP(5)7Tg#Sm|cfhw*Wb5C#qh75pS;dxQOR_CD$#QRU zcj7os;+Ebk>Agb21`=urB(y;2y=Uo!9!NsjP_vX}VHbD{yDYnJmt|SN(*K()$t7_X z-oF1!exFBo?%bI(=bSlnrrfy_O`!w6vC}H%Z!Yt?GTNNA>Bi#*Lxz+WNp)Fi#tggK zX(u&A6h&{al+Ku;^ws7ncTclg@+W4d<)rh(N~qj!tIRiMs5=}Pwnb*C*jqTkXr@$0 zctx#L=JVUF)mcU&wP%Bmv$zZB6|`S?H*iw&9k^k0r9yW-afQMa2-h_-q8?vC!j4KkTF_V;P?>&99$I?D7S$|ga7k#)X$PB@shOSg*Z zm!;KquAd~6wx}o{m85HoC38bX?n!0|d3>%g|Cy%C>JH{E?q!F!aTjoPbUeLCI0)$CG| z)CWZ+YxF=)MeDFc!jE1hN|K}wI=_#$9-sF)%>m*mNCJJp867>x23!m z^_U&Z^X0T{R$4aH{Sc7Rrp5z<(!6Y;=kdP zTswNLLG`j2X|j1G7Lk%mMnVlOroq>a66duGv&_jIp@P#DDdDH*FUq${TC<8oE!TI| zluDIRE#aksx)8~(>%ZJ$7tyG+v3NqdjEpteq7yP)rQ0O#Mfnn1S1eIh<)qu(b#DU1#N|$L523E`(k%a)F-C2+q_Ry^ zRtM2#&sJES-42^((lhyqy$MeGAYH@hg*oT&h?k@MuqK1mO?}IQ?O!w{SDDK!XR7gF zedm|d=Z!Z@N)09v&8`x+KD@A{TCQ!-QE5IQ^)c!e>D&YME>@JnosdGyw%sywyZQ_kHq?S6HWW|o$ zHR|vZ|CC&FennKHY1FeXK=g7gGz?G5EbP7?K4UwaXkq8saI!6@>@5-Iic++{GIgBI zQfbAYMeY}i3hG1I4wXXAOB6&MRqz!h(-v#i%`FS@;;PYnjoUY zwBD83PF#MG(jgY7<+&kZi{5U|R`%#4Jxdn8E4r&&X0Lb3=Z{%cyj`pbZwg4n3qsCN zZJU$QF-G>j!)C68_R$NHZ+cpi@1>?zYP3Vs`@=Oe*})CH>3KYA&0Jr(e34YPtRD_1(^Rz>)SWzTGwl362Z^cCCe zbNXCLc@?}yQV{I&y0q$u$HEiUtemc_-;iijq}4>KinQ!#1S01OXdb;zI04Bbyxlo$ z^(}*(x*LOS>hw#8w<9v4wn9Pq)oU%*9FIm_kZzEO$Yia){VH3TW^ZM{KGq^5R;^a2 z)vaD+t!k7@6!bd7!z+92j^EEUq@{~A4JB=p-rZ?6bowN!y39E<#A92Z*#}r_9JSW{(TxDisUHWb0MsB~=+VUz${I?v{BB zGgXwpSCXpyt}KPMF+X6h%GFb?!?mE4T&qZ}mA+4R2tFw48j%==mPQBP;M4M{S3rmM zj|+PMQY(Q>K8&AYaokC*O*K5*L2De|O z3M*-Pnn+Ws)p-KOg*W4w%S*2crPe>mb4rnx6eU(X!&}R|QcJT&o9?Z9Eu=<^5J@a& zDWz1J-&3;+TUhJ0>dTrN;OfXkI5;_n%7gF zqp0&`sg)xc6yn!#B4fNnRJBG;@^Wo?<+Fm`j49<>Pfb~#9Ze=uXw%r0B8g}2oR`V99W~>! zNrqC{Mr4WgWFlzPE@+hSR?Y}r8d(YdP$ih^oLU20LUZ~Tw>5N^w`+J_>))5Z)%ZkX zVVaWU$uUxhRL$OmMA^%RFP8IvP3TE>Yp%1X?ySN*-@H0wptic$lVkTztWwL}R{#2Y z?kDEJju8vt6qa;6y^Ssw<}(%yj=2Z7T}X!Z7+F$#lvzzIBX=C8_6`iL@d+KeFguvo z$04K{8lLm9X|+DDg^JT$W=~6vEOy1dc1jD0Ty55B3{FL_yRLu7eUe)b=S?pR_BAdF zTKdy7J0}FZQW=;+G}8^HoW?m~Noli7qbnI#+Y~CTakw0rl+Vd>X;pQzU#c-`lxl}Y zog*fTi^hm(NtMHu<1kTi#PmY@)>}R3u|nl{OKgET#pSD~I!s|TFLIZqizSU1x5?_L zsJX4b(j=FdhOUgY?zQ|vkojti_3434oEY3wAqL*UiYC)UY&b+?C$#%i~k->Gp z5nmZg?NO2V1umvu_pl5dv5;b?aO`o)77c!jFEvaV{{FDAJD&eTR;$b9t;{l7VtrL| zvrOjHD@;=5f|9unVXatc9OKBCx}&hwCCk%Xkv+!$=yS^|IwYGb^R`%?ylDBFeDCal zRc3DL+f-5-kxQL=zA!5{(-L%O({yG>ZC+b?fmf?`W%I&i-&~rhr0nyeDu-IBcT-a2uQeE5I;U7$L1}?O?=4EZLFbD+e?HI4qAF$G z_6Te2G`h0lYQ0k=%jHR~TrB2An&R@6T?V^7qZF-e zAD0JvcDJxPG_*BV_~0|!?JTg<5=zZoCJ!DNzIiV+xPdRV`MzxUE7_zrJWsy7(&4Um zTl=dY=c(f8vgdtkyJz^|~%8Au4KeSC0Q>`0=S#i>fAE z1)0_btyZl@qp%aQ=sdq)B2M?rq~hG^K7~9_Y&|%u)g#r08lMgj-N6O#I`4}8T~lUM zi6ts`JIC{J{s;OYeOOr48~yE|j!_ol=$27d)8g?|ZfO$fN5U5~PH;i$;ICvS9iy>{ zJzjryIPpz@5oh{D%8a~rLv5_eY9ZwNQfFgv!AuqJ%bJ&+GsmNmyQAcb+(z^Z(J`J3 zuX}%2dzULbuE1bux;$EI-rS@isMOlHuLo;~3dz#7|?hd+KU5Bjb zepwywr+?tmg{uwx9Ku` z*EQ(0F*g0c-NhMbF4YPrszt&k_i3Ap-6pS&JQ5`(W{JJF@qoSBbg(wdQf(KBV)7_I z>wyOz%)D^ygbIbRrZmUqXnV?$%)50rB}y} z%y*NgKjLM7BwYiwq?n%>jmFN4Mv;0F_X^!fRjKbNnB2+KPsYCIr^NnDF8J{TS;)VN z^z}meom?j^p@}!i1w9Of*-*bM6t+mcslL)9yz*2w;scb!HI=*``$~p3*rZZQlu`Ys zVlnxxLamjlZ8bbKnsXz%QoCB7q2{TbHmC*B77#zYYd@XX zVdTEC_P@wgrl^U?rBV|6K`Jq5sQ zsMCEe5vx7HEopg$D{_1I#Yh_M&kT@9EhZ8hw=Aer=TNGa))>qg8x~(hR!v&|3tg~a zb@gU=P|LU}B1-QQtXuR9d!s%6NH{?-qn95X;0>|XH}v)mT|3&@4u$*1e2OaYq*9^q zs0}uy+F$N9ht1`d40EPYZ|r|aon3rhUBTM?IkaVz9r)*x`kLO%26D8B#Qr*IU4cQ1 zPKg?7Og8WK<#&@UQ#M@EP_VJ~Lh$-lZUyxC7lMUI&M;b}mTZgIAf;k|Hd+6q^^s|n zGmqL{oJ5T2vA^!Eydw6AjoA5hW2@UAa~_^hJ^uD}Rcm7(J4x2&>P_I$1>6LBJH1y} zE6+L8TDf?Xvd;86*~V9GN9R{9{J{F|bP`OD{rX_#jj^NYq?E21bw&Ks-3I_oW)g8C+!vX)Q_|m;T)N+Pukq3N?RMZE@RVbGW};rEb1Ss?b%t#P!E#l;zEzp>e$>2FS}4bGjZP}9y)dfVp4vX1FeQ+NtnxW8MW*0(t%_3zHBFJ3%b=c}Gp zms_y#BWnixiU~J{?x356v)p)76}e_@k)H4?+Rj$z?QT=6YIjjyxuq%k%rviSLQhs?LQ%SX;*m6PZY-Bee^0Lw zw5se(S|uGuk3h|7ofPdJRmVPvy;HDJUVLs)B6i#BtuDSl_N~^VHHJ3pyuS7M>AF%q zPp6EkZhN~fQ0DHRs8qJ>S66lU8tQa_tpEt0N&!f{vd4Zxc zI%nH_y) z!@{*1Z}GxLpMUY;SR7Pd2rG4v7H~T78ulQ2q-!Ke9>*t)8-}J6iQe>bZ(-KVCAy4? zdDY?4c`sRCkxtJkXvt}<&&u;PXSiz1OET>fY8yj#SJ#uS^2|p%qXm=NWMqC+sWVoE zYV~qb7zw%Evpqc?C)<;|j0@3cFeYc*%0`cOhLaA+8R$EeLjIM}I5)-gN_TzXf|bUs zibd6xb<5t$I4PNfE}^(1r#UA}>L2IIt}QRiveTkbxH!;N(~|EA^uFM2$as3fxRR+I zO0u(Fp(n&t7p~N6$+$>GW?;U1ir*=`2|a_(pa#Kn9%*CQ`_7?+kxd?~!v^(vrHJf~!yLeI;X}nvOez4A@FCmMlWd7F7(oOAl`=Sqc=17a` z-=4$s6Z0bNw7Mlnqsiffcb)6#{q&uGXJN?*OA7xdl3hAT*Wg%@W{lP|zq0lttuE`O zDVdJNyW!WinN8$my3MzvOD1ipY`IUSN&jV+Qc*z`3e$wjTUwObyn3ba_YX=+VWqtzE>bxyd@#O8%B;F@WO`nWXq^&Mh4rQaHw?p4425+$Mf2^mbFw)R zx17tOAJN|=&&wznT_2@qE}M=Y#n5Ng)dsT*J8$jHzPY*3GpR{Aus+!8_LNkG9aehF zD8}Ea`(i385dERWFL{b=nW8^271ZTB)v!^`V>b|Y6ue7beGfCT*Q`A*8ZWsUJhAmQA zXi``%Z$Bhc=+Bkcf4(e|yKs44*@93@XUL>AqJ^8vW<4gn!QUJI7kKu*pl?lQ)VI_8 zx6)I*q+!&GCE(+zu4TyVELdX5o##`@iz8H0Yc}mAp5WZp+=A&(*y=q`bazG8tk9-u zX6Kgl*Y(9#>gbK5>fP3og7zu8P+zfD)A5+Xtm~;3N$S2{*%(>6I?Y$MqP1zN-V}yfsjp(PS9b?}m*mjvNbEk+2Pb~&JBn9kFFa(s zYMh)*i`}H~1=s0weJgS@^cm!v=s8(A>7M#byQ{N0ntpMETpnHBIeD_iRWh-_n^niS zJCQ4;Z_?KVjVwEZef$~p48066+&bPG+e6k7UNq-R#RrSedMW+jR0Y`*J6DlgxW!oL z-%{+*d+EiaS;i-#>x1aA|d*xRbrM$eu!b7q<+GP%OzZDEujgdNJ~pGA*t zVY_|FX-;vru$MXUm;bu1D%Txo*{gH9_f(tp?NNE`SdCAC;GM#r?5Y5No8i^Irf^@M zLRZ#ZWj0THH>1=td7E^NEWdZUeJaXZ$~Do+v;_9SEPNkgv{srbj;7Z&nGTpe7n!9Kw( zeC2Tp{K<{9i8BiGH^SVBW#j}IMI3oGwuic6`v^5U=gO_c3o~UB!{5obyf_-2IkvoK zox+i~zCouepKK%UXcV@yg45BzB*#htb|%26p5$od5ya71qd7u*Vk_v(*jhr(u7&c9 z&@!)5YKr}nca1tC`YsxsKe2YoW<^%+wq~=bW`>hgvAG|ziJONW`dr~V!aA=mtScMt z&^#H9N;Xy1Ef5#XEs{vWd|@ntihr!j$?_v^cBV*_$x*Tz+EqetPWpYL%lfpu`OTxW zx?7`B=`ZS|OBDr+N~O{wY8<73T^du-8L{WAL4VE?Md6|>ktjo$9W0|u=n~<3R1$9_ zl$^{&Cmsr$#GVmuIeBgMXJ4#ghh-3+G$<9ZCzVP~hJUHTUNqllRHu_TiITeBqPhIL z1#Gr+-MD$1l&;{)I=81e@wJRc=tcb3!Z(=MH;7G4NONgmpqURn5{;7Ygjuzvuul1W zT=+6+DfDNG+9KgA2(##J`Yb0OApxIZsCgwR82p5= zm#oWZ%5+zS+9t}Y)_kq8y+21T<&s!q zy~8CI`{wHk7kEV?H^0XhJ8A#JTk6ZAN=3(6y8N?hWHQ$J3b^~|BT28%nOsXAZNy!s zAMpm#Anhg8KWdlzO6dzrsv3*KvF`c|FBJtAi}i)e{UTA8>kKYkhcEVzuN{|l_uZ(v zp+hR|TqQE*uWg3AeSqhZblydaIW4p}Agsuq_IAVITV09uNb#9To;&QVFU8PnD%slD z7iT8hHvAPYYw~?9JeX^c?fZAMvlB+@Xa>~@U;H`!48$6u3!73SK8%w5dT-sT1@B5f zpT1#SzsC|iZ_@PVY{#b0Bqy(|tw>j?ji!35%~6xvt0iy#%V@TBR(GY_ggHwWy^L-Y zEKTGLJ-%`9P~M?KBqO@8d9Zv+MmzN4ZIWhdZrQTpGwJtp&zU&eW349#J7=D>zP)(< z=%@dDzP5O(E6;4U)Z5ZC>w@DICi3m{hto~A-s&Ewol8=?gZ2sUsziUryDC3TdDWR- zRXOk9QGe!FRL=Q{Ime6u4v_(V2efs3xIsDE@AZT;9-)wJi++1Ij(VQ=l@<*c4 z7pF&Zr%lvkRCX3;`FoF~dpO~|k`8*Dp7@FR)KodcoZ{i{E)O4PwewGw=H)xH$KA8U zaerIbGqzYFqgRgF_*O=vC+5@@&gm=gR7(m zOO}TMo-|#$d-=D{)q&Wd4GybTD$(1E$XWhWYVGs~2{6RQ!y02G30B;WNGqIB@dckQ+Gji+(ZB znW%2(E)Y&PkV9HoqrB5Pyeno?h9`F0IYqNF4C zaFi|`P0Yvb8!L)u(1PhTrRVa>w4L>p6AZ<@<)uU&edd|yz*k(7`c27qMf16GVYK{H zQvW$sp{g?~!1X_;LL2{$BJ}-ay$E*^_X2IFS+IAB)pvK&f+W4LGBf#TYelGf;3EFY zz}Tvat&xtRwN(Xcee=jI6QdPtqtPpxqdg^)f@hZmdLpe%%Rc0~Xo!{yZyNjIfBJ`Z zG^RG#49%eq&HVmOvZ=lzwCoY7BK`iJw6ucK;#Om)WO;q_R{QFv(*2S>P0eT9H%9C4 zkE&(5E-J1Xs~7Q72~R>%MVg_kszk3L_Nc~Stg5Qe>x3Tv0NsU}Sp^z~=5v!f;iZ0& z*#D$xRePX+2`beDO5E3b?uvrreBs>R@o7}?pptv z)*RMRa`$sH_}|gp!uq^#_^UIiw}gb{(cjfyYujJ%N{`xIlr}BTpHo?Ry}vPMd(JHK zO(0rb=U@Dl^smd6isFSu(}I^>=#GRI=gvm%Q@F7hC;dp zcL~}55B{v!t30_eHjC#ay7Ih+igl7L)h*$P8E7A|7fB6Gk4CR;i(XsZWLBiB6pDJ4 z%2PQv& zqNpzaHT%iMk%i@v-uyXzX6xkGOt!OQ9ygKp(2LHTW5esZ7gklRCr^j+eRc;8$%jUbYmd0!jVZX+Gw4UG0zB`#Mtj?enMflmV>&dML z2Nr!z#ztdMNmiS++)28I|3vsgsMqtcj zsqvqGEY?V31AiqaVynn=N23E*ML!mDeumpZ9kgmhdVv3M;Gg`Mftz_}ET5PEcXXgW zN>ovd7arq^={nk*7_*P+qhv$IkD+}{t@mVg-@0}r)5B#0H$QMMTk4?;T zk8P3|YU=aNwvNZN`aghjo*1|+{$KPGv^0xgOHKTUoOLDHVc5zCqH;1vt*O66=eAy4 zX4Ec^O^rtBh4iY)vDf$L(^@N~>gtNTG~E``G<`>`0u)c+t_Q_lPA$y+gmuFX_3gJyqfbSNC_l5unA_=)Npq=p;JK;-|LmN(MUh4t*(v^nsU$xLtHSY(<*z-MSHrF8)K&$EMD{TH(ms+Y#`e^-`3U4qTB}7}_bb z6>SgMjitdb8|yy9y-dUW_pm!kLDD)W@#3#H!v8I%j`HiGq@ApcT^4QNO9tLx2RT3< zVH)6f3mzlesB)^m^j(x+rJ!kL4YzGGJ<*nDji@jTZ#_c9w>ox=of0jmX$ZO8ZHEjN z!FsmQiTr;v>p7IyaM8XN<&VlCxb}y0SDTM^MLjiIp64I@0|`7_aLJ^(V{|z+t)ZO4 zNzb`*SZ$_reRMCq5w&3w_3FaZD|8j%#Eu#r{zk&Q^XaE!W6%RU_Z$hwUXRA=U*I2( z{fU^O_uLbW{V5vz7m-F;ZY#Ju=w|*moRsl5TNf6#*(5ZOeaY{cDB1GkKbG-M$D&I! z&#C!>WW;_KjgntRqwCwsTZHe|zrnTAG5kM-7Ch89q__p8e_!tyIL^0*3-X-VT@Ng> z-_^9fD3-=+N>)ds&rhi;nB7-g)mhZNNucKmZXw-A^`OQ+WRnL4KCHKVSN!W44f)f0 z44Ks(#pO*)-@e5#Baqu7E@;Z~E{y6jOzy@nbUUl9*KDQ0R<0J|pA~P_-p5O|PZYnx@h}FI6~m*8~dZc-nXcQeI}Vk=xX2@_F5? zY#X0Nc@+`Yq^WpnpWnKd%xs&xDK~$9@j^!10WLy2_#cEX*?EU4@aWqNsz3M6TxdINzoC!qH%ybr@;MgETEOtw0wI=Z^6=O~A(m<9@Yo_DwvQBWZAk+bDYq>kQSN_ja@ap( znbB9apuDPX+3U_ID+jsI`Lv6be&J4(UL};C7ypv{z`umj4Z=0sxe*txO~Q31?td>_ zn}ur!8iq``wg}hW_?Iv@?An^jFL`Yft_ud!rwiBFgZJ&iwGa6Z2-gm_i!=Up+{azR ztJt@uVPTEJx2_`zpS5MucBxFQ)zK2Am{$$#S}38dBvZre+S=Hs+6s!$@V1X?+Jbx#kgV-ik4WS>RVu`LLRGv-b3 z|D41CnquYTSkvTwt5n=fA`?%!M7syAe$HA2ltQnK`?_%JG4pgGWGBdD+l zb1x_@F}gA(KLVWC$U;sf!NePT&2p_x>vv98lGfHqu|J=pIM?_jRMaAEl*-A)O_yCZ z@XfHonZ|lh?%(+9P;T3q%awYCp-b{JO2ejI!sfy07=Gwu3TFOqBdPkYe!5_yMbenvhUEH+Ss~Cmg%e#v;Y58W6$lz!(*=GgQZ3n5{>(T3Zzona<_U%k#T*dP%EHDzmg%^fbT7q;~17R-MZk@#th0 zi#~B0?0zyiS+4NaXq}WMONVas9qa209X>2jKq?bt5Vj7$8}N)Z^+j*6P{&ME;++<0 zBuvA^V+{n-ByvMvhNr2np3={5yJ$)$Zv^wzj%>0%c40+9x!X-TVBrXxk;dqtKegwO zee=K@Np+^-)WPIoQ_@MZcuAz%S)`DWKB{cWj8gu&&E&GEtxzFnG1XLT>wJD2S()jt z&9r4-a!EmZmp_Lm55@NQ-8D8_)|FT0)wheq86^*)Y>d^Yjb~>C2TQZ{RWh z?=Y=sXB{0()7Y|b2~wpCJHn98=TDyYR3Bs}U<57cQ) zBJrBtYBHeeBb#IAleJ}5nM@-UndE$j(k7yYj8KClb`IGPyMW2L0!7A98oZz!3{?g{ zgIY%-scvt0p_bGc*5squG;*-hrBs=egilwA)M*l_XNgQ7n?r7$StgSQtT}3)S9`>g z$i1{fsS<%op3f{uyR_6Ill#*MBCS-U%PgspDXwcSl**b-giFYr+W9}TzA0Pk9Xu4Y ztfVYCBa+&sPOQ5__l4 zp*L8q;=B$U6=`JFpp)cunA$@1T1Hp7O)Aq$32&4ODQt2)l4yEp-1z0aN?oH% z%PN#j^!W6pZVTT>byLlz`qqi9b&dHVk+*NIUnfymDcYhU5E{?(WOr-pCy|g^Zlof) z!d~JFP)a7o?)Oh?O;cv@e1^A9EUBmvBH!UvBAL}8k)Jq`RqP3oKeYaTrJw#M^gr~! zA|JMOIQ>ok%NmrS28REn7B9B8zVshg#L&vyTmKJgLjJ>=#4i3{R)zJs@ojvI(Cff! zF`VA-7*6kZ*go7JZPG;7qo@{%jlO*gKC?-aJx`@rh=?6NOqzAdMCX$q?G#IFwzpzW z>6FRNr?y=zMND;)3R#kh{GUw)?!&h+{WK*Pv{d~pQhu>+U2B3G{P`d9B>U&_fDun4qS{QY zVPap4Mw%7K@`X9!+~a>&mRvrJ#> zi#p_W8PDI4#o(+a(I9CFG2?0j+mrxJJ|mdo(CgU z7zJ`iQ=Vv;xiiRmW#1#r5goWQkwyc00;$>&P;CR6J4H#bT3pTwD7% zw^U8E-a%xrZ$;hxp9b!ZpCu;JHuHvXvc3o>wDs}7f@^tQ! zdWjUgy13jSmS`n}+9^+TV!1*=M4n=i?6O3>2+@h!sfdgF^>E+a58}4>^{q|%?i&&s z5HBYmoWX+}uGm7&J{T^^Lr)G0@&_ixfoJ&Y(WDp@%3;2vNbnttAV1_hn)f)OC8b2b z1pVpVw~pdI-g@_G&LajUKi7Xu=nV78-0&c&u#*EtStL#}%#%#{k;1F-zi(|lWbYG8 zt(F3ZESxQmHm~Se;60($S4Hri*lQCJUvUmhM3VbW3vvTKR``EXKtB~FF9eO!<6D`trTNtrn)>BuWMFI#Bk ztYuUnPY2h)zJcfVBtK-Abb&|6$3J>ofcgw?F@mM4Vyz$`C4|&BNaZ6N$Z3s%>DVps zKgEgGVr^|jBdDy9q7ist%||qkj?r2Iv@rG_oKk73wIpn7MZBC>qHZ}t&lVo4&?(9< ztd50Eg^ABQ`&oZd@$33JnKI#u4{r*aWJXPcC(xRektZR9i?bHy7D)v4myT=~=ai^q zk`5x3TC&QdN@HtsoWYwwQ3c~WYa6K<+hoJ=&ZI*i0h ziTo{>SgOSXkvi>lz8Zttot6u2Pw1UMwL{p0IM|%aidZ+CJjj@>Op~x6`|1J(&nuNY zZ&8vygDE#&4y zd3w&wMo`%a8&a28jZ2L3AVFb@AXrzDpaN!?2F*rVpeLGrrmKvi4hsF&3{~yK-W&fd% z`XBqJpdMpPev2^1EdHO4G6f?v+DMb0HqxZb;{E)==3|VqTKEV1`430>2ep0U6aE4J z;gJ9K;s4TqTYl`=nf*6@&#>O^!~g5vt{0^I%-$}+frO>`@PBJ*=znBsc7xjgp`~F| z6Xu=4`~Ndr;V{6qjNZ(bfGgpi<%*D|9q^I!xB%bAg^;!n*9Agoj(>;rdB6g|!=42kfHxUm z0AvF`q+iZ}Jn~sS0)pH)`cFJ}fYSlv`M0+SN4`m>336RD z%8f;Q2k!e2H&qDV;-=$w5uP*QcMpEM=!2XYA%hz64&+nMXhvuu?;`JD{Ew)M8F}Uc zr6?l>-T z14foN>E!Z=2zBX1zHQuCf%oIMO-NsoEVmI*vNVi;xaZ=37ymn1E%0y-o(VAC3vuJX z=Na5pf=p&|1|SV_(^%QO4RTA!$&dINvJA4r^XzoaB+|f-nMuB%256d6kOh;&Fd$C? zw1S6mgmR=YrsQxcK-Wx!E{zNF~Gj!@q zA=7o}A-iV!5)|_JS)tJ0(dJltPs%sZ?wQO^36t$RJ!w-)5pv-DKa(~n zC1;jLXY&4(q`hG_hG*@R$xYz#Tk&s(@uzfHy_n6>r0OQl;3kV62Qs;IpbP1{$YHKY zbUxb9gF-uMN$DcfZ>Hxd9{+4!B=l{BUbFVh+SH()3HlL#=TtdDcRm(JK;O#=8i(m+ zLKjZY&n2|61F`SlMJ;lFceFAHHss11Z(ED}DCJBAQsW5Zh0=|jAlI(j^(2UY|B>IhS zkXNEDvwp@17?`bReHWkw)&S#y3P4Q8#XsV>*l~`FYY`p=9tTbUFCfl`@J)m~!pne{ zlOgUA{En9{fywldBGe}!gi{533>gUZ zI3;BKM4dFl`X!;?JY$%&JEAOvKMMWgq-6g%(m!B!3UyD~8^y5D%=kbhcy1P+I~Ts~ zkI?^9!lb?{J%nY0BN5> zxB|L(6Z%*k?w>8xqlkYEcI~%ZggXy5qZwm@aqzkOITP$S>qp0+oqPFat{wKE8Z_jR z=iqAvL1#JojTSubhCb$V)ieWTGruvHYvoP&oduc#kX-1Mw<+$g7z3)W)46YXS%%(D~ihlq+ z?dQt5;}~Ba=R!ajV0LB6AXcM)T+Q{tCZ`KHkK4^ca)k2&6?|>{asIpnz{9f`_`A7f zd^_yxKJFoY4etFa0rDBbyW=ZS=4^f+`;D~efN-C?LkMe=IGa0%Z%^cjXIR>~iE;S< zIqncbN!$difn0!l%MpJk@E-6ZuEhYGXkxRL z|3t`klt3rQC-}|wTYLKjL&~PEHKf&(~ zA^fv&AJ^nP#Bs^=ClmQ_H)3q}FhT(_6{*MlcFw`Q2wfM&e?_{H7T`Zi0QKC6w7UiR zWXXKyCF;ig5&FLfcn$pwt|2!A>SMq&Ccp~XtgtgpV)LcR{0=7Xon(l|cs?2LN$5TNx^C`X=;1RA@tqur z%?9QGX9F97c|bWw;w1@M<1t1XD_#B!H4|>_ugT&$G_wG_>V%l)$AT8LLPgB z`lIf2C(3fip6A^0Ha^bz>GSY4zkzQ41${vp@C^Fgb?EQ@0edsUvSOb7x7Ne-UW;Yo(3)h)**fYFqZBD-5;ae8&S@iDCb@L z{u}3nP4L4e_yxcEDDHiM{`42|>qtTTJ)W&-f+zgO_yF3`0G|U)i~kuq8|SMbvr3=| zh;T#*OAud&G!X{GsSsC<@G!3TfcH!B`(mId{zD=S;6@s@3v)a4mBf6I^+yOlhFpUP zJIKZH@A)uCU=Q`MjW+1BmG8$`y&rV-$N!ZG;m5?ea`Guxh&oQ9?0mcLIhE*gj7Rpx zAL4JtbrY_Sa}wychJki*Dw;n8_-SdvJ(iZ;dk@dbIit7|W1p+zpYg@0Pb<$f#1tex22$);R5(MKKNxd2+I(L5SNeNA>n$K@H?ODLVK$wwV+`i zmw`HEQ9tLRwVZ*rz=xQ|WwM!Y@W6}T4*EI#jL&et1=s6w4-jiP8{k7+o{(l5?oZ}7 zo9~Ue@%w#*b;;|uaeX`bqKkz#7mF*0hx~=H^}_i2!htpDgBk}zP5iFJm>2mbLQ^ul zP6+RbEfmJ%_YBPA?}1Gm3ctg>SBWe37dBQ#xa^eh8;pOCa$m*HV&i!3tARxrkCzV% zf5g2L=znhz#?(I4b9nf5?0R9G|MkEF{MYd{2>*oecAmyB6~@#wt~w>WLI~M-|K2!B zAa*tS#Q|a5{aJj=$Po5|g>S?Tvbh5Oje(o^H{z=heuwaG#5W;K@*Z{|mat{X`2j2H z_9H`rW7~RAie+|Am#!2x~ z{GJQDBT4a!wsA)7k^PBI-LMs9(7{3D|`-p41u;OE>%UbmH5%siK!LuAYyvY>?yWaoD1T=nrx*rjw%ISb~1&uNZSq zM4!47*I&S{3T+19(4QpcqjdCQw1XA64q;q9H~tixOA(dB4kp%>jLFcz`m$lyy41Q; z^0%2?vw02BG7oi~2R)r9tl2%pxkN`fm-r*$H;XePG$W3!({-iR2-zB-FduXnf zV86bEZ1T7=$ZrAA1zb(PAToq=5uQLej()-SBedcAF@(?H`Y^)KP)P1Z_!96CuoL(d za2xP<;C0~qWZt`h9$*778MqSIoJ{vSU|ll)I^Y+;#lY$$J^uu@19O0xOy7WsKrs*i zM8Mg=EZ}iq7qA342bc{!0o)8!ChyHo)J>pgOES-yiSmRvhI+u6M2E0$mB8@yj5o`G z&Scpa0P}$y;PPbLg+Onju0)RTmSov1JU98f95@Tumne&mC%~OZ(tRhe9=I#XGsc@q zNq&z@@|MwYYm$bulJSdyvA|Qwe69huC23kVjE5_RQ-BK8 zWfQPEN!Q%u{ZNwsEL}koyOL!s8zzt0N%?dn(Vmne!$rV{$>;7*mdEIxm*m4*;ERMV za?nY_b~{V}4h_W#c}xdZ0B{gDGmjY9O%YjFM-*Pa~0P<5ZAWns6R96BRd8;)*Ie>Wee{pQvHm7L; zwgR9@^9ILUY)-ozcn;lD2>|+a7>VmP0*KRLG_Q96pj!|6^r(~mE#Pa8GqBSi@Qk4o zz-Zr?37ijn#c`%t07m>~D}cIK*c-_qU@dSvfV{1>z=Z(vvY}o!q_h19(|$34XYI(( z-UNVNJIb|x$8qfND#tpo|RgEdxBrJO+Rs_X`~7 zSpZxMAgu@ad+!HuKPw2#0e;1C*^oo_QULKj(Co_sP;Vd7`aJ+fyM8<$K$rtL=Yakk zJeLbz+-1E^!(UpX%LFaY`G7XYgP(47yu3M2sNEtm&D4+?R=5IRwW@`~_m zF?d=GK8KJl1fGVVCt>g}d>MdzOLBqD92b!RD8CdsQ8t6)%DXtO!o_iw(1R+Zse=5f zQSWMu_G(amO^oAe!MEBD0MFN=%(?~ubk|n{sAm-8uqf)^fcOURvf&$!Yef1+=wK7{ ztqJ)xfxpd2*9={4evRW=KvxTR--_qj5Z?wlwnMMle-C`mabv)%F`#EmJplfVMcv1O z<_@IoKpq{SYg{FOe8)jH@V^r!nIfV_I}Ob=-3LEU=L271uudLh4F(9#R~dLi3h z06@Nz!PCiTBa>05$wB2bs=??ks>D7eeL>VILNP-i12>w5dhl`6B4#BJgYx=v@SRu^4F< zgPz6EyCu-AC6NDF(DSoa0?2PEWV;l!EQJkO3SC%={Fgz;mZ2RkL;N!6?=sYPIr3Q! z+Lwc`%U=e-+Z9N&;%1Ip2|KqE`n(cyUWGcWf^1fSr>me3t3caoxWcO;&(+|^8t`K+ z=vWJy)}qd9A;Wdk0Nh)z0AK^wqfM@dUD|;9Y{0z@klO~>hz*d@2I$KM=*tH1c_Val zBW%@1=+;K?VI%mv5xm(59&UszHiEYsLFY!K-GsE8K<6gVw+XV?gtVKGb`#{c2|U?^ zw40E26Vh%5e>OumHbXZyqaK^VtIcSWn_-7G!?tdQUTj7?+k!l|fZi?O%@)*W3wXH& zJlg_ZZUHa1fKOY{j<=w0Tao8h=;v1G$yV6gt*|*;!JDnnldZ5BTao8h*zB#)*KM#T z+t8l3K`*vJS+;@i+d$_w(76q|z76`Y4SAl8JkN%%oQ*ushAy5BexHpz&jy`mLvH6l zkGG?(Y==H<$1~d@#~tAD4m`61{lpH~jvb(R2WZ{_S?stMfWGZO+8xlhbJ0f5#q;Mv z&gVj}&PD#`qCV&1-Y=k^zkn^=30imF2!Jm;VN-TOo;z{>Jn-{8)ag9fgY!|&`LJ!f zAopG919pK|yTH#~sQYd_zZ-SB06e?^x^*G=c_HL^A!xo3&s+o=E&{JEf}UN3I$aDs zz8G!z64dz;==de**Dir9E&)F-h2CBYeYh07yA=K7rKr!P$a@dy--CMYLHa#c1JI2< zsN){+<1)ziGQ?d5y7z*{(C{^Ug+yy(6SeN-3z(y#j|^%=X+rT_u~1> z@yzAWtIMJDmm{ysk?wM&yBz5*M_alaZSV@*zXEw)fxh?(=<^lG?+VEB3h??0&~XLw z*$27ogIxB(ChkK%`@oz1(3kyqWpD*fNPin_`R!fPCR=jp1BkCxC{Ke3w*o_vcC&<|8A6dH+1Z7$m(v`hr3bM-Qd+dsP{d{ z>mKOUz2ND+(7AiTll#za?gNkR1JCY5JG~FOdLMM?e(>Uc@cVwWrTfu#9zgjIp!^4* zvk!nb55R^!0R4Xuw(ddD_aJ^h1b#dOyKxA0Is_d!gx|jeZNG$V`6YDkm*C06uwxHH z9uK2^JOcfE1Z6*h{2ze~A3+|Ez~(%Pavnw8qsaGB(EBK!eGEK*3_N@cb$Sea*5jz> z<7kJEL$9Ae9iBirPoRxG3H^Q&ZSYCR1Dai9F(EAkh<0(9M7&>|w}x0k`!m+}0| zhU3mp*UqRYe!LwJv zgIA$1uOj|c*sWKQ_p6ZUtDx^yGPfwr@ClJ1Y_V6b1c@uj4CiML+$m1>O_}h5qZIt;o z`1cO#@-A$`yJ#y=P3|Og>DOpazlI*X2mZZ>dc2Q1z7P3*03Lk+8b5^0K7>qv0~vh; z8b3nY`v`UX?GgaI{TO+D3_gF1xKE%T{xxj=1~vK(WPgkK-$KrJ$j9$+ zkNzIAzlZ<7hs{4AZ-2o0ACXr-!k0fn@1KxIKfyOYVeU_`;V1a_C+M&g`Ywh1rO;t1 zY+Q=ETZ$T73XG-bc}tN;KO>KR#@e5O|1)y`XUO;&I{t!Zn_qDJ3;g;E{P8Pt>R05{ zukgdKSo<4l{5J&qcj)yyeDnu&_yhL;f!z56^8ZB6{E2ygq3{0%eg6jj-{`&nl)rC? z9`X-@_HX(BNwC(%^j;Toz{f%k`bWsY=YsAP za>Z>xSijp{2mV9$D|f?gDI{dy2|T_4xi|6WM!@8ky4K(J}UaiGtIteXv52m;V-8-TtQa#P6LtO>MK$j$E-atqkG#mho&34ONOU&yVoZktviw_ODUIm4j$u=zp` zPlKRe{XwATg=~PF7_P-IH|~I-TVg#>3G}d#Nnj>l6*7hMsi%eXam~kEAO1-LGY$M; zBxnf;J|6-5N4ziOc9_2%{ImVVLhdjabf}O!!mm5R-W{(1LDo(igJyu96msNNAjlhu zSdV;H$Phjbu{L~D$Otl{qlC<0oB>`IG0Gwjayx@yTOK~mBetX9>rs$B3UhXbtkJl( z%P`P2LhcG*?FxU7fxWxI&ts8iV`1O!i0e4`XxxoL?g7m4Yk`120rpKqTqar2JR$dl zZ}x=Fdm*RxLLB#ooV^jNeLWCt-)|NOYxW23{y2|4kVLDI2SC>YF#o_52yD!1WoBGZT0-5#O1RGZVJWgkNW( zre-1z*k{OD*MS}t@(|?QA+YOE`2JALI}ExVhMb%|76e@nhdzhjDdZ8b?FiK6k?_Nj zs6RZP%cBsVqhagOz&{#sJqEEq26K+x0t7w>c|Qj@#{us+%sC$Zn2Wrai#j?1b54M- zPC)*gfEb+!Ie6ZdCqkDKQCssMe;#a^hZ>%TSm3!^o&+DA1RtD?{5S=@;S~4|&(ZQ! zxmhX2k%+|L~f!nt!%8|U?a z&>PN2ja-1W7Xb4@^ty|n=S9G~2-ol|DldWGFM-{cq90s__*{my^HB@)kpl~0;{w#z z!efM71b;0;zAZ-XE=Dd~4!bXhyen1!!Jl}Rlvm>TO6YnOe04RhUk$%sQwKuau0=eq z1@5)Ly$<$Wj~cxm{qlO~em!bo3F>S%=Yq05c_~lLH#G8oGTZq})(Ccm3{|;*8UHI=ktif}F{1El>5n}ui za^qvn`2_c>Pmv#=A|{{V+~?q5AjV%JZeJn~zC=vEM1FpSxO{~i{~9&%4fOgJ`SdO3 zeh1%v4;_DmzkY<@euN%B!4E${zn@^wQsn>7IQI+e`xW)^8|v}5`-S`+cK?obf1o%1 z348y9j(;IH{=)UYq37R_`w!&*d!tZdj!^P`p;R99n^1bbP!7gs9ii+>ARN2Rpj(CV z&J=0@Xy7hF4Z`)oI6tHn^r28IoGR3cV}!!}SgmxSP%G~bdRM4bx;|))XMfTq`Zq+8cuw3$=~~%@b|wH~gm-z3zA!-T3^D%3`w z3bpYcLJj?~N}C-a)D~+AwdKA-ZLNgbrX&>Ze`+|+H{g2wYoU^Zg-T_G@|Oq|Y$nup zkiR`-?eL^fJ7LYpdZ9v$Gg}CijfBdLuYPHA=T(Fnjd^3X7izazLXAB}sNK&OY7bl+ ze~?fUUKVN+*6cY$sJ*a$Z|J{I4D`8B`|d5&ewer4@j~qn8}`Sw|7;`hxC8oDr~{t| z!Ip!7e^4C=`W-YGgqR$(5cD_*K0FAv7GPfiGH@SJg=rx8tbmvlo(2JHGJH09D-dEg zc?#$#(8Zv8LGKII2+T(Kw-GWLCxUuFXM=7Ay$(W*nh?__=-xCI)CoErgdAyl6@=?W zTra{;MZ~TMj3Rtkyb1&zieC!VyaEWmZHE7vVMjCUXok(r@JlnUx8QoqP|!#a@}UJf zwpu1~@BDKCOx!&I!F3O`Ln4o__d!G@`jKlNDV&SH$oo#@PAB5g z30pgnk6qBS3wCxPhq_Jx!B1U?cNea8qlUV1ts6Ptjoj&m{@u{O8~Pu-0SLMu46K78 z@8Cy4(7OlndQu=@^VvI)(5(;go#ug{-!$kx4gQ#h z9GZq4n1;F2kgL<+<7tpP?H{401A993nvR^Gj#y7e{Y(e`bo7Mjz@LtuG9B@p0lQ`( zUNe9{1F@Ka`kMh8W&nEzg*ur9d9!ANpx-R$Hw*J-VcsmvI|TY2f?PfXb$`gZFAhb09frC-3^6_oaXbvV&ql4xMm%OChKIukM7E_Z;|j4s4qPyN|=V<4`}xBOi`O z430<69giHDi#2nBKNmX9MSSOC&0N&uT*PiJbU6WjJ`pqzHqJwzIT`*v1vz~x=yc@c z8R+F_qE633UpNQ0oeSJ^A?IA^c0P1FAHF*uKDiLG#@oJAJ^yO`g~lUkL&YseLm`X0erCla~5FE0_eK{dMv=a1(>%0 zIko`v7NE~9#Jq*5&xOdzh3F#-F?S*6E<}75BJUT%w+k_UA$sdV%wGgwEW+GH$e%^P zUW9pzVBaG6Z4q*45#}z!+{Nghi;=gBk+X~8lgoi|Ir8Fi)Ylcb4_<*By#nX2K;2&n zyerXzuR;!7h5Wq=a;}0Ou7Vv`!xvXW=GDlNt5HAKASbUu?OlVsy%sUL7P)mDVtGC0 zUytz;;4FbZmmnTXpzjT^=?1L55%%5$y>Ei7o8kYP5w}~AL$|;`w;(TWflqJ6_*UG1 zZ$+Np2Atb4_jcsl?eN1L=u3AXhw$vB?m%z76LRmu`n!;4cOwt)2HxGMuY0iW9@u;j z?7SCi?nN%$3%}os{&6q#xDPddAM|2e*^a)%>M^E{CjET|IDLhN@%qi=zgK~@j^Qzg*MZK zw!aAN{w1`x5cH$a0~BZq=u@Ew#z3<{uM0hB7-)acJfR2g2>M*;Ax8M-VKQh2=wuMqH{e>s zlOWg^+ZdDv?F`x*)C$7f7<7)E3j#(A{){~if?wiWfuL_3eoG7n9RLDGvIP2C=+vzs z$n_C3AGrR_LZ|CN@NpXY1>gbBjc`D?J_5FG2fu9xpKO1o&^tihj=624<=-BS6vKp5Io?=aEXx0yQu)7q zD}U?Ctd+$694j$cbaJdkRvgN4`Cl1-kYghfmDjZ8u@x)H!5j|}^W+8`uON1o*KoY5 z*jxTm`?pHARpV;^o{6VsbF73_$8oI1#_D8_9Wg-Nz_AhQsJl3}So#Q54OhBcmhn9%rWExc}S;;>Cnt zxnB2w)OVt2tw`>}QJI%5uY<0w6-jkCD$6SCUOjGsghJ&^+0Htg>l2g36dW~HW|c6% zPK**`#iR-^Vs5drrX9!QDzn=ms}VUQWo3rKaawF@ZFG1JvOv%T0{s*Bav$F?c|9k0vx6pM8ex|&PV3q8fUd{ z)j3R*uS_U(_KMw#O>KQ0Vq9|}*VI<3YZz8vH-hVM8RPV}!M0^#qIOd3S?uYBl)9ng zi__Z5qY+qF`BOKvZkgzbt;M>&-eO%>b6u&mt+%eZtFu%G-qKU(EESvTdiy3%DK?hs zN?moM#!jjmRqQPG6x!>?^-XSXYpfg7)>!Q9Ey8!DQum1A!>3Q5KCGp)Z&+7P%kW0p zI=rR3eOPO$qrHN4a9>;F)Vj$%UDG>(HKT4yUq^RuUDvc?5Ach1?S)x0>zcY+;Hyr! zZyKlxqb>v`TXAt0+&ZNa_Ch59)%5GGgtveomCsJAq}J3*0Ge>M4q>Qc;*?i5{{N9? z@}LT8Tcv0wS9F?1{R^PlK=aE-r zQl_LY(=w1F@<90R8nHkeBaRjKh_l7#VvaajoG305SBizQAWpyy z_h@m3_)+{MP7>#cl4Y!+@#Vd%ySK=En7ZGYhRLYU;6qh0*2P0NJm6ldQ z1gDEH(IU#_e~35?H?Z5qW#Vu#TO1*d6km&P#hr4pY?Mv1D4S)A_*?uVTV+UXv%vdGaKAvOGneDo>NA%QNJe@+^6_JV%}@&l4YtkL3CC0(qgl zNM0;2k(bKLY49yj|WQ@054RyX8IdUU{FqUp^ooln=>=pu%J<~^@&oyy{78N*Karox z&*bOw3;Ct|N`5WBk>ASi*517 zOC2KK5^sxl#QWk6@t!(V9j0ch!_^V$NOhDtS{UcF*ouE!s^VCV|WOa%< zRh_0zS7)d*)miFnb&fh$ou|%M7pM!>Me1U8iMmu>rsk^!YN1-B7OTtE73xZLmAYD8 zqpnrgsq57eb%VN5-K1_-x2RjyZR&P)hq_bUrS4YusC(6Y>VEZrdQd&29>$*bQT3R5 zTs@(lR8NTu)YIx2^{jeMJ+EF+FRGW+%jy;Ns(MYmuHH~@s<+hJ>K*m2dQZKtK2RU3 zkJQKN6ZNV3Ont7tP+zLA)Ys}8^{x6&eXo8{KdPV9QuVX?Mg6LNQ@^V})Sv1v^|$&* z{j0Hi)JkjZXrrxmwWkN@fqIZ0tcU0o^on{Vy|P|Kuc}wmtLruNntCn0wq8fCtJl-( z>kagVx=wGTH`bfzp?XujnciG)p|{jq>8Ywt9RGq^d5S=o}ee{NqSGcm)=|N zqxaSO>HYP8^a1)neUL8b$+}TD>7s7dExJ{==_z`uZr2^UQ+MfZeX#D)y}G3P^fWzP z&(JgVEPaSRR3D~i>%;XC`bd40K3X56kJWSZar$^YSD&Cy)bsR7`ec2IK2@KlPuFMY zGxb^eY<-SCSD&ZP*B9su^+oz(eTlwQU#92l1$v=gq!;VU^%eR`eU-jiU!$+p*Xir^ z5`BZdQQxF**0<e)eo{ZB zpVrUlXZ3UXdHsTZQNN^L*01PS^=tZd{f2&1zop;S@91~+d-{F-f&Nf`q(9c5=uh=$ z`g8q-{!)LXzt-RAZ}oTjd;Np{QU9cu>Yw#5`d9s%{$2l}|I~l!zx6-*Uq?97QI2*T z$2it;9nTry40HxLgPkGH3eJkoO3up8D$c6TYR>A;8qS)|TF%I_*w})9G|M-Oj;IkJIav zoIYooGu@ft%yecshd75ihdHyI!<{3XBb}q1qn%@%W1Tt9anAA1T;~MmL}#9Jl5?_i zigT)Snsd5yhI6KKmUFgqj&rVao^!r)fpejAk#n(giF2uQnKR#6;4E|&Ig6dkohzIx zovWOyook$Ho$H+Ioh8l<&W+AZ&dts(&aKXE&h5?}&YjL(&fU&E&b`ik&i&2<&V$ZF z&cn_l&ZEv_&g0G#&Xdkl&eP5_&a=*Q&hyR-&Wp}V&dbg#&a2LA&g;$_&YR9#&fCsA z&b!Wg&il>>&WFxN&d1It&Zo|2&gae-&X>+t&ezU2&bQ8Y&iBp_&X3Md&Qj-R=NIQ! z=Qrnf=MU#k=P&1P=O5=^BaAf4XyX`TtZ|KJ2AF|nkQr=-m=(;5W+k(-S;eesRx_)c zHO!i3Ewi>+$E<7CGwYiT%!a1UY-Bbzo0y?yQ?r@b+-zaCG+UXi%{FFRGt3M(^`^nZ zOxz?)(xi-U(k3t?%ywpbvxC{u>|{oo&_pIgWctiBGu_NEGtDe>h&j|8W@eki%@O8EbCfyS9Al0(bIft(cr(|WU`{mi z%t_{CbBa0DoMuipXP7h1S>|kWjyczyXU;blmj(p;=@Wo6F4= z=1Oywx!PP~t~J-0>&+5#gSpY%WNtRMm|M+l=5}+3xzpTb?l$+Bd(D03e)E8N&^%-w zHjkJ`&12?q^MrZQJY}9X&zNV;bLM&Tf_c%rWL`F}m{-kf=5_OidDFaQ-Zt-;cg=g| zee;3&(0pV*HlLVJ&1dFw^M(1+d}Y2i-sVv0b**Oy*nxJC9c+i#73_+3CA+d+#ja{sv#Z-R?3#8hyS81& zu4~t`>)Q?NhPKXbWH+{(*r9e)yP4hGZeh2yTiLDcHg;P(%nrBpw!y}1+$L<&rmSz% zHn1b?c6NKagWb{YWJlW2MmA%!HfQs8l-=2mw!7F}?HIe89cy>D~Z#ZJJ+6IPqg#wN%mxWiaphy zW>2?g*fZ@}_H28OJ=dOR&$k!Y3++YrVta|b)Lv%i+XZ%^U1S&A%k35RN_&;P+FoO? zwb$9}?Gk%~z0uxeZ??DCTkUQ3c6*1t)81w8w)fb3?S1xs`+$AWK4c%ZkJv};WA<_T zgniOJWuLas*k|o?_Idk)ebK&TU$(E^;?keu8?rQGp?i%iz?pp5J?mF(e?t1R} z?gs9LZk@Z4yRo~8JJj9O-OSzG-NN0{-OAnC-NxP49p(;q>)i%7=EmKGn{-pI@21_r z9pP^0Ztw2k?&$91j&wseax-q$&AEAZl)JM#+TF$7Rop0U61R%m#KZ0wakIEZJmT&q zjuH=w2|r@?!j)4+v}FxK6jcs-JRjibZ3cq?ji1> z?qTk1_i*nH zp5vbDp68zLUf^EnUgTcvUgBQrUgpks7q|=EMebtva`y`NO7|-FYWEuVTK78ldUuI? zgL|WUlY6s!i+ihkn|r%^hkK`cmwUH+k9)6spE%dO-+e$_;Xdd-ecpY+ebIf%ec64*ebs$UoFdK?XSuJtZ@6!| zZ@F)aJKT5Ncis2g_uUWN58aR4kKIq)Pu$s6f~UgTxGte5lh-Y9Qp zZ?w0Ix2reC+szy6?e2~9_VC7g6TFGuByUe|FK=&eA8%i8KW~5UKi&b}f!;x0!JF(g zdQD!@YxY{aR+-t2gS{TF*DHB_-ZXEzH^ZCh&GHWM4)qT6W_yQw zM|ekiM|nqk$9TtjbG+lcUVdzX7xcvpH?c~^Vac-MN@iTlL^-u2!R?*{Ki z?6st?+))y?=J6d?;h`7?>_H-?*Z>Y?;-DD?-B1&?=kOj?+Nco?X;z?*;Eg?+B*?*r4@U1%)Y;*7@j zLWg&7UstKvG`W3XXJ5zU@;kGZPTSPg-d^Z&yNf-I#m>@zLI*~@h0dlymC3zroh|Lf z0o{e3VrTgU*TBlCr>&*6gXug)|uU{#ZC(uZCy>Kx4qEY z>dY$kbm^|nqApGEGNsm@BA(^C`g)w^wrNG(+cv}W7N-?EO|dN0>1^vPLRNcM=YZZ~ zM_Xm&v=@7OP4VEqLc812Q!D@$rWAY2Zw^(V^#Ag9WzgiFLgUn8sch4L$rx5t9n7;8 z`vw(y8{66%+j<)NItKQ2Ho+~8T|Gt9(o>jLl!fKrY4pF(;Jb|f%bSb=W$DE-qMlsn z8CW^0APuY_mD<{yiUWJQnoCtDx?xA5v8SukEmXM;C-=ZnwoqYi*wq4`PIU`aJ}6Vw zw7I=FV^HI=@xV+|SEmM6|h)g19Qs+6>CE` zM>UF7ZgW+M#R?lVYB{A^mQ!lfGFdIP;own~9O6OCatDKUUQSNyvaz!>9O<;;FFU&8 zK3nyoJDQfX(UQ?sOWLZg8%>?ts$7lUMYT;Cw99fBQcXpsJ+6RF|gig$6t1Ab$w@b{n+K#cP_tvY;}ES)xn*G z?ylZaPZttK=Q>+-v9rb9oyK?3_}#0uW4n0*J z#xJi!&+RP z-M4DttO^^r@3Q2bRT~=gsg~ZVb?JI?TAPlOC&-iJDRQ4YO&*X(k7jpCx{l_*vp-iJv8YmiSrXXNjL9evbG#;^*RaR5e>$ zDvW1|mLpn@XgQ+gh?XN-p3?J_o~QIYt;^H8Jgv)9em)o&mNUGXe1+Q34RcjqC{`

c|@Ke&ywfJtG_Q;ttLKK1gcmruDq{p3?V`(TWHFvdO@V;_vM z|Hat1?~W(w9$p_j zX}QS*ckd{+R41+6hUx!>Whz)sR4f(Dr~-Y1O#OdS`OkxR$bUrm5IoD!7z|T?RJwzh_PG@t%avY|GL)ke#%CTgQ(ZIr5w{Msm8 z8wLHNR1J+CC{drSo$1GFNYvyu)TA}kq&3u}#g^$_(>PYsI9Ag$R+AU2=^3j@j@2Z` zYLeqM$?=-xcujJ==8Jd@BVNOZ*D&HWjCc(rUc*S#FcLM4L=7WR!${OHmiZ-7!${OH z5;cs(GJn@rq-rZtwH2w_id1cdU(?F3>EhRP@oT#HHOYQWvR{+z*ChKj$?2Npbj{v$ z4I^E{NY^mZHH>r(BVEHt*D%sGjG%@Q)G&e?Mo_~DY8XKcBdB2n)jpd@F7w4QY5iCY zwaUSt+NhSp_3_#$Q5z*|qf~9=*GB2uC?I}+Z8S90u=u2&;2kc(J6wWyxI{W%tGZ>r zsNOFUL5!R-f&_VzJVj3XYwM^_5Ryma)PcK&1n;H^?iLcft0qF$dPw|`_#yGRt4M^z z=k6lG-9>`Ci$q9#?lKY~@wwYbaJP{Ni60R^B7Q{ti1-olBjQKIkBA=;KO%la{D}Aw z@gw3##E*!dA%2GV8RBP%&s|Z1yPyPjK?&}965RD9xVuSkcaz}mCc)iJg1egpcQ*;{ zZW7$xB(nXPl}_|up(WhkB(nWTw1oSc1ot-y?r##@-z2!dN#v+OjvC~sL5?^%YQP;& zf;*lBcRUI1coN+4B)H>A5lQYNlH5lmlf>tKBAFx(_YX<#ACgJpB#Fbjc#>~t zk}1kfQ7-ovN$xL_++QTQzesX_k>vg&nIc|_c-(I!Q~h|fi~Eiw_Z>;@JCfXYB>7~V zCi=PC^x}O5n(=N@9@W=IvD&2o*fb2sU8H|g^|iO=^Wegp9uh}S^82I4gk zuYq_C{dhU@YEAet;>U;|BYuqdG2+LF&t0w0U9Hbut)p6;`!`|RmHd%Dk_?z5-+@qQfI$)4`Br~B;bK6|>)p6;`!`|RmH zd%Dk_?z5-+?CCyxy3d{-Fi!&JNx-}am=^)_B4Azw%!{DDe|*d_gMfJuFb@LeLBKo+m9`K$W@SYv;-Wl-T8Svg2@ZK5l z-Wl-T8Svg2@ZK5l-Wl-T8Svg2@ZJ^h-WBlP74V)F@SYX$o)z#NTflo)kR~oaYY4a_ z3HTX9z&;pow-Io+5pcH=aJLa~w-Io+5pcH=aJLa~w-Io+5pcH=aJLa~w-Io+5pcH= zaJNyP=|3hucN_JY{$roVDRSz;T}HrNM!;Q0z+FbbT}HrNM!?-gJ$DfScM$=15dn7* z0e21cdSKqZXw`qA?VkayM>@%Pwo~1?iK=mMiTJpKj5={knKNDJU-J0 ze5MchOds%>zMjw8^?cT@&-b5CkkgNO`YlgC^4Ytd&))TU+R115fN}%M4JbFD+<_pA6Y2!}|XDRr^Es$B=z7WM2%~7en^NkbN;^Ukuq7 zL-xgxeKBNT4A~b$_QjBWF=Ss1*%w3h#gKh5WM2%~7en^NkbN;^Ukup~L-xav{V-%d z4A~Du_QR0RhLG!@i{$We~H*%BKDVv zeI?>^SH!*&v7bcjBN6*Z#6A+Sk3{Sr5&K5Oz7ersMC=z4`$fdMk68B+>pNn7N38FN z^&PRUBR=0mtnY~R9kH$>)^)_Xj#$?b>pJ4|OvL(*_!(lv`ixTj=P94{8L>Vi)@Q`} zj98x$>oa0~My$Jt&mj@(FJk>gtiOo$7qR{#)?dUopb?)xB0hgaeCrwUIV9q9NW?mg zSdS6wF=8D?tiOo$7qQMF)>*`QiuiUiVqHb7pNRDnv3?@Hg^XB75$h=8TgZs@6tRvX z)=|Vdida7p>nCFUM692P&o2?{CSu)0{7f@q{Y0#vh|dWTpA#ZJk3@VY81cCw;&Vg9 z=Y$O7lVN-^j8BH~$uK?{#wWx0WEh_eP?q(OrN6WEcb0z5(yv+Gce4C0PnQ16(mz@HCmZz7 z%aB*`vh+`u{>jomS^6bQzhvo;Ed7yX-e;NjS>8{wypLqVe)+VA{>##TS^6!@{LeD~ zv%H^VSqE9xL6&upr{BKOJD&ew_Gm;>U>}Cw`pxapK2` zA18jC_;KPVh@T*Sg7^vICy1XQeu8)j;w6ZeAYOua3F0LwKS}vX%1=^$lJb+3pQL?B z+Lt6wlJb-Na;blc@>7(bqWl!)rzk%~`6FHO8O@zTUg z6E97?bUz;LP1D|h_yO?);s?YJh#wF?AbvpnfcOFN1L6n74~QQSKOlZU{E+w|@k8Q= z#1Dxd5Wr>$1UY2-S;$(@_f1k+_Cr6wdadO1T(Y_qxnj>zGxH;nHh?^sBj<`A6nInFV z_&MU|iI*o{o_KlU~zM+0dJMC+Cb#oUw#pNnQSI8`0eLjI{Hv7S zzRC|(da5V=hQa0ErSzX1T>gDZ|G}W%wi*57A(h{&)Q&2@Td6H7|9+)*P{wHMY_3Y^ z>MYjArRlZvLn^VQMD9ROHsAzjTJmWPJL3;Cq;cy)F(xKQglU%u1L`p zDY~M1V+AL^Pkf*FKJk6x`^5K&?-SoAzE6Cg_&)J{;`_w+iSHBN&krc{^mI)x|4zxR zjQY9FVz4DgS<~&~6IlpSTTd?`mmlER=uDGk`u#Sp1ns1|SpJn!U%%XVef^-0zTUE$Wt+?AaH@ek zMjj_mlKbRo@_;-fkH|CRS@IltzRIg!1t(s04+2h{1kWd^M}m4JI4{vZFGWth64Wa} zy%N+bLA?^xD?z;y)GI-~lGH0n{3P*{#7`1GN&F=7lf+LFKS}%~@sq?)5IWOeAkn=+78B))XdWO_9q@E$=h14_bmrFfE>KRhcka|Yc zGa`OO{D}Aw@gw3##E*y{5kDe+MEr>O5%DA9N5qeapCNvR_!;77h@T;ThWHucXNaF6 zeunrN;%A7TA%2GV8RBP%pCx{l_*vp-iJv8YmiSrXXNjLBewO%I;%AAUC4QFpS>k7j zpCf*b_&MU|h@T^Vj`%s^=ZK#pevbG#;^&B;BYuwfIpXJtpC^8v_<7>ziJvEap7?p< z=ZT*uexCSw;^&Ez`4550&TVB;YafIC+A+ ze?BEvpE$wOf0%y!Ktaey!rvB2ILA zIHHFmdN`to`Dsm_pVH*{DNUZA&VbX(1mz}ZU4rrxl%J@5 + Copyright (C) + + 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + diff --git a/getconf.c b/getconf.c new file mode 100644 index 0000000..4141d0d --- /dev/null +++ b/getconf.c @@ -0,0 +1,747 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +extern numlist hours, weekdays; + +char wbuf[MAXLEN]; +char Msg[255]; + +void getconf() +{ + + FILE *fp_in; + char buf[MAXLEN]; + + if(debug) { + sprintf(Msg,"Loading configuration from: %s",ConfigFile); + debuga(Msg); + } + + if ((fp_in = fopen(ConfigFile, "r")) == NULL) { + fprintf(stderr, "SARG: (getconf) Cannot open file: %s\n",ConfigFile); + exit(1); + } + + while (fgets(buf, MAXLEN, fp_in) != NULL) { + if(strstr(buf,"\n") != 0) + buf[strlen(buf)-1]='\n'; + + if(debugm) + printf("SYSCONFDIR %s",buf); + + if(strncmp(buf,"#",1) == 0) + continue; + + parmtest(buf); + + } + + fclose(fp_in); + language_load(language); + return; +} + + +int parmtest(char *buf) +{ + + if(strstr(buf,"background_color") != 0) { + getword(wbuf,buf,' '); + strcpy(BgColor,buf); + fixnone(BgColor); + return; + } + + if(strstr(buf,"text_color") != 0) { + if(strstr(buf,"logo_text_color") == 0) { + getword(wbuf,buf,' '); + strcpy(TxColor,buf); + fixnone(TxColor); + return; + } + } + + if(strstr(buf,"text_bgcolor") != 0) { + getword(wbuf,buf,' '); + strcpy(TxBgColor,buf); + fixnone(TxBgColor); + return; + } + + if(strstr(buf,"title_color") != 0) { + getword(wbuf,buf,' '); + strcpy(TiColor,buf); + fixnone(TiColor); + return; + } + + if(strstr(buf,"logo_image") != 0) { + getword(wbuf,buf,' '); + strcpy(LogoImage,buf); + fixnone(LogoImage); + return; + } + + if(strstr(buf,"logo_text") != 0) { + if(strstr(buf,"logo_text_color") == 0) { + getword(wbuf,buf,'"'); + getword(LogoText,buf,'"'); + fixnone(LogoText); + return; + } + } + + if(strstr(buf,"logo_text_color") != 0) { + getword(wbuf,buf,' '); + strcpy(LogoTextColor,buf); + fixnone(LogoTextColor); + return; + } + + if(strstr(buf,"background_image") != 0) { + getword(wbuf,buf,' '); + strcpy(BgImage,buf); + fixnone(BgImage); + return; + } + + if(strstr(buf,"show_sarg_info") != 0) { + getword(wbuf,buf,' '); + strcpy(ShowSargInfo,buf); + fixnone(ShowSargInfo); + return; + } + + if(strstr(buf,"show_sarg_logo") != 0) { + getword(wbuf,buf,' '); + strcpy(ShowSargLogo,buf); + fixnone(ShowSargLogo); + return; + } + + if(strstr(buf,"font_face") != 0) { + getword(wbuf,buf,' '); + strcpy(FontFace,buf); + fixnone(FontFace); + return; + } + + if(strstr(buf,"header_color") != 0) { + getword(wbuf,buf,' '); + strcpy(HeaderColor,buf); + fixnone(HeaderColor); + return; + } + + if(strstr(buf,"header_bgcolor") != 0) { + getword(wbuf,buf,' '); + strcpy(HeaderBgColor,buf); + fixnone(HeaderBgColor); + return; + } + + if(strstr(buf,"font_size") != 0) { + if(strstr(buf,"header_font_size") == 0 && strstr(buf,"title_font_size") == 0) { + getword(wbuf,buf,' '); + strcpy(FontSize,buf); + fixnone(FontSize); + return; + } + } + + if(strstr(buf,"header_font_size") != 0) { + getword(wbuf,buf,' '); + strcpy(HeaderFontSize,buf); + fixnone(HeaderFontSize); + return; + } + + if(strstr(buf,"title_font_size") != 0) { + getword(wbuf,buf,' '); + strcpy(TitleFontSize,buf); + fixnone(TitleFontSize); + return; + } + + if(strstr(buf,"image_size") != 0) { + getword(wbuf,buf,' '); + getword(Width,buf,' '); + strcpy(Height,buf); + fixnone(Width); + fixnone(Height); + return; + } + + if(strstr(buf,"title") != 0) { + getword(wbuf,buf,'"'); + getword(Title,buf,'"'); + fixnone(Title); + return; + } + + if(strstr(buf,"resolve_ip") != 0) { + getword(wbuf,buf,' '); + strcpy(Ip2Name,buf); + fixnone(Ip2Name); + return; + } + + if(strstr(buf,"user_ip") != 0) { + getword(wbuf,buf,' '); + strcpy(UserIp,buf); + fixnone(UserIp); + return; + } + + if(strstr(buf,"max_elapsed") != 0) { + getword(wbuf,buf,' '); + strcpy(MaxElapsed,buf); + fixnone(MaxElapsed); + return; + } + + if(strstr(buf,"date_format") != 0) { + getword(wbuf,buf,' '); + strcpy(DateFormat,buf); + fixnone(DateFormat); + return; + } + + if( strstr( buf, "hours" ) != 0 ) { + if( getnumlist( buf, &hours, 24, 24 ) ) { + fprintf( stderr, "Error: Invalid syntax in hours tag!\n" ); + exit( 1 ); + } + } + + if( strstr( buf, "weekdays" ) != 0 ) { + if( getnumlist( buf, &weekdays, 7, 7 ) ) { + fprintf( stderr, "Error: Invalid syntax in weekdays tag!\n" ); + exit( 1 ); + } + } + + if(strstr(buf,"topuser_sort_field") != 0) { + getword(wbuf,buf,' '); + getword(TopuserSortField,buf,' '); + strcpy(TopuserSortOrder,buf); + fixnone(TopuserSortOrder); + return; + } + + if(strstr(buf,"user_sort_field") != 0) { + getword(wbuf,buf,' '); + getword(UserSortField,buf,' '); + strcpy(UserSortOrder,buf); + fixnone(UserSortOrder); + return; + } + + if(strstr(buf,"access_log") != 0) { + getword(wbuf,buf,' '); + strcpy(AccessLog,buf); + fixnone(AccessLog); + return; + } + + if(strstr(buf,"useragent_log") != 0) { + getword(wbuf,buf,' '); + strcpy(UserAgentLog,buf); + fixnone(UserAgentLog); + return; + } + + if(strstr(buf,"exclude_hosts") != 0) { + getword(wbuf,buf,' '); + strcpy(ExcludeHosts,buf); + fixnone(ExcludeHosts); + return; + } + + if(strstr(buf,"exclude_codes") != 0) { + getword(wbuf,buf,' '); + strcpy(ExcludeCodes,buf); + fixnone(ExcludeCodes); + return; + } + + if(strstr(buf,"exclude_users") != 0) { + getword(wbuf,buf,' '); + strcpy(ExcludeUsers,buf); + fixnone(ExcludeUsers); + return; + } + + if(strstr(buf,"password") != 0) { + getword(wbuf,buf,' '); + strcpy(PasswdFile,buf); + fixnone(PasswdFile); + return; + } + + if(strstr(buf,"temporary_dir") != 0) { + getword(wbuf,buf,' '); + strcpy(TempDir,buf); + fixnone(TempDir); + return; + } + + if(strstr(buf,"report_type") != 0) { + getword(wbuf,buf,' '); + strcpy(ReportType,buf); + fixnone(ReportType); + return; + } + + if(strstr(buf,"output_dir") != 0) { + if(strstr(buf,"output_dir_form") == 0) { + getword(wbuf,buf,' '); + strcpy(OutputDir,buf); + fixnone(OutputDir); + return; + } + } + + if(strstr(buf,"output_email") != 0) { + getword(wbuf,buf,' '); + strcpy(OutputEmail,buf); + fixnone(OutputEmail); + return; + } + + if(strstr(buf,"per_user_limit") != 0) { + getword(wbuf,buf,' '); + getword(PerUserLimitFile,buf,' '); + strcpy(PerUserLimit,buf); + fixnone(PerUserLimitFile); + fixnone(PerUserLimit); + return; + } + + + if(strstr(buf,"lastlog") != 0) { + getword(wbuf,buf,' '); + strcpy(LastLog,buf); + fixnone(LastLog); + return; + } + + if(strstr(buf,"remove_temp_files") != 0) { + getword(wbuf,buf,' '); + strcpy(RemoveTempFiles,buf); + fixnone(RemoveTempFiles); + return; + } + + if(strstr(buf,"replace_index") != 0) { + getword(wbuf,buf,' '); + strcpy(ReplaceIndex,buf); + fixnone(ReplaceIndex); + return; + } + + if(strstr(buf,"index") != 0) { + if(strstr(buf,"index_sort_order") == 0) { + getword(wbuf,buf,' '); + strcpy(Index,buf); + fixnone(Index); + return; + } + } + + if(strstr(buf,"overwrite_report") != 0) { + getword(wbuf,buf,' '); + strcpy(OverwriteReport,buf); + fixnone(OverwriteReport); + return; + } + + if(strstr(buf,"records_without_userid") != 0) { + getword(wbuf,buf,' '); + strcpy(RecordsWithoutUser,buf); + fixnone(RecordsWithoutUser); + return; + } + + if(strstr(buf,"use_comma") != 0) { + getword(wbuf,buf,' '); + strcpy(UseComma,buf); + fixnone(UseComma); + return; + } + + if(strstr(buf,"mail_utility") != 0) { + getword(wbuf,buf,' '); + strcpy(MailUtility,buf); + fixnone(MailUtility); + return; + } + + if(strstr(buf,"topsites_num") != 0) { + getword(wbuf,buf,' '); + strcpy(TopSitesNum,buf); + fixnone(TopSitesNum); + return; + } + + if(strstr(buf,"topuser_num") != 0) { + getword(wbuf,buf,' '); + strcpy(TopUsersNum,buf); + fixnone(TopUsersNum); + return; + } + + if(strstr(buf,"usertab") != 0) { + getword(wbuf,buf,' '); + strcpy(UserTabFile,buf); + fixnone(UserTabFile); + return; + } + + if(strstr(buf,"index_sort_order") != 0) { + getword(wbuf,buf,' '); + strcpy(IndexSortOrder,buf); + fixnone(IndexSortOrder); + return; + } + + if(strstr(buf,"topsites_sort_order") != 0) { + getword(wbuf,buf,' '); + getword(TopsitesSortField,buf,' '); + strcpy(TopsitesSortType,buf); + fixnone(TopsitesSortField); + fixnone(TopsitesSortType); + return; + } + + if(strstr(buf,"long_url") != 0) { + getword(wbuf,buf,' '); + strcpy(LongUrl,buf); + fixnone(LongUrl); + return; + } + + if(strstr(buf,"language") != 0) { + getword(wbuf,buf,' '); + strcpy(language,buf); + fixnone(language); + return; + } + + if(strstr(buf,"dansguardian_conf") != 0) { + getword(wbuf,buf,' '); + strcpy(DansGuardianConf,buf); + fixnone(DansGuardianConf); + return; + } + + if(strstr(buf,"squidguard_conf") != 0) { + getword(wbuf,buf,' '); + strcpy(SquidGuardConf,buf); + fixnone(SquidGuardConf); + return; + } + + if(strstr(buf,"date_time_by") != 0) { + getword(wbuf,buf,' '); + strcpy(datetimeby,buf); + fixnone(datetimeby); + return; + } + + if(strstr(buf,"charset") != 0) { + getword(wbuf,buf,' '); + strcpy(CharSet,buf); + fixnone(CharSet); + ccharset(CharSet); + return; + } + + if(strstr(buf,"user_invalid_char") != 0) { + getword(wbuf,buf,'"'); + getword(UserInvalidChar,buf,'"'); + fixnone(UserInvalidChar); + return; + } + + if(strstr(buf,"include_users") != 0) { + getword(wbuf,buf,'"'); + getword(wbuf,buf,'"'); + sprintf(IncludeUsers,":%s:",wbuf); + fixnone(IncludeUsers); + return; + } + + if(strstr(buf,"exclude_string") != 0) { + getword(wbuf,buf,'"'); + getword(ExcludeString,buf,'"'); + fixnone(ExcludeString); + return; + } + + if(strstr(buf,"privacy") != 0) { + if(strstr(buf,"privacy_string") == 0 && \ + strstr(buf,"privacy_string_color") == 0) { + getword(wbuf,buf,' '); + strcpy(Privacy,buf); + fixnone(Privacy); + return; + } + } + + if(strstr(buf,"privacy_string") != 0) { + if(strstr(buf,"privacy_string_color") == 0) { + getword(wbuf,buf,'"'); + getword(PrivacyString,buf,'"'); + fixnone(PrivacyString); + return; + } + } + + if(strstr(buf,"privacy_string_color") != 0) { + getword(wbuf,buf,' '); + strcpy(PrivacyStringColor,buf); + fixnone(PrivacyStringColor); + return; + } + + if(strstr(buf,"show_successful_message") != 0) { + getword(wbuf,buf,' '); + strcpy(SuccessfulMsg,buf); + fixnone(SuccessfulMsg); + return; + } + + if(strstr(buf,"show_read_statistics") != 0) { + getword(wbuf,buf,' '); + strcpy(ShowReadStatistics,buf); + fixnone(ShowReadStatistics); + return; + } + + if(strstr(buf,"topuser_fields") != 0) { + getword(wbuf,buf,' '); + strcpy(TopUserFields,buf); + fixnone(TopUserFields); + return; + } + + if(strstr(buf,"user_report_fields") != 0) { + getword(wbuf,buf,' '); + strcpy(UserReportFields,buf); + fixnone(UserReportFields); + return; + } + + if(strstr(buf,"site_user_time_date_type") != 0) { + getword(wbuf,buf,' '); + strcpy(SiteUserTimeDateType,buf); + fixnone(SiteUserTimeDateType); + return; + } + + if(strstr(buf,"datafile ") != 0) { + getword(wbuf,buf,' '); + strcpy(DataFile,buf); + fixnone(DataFile); + return; + } + + if(strstr(buf,"datafile_delimiter") != 0) { + getword(wbuf,buf,' '); + getword(wbuf,buf,'"'); + getword(DataFileDelimiter,buf,'"'); + fixnone(DataFileDelimiter); + return; + } + + if(strstr(buf,"datafile_fields") != 0) { + getword(wbuf,buf,' '); + strcpy(DataFileFields,buf); + fixnone(DataFileFields); + return; + } + + if(strstr(buf,"parsed_output_log") != 0) { + if(strstr(buf,"parsed_output_log_compress") == 0) { + getword(wbuf,buf,' '); + strcpy(ParsedOutputLog,buf); + fixnone(ParsedOutputLog); + return; + } + } + + if(strstr(buf,"parsed_output_log_compress") != 0) { + getword(wbuf,buf,' '); + strcpy(ParsedOutputLogCompress,buf); + fixnone(ParsedOutputLogCompress); + return; + } + + if(strstr(buf,"displayed_values") != 0) { + getword(wbuf,buf,' '); + strcpy(DisplayedValues,buf); + fixnone(DisplayedValues); + return; + } + + if(strstr(buf,"authfail_report_limit") != 0) { + getword(wbuf,buf,' '); + AuthfailReportLimit=atoi(buf); + return; + } + + if(strstr(buf,"denied_report_limit") != 0) { + getword(wbuf,buf,' '); + DeniedReportLimit=atoi(buf); + return; + } + + if(strstr(buf,"siteusers_report_limit") != 0) { + getword(wbuf,buf,' '); + SiteUsersReportLimit=atoi(buf); + return; + } + + if(strstr(buf,"dansguardian_report_limit") != 0) { + getword(wbuf,buf,' '); + DansGuardianReportLimit=atoi(buf); + return; + } + + if(strstr(buf,"squidguard_report_limit") != 0) { + getword(wbuf,buf,' '); + SquidGuardReportLimit=atoi(buf); + return; + } + + if(strstr(buf,"user_report_limit") != 0) { + getword(wbuf,buf,' '); + UserReportLimit=atoi(buf); + return; + } + + if(strstr(buf,"www_document_root") != 0) { + getword(wbuf,buf,' '); + strcpy(wwwDocumentRoot,buf); + fixnone(wwwDocumentRoot); + return; + } + + if(strstr(buf,"block_it") != 0) { + getword(wbuf,buf,' '); + strcpy(BlockIt,buf); + fixnone(BlockIt); + return; + } + + if(strstr(buf,"external_css_file") != 0) { + getword(wbuf,buf,' '); + strcpy(ExternalCSSFile,buf); + fixnone(ExternalCSSFile); + return; + } + + if(strstr(buf,"user_authentication") != 0) { + getword(wbuf,buf,' '); + strcpy(UserAuthentication,buf); + fixnone(UserAuthentication); + return; + } + + if(strstr(buf,"AuthUserFile") != 0) { + getword(wbuf,buf,' '); + strcpy(AuthUserFile,buf); + fixnone(AuthUserFile); + return; + } + + if(strstr(buf,"AuthName") != 0) { + getword(wbuf,buf,' '); + strcpy(AuthName,buf); + fixnone(AuthName); + return; + } + + if(strstr(buf,"AuthType") != 0) { + getword(wbuf,buf,' '); + strcpy(AuthType,buf); + fixnone(AuthType); + return; + } + + if(strstr(buf,"Require") != 0) { + getword(wbuf,buf,' '); + strcpy(Require,buf); + fixnone(Require); + return; + } + + if(strstr(buf,"download_suffix") != 0) { + getword(wbuf,buf,'"'); + getword(DownloadSuffix,buf,'"'); + fixnone(DownloadSuffix); + return; + } + + if(strstr(buf,"graphs") != 0) { + getword(wbuf,buf,' '); + strcpy(Graphs,buf); + fixnone(Graphs); + return; + } + + if(strstr(buf,"graph_days_bytes_bar_color") != 0) { + getword(wbuf,buf,' '); + strcpy(GraphDaysBytesBarColor,buf); + fixnone(GraphDaysBytesBarColor); + return; + } + + if(strstr(buf,"squidguard_log_format") != 0) { + getword(wbuf,buf,' '); + strcpy(SquidGuardLogFormat,buf); + fixnone(SquidGuardLogFormat); + return; + } + + if(strstr(buf,"ulimit") != 0) { + getword(wbuf,buf,' '); + strcpy(Ulimit,buf); + fixnone(Ulimit); + return; + } + + if(strstr(buf,"ntlm_user_format") != 0) { + getword(wbuf,buf,' '); + strcpy(NtlmUserFormat,buf); + fixnone(NtlmUserFormat); + return; + } + + return; +} diff --git a/grepday.c b/grepday.c new file mode 100644 index 0000000..bb5dfaf --- /dev/null +++ b/grepday.c @@ -0,0 +1,455 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +int blue; +int white; +int lavender; +int darkblue; +int dimgray; +int goldenrod; +int goldenrod2; +int gray; +int silver; +int black; +int x1; +char *font1 = SYSCONFDIR"/fonts/FreeSans.ttf"; +char s[15]; + +#ifdef HAVE_ICONV_H +#include +#define SARGgdImageStringFT I18NgdImageStringFT + +BGD_DECLARE(char *) I18NgdImageStringFT (gdImage * im, int *brect, int fg, char *fontlist, + double ptsize, double angle, int x, int y, + char *string) +{ + iconv_t localtoutf; + char *sstring, *str, *sstr, *retval; + size_t slen, sslen; + + slen = strlen(string) + 1; // We must include string termination character + sslen = slen * 2; // We assume that UTF8 maximum 2 times large than local + sstring = (char *)malloc(sslen); + + str = (char *) string; + sstr = (char *) sstring; + + localtoutf = iconv_open ("UTF-8", CharSet); + iconv (localtoutf, &str, &slen, &sstr, &sslen); + iconv_close (localtoutf); + + retval = gdImageStringFTEx (im, brect, fg, fontlist, ptsize, angle, x, y, sstring, gdFTEX_Unicode); + free(sstring); + + return retval; +} +#else +#define SARGgdImageStringFT gdImageStringFT +#endif + +void *bar(long long int *n) +{ +#ifdef HAVE_GD + gdPoint points[4]; + int brect[8]; + int val=0, x; + float f=0; + long long int lim, num; + char v[15]; + + static char limits[400][12]={"0","500","1000","2000","3000","4000", + "5000","6000","7000","8000","9000","10000", + "20000","30000","40000","50000","70000","90000", + "110000","130000","150000","170000","190000","210000", + "230000","250000","280000","310000","340000","370000", + "400000","430000","450000","460000","490000","500000", + "550000","600000","650000","700000","750000","800000", + "850000","900000","950000","1000000","1100000","1200000", + "1300000","1400000","1500000","1600000","1700000","1800000", + "1900000","2000000","2100000","2200000","2300000","2400000", + "2500000","2600000","2700000","2800000","2900000","3000000", + "3100000","3200000","3300000","3400000","3500000","3600000", + "3700000","3800000","3900000","4000000","4100000","4200000", + "4300000","4400000","4500000","4600000","4700000","4800000", + "4900000","5000000","5100000","5200000","5300000","5400000", + "5500000","5600000","5700000","5800000","5900000","6000000", + "6100000","6200000","6300000","6400000","6500000","6600000", + "6700000","6800000","6900000","7000000","7100000","7200000", + "7300000","7400000","7500000","7600000","7700000","7800000", + "7900000","8000000","8100000","8200000","8300000","8400000", + "8500000","8600000","8700000","8800000","8900000","9000000", + "9100000","9200000","9300000","9400000","9500000","9600000", + "9700000","9800000","9900000","10000000","10500000","11000000", + "11500000","12000000","12500000","13000000","13500000","14000000", + "14500000","15000000","15500000","16000000","16500000","17000000", + "17500000","18000000","18500000","19000000","19500000","20000000", + "21000000","22000000","23000000","24000000","25000000","26000000", + "27000000","28000000","29000000","30000000","31000000","32000000", + "33000000","34000000","35000000","36000000","37000000","38000000", + "39000000","40000000","41000000","42000000","43000000","44000000", + "45000000","46000000","47000000","48000000","49000000","50000000", + "51000000","52000000","53000000","54000000","55000000","56000000", + "57000000","58000000","59000000","60000000","61000000","62000000", + "63000000","64000000","65000000","66000000","67000000","68000000", + "69000000","70000000","71000000","72000000","73000000","74000000", + "75000000","76000000","77000000","78000000","79000000","80000000", + "81000000","82000000","83000000","84000000","85000000","86000000", + "87000000","88000000","89000000","90000000","91000000","92000000", + "93000000","94000000","95000000","96000000","97000000","98000000", + "99000000","100000000","110000000","120000000","130000000","140000000", + "150000000","160000000","170000000","180000000","190000000","200000000", + "210000000","220000000","230000000","240000000","250000000","260000000", + "270000000","280000000","290000000","300000000","310000000","320000000", + "330000000","340000000","350000000","360000000","370000000","380000000", + "390000000","400000000","410000000","420000000","430000000","440000000", + "450000000","460000000","470000000","480000000","490000000","500000000", + "510000000","520000000","530000000","540000000","550000000","560000000", + "570000000","580000000","590000000","600000000","610000000","620000000", + "630000000","640000000","650000000","660000000","670000000","680000000", + "690000000","700000000","710000000","720000000","730000000","740000000", + "750000000","760000000","770000000","780000000","790000000","800000000", + "810000000","820000000","830000000","840000000","850000000","860000000", + "870000000","880000000","890000000","900000000","910000000","920000000", + "930000000","940000000","950000000","960000000","970000000","980000000", + "990000000","1000000000","1100000000","1200000000","1300000000","1400000000", + "1500000000","1600000000","1700000000","1800000000","1900000000","2000000000", + "2100000000","2200000000","2300000000","2400000000","2500000000","2600000000", + "2700000000","2800000000","2900000000","3000000000","3100000000","3200000000", + "3300000000","3400000000","3500000000","3600000000","3700000000","3800000000", + "3900000000","4000000000","4100000000","4200000000","4300000000","4400000000", + "4500000000","4600000000","4700000000","4800000000","4900000000","5000000000"}; + + if(access(font1, R_OK) != 0) { + fprintf(stderr, "SARG: (grepday) Fontname: %s not found.\n",font1); + exit(1); + } + + if(strcmp(GraphDaysBytesBarColor,"orange") == 0) { + color1 = gdImageColorAllocate(im, 255, 233, 142); + color2 = gdImageColorAllocate(im, 220, 163, 72); + color3 = gdImageColorAllocate(im, 255, 198, 107); + } + if(strcmp(GraphDaysBytesBarColor,"blue") == 0) { + color1 = gdImageColorAllocate(im, 62, 80, 167); + color2 = gdImageColorAllocate(im, 40, 51, 101); + color3 = gdImageColorAllocate(im, 57, 73, 150); + } + if(strcmp(GraphDaysBytesBarColor,"green") == 0) { + color1 = gdImageColorAllocate(im,120,166,129); + color2 = gdImageColorAllocate(im,84,113,82); + color3 = gdImageColorAllocate(im,158,223,167); + } + if(strcmp(GraphDaysBytesBarColor,"yellow") == 0) { + color1 = gdImageColorAllocate(im,185,185,10); + color2 = gdImageColorAllocate(im,111,111,10); + color3 = gdImageColorAllocate(im,166,166,10); + } + if(strcmp(GraphDaysBytesBarColor,"brown") == 0) { + color1 = gdImageColorAllocate(im,97,45,27); + color2 = gdImageColorAllocate(im,60,30,20); + color3 = gdImageColorAllocate(im,88,41,26); + } + if(strcmp(GraphDaysBytesBarColor,"red") == 0){ + color1 = gdImageColorAllocate(im,185,10,10); + color2 = gdImageColorAllocate(im,111,10,10); + color3 = gdImageColorAllocate(im,166,10,10); + } + + blue = gdImageColorAllocate(im, 0, 0, 255); + white = gdImageColorAllocate(im, 255, 255, 255); + dimgray = gdImageColorAllocate(im, 105, 105, 105); + goldenrod = gdImageColorAllocate(im, 234, 234, 174); + goldenrod2 = gdImageColorAllocate(im, 207, 181, 59); + + num = n; + for(x=0; x<=366; x++) { + lim = my_atoll(limits[x]); + if(lim >= num) { + val = 425 - x; + break; + } + } + if(x>366) val = 55; + + gdImageFilledRectangle(im, x1, val, x1+11, 425, color3); + + points[0].x = x1+7; + points[0].y = val-5; + points[1].x = x1; + points[1].y = val; + points[2].x = x1+11; + points[2].y = val; + points[3].x = x1+17; + points[3].y = val-5; + gdImageFilledPolygon(im, points, 4, color1); + + gdImageLine(im, x1+8, val-2, x1+8, val-10, dimgray); + gdImageFilledRectangle(im, x1-2, val-20, x1+18, val-10, goldenrod); + gdImageRectangle(im, x1-2, val-20, x1+18, val-10, goldenrod2); + + snprintf(v,6,"%s",fixnum(num,0)); + + SARGgdImageStringFT(im,&brect[0],black,font1,6,0.0,x1-1,val-12,v); + + points[0].x = x1+17; + points[0].y = val-5; + points[1].x = x1+11; + points[1].y = val; + points[2].x = x1+11; + points[2].y = 426; + points[3].x = x1+17; + points[3].y = 420; + gdImageFilledPolygon(im, points, 4, color2); + +#endif + return; +} + +void greport_day(char *user, int *iprel, int *ipuser) +{ + FILE *fp_in, *pngout; + int x, y, z; + int brect[8]; + char wdirname[MAXLEN]; + char graph[MAXLEN]; + char wuser[255]; + char csort[255]; + char data[20]; + int count=0; + char oday[20]; + char day[20]; + char bytes[20]; + long long int tot; + time_t t; + struct tm *local; +#ifdef HAVE_GD + + if(strcmp(Graphs,"yes") != 0) { + unlink(wdirname); + return; + } + + im = gdImageCreate(720, 480); + + lavender = gdImageColorAllocate(im, 230, 230, 250); + white = gdImageColorAllocate(im, 255, 255, 255); + gray = gdImageColorAllocate(im, 192, 192, 192); + silver = gdImageColorAllocate(im, 211, 211, 211); + black = gdImageColorAllocate(im, 0, 0, 0); + blue = gdImageColorAllocate(im, 35, 35, 227); + dimgray = gdImageColorAllocate(im, 105, 105, 105); + darkblue = gdImageColorAllocate(im, 0, 0, 139); + + gdImageRectangle(im, 0, 0, 719, 479, dimgray); + gdImageFilledRectangle(im, 60, 60, 700, 420, silver); + + points[0].x = 50; + points[0].y = 65; + points[1].x = 50; + points[1].y = 425; + points[2].x = 60; + points[2].y = 420; + points[3].x = 60; + points[3].y = 60; + gdImageFilledPolygon(im, points, 4, gray); + + points[0].x = 60; + points[0].y = 420; + points[1].x = 50; + points[1].y = 425; + points[2].x = 690; + points[2].y = 425; + points[3].x = 700; + points[3].y = 420; + gdImageFilledPolygon(im, points, 4, gray); + + gdImageLine(im, 50, 65, 50, 430, black); + gdImageLine(im, 45, 425, 690, 425, black); + gdImageLine(im, 50, 425, 60, 420, black); + gdImageLine(im, 60, 420, 60, 60, black); + gdImageLine(im, 700, 60, 700, 420, black); + gdImageLine(im, 690, 425, 700, 420, black); + + for(x=415; x>=65; x=x-10) { + gdImageLine(im, 50, x, 60, x-5, dimgray); + gdImageLine(im, 47, x, 50, x, dimgray); + } + + for(x=60; x<=420; x=x+10) + gdImageLine(im, 60, x, 700, x, dimgray); + + gdImageLine(im, 60, 420, 700, 420, black); + + for(x=70; x<=680; x=x+20) + gdImageLine(im, x, 425, x, 428, dimgray); + + y=65; + for(x=1; x<=31; x++) { + sprintf(s,"%02d",x); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,y,437,s); + y=y+20; + } + + t = time(NULL); + local = localtime(&t); + if(strcmp(DateFormat,"u") == 0) + strftime(ftime, 127, "%b/%d/%Y %H:%M", local); + if(strcmp(DateFormat,"e") == 0) + strftime(ftime, 127, "%d/%b/%Y-%H:%M", local); + + SARGgdImageStringFT(im,&brect[0],darkblue,font1,7,0.0,620,470,ftime); + if(strcmp(ShowSargInfo,"yes") == 0) SARGgdImageStringFT(im,&brect[0],darkblue,font1,10,0.0,257,15,"SARG, "); + SARGgdImageStringFT(im,&brect[0],darkblue,font1,10,0.0,300,15,Title); + sprintf(warea,"%s: %s",text[89],periodo); + SARGgdImageStringFT(im,&brect[0],darkblue,font1,9,0.0,300,27,warea); + sprintf(warea,"%s: %s",text[90],name); + SARGgdImageStringFT(im,&brect[0],darkblue,font1,9,0.0,300,38,warea); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,418," 50K"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,408,"250K"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,398,"500K"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,388," 1M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,378," 2M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,368," 3M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,358," 4M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,348," 5M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,338," 6M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,328," 7M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,318," 8M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,308," 9M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,298," 10M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,288," 15M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,278," 20M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,268," 30M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,258," 40M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,248," 50M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,238," 60M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,228," 70M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,218," 80M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,208," 90M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,198,"100M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,188,"200M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,178,"300M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,168,"400M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,158,"500M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,148,"600M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,138,"700M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,128,"800M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,118,"900M"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,108," 1G"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23, 98," 2G"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23, 88," 3G"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23, 78," 4G"); + SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23, 68," 5G"); + SARGgdImageStringFT(im,&brect[0],black,font1,10,3.14/2,20,248,text[93]); + SARGgdImageStringFT(im,&brect[0],black,font1,10,0.0,330,460,text[127]); + + sprintf(graph,"%s/%s/graph_day.png",dirname,user); + sprintf(wdirname,"%s/%s.day",tmp,user); + sprintf(tmp5,"%s/%s.graph",tmp,user); + + if(access(wdirname, R_OK) != 0) + return; + + sprintf(csort,"sort -t'/' -k 2,2 -o %s %s",tmp5,wdirname); + if(strcmp(DateFormat,"e") == 0) + sprintf(csort,"sort -t'/' -k 1,1 -o %s %s",tmp5,wdirname); + + system(csort); + + if((fp_in=fopen(tmp5,"r"))==NULL) { + fprintf(stderr, "SARG: (grepday) %s: %s\n",text[8],tmp5); + exit(1); + } + + if((pngout=fopen(graph,"wb"))==NULL) { + fprintf(stderr, "SARG: (grepday) %s: %s\n",text[8],graph); + exit(1); + } + + strcpy(wuser,user); + if(strstr(wuser,"_") != 0) + fixip(wuser); + + if(strcmp(Ip2Name,"yes") == 0) + if((str=(char *) strstr(name, ".")) != (char *) NULL) { + if((str=(char *) strstr(str+1, ".")) != (char *) NULL) + ip2name(wuser); + } + + if(UserTabFile[0] != '\0') { + sprintf(warea,":%s:",wuser); + if((str=(char *) strstr(userfile,warea)) != (char *) NULL ) { + z1=0; + str2=(char *) strstr(str+1,":"); + str2++; + bzero(name, MAXLEN); + while(str2[z1] != ':') { + name[z1]=str2[z1]; + z1++; + } + } else strcpy(name,wuser); + } else strcpy(name,user); + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(data,buf,' '); + getword(day,data,'/'); + if(strcmp(DateFormat,"u") == 0) + getword(day,data,'/'); + if(!count) { + strcpy(oday,day); + count++; + } + getword(bytes,buf,' '); + getword(bytes,buf,' '); + bytes[strlen(bytes)-1]='\0'; + + if(strcmp(oday,day) != 0) { + strcpy(warea,oday); + x1 = 44 +(atoi(oday) * 20); + bar(tot); + strcpy(oday,day); + tot=0; + } else + tot=tot+my_atoll(bytes); + } + + if(tot) { + x1 = 44 +(atoi(day) * 20); + bar(tot); + } + + gdImagePng(im, pngout); + fclose(pngout); + gdImageDestroy(im); + + fclose(fp_in); + unlink(wdirname); + unlink(tmp5); + +#endif + return; +} diff --git a/htaccess b/htaccess new file mode 100644 index 0000000..4bfefc1 --- /dev/null +++ b/htaccess @@ -0,0 +1,6 @@ +AuthUserFile /usr/local/sarg/passwd +AuthName "SARG, Squid Analysis Report Generator" +AuthType Basic + +require user admin %u + diff --git a/html.c b/html.c new file mode 100644 index 0000000..18b8dff --- /dev/null +++ b/html.c @@ -0,0 +1,718 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void htmlrel() +{ + DIR *dirp; + FILE *fp_in, *fp_ou, *fp_ip, *fp_ip2, *fp_usr, *fp_tt; + + struct dirent *direntp; + long long int nnbytes=0, unbytes=0, tnbytes=0, totbytes=0, totbytes2=0; + long long int totelap=0, totelap2=0, nnelap=0, unelap=0, tnelap=0; + long long int incache=0, oucache=0, tnincache=0, tnoucache=0, twork=0, twork2=0; + char arqin[MAXLEN], arqou[MAXLEN], arqper[MAXLEN], arqip[MAXLEN]; + char nacc[20], nbytes[20], url[1024], purl[1024], tmsg[30], tmsg2[30], nelap[20], csort[MAXLEN]; + char periodo[MAXLEN], usuario[MAXLEN], wusuario[MAXLEN], u2[MAXLEN], duser[MAXLEN]; + char userbytes[20], userelap[20], userurl[1024], userhora[9], userdia[9]; + char user_ip[MAXLEN], olduserip[MAXLEN], tmp2[MAXLEN], tmp3[MAXLEN], incac[20], oucac[20]; + char denied_report[255]; + char ttd1[3], ttd2[3], ttd3[5], ttt1[3], ttt2[3], ttt3[3]; + char *str; + char ftime[128], warea[MAXLEN]; + char wtemp[MAXLEN], totuser[8]; + long long int tnacc=0, ttnacc=0, unacc=0; + float perc=0, perc2=0, ouperc=0, inperc=0; + char *s; + int x, count; + + if(indexonly) return; + if(strstr(ReportType,"users_sites") == 0) return; + + strcpy(tmp2,TempDir); + strcat(tmp2,"/sargtmp.unsort"); + + strcpy(tmp3,TempDir); + strcat(tmp3,"/sargtmp.log"); + + strcpy(arqper,dirname); + strcat(arqper,"/periodo"); + + if ((fp_in = fopen(arqper, "r")) == 0){ + fprintf(stderr, "SARG: (html1) %s: %s\n",text[45],arqper); + exit(1); + } + + fgets(periodo,sizeof(periodo),fp_in); + fclose(fp_in); + + strcpy(arqper,dirname); + strcat(arqper,"/geral"); + + if ((fp_in = fopen(arqper, "r")) == 0){ + fprintf(stderr, "SARG: (html2) %s: %s\n",text[45],arqper); + exit(1); + } + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + if(strstr(buf,"TOTAL") == 0) { + getword(wtemp,buf,' '); + ttnacc+=my_atoll(buf); + getword(wtemp,buf,' '); + getword(wtemp,buf,' '); + totbytes+=my_atoll(wtemp); + getword(wtemp,buf,' '); + getword(wtemp,buf,' '); + getword(wtemp,buf,' '); + getword(wtemp,buf,' '); + getword(wtemp,buf,' '); + totelap+=my_atoll(wtemp); + } + } + + fclose(fp_in); + + dirp = opendir(tmp); + while ( (direntp = readdir( dirp )) != NULL ) { + if(strstr(direntp->d_name,".txt") == 0) + continue; + + count=1; + strcpy(usuario,direntp->d_name); + wusuario[0]='\0'; + + striptxt: + getword(warea,usuario,'.'); + strcpy(denied_report,warea); + strcat(wusuario,warea); + + if(strcmp(usuario,"txt") !=0) { + strcat(wusuario,"."); + goto striptxt; + } + + sprintf(warea,"%s/%s",dirname,wusuario); + mkdir(warea,0755); + + report_day(wusuario, iprel, userip); + greport_day(wusuario, iprel, userip); + + strcpy(usuario,wusuario); + strcpy(arqin,tmp); + strcat(arqin,"/"); + strcpy(arqou,dirname); + strcat(arqou,"/"); + strcat(arqou,usuario); + strcat(arqou,"/"); + strcat(arqou,usuario); + strcat(arqou,".html"); + strcpy(duser,arqin); + strcat(duser,"denied_"); + strcat(arqin,direntp->d_name); + + if((str=(char *) strstr(denied_report, "_")) != (char *) NULL ) { + if((str=(char *) strstr(str+1, "_")) != (char *) NULL ) + fixip(denied_report); + } + strcat(duser,denied_report); + strcat(duser,".html"); + if(access(duser, R_OK) != 0) + denied_report[0]='\0'; + + if ((fp_in = fopen(arqin, "r")) == 0){ + fprintf(stderr, "SARG: (html3) %s: %s\n",text[45],arqin); + exit(1); + } + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(wtemp,buf,' '); + tnacc+=my_atoll(wtemp); + getword(wtemp,buf,' '); + tnbytes+=my_atoll(wtemp); + getword(wtemp,buf,' '); + getword(wtemp,buf,' '); + getword(wtemp,buf,' '); + tnelap+=my_atoll(wtemp); + getword(wtemp,buf,' '); + tnincache+=my_atoll(wtemp); + getword(wtemp,buf,' '); + tnoucache+=my_atoll(wtemp); + } + + fclose(fp_in); + + if ((fp_in = fopen(arqin, "r")) == 0){ + fprintf(stderr, "SARG: (html4) %s: %s\n",text[45],arqin); + exit(1); + } + + if ((fp_ou = fopen(arqou, "w")) == 0){ + fprintf(stderr, "SARG: (html5) %s: %s\n",text[45],arqou); + exit(1); + } + + fputs("\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + sprintf(html," \n",CharSet); + fputs(html,fp_ou); + css(fp_ou); + fputs("\n",fp_ou); + + sprintf(buf,"\n",FontFace,TitleFontSize,BgColor,BgImage); + fputs(buf,fp_ou); + + if(strlen(LogoImage) > 0) { + fputs("

\n",fp_ou); + sprintf(html,"
%s\n",LogoImage,Width,Height,LogoTextColor,LogoText); + fputs(html,fp_ou); + fputs("
\n",fp_ou); + } + + show_sarg(fp_ou,"../.."); + fputs("
\n",fp_ou); + sprintf(html,"\n",Title); + fputs(html,fp_ou); + + strcpy(u2,usuario); + if(userip){ + strcpy(u2,usuario); + fixip(u2); + } + if(strcmp(Ip2Name,"yes") == 0) + ip2name(u2); + + if(UserTabFile[0] != '\0') { + sprintf(warea,":%s:",u2); + if((str=(char *) strstr(userfile,warea)) != (char *) NULL ) { + z1=0; + str2=(char *) strstr(str+1,":"); + str2++; + bzero(name, MAXLEN); + while(str2[z1] != ':') { + name[z1]=str2[z1]; + z1++; + } + } else strcpy(name,u2); + } else strcpy(name,u2); + + sprintf(html,"\n",text[89],periodo); + fputs(html,fp_ou); + sprintf(html,"\n",text[90],name); + fputs(html,fp_ou); + sprintf(html,"\n",text[104],UserSortField,UserSortOrder); + fputs(html,fp_ou); + sprintf(html,"\n",text[32],text[55]); + fputs(html,fp_ou); + fputs("\n",fp_ou); + + fputs("
%s
%s: %s
%s: %s
%s: %s, %s
%s %s
\n",fp_ou); + fputs("
\n",fp_ou); + + if(strlen(denied_report) > 0) { + sprintf(html,"\n",denied_report,text[116],text[55]); + fputs(html,fp_ou); + } + + strcpy(val3,text[92]); + strcpy(val4,text[93]); + sprintf(val11,"%%%s",text[93]); + sprintf(val5,"%s-%s-%s",text[113],text[114],text[112]); + strcpy(val6,text[94]); + strcpy(val7,text[95]); + sprintf(val8,"%%%s",text[99]); + strcpy(val9,"colspan=2"); + bzero(val10, 255); + + if(strstr(UserReportFields,"CONNECT") == 0) + bzero(val3, 255); + if(strstr(UserReportFields,"BYTES") == 0) + bzero(val4, 255); + if(strstr(UserReportFields,"SETYB") == 0) + bzero(val11, 255); + if(strstr(UserReportFields,"IN-CACHE-OUT") == 0) { + bzero(val5, 255); + bzero(val9, 255); + strcpy(val10,""); + } + if(strstr(UserReportFields,"USED_TIME") == 0) + bzero(val6, 255); + if(strstr(UserReportFields,"MILISEC") == 0) + bzero(val7, 255); + if(strstr(UserReportFields,"%TIME") == 0) + bzero(val8, 255); + + sprintf(html,"\n",text[91],val3,val4,val11,val9,val5,val6,val7,val8); + fputs(html,fp_ou); + + if(debug) { + if(userip) { + strcpy(u2,usuario); + fixip(u2); + sprintf(msg, "%s: %s",text[61],u2); + } else + sprintf(msg, "%s: %s",text[61],usuario); + debuga(msg); + } + + fscanf(fp_in,"%s",nacc); + fscanf(fp_in,"%s",nbytes); + fscanf(fp_in,"%s",url); + fscanf(fp_in,"%s",tmsg); + fscanf(fp_in,"%s",nelap); + fscanf(fp_in,"%s",incac); + fscanf(fp_in,"%s",oucac); + + while(!feof(fp_in)) { + if(strncmp(tmsg,"OK",2) != 0) + sprintf(tmsg,"",text[46]); + else bzero(tmsg, 50); + + nnbytes=my_atoll(nbytes); + nnelap=my_atoll(nelap); + incache=my_atoll(incac); + oucache=my_atoll(oucac); + + if(nnbytes) { + perc=nnbytes * 100; + perc=perc / tnbytes; + } else { + perc=0; + ouperc=0; + } + + if(nnelap) { + perc2=nnelap * 100; + perc2=perc2 / tnelap; + } else perc2=0; + + if(incache) { + inperc=incache * 100; + inperc=inperc / nnbytes; + } else inperc=0; + + if(oucache) { + ouperc=oucache * 100; + ouperc=ouperc / nnbytes; + } else ouperc=0; + + twork=my_atoll(nacc); + sprintf(wwork1,"%s",fixnum(twork,1)); + sprintf(wwork2,"%s",fixnum(nnbytes,1)); + sprintf(wwork3,"%s",fixnum(nnelap,1)); + + if(strcmp(LongUrl,"yes") != 0) { + getword(warea,url,'/'); + sprintf(url,"%s",warea); + strcpy(urly,url); + } else { + strcpy(urly,url); + url_module(url, module); + getword(warea,url,'/'); + sprintf(url,"%s...%s",warea,module); + } + + if(strcmp(Privacy,"yes") == 0) + sprintf(httplink,"%s", \ + PrivacyStringColor,PrivacyString,PrivacyString); + else + if(strlen(BlockIt) > 0) + sprintf(httplink," %s",wwwDocumentRoot,BlockIt,urly,urly,urly); + else + sprintf(httplink,"%s",urly,urly,url); + + if(strstr(ReportType,"site_user_time_date") != 0) { + sprintf(ltext110,"%s",text[110]); + if(ltext110){ + for(s=ltext110; *s; ++s) + *s=tolower(*s); + } + strcpy(siteind,urly); + str=siteind; + for(z1=0; z1",usuario,siteind,ltext110,text[55]); + } else { + bzero(href2, MAXLEN); + bzero(ltext110, 50); + } + + sprintf(val2,"%s",href2); + sprintf(val3,"%3.2f%%",perc); + sprintf(val4,"%3.2f%%",inperc); + sprintf(val5,"%3.2f%%",ouperc); + sprintf(val6,"%s",buildtime(nnelap)); + sprintf(val7,"%3.2f%%",perc2); + + if(strstr(UserReportFields,"CONNECT") == 0) { + bzero(wwork1, 255); + bzero(hbc1, 30); + } + if(strstr(UserReportFields,"BYTES") == 0) { + bzero(wwork2, 255); + bzero(hbc2, 30); + } + if(strstr(UserReportFields,"MILISEC") == 0) { + bzero(wwork3, 255); + bzero(hbc3, 30); + } + if(strstr(UserReportFields,"SETYB") == 0) { + bzero(val3, 255); + bzero(hbc4, 30); + } + if(strstr(UserReportFields,"IN-CACHE-OUT") == 0) { + bzero(val4, 255); + bzero(val5, 255); + bzero(hbc5, 30); + bzero(hbc6, 30); + } + if(strstr(UserReportFields,"USED_TIME") == 0) { + bzero(val6, 255); + bzero(hbc7, 30); + } + if(strstr(UserReportFields,"%TIME") == 0) { + bzero(val7, 255); + bzero(hbc8, 30); + } + if(strncmp(tmsg," ",1) == 0) + bzero(hbc9, 30); + + sprintf(html,"%s\n",val2,httplink,wwork1,wwork2,val3,val4,val5,val6,wwork3,val7,tmsg); + + if(UserReportLimit) { + if(count <= UserReportLimit) { + fputs(html,fp_ou); + count++; + } + } else fputs(html,fp_ou); + + if(iprel) { + strcpy(arqip,tmp); + strcat(arqip,"/"); + strcat(arqip,usuario); + strcat(arqip,".ip"); + + if ((fp_ip = fopen(arqip, "r")) == 0){ + fprintf(stderr, "SARG: (html6) %s: %s\n",text[45],arqip); + exit(1); + } + + if ((fp_ip2 = fopen(tmp2, "a")) == 0){ + fprintf(stderr, "SARG: (html7) %s: %s\n",text[45],tmp2); + exit(1); + } + + while(fgets(buf,sizeof(buf),fp_ip)!=NULL) { + if(strstr(buf,url) != 0) + fputs(buf,fp_ip2); + } + + fclose(fp_ip); + fclose(fp_ip2); + + sprintf(csort,"sort -n -T %s -k 1,1 -k 5,5 -o %s %s",TempDir,tmp3,tmp2); + system(csort); + + if ((fp_ip = fopen(tmp3, "r")) == 0) { + fprintf(stderr, "SARG: (html8) %s: %s\n",text[45],tmp3); + exit(1); + } + + fscanf(fp_ip,"%s",user_ip); + fscanf(fp_ip,"%s",userurl); + fscanf(fp_ip,"%s",userdia); + fscanf(fp_ip,"%s",userhora); + fscanf(fp_ip,"%s",userbytes); + fscanf(fp_ip,"%s",userelap); + + strcpy(olduserip,user_ip); + + while(!feof(fp_ip)) { + if(strcmp(user_ip,olduserip) != 0) { + my_lltoa(unelap,val2,0); + sprintf(wwork1,"%s",fixnum(unbytes,1)); + sprintf(html,"\n",olduserip,wwork1,buildtime(unelap),val2); + fputs(html,fp_ou); + + strcpy(olduserip,user_ip); + unacc=0; + unbytes=0; + unelap=0; + } + + unbytes=unbytes+my_atoll(userbytes); + unelap=unelap+my_atoll(userelap); + + fscanf(fp_ip,"%s",user_ip); + fscanf(fp_ip,"%s",userurl); + fscanf(fp_ip,"%s",userdia); + fscanf(fp_ip,"%s",userhora); + fscanf(fp_ip,"%s",userbytes); + fscanf(fp_ip,"%s",userelap); + + } + + fclose(fp_ip); + + unlink(tmp2); + unlink(tmp3); + + my_lltoa(unelap,val3,0); + sprintf(wwork1,"%s",fixnum(unbytes,1)); + sprintf(html,"\n",olduserip,wwork1,buildtime(unelap),val3); + fputs(html,fp_ou); + } + + unacc=0; + unbytes=0; + unelap=0; + + fscanf(fp_in,"%s",nacc); + fscanf(fp_in,"%s",nbytes); + fscanf(fp_in,"%s",url); + fscanf(fp_in,"%s",tmsg); + fscanf(fp_in,"%s",nelap); + fscanf(fp_in,"%s",incac); + fscanf(fp_in,"%s",oucac); +// fscanf(fp_in,"%s",datestimes); + + } + + if(iprel) + unlink(arqip); + unlink(arqin); + + if(tnbytes) { + perc=totbytes / 100; + perc=tnbytes / perc; + } else perc=0; + + if(tnelap) { + perc2=totelap / 100; + perc2=tnelap / perc2; + } else perc2=0; + + if(tnoucache) { + ouperc=tnoucache * 100; + ouperc=ouperc / tnbytes; + } else ouperc=0; + + if(tnincache) { + inperc=tnincache * 100; + inperc=inperc / tnbytes; + } else inperc=0; + + sprintf(wwork1,"%s",fixnum(tnacc,1)); + sprintf(wwork2,"%s",fixnum(tnbytes,1)); + sprintf(wwork3,"%s",fixnum(tnelap,1)); + + sprintf(val2,"%s%s",href2,ltext110); + sprintf(val3,"%3.2f%%",perc); + sprintf(val4,"%3.2f%%",inperc); + sprintf(val5,"%3.2f%%",ouperc); + sprintf(val6,"%s",buildtime(tnelap)); + sprintf(val7,"%3.2f%%",perc2); + + strcpy(hbc1,"class=\"header2\""); + strcpy(hbc2,"class=\"header2\""); + strcpy(hbc3,"class=\"header2\""); + strcpy(hbc4,"class=\"header2\""); + strcpy(hbc5,"class=\"header2\""); + strcpy(hbc6,"class=\"header2\""); + strcpy(hbc7,"class=\"header2\""); + strcpy(hbc8,"class=\"header2\""); + strcpy(hbc9,"class=\"header\""); + + if(strstr(UserReportFields,"CONNECT") == 0) { + bzero(wwork1, 255); + bzero(hbc1, 30); + } + if(strstr(UserReportFields,"BYTES") == 0) { + bzero(wwork2, 255); + bzero(hbc2, 30); + } + if(strstr(UserReportFields,"MILISEC") == 0) { + bzero(wwork3, 255); + bzero(hbc3, 30); + } + if(strstr(UserReportFields,"SETYB") == 0) { + bzero(val3, 255); + bzero(hbc4, 30); + } + if(strstr(UserReportFields,"IN-CACHE-OUT") == 0) { + bzero(val4, 255); + bzero(hbc5, 30); + } + if(strstr(UserReportFields,"IN-CACHE-OUT") == 0) { + bzero(val5, 255); + bzero(hbc6, 30); + } + if(strstr(UserReportFields,"USED_TIME") == 0) { + bzero(val6, 255); + bzero(hbc7, 30); + } + if(strstr(UserReportFields,"%TIME") == 0) { + bzero(val7, 255); + bzero(hbc8, 30); + } + + if(strstr(UserReportFields,"TOTAL") != 0) { + sprintf(html,"\n",hbc9,text[107],hbc1,wwork1,hbc2,wwork2,hbc4,val3,hbc5,val4,hbc6,val5,hbc7,val6,hbc3,wwork3,hbc8,val7); + fputs(html,fp_ou); + } + + fclose(fp_in); + + if(atoi(PerUserLimit) > 0) { + if(tnbytes > (atoi(PerUserLimit)*1000000)) { + limit_flag=0; + if(access(PerUserLimitFile, R_OK) == 0) { + if((fp_usr = fopen(PerUserLimitFile, "r")) == 0) { + fprintf(stderr, "SARG: (html9) %s: %s\n",text[45],PerUserLimitFile); + exit(1); + } + while(fgets(tmp5,sizeof(tmp5),fp_usr)!=NULL) { + if(strstr(tmp5,"\n") != 0) + tmp5[strlen(tmp5)-1]='\0'; + if(strcmp(tmp5,u2) == 0) { + limit_flag=1; + break; + } + } + fclose(fp_usr); + } + + if(!limit_flag) { + if((fp_usr = fopen(PerUserLimitFile, "a")) == 0) { + fprintf(stderr, "SARG: (html10) %s: %s\n",text[45],PerUserLimitFile); + exit(1); + } + sprintf(html,"%s\n",u2); + fputs(html,fp_usr); + fclose(fp_usr); + + if(debug) { + sprintf(msg, "%s %s %s (%s MB). %s %s",text[32],u2,text[74],PerUserLimit,text[75],PerUserLimitFile); + debuga(msg); + } + } + } + } + + strcpy(arqper,dirname); + strcat(arqper,"/usuarios"); + + if ((fp_in = fopen(arqper, "r")) == 0){ + fprintf(stderr, "SARG: (html11) %s: %s\n",text[45],arqper); + exit(1); + } + + fgets(totuser,8,fp_in); + fclose(fp_in); + + totbytes2=totbytes/my_atoll(totuser); + totelap2=totelap/my_atoll(totuser); + + if(totbytes2) { + perc = totbytes / 100; + perc = totbytes2 / perc; + } else perc=0; + + if(totelap2) { + perc2 = totelap / 100; + perc2 = totelap2 / perc2; + } else perc2=0; + + twork2=my_atoll(totuser); + twork=ttnacc/twork2; + + sprintf(wwork1,"%s",fixnum(twork,1)); + sprintf(wwork2,"%s",fixnum(totbytes2,1)); + sprintf(wwork3,"%s",fixnum(totelap2,1)); + + sprintf(val6,"%s",buildtime(totelap2)); + sprintf(val7,"%3.2f%%",perc2); + + strcpy(hbc1,"class=\"header2\""); + strcpy(hbc2,"class=\"header2\""); + strcpy(hbc3,"class=\"header2\""); + strcpy(hbc4,"class=\"header2\""); + strcpy(hbc5,"class=\"header2\""); + strcpy(hbc6,"class=\"header\""); + + if(strstr(UserReportFields,"CONNECT") == 0) { + bzero(wwork1, 255); + bzero(hbc1, 30); + } + if(strstr(UserReportFields,"BYTES") == 0) { + bzero(wwork2, 255); + bzero(hbc2, 30); + } + if(strstr(UserReportFields,"MILISEC") == 0) { + bzero(wwork3, 255); + bzero(hbc3, 30); + } + if(strstr(UserReportFields,"USED_TIME") == 0) { + bzero(val6, 255); + bzero(hbc4, 30); + } + if(strstr(UserReportFields,"%TIME") == 0) { + bzero(val7, 255); + bzero(hbc5, 30); + } + + if(strstr(UserReportFields,"AVERAGE") != 0) { + sprintf(html,"\n",hbc6,text[96],hbc1,wwork1,hbc2,wwork2,hbc4,val6,hbc3,wwork3,hbc5,val7); + fputs(html,fp_ou); + } + + tnacc=0; + tnbytes=0; + tnelap=0; + tnincache=0; + tnoucache=0; + + fputs("
%s %s
%s%s%s%s%s%s%s%s
%s
%s%s%s%s%s%s%s%s%s%s
%s%s%s%s
%s%s%s%s
%s%s%s%s%s%s%s%s%s
%s%s%s%s%s%s
\n",fp_ou); + + show_info(fp_ou); + + fputs("\n\n",fp_ou); + + fclose(fp_ou); + + htaccess(name); + + } + + (void)rewinddir(dirp); + (void)closedir(dirp); + + return; +} diff --git a/images/datetime.png b/images/datetime.png new file mode 100644 index 0000000000000000000000000000000000000000..61543da044611cf5d7c79faeba77c7c37c57c83c GIT binary patch literal 263 zc-jF60r>ujP)iYXGfIo!P)a>ao@E)@wnd)j008kj%^`}SV;F`X+r6&q%@?~nZMgJ0r)mHI N002ovPDHLkV1mw0Y;FJm literal 0 Hc-jL100001 diff --git a/images/graph.png b/images/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..3fc5ecf424a2ca9091230396fb460b556053c10e GIT binary patch literal 130 zc-rd>@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhoCO|{#XvD(5N2eUHAey{XyWPO z7*a7OIbi|EpY}s+ZU0{c`7D`n_{;pphyUw=Twb0TYJn+6+=;6H7n+$(dhtwgg#?4p X5#BD@sk01$`WZZ3{an^LB{Ts55@jZ= literal 0 Hc-jL100001 diff --git a/images/sarg-squidguard-block.png b/images/sarg-squidguard-block.png new file mode 100644 index 0000000000000000000000000000000000000000..3163894372c70a8d8fd16ed78c5ac0c75a0c6e21 GIT binary patch literal 320 zc-jF#0l)r(rLX=_xZkD~qXoqb@T+ z^3|tR%d{Ld85kHCPU(3`b8SAncMaE1yA!;OFW^S**LLf;AYlCBsJctSZZ?e)0c;4Ds9L?VD|g^nhmlRuYUaaUJC%t@0mU| S^_Z;y0000$ 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 +#endif +#if HAVE_STDLIB_H +#include +#endif +#if HAVE_STRING_H +#include +#endif +#if HAVE_STRINGS_H +#include +#endif +#if HAVE_SYS_TIME_H +#include +#endif +#if HAVE_TIME_H +#include +#endif +#if HAVE_SYS_RESOURCE_H +#include +#endif +#if HAVE_UNISTD_H +#include +#endif +#if HAVE_SYS_DIRENT_H && !HAVE_DIRENT_H +#include +#endif +#if HAVE_DIRENT_H +#include +#endif +#if HAVE_SYS_SOCKET_H +#include +#endif +#if HAVE_NETDB_H +#include +#endif +#if HAVE_TYPES_H +#include +#endif +#if HAVE_NETINET_IN_H +#include +#endif +#if HAVE_ARPA_INET_H +#include +#endif +#if HAVE_SYS_STAT_H +#include +#endif +#if HAVE_CTYPE_H +#include +#endif +#if HAVE_ERRNO_H +#include +#endif +#if HAVE_GD_H +#include +#define HAVE_GD +gdImagePtr im; +gdPoint points[4]; +#endif +#if HAVE_GDFONTL_H +#include +#endif +#if HAVE_GDFONTT_H +#include +#endif +#if HAVE_GDFONTS_H +#include +#endif +#if HAVE_GDFONTMB_H +#include +#endif +#if HAVE_GDFONTG_H +#include +#endif + +#if HAVE_FOPEN64 +#define _FILE_OFFSET_BITS 64 +#define MY_FOPEN fopen +#else +#define MY_FOPEN fopen +#endif + + +#define MAXLEN 20000 +long long int my_atoll (const char *nptr); + +FILE *fp_tt; + +char outdir[MAXLEN]; +char dirname[MAXLEN]; +char buf[MAXLEN]; +char url[MAXLEN]; +char urly[MAXLEN]; +char user[MAXLEN]; +char periodo[MAXLEN]; +char msg[1024]; +char per_hour[128]; +char tmp[MAXLEN]; +char tmp2[MAXLEN]; +char tmp3[MAXLEN]; +char tmp4[MAXLEN]; +char tmp5[MAXLEN]; +char tmp6[MAXLEN]; +char parse_out[MAXLEN]; +char arqtt[MAXLEN]; +char html[MAXLEN]; +char datestimes[MAXLEN]; +char ConfigFile[MAXLEN]; +char href[MAXLEN]; +char href2[MAXLEN]; +char href3[MAXLEN]; +char df[20]; +char day[3], month[3], year[5]; +char ltext110[50]; +char cdfrom[30]; +char cduntil[30]; +char LastLog[5]; +char RemoveTempFiles[4]; +char ReplaceIndex[256]; +char Index[5]; +char OverwriteReport[4]; +char RecordsWithoutUser[20]; +char UseComma[4]; +char MailUtility[6]; +char TopSitesNum[5]; +char TopUsersNum[5]; +char ExcludeCodes[256]; +char TopsitesSortField[15]; +char TopsitesSortType[5]; +char ReportType[255]; +char UserTabFile[255]; +char warea[MAXLEN]; +char name[MAXLEN]; +char LongUrl[4]; +char Ip2Name[5]; +char language[255]; +char AccessLog[MAXLEN]; +char Title[MAXLEN]; +char BgColor[MAXLEN]; +char BgImage[MAXLEN]; +char TxColor[MAXLEN]; +char TxBgColor[MAXLEN]; +char TiColor[MAXLEN]; +char LogoImage[MAXLEN]; +char LogoText[MAXLEN]; +char LogoTextColor[MAXLEN]; +char Width[MAXLEN]; +char Height[MAXLEN]; +char FontFace[MAXLEN]; +char HeaderColor[MAXLEN]; +char HeaderBgColor[MAXLEN]; +char FontSize[MAXLEN]; +char PasswdFile[MAXLEN]; +char TempDir[MAXLEN]; +char OutputDir[MAXLEN]; +char OutputEmail[MAXLEN]; +char TopuserSortField[30]; +char UserSortField[30]; +char TopuserSortOrder[10]; +char UserSortOrder[10]; +char UserAgentLog[255]; +char module[255]; +char ExcludeHosts[255]; +char ExcludeUsers[255]; +char DateFormat[2]; +char PerUserLimitFile[255]; +char PerUserLimit[20]; +char UserIp[5]; +char MaxElapsed[255]; +char datetimeby[10]; +char csort[255]; +char CharSet[255]; +char UserInvalidChar[255]; +char Graphs[5]; +char GraphDaysBytesBarColor[255]; +char Privacy[10]; +char PrivacyString[255]; +char PrivacyStringColor[30]; +char IncludeUsers[MAXLEN]; +char ExcludeString[MAXLEN]; +char SuccessfulMsg[5]; +char TopUserFields[255]; +char UserReportFields[255]; +char DataFile[MAXLEN]; +char DataFileDelimiter[3]; +char DataFileFields[MAXLEN]; +char SiteUserTimeDateType[10]; +char ShowReadStatistics[5]; +char IndexSortOrder[5]; +char DansGuardianConf[MAXLEN]; +char SquidGuardConf[MAXLEN]; +char SquidGuarddbHome[255]; +char SquidGuardLogFormat[MAXLEN]; +char ShowSargInfo[5]; +char ShowSargLogo[5]; +char ParsedOutputLog[MAXLEN]; +char ParsedOutputLogCompress[255]; +char DisplayedValues[20]; +char HeaderFontSize[3]; +char TitleFontSize[3]; +char wwwDocumentRoot[MAXLEN]; +char ExternalCSSFile[MAXLEN]; +char BlockIt[255]; +char BlockImage[512]; +char NtlmUserFormat[30]; +char hbc1[30]; +char hbc2[255]; +char hbc3[30]; +char hbc4[30]; +char hbc5[30]; +char hbc6[30]; +char hbc7[30]; +char hbc8[30]; +char hbc9[30]; +char hbc10[30]; +char UserAuthentication[10]; +char AuthUserFile[255]; +char AuthName[512]; +char AuthType[255]; +char Require[512]; +char DownloadSuffix[MAXLEN]; +char *excludecode; +char *userfile; +char *str; +char *str2; +char text[200][255]; +char val1[MAXLEN]; +char val2[MAXLEN]; +char val3[MAXLEN]; +char val4[MAXLEN]; +char val5[MAXLEN]; +char val6[MAXLEN]; +char val7[MAXLEN]; +char val8[MAXLEN]; +char val9[MAXLEN]; +char val10[MAXLEN]; +char val11[MAXLEN]; +char wwork1[MAXLEN]; +char wwork2[MAXLEN]; +char wwork3[MAXLEN]; +char ftime[128]; +char mask[MAXLEN]; +char httplink[MAXLEN]; +char html_old[MAXLEN]; +char siteind[MAXLEN]; +char site[MAXLEN]; +char us[50]; +char email[MAXLEN]; +char test[1]; +char ouser2[255]; +char user2[MAXLEN]; +char wentp[512]; +char addr[MAXLEN]; +char suffix[10]; +char download_url[MAXLEN]; +char Ulimit[5]; +char cmd[255]; +int excode; +int idate; +int smartfilter; +int denied_count; +int download_count; +int authfail_count; +int dansguardian_count; +int squidguard_count; +int limit_flag; +int color1; +int color2; +int color3; +int z1, z2, z3; +int ttopen; +int ind2; +int sarglog; +int isalog; +int dfrom; +int duntil; +int dataonly; +int indexonly; +int iprel; +int userip; +int langcode; +int debug; +int debugz; +int debugm; +int AuthfailReportLimit; +int DeniedReportLimit; +int SiteUsersReportLimit; +int DansGuardianReportLimit; +int SquidGuardReportLimit; +int UserReportLimit; +int download_flag; +int AuthfailReportLimit; +int DeniedReportLimit; +int SiteUsersReportLimit; +int SquidGuardReportLimit; +int UserReportLimit; +int download_flag; +long l1, l2; +float perc; + +long long int twork; +long long int twork2; + +typedef struct +{ int list[ 24 ]; + int len; +} numlist; + +DIR *dirp; +struct dirent *direntp; + +int getnumlist( char *, numlist *, const int, const int ); diff --git a/include/defs.h b/include/defs.h new file mode 100755 index 0000000..e1d2124 --- /dev/null +++ b/include/defs.h @@ -0,0 +1,8 @@ +void maketmp(char *user, char *dirname, int debug, int indexonly); +void maketmp_hour(char *user, char *dirname, int indexonly); +void gravatmp(char *oldaccuser, char *dirname, char *oldurl, long long int nacc, long long int nbytes, char *oldmsg, long long int nelap, int indexonly, long long int incache, long long int oucache); +void gravatmp_hora(char *dirname, char *user, char *data, char *hora, char *elap, char *accbytes, int indexonly); +void gravatmpf(char *oldaccuser, char *dirname, char *oldurl, long long int nacc, long long int nbytes, char *oldmsg, long long int nelap, int indexonly, long long int incache, long long int oucache); +void gravaporuser(char *user, char *dirname, char *url, char *ip, char *data, char *hora, char *tam, char *elap, int indexonly); +void gravager(char *dirname, char *user, long long int nacc, char *url, long long int nbytes, char *ip, char *hora, char *dia, long long int nelap, long long int incache, long long int oucache); +void grava_SmartFilter(char *dirname, char *user, char *ip, char *data, char *hora, char *url, char *smart); diff --git a/include/extern.h b/include/extern.h new file mode 100755 index 0000000..ffc195e --- /dev/null +++ b/include/extern.h @@ -0,0 +1,112 @@ +extern char *htm01; +extern char *htm02; +extern char *htm03; +extern char *htm04; +extern char *htm05; +extern char *htm06; +extern char *htm07; +extern char *htm08; +extern char *htm09; +extern char *htm10; +extern char *htm11; +extern char *htm12; +extern char *htm13; +extern char *htm14; +extern char *htm15; +extern char *htm16; +extern char *htm17; +extern char *htm18; +extern char *htm19; +extern char *htm20; +extern char *htm21; +extern char *htm22; +extern char *htm23; +extern char *htm24; +extern char *htm26; +extern char *htm27; +extern char *htm28; +extern char *htm29; +extern char *htm30; + +extern char *msg01; +extern char *msg02; +extern char *msg03; +extern char *msg04; +extern char *msg05; +extern char *msg06; +extern char *msg07; +extern char *msg08; +extern char *msg09; +extern char *msg10; +extern char *msg11; +extern char *msg12; +extern char *msg13; +extern char *msg14; +extern char *msg15; +extern char *msg16; +extern char *msg17; +extern char *msg18; +extern char *msg19; +extern char *msg20; +extern char *msg21; +extern char *msg22; +extern char *msg23; +extern char *msg24; +extern char *msg25; +extern char *msg26; +extern char *msg27; +extern char *msg28; +extern char *msg29; +extern char *msg30; +extern char *msg31; +extern char *msg32; +extern char *msg33; +extern char *msg34; +extern char *msg35; +extern char *msg36; +extern char *msg37; +extern char *msg38; +extern char *msg39; +extern char *msg40; +extern char *msg41; +extern char *msg42; +extern char *msg43; +extern char *msg44; +extern char *msg45; +extern char *msg46; +extern char *msg47; +extern char *msg48; +extern char *msg49; +extern char *msg50; +extern char *msg51; +extern char *msg52; +extern char *msg53; +extern char *msg54; +extern char *msg55; +extern char *msg56; +extern char *msg57; +extern char *msg58; +extern char *msg59; +extern char *msg60; +extern char *msg61; +extern char *msg62; +extern char *msg63; +extern char *msg64; +extern char *msg65; +extern char *msg66; +extern char *msg67; +extern char *msg68; +extern char *msg70; +extern char *msg72; +extern char *msg73; +extern char *msg74; +extern char *msg75; +extern char *msg76; +extern char *msg77; +extern char *msg78; +extern char *msg79; +extern char *msg80; +extern char *msg81; +extern char *msg82; +extern char *msg83; +extern char *msg84; diff --git a/include/info.h b/include/info.h new file mode 100755 index 0000000..b2dcad4 --- /dev/null +++ b/include/info.h @@ -0,0 +1,3 @@ +#define VERSION "2.0.8 May-29-2005" +#define PGM "sarg" +#define URL "http://www.sarg-squid.org" diff --git a/index.c b/index.c new file mode 100644 index 0000000..d27c4d3 --- /dev/null +++ b/index.c @@ -0,0 +1,193 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void geraindex() +{ + + FILE *fp_ou, *fp_tmp, *tp_tmp2; + DIR *dirp; + struct dirent *direntp; + char html[MAXLEN]; + char wdir[MAXLEN]; + char wdir_tmp[MAXLEN]; + char wdir_tmp2[MAXLEN]; + char newname[512]; + char month[4]; + char period[80]; + char data[80]; + char tuser[20]; + char tbytes[20]; + char media[20]; + char ftime[128]; + char day[4], mon[4], year[6], hour[10]; + char h[3], m[3], s[3]; + + if(LastLog[0] != '\0') + mklastlog(outdir,debug); + + sprintf(wdir,"%sindex.html",outdir); + sprintf(wdir_tmp,"%sindex.unsort",outdir); + sprintf(wdir_tmp2,"%sindex.sort",outdir); + strcpy(hbc1,"class=\"header\""); + + if(strcmp(Index,"no") == 0) { + if(access(wdir, R_OK) == 0) + unlink(wdir); + return; + } + + if(debug) + debuga(text[53]); + + if((fp_ou=fopen(wdir,"w"))==NULL) { + fprintf(stderr, "SARG: (index) %s: %s\n",text[45],wdir); + exit(1); + } + + if((fp_tmp=fopen(wdir_tmp,"w"))==NULL) { + fprintf(stderr, "SARG: (index) %s: %s\n",text[45],wdir_tmp); + exit(1); + } + + dirp = opendir(outdir); + while ( (direntp = readdir( dirp )) != NULL ){ + if(strstr(direntp->d_name,"-") == 0) + continue; + + bzero(newname, 512); + strncat(newname,direntp->d_name,4); + strncpy(month,direntp->d_name+4,3); + month[3]='\0'; + conv_month(month); + strcat(newname,month); + strncat(newname,direntp->d_name+7,2); + + obtdate(outdir,direntp->d_name,data); + obtuser(outdir,direntp->d_name,tuser); + obttotal(outdir,direntp->d_name,tbytes,tuser,media); + + strcpy(html,data); + getword(mon,html,' '); + getword(mon,html,' '); + getword(day,html,' '); + getword(hour,html,' '); + getword(year,html,' '); + getword(year,html,' '); + strcpy(html,hour); + getword(h,html,':'); + getword(m,html,':'); + strcpy(s,html); + buildymd(day,mon,year,ftime); + + sprintf(html,"%s%s%s%s;%s;%s;%s;%s;%s;%s\n",ftime, h, m, s, direntp->d_name, data, tuser, tbytes, media, + newname); + fputs(html, fp_tmp); + } + + fclose(fp_tmp); + (void)rewinddir( dirp ); + (void)closedir( dirp ); + + if(strcmp(IndexSortOrder,"A") == 0) +// sprintf(html,"sort -t';' -k 7,7 %s -o %s", wdir_tmp, wdir_tmp2); + sprintf(html,"sort -t';' +6.5n +6.2M +6.0n '%s' -o '%s'", wdir_tmp, wdir_tmp2); + else +// sprintf(html,"sort -t';' -r -k 7,7 %s -o %s", wdir_tmp, wdir_tmp2); + sprintf(html,"sort -t';' +6.5nr +6.2Mr +6.0nr '%s' -o '%s'", wdir_tmp, wdir_tmp2); + + system(html); + + unlink(wdir_tmp); + + fputs("\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + sprintf(html," \n",CharSet); + fputs(html,fp_ou); + fputs("\n",fp_ou); + css(fp_ou); + + sprintf(buf,"\n",FontFace,TitleFontSize,BgColor,BgImage); + fputs(buf,fp_ou); + + sprintf(buf,"
\n"); + fputs(buf,fp_ou); + if(strlen(LogoImage) > 0) { + sprintf(html,"\n",LogoImage,Width,Height,LogoTextColor,LogoText); + fputs(html,fp_ou); + } + show_sarg(fp_ou, "."); + sprintf(html,"\n",Title); + fputs(html,fp_ou); + fputs("
\ + %s
%s
\n",fp_ou); + + fputs("
\n",fp_ou); + fputs("\n",fp_ou); + + sprintf(html,"\n", \ + hbc1,text[101],hbc1,text[102],hbc1,text[103],hbc1,text[93],hbc1,text[96]); + fputs(html,fp_ou); + + if((fp_tmp=fopen(wdir_tmp2,"r"))==NULL) { + fprintf(stderr, "SARG: (index) %s: %s\n",text[45],wdir_tmp2); + exit(1); + } + + while(fgets(buf,MAXLEN,fp_tmp)!=NULL) { + getword(period,buf,';'); + getword(period,buf,';'); + getword(data,buf,';'); + getword(tuser,buf,';'); + getword(tbytes,buf,';'); + getword(media,buf,';'); + + sprintf(html," \ + \n", \ + period,ReplaceIndex,period,data,tuser,tbytes,media); + fputs(html,fp_ou); + } + + strcpy(html,"
%s%s%s \ + %s%s
%s%s%s%s%s
"); + fputs(html,fp_ou); + + zdate(ftime, DateFormat); + + show_info(fp_ou); + + strcpy(html,"\n\n"); + fputs(html,fp_ou); + + fclose(fp_ou); + fclose(fp_tmp); + + unlink(wdir_tmp2); + return; +} diff --git a/indexonly.c b/indexonly.c new file mode 100644 index 0000000..2c27f21 --- /dev/null +++ b/indexonly.c @@ -0,0 +1,50 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + + +void index_only() +{ + + DIR *dirp; + struct dirent *direntp; + char remove[MAXLEN]; + + + dirp = opendir(dirname); + while ( (direntp = readdir( dirp )) != NULL ){ + if(strcmp(direntp->d_name,".") == 0 || strcmp(direntp->d_name,"..") == 0 || strcmp(direntp->d_name, "index.html") == 0) + continue; + + sprintf(remove,"%s/%s",dirname,direntp->d_name); + unlink(remove); + } + + (void)rewinddir( dirp ); + (void)closedir( dirp ); + + return; +} diff --git a/ip2name.c b/ip2name.c new file mode 100644 index 0000000..5f88038 --- /dev/null +++ b/ip2name.c @@ -0,0 +1,81 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void ip2name(char *ip) +{ + u_long addr; + struct hostent *hp; + char **p; + + if ((int)(addr = inet_addr(ip)) == -1) + return; + + hp = gethostbyaddr((char *)&addr, sizeof (addr), AF_INET); + if (hp == NULL) + return; + + for (p = hp->h_addr_list; *p != 0; p++) { + struct in_addr in; + + (void) memcpy(&in.s_addr, *p, sizeof (in.s_addr)); + (void) sprintf(ip,"%s", hp->h_name); + } + + return; +} + +void name2ip(char *name) +{ + struct in_addr ia; + struct hostent *hp; + char work[MAXLEN]; + char n1[4]; + char n2[4]; + char n3[4]; + char n4[4]; + + if(strstr(name,":") > 0) { + getword(work,name,':'); + strcpy(name,work); + } + + if((hp=gethostbyname(name))==NULL) + return; + else { + memcpy(&ia.s_addr,hp->h_addr_list[0],sizeof(ia.s_addr)); + ia.s_addr=ntohl(ia.s_addr); + sprintf(name,"%s",inet_ntoa(ia)); + getword(n4,name,'.'); + getword(n3,name,'.'); + getword(n2,name,'.'); + strcpy(n1,name); + sprintf(name,"%s.%s.%s.%s",n1,n2,n3,n4); + + } + + return; +} diff --git a/language.c b/language.c new file mode 100644 index 0000000..1eaa36a --- /dev/null +++ b/language.c @@ -0,0 +1,56 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + + +void language_load(char *language) +{ + + FILE *fp_text; + int record=0; + + sprintf(warea,"%s/languages/%s",SYSCONFDIR,language); + + if((fp_text=fopen(warea,"r"))==NULL) { + fprintf(stderr, "SARG: (language) Cannot open language file: %s\n",warea); + exit(1); + } + + while(fgets(buf,MAXLEN,fp_text)!=NULL) { + getword(warea,buf,'"'); + getword(warea,buf,'"'); + strcpy(text[record],warea); + + if(langcode) + printf("%d %s\n",record,warea); + + record++; + } + + fclose(fp_text); + + return; +} diff --git a/languages/.new b/languages/.new new file mode 100755 index 0000000..e69de29 diff --git a/languages/Bulgarian_windows1251 b/languages/Bulgarian_windows1251 new file mode 100644 index 0000000..7fdb18a --- /dev/null +++ b/languages/Bulgarian_windows1251 @@ -0,0 +1,130 @@ +# by Ivan Minchev +"Äà" +"Íå" +"Bulgarian" +"Ïàðàìåòðè" +"íåîáõîäèì å àðãóìåíò" +"Èíèöèàëèçàöèÿ" +"×åòåíå íà log ôàéëà" +"Íå ìîãà äà íàìåðÿ log ôàéëà" +"Íå ìîãà äà íàìåðÿ âðåìåííèÿ ôàéë" +"Çàïèñèòå ñà ïðî÷åòåíè" +"çàïèñàíî" +"Log-à ñúäúðæà çàïèñè ñ ðàçëè÷íè ôîðìàòè (squid è äð.)" +"Log ñ äðóã ôîðìàò" +"Log â Squid-ôîðìàò" +"Log ñ ãðåøåí ôîðìàò" +"Çàïèñèòå íå ñà íàìåðåíè" +"Ïåðèîä" +"ñå èçïîëçâà" +"êàòî âðåìåíåíà äèðåêòîðèÿ" +"Ñîðòèðîâêà íà ôàéëîâåòå" +"Çàâúðøåíî" +"Ïàðàìåòðè" +"Èìå èëè IP-àäðåñ" +"Äàòà îò-äî" +"Ôîðìàò íà äàòèòå" +"Åâðîïà" +"Àìåðèêà" +"IP îò÷åò" +"Èñïîëçâàéòå Ip-àäðåñ âìåñòî èìå íà ïîòðåáèòåëÿ" +"Àäðåñ" +"Âðåìå" +"Èìå" +"Âåðñèÿ íà Squid" +"Âðåìåíåíà äèðåêòîðèÿ" +"Êîíòðîëíè ñîîáùåíèÿ" +"Ðàáîòíè ñúîáùåíèÿ" +"Âõîäÿù log" +"Èçõîäíà äèðåêòîðèÿ" +"Èçïîëçîâàí" +"ïàðàìåòðè" +"E-mail àäðåñ çà èçïðàùàíå íà îò÷åòà" +"ñò.èçõîä íà êîíçîëàòà" +"Îò÷åò ïî ïîòðåáèòåëè è IP-àäðåñè" +"îò÷åòè" +"Íå ìîãà äà íàìåðÿ ôàéëà" +"ÇÀÁÐÀÍÅÍÎ" +"Îò÷åòà å ãåíåðèðàí â:" +"Îò÷åòà å ãåíåðèðàí è èçïðàòåí" +"Ñúçäàâàíå íà ôàéëà" +"Ñúçäàâàíå íà ôàéëà çà ïåðèîäà" +"Ôàéë" +"âå÷å ñúùåñòâóâà, ïðåìåñòåí â" +"Ñúçäàâàíå íà index.html" +"Ñîðòèðîâêà íà ôàéëîâåòå" +"Îò÷åò" +"Squid íå å èíñòàëèðàí íà òàçè ìàøèíà" +"Ìîëÿ, èñïîëçâàéòå ïàðàìåòúð -v çà çàäàâàíå íà âåðñèÿòà íà Squid" +"Çàðåæäà êîíôèãóðàöèÿ îò" +"ãðåøêà malloc" +"Çàðåæäà ôàéëà ñ ïàðîëèòå îò" +"Ñúçäàâàíå íà îò÷åòà" +"Ðàçàðõèâèðàíå íà log ôàéëà" +"Àðõèâèðàíå íà log ôàéëà" +"Ôàéëà íå å íàìåðåí" +"Íàìèðàíå íà IP-àäðåñà" +"×åòåíå íà log-à íà áðàóçåðèòå" +"Çàðåæäà ôàéëà ñ èçêëþ÷åíèÿòà îò" +"èçêëþ÷åíèÿ" +"Ôàéë ñ èçêëþ÷åíèÿ" +"Ôàéë ñ êîíôèãóðàöèè" +"Log íà áðàóçåðèòå" +"Ñúçäàâàíå íà îò÷åòà ïî áðàóçåðè" +"âåðñèÿ" +"äîñòèãíàò ëèìèòà" +"Äîáàâåí êúì ôàéëà" +"Êîíâåðòèðàíå íà access.log ôàéëà êúì ÷åòëèâè äàòè" +"Ðàçäåëÿíå íà log ôàéëà ïî äàòèòå â ïàðàìåòúð -d" +"ïî" +"â îáðàòåí ðåä" +"íîðìàëíî" +"Èçòðèâàíå íà ñòàðèÿ ôàéë ñ îò÷åòà" +"Èçòðèâàíå íà âðåìåííèòå ôàéëîâå" +"Top" +"ñàéòîâå" +"Ñåäìèöè" +"Loading User table" +"Cannot load. Memory fault" +"Îò÷åò çà äîñòúïà íà ïîòðåáèòåëèòå íà Squid" +"Ïåðèîä" +"Ïîòðåáèòåë" +"Àäðåñ" +"Âêëþ÷âàíå" +"Áàéòîâå" +"Îáùî âðåìå" +"Ìèëèñåê." +"Ñðåäíî" +"Íèçõîäÿùî (áàéòîâå)" +"Ïîòðåáèòåë" +"Âðåìå" +"No" +"Ïåðèîä" +"Äàòà íà ñúçäàâàíå" +"Ïîòðåáèòåëè" +"Ñîðòèðàíî" +"Îò÷åò Squid ïî áðàóçåðè" +"Áðàóçåð" +"Âñè÷êî" +"Ãåíåðèðàíî îò" +"íà" +"Äàòà/Âðåìå" +"IP/Èìå" +"OUT" +"IN" +"CACHE" +"SitesUsers" +"SmartFilter" +"Authentication Failures" +"Denied" +"Topsites" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/Catalan b/languages/Catalan new file mode 100644 index 0000000..c9ea2e8 --- /dev/null +++ b/languages/Catalan @@ -0,0 +1,130 @@ +# by Leonardo A. D'Angelo +"Si" +"No" +"Catalan" +"Opcio" +"requereix un argument" +"Inicialització" +"Llegint arxiu del log d'accesos" +"No es pot obrir l'arxiu de log" +"No es pot obrir l'arxiu temporal" +"Registres llegits" +"escrits" +"El log té formats de registre barrejats (squid i common log)" +"Format Common log" +"Format Squid log" +"Log amb format invàlid" +"No s'han trobat registres" +"Període" +"fent anar" +"com arxiu temporal" +"Ordenant arxiu" +"Fi" +"Paràmetres" +"Nom de host o direcció IP" +"Data desde-fins a" +"Format de data" +"Formato de fecha" +"Europa" +"USA" +"Report IP" +"Fa anar direcció IP en cop de userid" +"Lloc accedit" +"Hora" +"Usuari" +"Versió de l'Squid" +"Directori temporal" +"Missatges de depuració" +"Missatges de procesos" +"Log d'entrada" +"Directori de sortida" +"Mode d'ús" +"opcions" +"Direcció de correu on enviar els reports" +"stdout per a consola" +"Reports per usuario i direcció IP" +"reports" +"No es pot obrir arxiu" +"DENEGAT" +"Report generat satisfactoriament a" +"Report generat satisfactoriament i enviat a" +"Creant arxiu" +"Creant arxiu de període" +"Arxiu" +"ja existeix, renombrant-lo com a" +"Creant index.html" +"Ordenant arxiu" +"Report" +"Squid no instalat en aquesta màquina" +"Si us plau, usi l'opció -v per veure la versió de l'Squid" +"Carregant configuració desde" +"error malloc" +"Carregant arxiu de paraules de pas desde" +"Creant report" +"Descompactant arxiu de log" +"Compactant arxiu de log" +"Arxiu no trobat" +"Resolguent direcció IP" +"Llegint log de l'agent d'usuari" +"Carregant arxiu d'exclusions desde" +"excluit" +"Arxiu d'exclusions" +"Arxiu de configuració" +"Log de l'agent d'usuari" +"Creant report d'agent d'usuari" +"versió" +"límit excedit" +"Afegint a l'arxiu" +"Converteix l'arxiu access.log a una data llegible" +"Cambia l'arxiu de log per data amb el paràmetre -d" +"per" +"invers" +"normal" +"Esborrant arxiu vell de report" +"Esborrant arxius temporals" +"Màxim" +"Llocs" +"Llocs i Usuaris"" +"Carregant taula d'usuaris" +"No es pot carregar, fallida de la memòria" +"Report d'Accesos d'Usuaris de l'Squid" +"Període" +"Usuari" +"LLOC ACCEDIT" +"CONEXIÓ" +"BYTES" +"TEMPS UTILITZAT" +"MILISEC" +"PROMITGE" +"Accés Decreixent (bytes)" +"USERID" +"HORA" +"NUM" +"ARXIU/PERÍODE" +"DATA CREACIÓ" +"USUARIS" +"Clasificat per" +"Report d'Agent d'Usuari Squid" +"AGENT" +"TOTAL" +"Generat per" +"el" +"DATA/HORA" +"IP/NOM" +"SORTIDA" +"ENTRADA" +"LlocsUsuaris" +"FiltreInteligent" +"Fallides d'autenticació" +"Denied" +"Topsites" +"SQUIDGUARD" +"REGLA" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/Czech b/languages/Czech new file mode 100644 index 0000000..97c025a --- /dev/null +++ b/languages/Czech @@ -0,0 +1,130 @@ +# by Milos Prudek +"Ano" +"Ne" +"Èe¹tina" +"Volba" +"vy¾aduje argument" +"Inicializace" +"Ètu pøístupový ¾urnál" +"Nemohu otevøít ¾urnál" +"Nemohu otevøít pøechodný soubor" +"Záznamù pøeèteno" +"zapsáno" +"®urnál má smíchané oba ¾urnálové formáty (obecný a squid ¾urnál)" +"Obecný formát ¾urnálu" +"Squid formát ¾urnálu" +"®urnál s neplatným formátem" +"Nena¹el jsem ¾ádné záznamy" +"Období" +"pou¾il jsem" +"jako pøechodný adresáø" +"Tøídím soubor" +"Konec" +"Parametry" +"Jméno hostitele nebo IP adresa" +"Datum od-do" +"Formát data" +"Evropa" +"USA" +"IP zpráva" +"Pou¾ij IP Adresu místo ID u¾ivatele" +"Nav¹tívený server" +"Èas" +"U¾ivatel" +"verze Squidu" +"Doèasnný adresáø" +"Ladicí zprávy" +"Zprávy o zpracování" +"Vstupní ¾urnál" +"Výstupní adresáø" +"Pou¾ití" +"volby" +"Emailová adresa, na kterou se mají poslat pøehledy" +"stdout pro konzolu" +"Pøehledy podle u¾ivatele a IP adresy" +"pøehledy" +"Nemohu otevøít soubor" +"Zakázáno" +"Pøehled úspì¹nì generován" +"Pøehled úspì¹nì generován a odeslán na adresu" +"Vytváøím soubor" +"Vytváøím soubor období" +"Soubor" +"u¾ existuje, pøesouvám do" +"Vytváøím index.html" +"Tøídím soubor" +"Pøehled" +"Squid není na tomto poèítaèi instalován" +"Prosíme pou¾ijte volbu -v pro definování verze Squidu" +"Naèítám konfiguraci z" +"chyba malloc" +"Naèítám heslo ze souboru" +"Vytváøím zprávu" +"Rozbaluji ¾urnálový soubor" +"Balím ¾urnálový soubor" +"Soubor nenalezen" +"Pøevádí IP adresu na jméno" +"Ètu ¾urnál s pøehledem klientù" +"Naèítám soubor vyjímek z" +"vyjmuto" +"Soubor vyjímek" +"Konfiguraèní soubor" +"®urnál s pøehledem klientù" +"Vytváøím pøehled o klientech" +"verze" +"limit pøekroèen" +"Pøidáno do souboru" +"Pøevede soubor access.log na správné datum" +"Rozdìlí ¾urnálový soubor podle data v parametru -d" +", napsal" +"obrácenì" +"normálnì" +"Odstraòuji starý soubor s pøehledem" +"Odstraòuji pøechodný soubor" +"Nejlep¹ích" +"serverù" +"Týdny" +"Loading User table" +"Cannot load. Memory fault" +"Pøehled o vyu¾ití Squidu podle u¾ivatelù" +"Období" +"U¾ivatel" +"NAV©TÍVENÝ SERVER" +"SPOJENÍ" +"BYTÙ" +"POU®ITÝ ÈAS" +"MILISEC" +"PRÙMÌR" +"Klesající pøístup (bytù)" +"ID U®IVATELE" +"ÈAS" +"POØADÍ" +"SOUBOR/OBDOBÍ" +"DATUM VZNIKU" +"U®IVATELÉ" +"Tøídìní" +"Pøehled o pou¾itých klientech pro Squid" +"KLIENT" +"CELKEM" +"Generoval" +"dne" +"datum/èas" +"IP/JMÉNO" +"VÝSTUP" +"VSTUP" +"CACHE" +"ServeryU¾ivatelé" +"SmartFilter" +"Authentication failures" +"Denied" +"Topsites" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/Dutch b/languages/Dutch new file mode 100644 index 0000000..56b3acb --- /dev/null +++ b/languages/Dutch @@ -0,0 +1,130 @@ +# by Seth Mos and Pieter Kooistra +"Ja" +"Nee" +"Dutch" +"Optie" +"argument nodig" +"Init" +"Access log bestand inlezen" +"Kan het log bestand niet openen" +"Kan het tijdelijke bestand niet openen" +"Records gelezen" +"geschreven" +"Log heeft gemixte indeling (squid en algemeen log)" +"Algemene log indeling" +"Squid log indeling" +"Log met ongeldige indeling" +"Geen records gevonden" +"Periode" +"gebruiken" +"als tijdelijke directory" +"Sorteren bestand" +"Eind" +"Parameters" +"Hostname of IP adres" +"Datum van-tot" +"Datum indeling" +"Europa" +"USA" +"IP rapport" +"Gebruik Ip Adres i.p.v. gebruikersnaam" +"Bezochte site" +"Tijd" +"Gebruiker" +"Squid versie" +"Tijdelijke dir" +"Debug berichten" +"Process berichten" +"Invoer log" +"Uitvoer dir" +"Gebruik" +"opties" +"Email adres om rapporten te zenden" +"stdout voor console" +"Rapporten per gebruiker en IP adres" +"rapporten" +"Kan bestand niet openen" +"GEWEIGERD" +"Succesvol rapport gegenereerd op" +"Succesvol rapport gegenereerd en verzonden naar" +"Bestand maken" +"Periode bestand maken" +"Bestand" +"bestaat al, verplaatst naar" +"index.html maken" +"Sorteren bestand" +"Rapport" +"Squid is niet geinstalleerd op deze machine" +"Alstublieft, gebruik -v optie om squid versie te" +"Configuratie laden uit" +"malloc error" +"Laden password bestand uit" +"Maken rapport" +"Decomprimeren log bestand" +"Comprimeren log bestand" +"Bestand niet gevonden" +"Opzoeken IP Adres" +"Lezen useragent log" +"Laden uiztondering bestand uit" +"uitgezonderd" +"Uitzondering bestand" +"Configuratie bestand" +"Useragent log" +"Maken Useragent rapport" +"versie" +"limiet overschreden" +"Toegevoegd aan bestand" +"Converteer het access.log bestand naar een geldige datum" +"Deel het log bestand per datum met -d parameter" +"door" +"omgekeerd" +"normaal" +"Verwijderen oude rapport bestand" +"Verwijderen tijdelijke bestanden" +"Top" +"sites" +"Weken" +"Loading User table" +"Cannot load. Memory fault" +"Squid Gebruikers Toegangs Rapport" +"Periode" +"Gberuiker" +"BEZOCHTE SITE" +"VERBINDING" +"BYTES" +"GEBRUIKTE TIJD" +"MILISEC" +"GEMIDDELDE" +"Verminderen Toegang (bytes)" +"GEBRUIKERSID" +"TIJD" +"NUM" +"BESTAND/PERIODE" +"CREATIE DATUM" +"GEBRUKERS" +"Sorteer" +"Squid Useragent's Rapport" +"AGENT" +"TOTAAL" +"Gegenereerd door" +"op" +"DATUM/TIJD" +"IP/NAAM" +"UIT" +"IN" +"CACHE" +"SitesUsers" +"SmartFilter" +"Authentication failures" +"Denied" +"Topsites" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/English b/languages/English new file mode 100644 index 0000000..9a9a82c --- /dev/null +++ b/languages/English @@ -0,0 +1,130 @@ +# by Pedro Lineu Orso +"Yes" +"No" +"English" +"Option" +"require an argument" +"Init" +"Reading access log file" +"Cannot open log file" +"Cannot open temporary file" +"Records read" +"written" +"Log with mixed records format (squid and common log)" +"Common log format" +"Squid log format" +"Log with invalid format" +"No records found" +"Period" +"using" +"as temporary dir" +"Sorting file" +"End" +"Parameters" +"Hostname or IP address" +"Date from-until" +"Date format" +"Europe" +"USA" +"IP report" +"Use Ip Address instead of userid" +"Accessed site" +"Time" +"User" +"Squid version" +"Temporary dir" +"Debug messages" +"Process messages" +"Input log" +"Output dir" +"Usage" +"options" +"Email address to send reports" +"stdout for console" +"Reports by user and IP address" +"reports" +"Cannot open file" +"DENIED" +"Successful report generated on" +"Successful report generated and sent to" +"Making file" +"Making period file" +"File" +"already exists, moved to" +"Making index.html" +"Sorting file" +"Report" +"Squid not installed on this machine" +"Please, use -v option to set Squid version" +"Loading configuration from" +"malloc error" +"Loading password file from" +"Making report" +"Decompressing log file" +"Compressing log file" +"File not found" +"Resolve IP Address" +"Reading useragent log" +"Loading exclude file from" +"excluded" +"Exclude file" +"Config file" +"Useragent log" +"Making Useragent report" +"version" +"limit exceeded" +"Added to file" +"Convert the access.log file to a legible date" +"Split the log file by date in -d parameter" +"by" +"reverse" +"normal" +"Removing old report file" +"Removing temporary files" +"Top" +"sites" +"Sites & Users" +"Loading User table" +"Cannot load. Memory fault" +"Squid User Access Report" +"Period" +"User" +"ACCESSED SITE" +"CONNECT" +"BYTES" +"ELAPSED TIME" +"MILISEC" +"AVERAGE" +"Decreasing Access (bytes)" +"USERID" +"TIME" +"NUM" +"FILE/PERIOD" +"CREATION DATE" +"USERS" +"Sort" +"Squid Useragent's Report" +"AGENT" +"TOTAL" +"Generated by" +"on" +"DATE/TIME" +"IP/NAME" +"OUT" +"IN" +"CACHE" +"SitesUsers" +"SmartFilter" +"Authentication Failures" +"Denied" +"Topsites" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/French b/languages/French new file mode 100644 index 0000000..5462c97 --- /dev/null +++ b/languages/French @@ -0,0 +1,130 @@ +# by Fred Pacquier +"Oui" +"Non" +"Français" +"Option" +"requiert un argument" +"Initialisation" +"Lecture du journal des accès" +"Impossible d'ouvrir le journal" +"Impossible d'ouvrir le fichier temporaire" +"Enregistrements lus" +"écrits" +"Le journal contient des enregistrements de plusieurs formats (squid et common log)" +"Format habituel du journal" +"Format Squid du journal" +"Le format du journal est invalide" +"Aucun enregistrement trouvé" +"Période" +"utilisation de" +"comme répertoire temporaire" +"Tri du fichier" +"Fin" +"Paramètres" +"Nom de l'hôte ou adresse IP" +"Date début-fin" +"Format de date" +"Europe" +"USA" +"Statistiques des adresses IP" +"Utiliser l'adresse IP au lieu de l'identifiant utilisateur" +"Site accédé" +"Heure" +"Utilisateur" +"Version de Squid" +"Répertoire temporaire" +"Messages de débogage" +"Messages des processus" +"Journal d'entrée" +"Répertoire de sortie" +"Utilisation" +"options" +"Adresse e-mail destinataire des statistiques" +"Sortie standard de la console" +"Statistiques par utilisateurs et par adresses IP" +"statistiques" +"Impossible d'ouvrir le fichier" +"REFUSÉ" +"Statistiques générées sans erreur sur" +"Statistiques générées sans erreur envoyées à" +"Création du fichier" +"Création du fichier de l'intervalle" +"Le fichier" +"existe déjà, déplacé vers" +"Création du fichier index.html" +"Tri du fichier" +"Statistiques" +"Squid n'est pas installé sur cette machine" +"Merci d'utiliser l'option -v pour spécifier la version de Squid" +"Chargement de la configuration depuis" +"erreur d'allocation mémoire" +"Chargement des mots de passe depuis" +"Création des statistiques" +"Decompression du journal" +"Compression du journal" +"Fichier introuvable" +"Résolution des adresses IP" +"Lecture du journal des agents utilisateurs" +"Chargement des exclusions depuis" +"exclus" +"Fichier des exclusions" +"Fichier de configuration" +"Journal des agents utilisateurs" +"Création des statistiques des agents utilisateurs" +"version" +"limite dépassée" +"Ajouté au fichier" +"Convertit les dates du journal access.log en un format lisible" +"Produit un journal correspondant aux dates passées par -d (sur stdout)" +"par" +"descendant" +"ascendant" +"Supprime le fichier des anciennes statistiques" +"Supprime les fichiers temporaires" +"Les" +"sites les plus accédés" +"Semaines" +"Loading User table" +"Cannot load. Memory fault" +"Statistiques des accès utilisateurs de Squid" +"Période" +"Utilisateur" +"SITES ACCÉDÉS" +"ACCÈS" +"OCTETS" +"DURÉE" +"millisecondes" +"MOYENNE" +"Accès décroissant (en octets)" +"IDENTIFIANT" +"DURÉE" +"NUMÉRO" +"FICHIER/PÉRIODE" +"DATE DE CRÉATION" +"UTILISATEURS" +"Tri" +"Statistiques des agents utilisateurs Squid" +"AGENT" +"TOTAL" +"Généré par" +"le" +"DATE/HEURE" +"IP/NOM" +"HORS" +"DANS" +"CACHE" +"SitesUsers" +"SmartFilter" +"Authentication Failures" +"Denied" +"Topsites" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/German b/languages/German new file mode 100644 index 0000000..1c29b59 --- /dev/null +++ b/languages/German @@ -0,0 +1,130 @@ +# by Andreas Piek +"Ja" +"Nein" +"German" +"Option" +"Argument benoetigt" +"Init" +"Lese Zugriffsprotokoll" +"Kann Zugriffsprotokoll nicht oeffnen" +"Kann temporaere Datei nicht oeffnen" +"Datensaetze gelesen" +"geschrieben" +"Protokolle beinhaltet Datensaetze in verschiedenen Formaten (SQUID -und allgemeines Format)" +"allgemeines Protokollformat" +"Squid-Protokollformat" +"Protokoll mit ungueltigem Format" +"Keine Datensaetze gefunden" +"Zeitraum" +"benutze" +"als temporaeres Verzeichnis" +"Sortiere Datei" +"Ende" +"Parameter" +"Rechnername oder IP-Adresse" +"Datum von-bis" +"Datumsformat" +"Europa" +"USA" +"IP Bericht" +"Benutze IP-Adresse anstatt User-ID" +"zugegriffene Site" +"Zeit" +"Benutzer" +"Squid Version" +"temporaeres Verzeichnis" +"Debug Nachrichten" +"Verarbeite Nachrichten" +"Eingabeprotokoll" +"Ausgabeverzeichnis" +"Benutzung" +"Optionen" +"Sende Reports an folgende Email-Adresse" +"Standardausgabe an Konsole" +"Berichte geordnet nach Benutzer und IP-Adresse" +"Berichte" +"Kann Datei nicht oeffnen" +"ABGELEHNT" +"Bericht erfolgreich erstellt in" +"Bericht erfolgreich erstellt und gesendet an" +"Erstelle Datei" +"Erstelle Zeitraum-Datei" +"Datei" +"bereits vorhanden, wechsle zu" +"Erstelle index.html" +"Sortiere Datei" +"Bericht" +"Squid ist auf diesem Rechner nicht installiert" +"Bitte Option -v zum Angeben der Squid-Version setzen" +"Lade Konfiguration aus" +"Speicherallokationsfehler" +"Lade Passwortdatei aus" +"Erstelle Bericht" +"Dekomprimiere Protokolldatei" +"Komprimiere Protokolldatei" +"Datei nicht gefunden" +"Loese IP-Adressen auf" +"Lese UserAgent-Protokoll" +"Lade Ausschlussdatei aus" +"ausgeschlossen" +"Ausschlussdatei" +"Konfigurationsdatei" +"UserAgent-Protokoll" +"Erstelle UserAgent-Bericht" +"Version" +"Grenze erreicht" +"Angehaengt an Datei" +"Convert the access.log file to a legible date" +"Split the log file by date in -d parameter" +"by" +"reverse" +"normal" +"Removing old report file" +"Removing temporary files" +"Top" +"sites" +"Wochen" +"Loading User table" +"Cannot load. Memory fault" +"Squid Bericht ueber Benutzerzugriffe" +"Zeitraum" +"Benutzer" +"ZUGEGRIFFENE SITE" +"VERBINDUNGEN" +"Bytes" +"ZEITDAUER" +"MILLISEKUNDEN" +"DURCHSCHNITT" +"verringerter Zugriff (Bytes)" +"BENUTZERKENNUNG" +"ZEIT" +"NR." +"DATEI/ZEITRAUM" +"ERSTELLUNGSDATUM" +"BENUTZER" +"Sortierung" +"Squid Bericht ueber die verwendeten Browser" +"BROWSER" +"INSGESAMT" +"Erstellt mit" +"am" +"DATUM/ZEIT" +"IP/NAME" +"AUSGEHEND" +"EINGEHEND" +"CACHE" +"SitesUsers" +"SmartFilter" +"Authentication Failures" +"Denied" +"Topsites" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/Greek b/languages/Greek new file mode 100644 index 0000000..f730702 --- /dev/null +++ b/languages/Greek @@ -0,0 +1,129 @@ +# Translation: Antonis Maglaras - email:vegos@magla.gr - http://www.magla.gr +"Íáé" +"¼÷é" +"ÅëëçíéêÜ" +"¢ëëï" +"÷ñåéÜæåôáé Ýíá óôïé÷åßï" +"Init" +"ÁíÜãíùóç áñ÷åßïõ " +"Äåí ìðïñþ íá äéáâÜóù ôï áñ÷åßï log" +"Äåí ìðïñþ íá äéáâÜóù ôá ðñïóùñéíÜ áñ÷åßá" +"ÅããñáöÝò áíáãíþóôçêáí" +"Áðïèçêåýèçêáí" +"Áñ÷åßï Log ìå äéÜöïñåò åããñáöÝò (squid êáé ãåíéêü log)" +"Êïéíü áñ÷åßï log" +"öïñìÜô ôïõ Squid log" +"Áñ÷åßï Log ìå Üãíùóôç ìïñöÞ" +"Äåí âñÝèçêáí åããñáöÝò" +"Ðåñßïäïò" +"÷ñÞóç" +"ùò ðñïóùñéíïý êáôáëüãïõ" +"Ôáîéíüìçóç áñ÷åßïõ" +"ÔÝëïò" +"ÐáñÜìåôñïé" +"Hostname Þ äéåýèõíóç IP" +"Çìåñïìçíßá áðü-ìÝ÷ñé" +"ÌïñöÞ çìåñïìçíßáò" +"Åõñþðç" +"ÁìåñéêÞ" +"ÊáôÜóôáóç IP" +"×ñÞóç äéåýèõíóçò Ip áíôß ïíüìáôïò" +"ÐñïóâÜóéìá sites" +"×ñüíïò" +"×ñÞóôçò" +"¸êäïóç Squid" +"Ðñïóùñéíüò öÜêåëëïò" +"Ìçíýìáôá Debug" +"Ìçíýìáôá Process" +"Áñ÷åßï åéóüäïõ" +"ÖÜêåëëïò åîüäïõ" +"×ñÞóç" +"åðéëïãÝò" +"Äéåýèõíóç Email ãéá áðïóôïëÞ áíáöïñþí" +"stdout ãéá êïíóüëá" +"ÁíáöïñÝò áíÜ ÷ñÞóôç êáé IP äéåýèõíóç" +"áíáöïñÝò" +"Äåí ìðïñþ íá äéáâÜóù ôï áñ÷åßï" +"×ùñßò ðñüóâáóç" +"Ïé áíáöïñÝò äçìéïõñãÞèçêáí åðéôõ÷þò óôéò" +"Ïé áíáöïñÝò äçìéïõñãÞèçêáí åðéôõ÷þò êáé óôÜëèçêáí óå" +"Äçìéïõñãßá áñ÷åßïõ" +"Äçìéïõñãßá áñ÷åßïõ ðåñéüäïõ" +"Áñ÷åßï" +"õðÜñ÷åé Þäç, ìåôáêéíÞèçêå óå" +"Äçìéïõñãßá áñ÷åßïõ index.html" +"Ôáîéíüìçóç áñ÷åßïõ" +"ÁíáöïñÜ" +"Ôï Squid äåí õðÜñ÷åé óôïí õðïëïãéóôÞ" +"Ðáñáêáëþ, ÷ñçóéìïðïéÞóôå ôçí åðéëïãÞ -v ãéá íá ïñßóåôå ôçí Ýêäïóç ôïõ Squid" +"Öüñôùìá áñ÷åßïõ ñõèìßóåùí" +"óöÜëìá ìíÞìçò" +"Öüñôùìá áñ÷åßïõ êùäéêþí áðü" +"Äçìéïõñãßá áíáöïñþí" +"Áðïóõìðßåóç áñ÷åßïõ log" +"Óõìðßåóç áñ÷åßïõ log" +"Ôï áñ÷åßï äåí âñÝèçêå" +"Áíôéóôïß÷éóç äéåõèýíóçò IP" +"ÁíÜãíùóç áñ÷åßïõ useragent log" +"Öüñôùóç áñ÷åßïõ åîáéñÝóåùí áðü" +"åîáéñÝèçêáí" +"Áñ÷åßï åîáéñÝóåùí" +"Áñ÷åßï ñõèìßóåùí" +"Áñ÷åßï Useragent log" +"Äçìéïõñãßá áíáöïñþí Useragent" +"Ýêäïóç" +"ôï üñéï åîáíôëÞèçêå" +"ÐñïóôÝèçêáí óôï áñ÷åßï" +"ÌåôáôñïðÞ ôïõ áñ÷åßïõ access.log óå çìåñïìçíßá" +"Äéá÷ùñéóìüò ôïõ áñ÷åßïõ log âÜóç çìåñïìçíßáò ìå ôçí -d ðáñÜìåôñï" +"áðü" +"áíÜðïäá" +"êáíïíéêÜ" +"Áöáßñåóç ðáëéïý áñ÷åßïõ áíáöïñþí" +"Áöáßñåóç ðñïóùñéíþí áñ÷åßùí" +"Top" +"sites" +"Óåëßäåò & ×ñÞóôåò" +"Öüñôùóç ðßíáêá ÷ñçóôþí" +"Äåí ìðïñþ íá äéáâÜóù. Ðñüâëçìá ìíÞìçò" +"ÁíáëõôéêÞ êáôÜóôáóç ðñüóâáóçò ÷ñçóôþí ôïõ Proxy Server" +"Ðåñßïäïò" +"×ñÞóôçò" +"Óåëßäá ðïõ æçôÞèçêå" +"Óýíäåóç" +"Bytes" +"×ñüíïò" +"msec" +"ÌÝóïò üñïò" +"ÌåéùìÝíç ðñüóâáóç (bytes)" +"¼íïìá ÷ñÞóôç" +"×ñüíïò" +"Áñéèìüò" +"Ðåñßïäïò (áðü/Ýùò)" +"Çì/íßá Äçìéïõñãßáò" +"×ñÞóôåò" +"Ôáîéíüìçóç" +"ÊáôÜóôáóç ÷ñçóôþí Proxy" +"ÐñÜêôïñáò" +"Óýíïëï" +"ÄçìéïõñãÞèçêå áðü" +"óôéò" +"Çì/íßá-¿ñá " +"IP/¼íïìá" +"¸îù" +"ÌÝóá" +"Cache" +"×ñÞóôåò" +"¸îõðíï ößëôñï" +"Ðñüâëçìá ðéóôïðïßçóçò" +"Ìç åðéôñåðôÞ ðñüóâáóç" +"Óåëßäåò ðïõ æçôÞèçêáí ðåñéóóüôåñï" +"SQUIDGUARD" +"Êáíüíåò" +"squidGuard" +"Ôï áñ÷åßï log ôïõ Sarg áðïèçêåýèçêå ùò" +"ÖïñìÜô ôïõ Sarg log" +"ËçöèÝíôá áñ÷åßá" +"Ãñáöéêü" +"ÇìÝñåò" +"ÇìÝñåò" \ No newline at end of file diff --git a/languages/Hungarian b/languages/Hungarian new file mode 100644 index 0000000..7fb7577 --- /dev/null +++ b/languages/Hungarian @@ -0,0 +1,130 @@ +# by Csaba Kabai +"Igen" +"Nem" +"Hungarian" +"Opciók" +"paraméter szükséges" +"Inicializálás" +"Access log file olvasása" +"Nem tudom megnyitni a log file-t" +"Nem tudom megnyitni az ideiglenes file-t" +"Rekord olvasva" +"írva" +"A log-ban keverednek a rekordformátumok (squid es közös log)" +"Közös log formátum" +"Squid log formátum" +"Log érvénytelen formátummal" +"Nem található rekord" +"Periódus" +"használva" +"mint ideiglenes könyvtár" +"A file rendezés alatt" +"Vége" +"Paraméterek" +"Hosztnév vagy IP cím" +"Dátum tól-ig" +"Dátum formátum" +"Európa" +"USA" +"IP kimutatás" +"IP cimet használ userid helyett" +"Meglátogatott hely" +"Idõ" +"Felhasználó" +"Squid verzió" +"Ideiglenes könyvtár" +"Debug üzenet" +"Processz üzenet" +"Input log" +"Output könyvtár" +"Használat:" +"opciók" +"Email cím a kimutatás küldésére" +"stdout a konzolra" +"Kimutatás felhasználó és IP cím alapján" +"kimutatások" +"Megnyithatatlan file" +"TILTOTT" +"Sikeres kimutatás generálva:" +"Sikeres kimutatás generálva és elküldve:" +"File keszítés" +"Periódus file készítés" +"File" +"letezik, átmozgatva" +"Készítés alatt: index.html" +"Rendezés" +"Kimutatás" +"A Squid nincs installálva ezen a gépen" +"Kérlek, használd a -v opciót a Squid verzió beállításához" +"Konfiguráció betöltése a" +"malloc hiba" +"Jelszó file betöltése a" +"Kimutatás készítése" +"Log file bontása" +"Log file tömörítése" +"File nem található" +"IP cím visszafejtése" +"Felhasználói agent log olvasása" +"Kizaró file beolvasása a" +"Kizárva" +"Kizáró file" +"Konfigurációs file" +"Useragent log" +"Useragent kimutatás készítése" +"verzió" +"limit exceeded" +"Added to file" +"Convert the access.log file to a legible date" +"Split the log file by date in -d parameter" +"by" +"reverse" +"normal" +"Removing old report file" +"Removing temporary files" +"Top" +"sites" +"hét" +"Loading User table" +"Cannot load. Memory fault" +"Squid Felhasználók szerinti kimutatás" +"Periódus" +"Felhasználó" +"MEGLÁTOGATOTT HELY" +"KAPCSOLAT" +"BYTE-ok" +"ELTÖLTÖTT IDÕ" +"MILISEC" +"ÁTLAG" +"Elérés csökkentve (byte-al)" +"FELHASZNÁLÓ" +"IDÕ" +"Sorszám" +"FILE/PERIÓDUS" +"KÉSZÍTÉS DÁTUMA" +"FELHASZNÁLÓK" +"Sorrend" +"Squid Felhasználói kimutatás" +"AGENT" +"ÖSSZESEN" +"Készítette:" +"idõ:" +"dátum/idõ" +"IP/NÉV" +"OUT" +"IN" +"CACHE" +"SitesUsers" +"SmartFilter" +"Authentication Failures" +"Denied" +"Topsites" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/Indonesian b/languages/Indonesian new file mode 100644 index 0000000..b3ccf25 --- /dev/null +++ b/languages/Indonesian @@ -0,0 +1,130 @@ +# by V Gatut Harijiso +"Ya" +"Ndak" +"Indonesiain" +"Pilihan" +"butuh argumen" +"Awal" +"Membaca file log akses" +"Tak bisa buka file log" +"Tak bisa buka file sementara" +"Record dibaca" +"ditulis" +"Log mengandung format campuran (squid dan log umum/common)" +"Format log common" +"Format log Squid" +"Log dengan format yang salah" +"Tidak ada record yang dicari" +"Periode" +"menggunakan" +"sebagai dir sementara" +"mengurutkan file" +"Selesai" +"Parameter" +"Alamat nama host or IP" +"Tanggal dari-sampai" +"Format tanggal" +"Eropa" +"USA" +"Laporan IP" +"Menggunakan Alamat Ip daripada userid" +"Situs diakses" +"Waktu" +"User" +"Versi Squid" +"Dir sementara" +"Pesan Debug" +"Pesan process" +"Log input" +"Dir output" +"Penggunaan" +"opsi" +"Alamat email penerima laporan" +"stdout untuk console" +"Laporan berdasar user dan alamat IP" +"laporan" +"Tak bisa buka file" +"DITOLAK" +"Berhasil melaporkan pada" +"Berhasil melaporkan dan dikirim ke" +"Membuat file" +"Membuat laporan periodik" +"File" +"Sudah ada, dipindahkan ke" +"Membuat index.html" +"Mengurutkan file" +"Laporan" +"Squid tidak diinstall di mesin ini" +"Mohon, gunakan opsi -v untuk menentukan versi Squid" +"Menyertakan konfigurasi dari" +"kesalahan malloc" +"Menyertakan file password dari" +"Membuat laporan" +"Membongkar file log" +"Mengkompres file log" +"File tidak ditemukan" +"Mengartikan Alamat IP" +"Membaca log useragent" +"Menyertakan file exclude dari" +"tidak disertakan" +"File exclude" +"File konfig" +"Log useragent" +"Membuat laporan useragent" +"versi" +"batasan terlampaui" +"Ditambahkan ke file" +"Mengkonversi file access.log ke tanggal yang dipahami" +"Membagi file log berdasarkan tanggal dalam parameter -d" +"oleh" +"terbalik" +"normal" +"Membuang file laporan lama" +"Membuang file sementara" +"Tertinggi" +"situs" +"Mingguan" +"Loading User table" +"Cannot load. Memory fault" +"Laporan Akses Pemakai Squid" +"Periode" +"Pemakai" +"SITUS DIAKSES" +"MENGHUBUNGI" +"BYTES" +"WAKTU TERPAKAI" +"MILIDETIK" +"RATA-RATA" +"Menurunkan Akses (bytes)" +"USERID" +"WAKTU" +"NO." +"FILE/PERIOD" +"TANGGAL PEMBUATAN" +"PEMAKAI" +"Urut" +"Laporan Useragent Squid" +"AGEN" +"TOTAL" +"Dibuat oleh" +"pada" +"TANGGAL/WAKTU" +"IP/NAMA" +"OUT" +"IN" +"CACHE" +"SitesUsers" +"SmartFilter" +"Authentication Failures" +"Denied" +"Topsites" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/Italian b/languages/Italian new file mode 100644 index 0000000..3fc801c --- /dev/null +++ b/languages/Italian @@ -0,0 +1,130 @@ +# by Matteo Colombo +"Si" +"No" +"Italian" +"Opzione" +"richide un argomento" +"Inizializzazione" +"Lettura access log file" +"Non riesco a aprire il log file" +"Non riesco a aprire il file temporaneo" +"Records letti" +"scritto" +"Formato dei log misto (squid and common log)" +"Formato Common log" +"Formato Squid log" +"Formato invalido dei Log" +"Nessun records trovato." +"Periodo" +"utilizzare" +"come directory temporanea" +"Sto Ordinando il file" +"Fine" +"Parametri" +"Hostname o indirizzo IP" +"Data from-until" +"Formato della Data" +"Europa" +"USA" +"Rapporto IP" +"Usa l'indirizzo Ip invece della userid" +"Accessed site" +"Tempo" +"Utente" +"Squid versione" +"Directory Temporanea" +"Messaggi di Debug" +"Messaggi di Processo" +"Input log" +"Directory di destinazione" +"Usa" +"opzioni" +"Repporto spedito all'indirizzo Email" +"stdout per console" +"Rapporto di user e IP address" +"rapporti" +"Non riesco ad aprire il file" +"NEGATO" +"Rapporto generato con successo in" +"Rapporto generato e spedito con successo in" +"Creazione del file" +"Creazione del file del periodo" +"File" +"esiste gia', spostato in" +"Creazione index.html" +"Sto Ordinano il file" +"Rapporto" +"Squid non e' installato su questa macchina" +"Prego, usare l'opzione -v per settare la vesione dello Squid" +"Caricamento della configurazione da" +"malloc error" +"Caricamento del file delle password da" +"Creazione rapporto" +"Decompressione file di log" +"Compressione file di log" +"File non trovato" +"Risoluzione IP Address" +"Lettura useragent log" +"Caricamento exclude file da" +"esclusi" +"File Exclude" +"File di Configurazione" +"Useragent log" +"Creazione rapporto Useragent" +"versione" +"limit exceeded" +"Added to file" +"Convert the access.log file to a legible date" +"Split the log file by date in -d parameter" +"by" +"reverse" +"normal" +"Removing old report file" +"Removing temporary files" +"Top" +"sites" +"Sites & Users" +"Loading User table" +"Cannot load. Memory fault" +"Squid - Rapporto Accessi per Utenti" +"Periodo" +"Utente" +"SITI VISITATI" +"CONNESSIONI" +"BYTES" +"TIME UTIL" +"MILISEC" +"MEDIA" +"Accesso Descrescente (bytes)" +"USERID" +"TEMPO" +"NUM" +"FILE/PERIODO" +"DATA DI CREAZIONE" +"UTENTI" +"Ordinato per" +"Squid - Rapporto Useragent" +"AGENTE" +"TOTALE" +"Generato da" +"il" +"DATA/TEMPO" +"IP/NOME" +"OUT" +"IN" +"CACHE" +"SitesUsers" +"SmartFilter" +"Authentication Failures" +"Denied" +"Topsites" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/Japanese b/languages/Japanese new file mode 100644 index 0000000..01ca1dd --- /dev/null +++ b/languages/Japanese @@ -0,0 +1,130 @@ +# by Akira Kitamura +"Yes" +"No" +"Japanese" +"¥ª¥×¥·¥ç¥ó" +"require an argument" +"Init" +"¥¢¥¯¥»¥¹¥í¥°¥Õ¥¡¥¤¥ë¤òÆÉ¤ó¤Ç¤¤¤Þ¤¹" +"¥í¥°¥Õ¥¡¥¤¥ë¤ò¥ª¡¼¥×¥ó¤Ç¤­¤Þ¤»¤ó" +"¥Æ¥ó¥Ý¥é¥ê¥Õ¥¡¥¤¥ë¤ò¥ª¡¼¥×¥ó¤Ç¤­¤Þ¤»¤ó" +"¥ì¥³¡¼¥É¤òÆÉ¤ó¤Ç¤¤¤Þ¤¹" +"½ñ¹þ¤ßÃæ" +"¥í¥°¥Õ¥©¡¼¥Þ¥Ã¥È¤¬º®ºß¤·¤Æ¤¤¤Þ¤¹ (squid and common log)" +"Common ¥í¥°¥Õ¥©¡¼¥Þ¥Ã¥È" +"Squid ¥í¥°¥Õ¥©¡¼¥Þ¥Ã¥È" +"̵¸ú¤Ê¥í¥°¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç¤¹" +"¥ì¥³¡¼¥É¤¬¤¢¤ê¤Þ¤»¤ó" +"½¸·×´ü´Ö" +"»ÈÍÑ" +"¥Æ¥ó¥Ý¥é¥ê¥Ç¥£¥ì¥¯¥È¥ê" +"¥Õ¥¡¥¤¥ë¤òSort" +"½ªÎ»" +"¥Ñ¥é¥á¡¼¥¿" +"¥Û¥¹¥È̾Ëô¤ÏIP¥¢¥É¥ì¥¹" +"ÆüÉÕ from-until" +"ÆüÉÕ¥Õ¥©¡¼¥Þ¥Ã¥È" +"¥è¡¼¥í¥Ã¥Ñ" +"¥¢¥á¥ê¥«" +"IP ¥ì¥Ý¡¼¥È" +"¥æ¡¼¥¶ID¤ÎÂå¤ï¤ê¤ËIP¥¢¥É¥ì¥¹¤ò»ÈÍѤ¹¤ë" +"¥¢¥¯¥»¥¹À襵¥¤¥È" +"»þ´Ö" +"¥æ¡¼¥¶" +"Squid ¥Ð¡¼¥¸¥ç¥ó" +"¥Æ¥ó¥Ý¥é¥ê ¥Ç¥£¥ì¥¯¥È¥ê" +"¥Ç¥Ð¥Ã¥°¥á¥Ã¥»¡¼¥¸" +"¥×¥í¥»¥¹¥á¥Ã¥»¡¼¥¸" +"ÆþÎÏ ¥í¥°¥Õ¥¡¥¤¥ë" +"½ÐÎÏÀè¥Ç¥£¥ì¥¯¥È¥ê" +"»È¤¤Êý" +"¥ª¥×¥·¥ç¥ó" +"¥ì¥Ý¡¼¥È¤òÁ÷¤ëE-Mail¥¢¥É¥ì¥¹" +"stdout for console" +"¥æ¡¼¥¶¡¦IP¥¢¥É¥ì¥¹¤Ë¤è¤ë¥ì¥Ý¡¼¥È" +"¥ì¥Ý¡¼¥È" +"¥Õ¥¡¥¤¥ë¤ò¥ª¡¼¥×¥ó¤Ç¤­¤Þ¤»¤ó" +"µñÈÝ" +"ºîÀ®´°Î»¡£°Ê²¼¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥ì¥Ý¡¼¥È¤¬ºîÀ®¤µ¤ì¤Þ¤·¤¿" +"¥ì¥Ý¡¼¥È¤ÎºîÀ®¤¬´°Î»¤·¥á¡¼¥ë¤ò°Ê²¼°¸¤ËÁ÷¿®¤·¤Þ¤·¤¿" +"Making file" +"½¸·×´ü´Ö¥Õ¥¡¥¤¥ë¤òºîÀ®" +"¥Õ¥¡¥¤¥ë" +"´û¤Ë¸ºß¤·¤Þ¤¹, °Ê²¼¤Ë°Üư¤·¤Þ¤·¤¿" +"index.html¤òºîÀ®" +"¥Õ¥¡¥¤¥ë¤òSort" +"¥ì¥Ý¡¼¥È" +"¤³¤Î¥Þ¥·¥ó¤Ë¤ÏSquid¤¬¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" +"Squid¤Î¥Ð¡¼¥¸¥ç¥ó¤ò»ØÄꤹ¤ë¤Ë¤Ï -v ¥ª¥×¥·¥ç¥ó¤ò»È¤Ã¤Æ¤¯¤À¤µ¤¤" +"°Ê²¼¤«¤éÀßÄê¥Õ¥¡¥¤¥ë¤òÆÉ¤ß¹þ¤ß¤Þ¤¹" +"malloc error" +"°Ê²¼¤«¤é¥Ñ¥¹¥ï¡¼¥É¥Õ¥¡¥¤¥ë¤òÆÉ¤ß¹þ¤ß¤Þ¤¹" +"¥ì¥Ý¡¼¥È¤òºîÀ®" +"¥í¥°¥Õ¥¡¥¤¥ë¤ò²òÅà" +"¥í¥°¥Õ¥¡¥¤¥ë¤ò°µ½Ì" +"¥Õ¥¡¥¤¥ë¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó" +"¥Û¥¹¥È̾²ò·è" +"¥æ¡¼¥¶¥¨¡¼¥¸¥§¥ó¥È¥í¥°¤òÆÉ¤ó¤Ç¤¤¤Þ¤¹" +"°Ê²¼¤«¤éÇÓ½ü¤¹¤ë¥Õ¥¡¥¤¥ë¤òÆÉ¤ß¹þ¤ó¤Ç¤¤¤Þ¤¹" +"ÇÓ½ü" +"ÇÓ½ü¤¹¤ë¥Õ¥¡¥¤¥ë" +"ÀßÄê¥Õ¥¡¥¤¥ë" +"¥æ¡¼¥¶¥¨¡¼¥¸¥§¥ó¥È¥í¥°" +"Abuse ¥ì¥Ý¡¼¥È" +"¥æ¡¼¥¶¥¨¡¼¥¸¥§¥ó¥È¥ì¥Ý¡¼¥È¤òºîÀ®" +"Making Abuse report" +"¥Ð¡¼¥¸¥ç¥ó" +"¥ê¥ß¥Ã¥È¤ò¥ª¡¼¥Ð¡¼" +"¥Õ¥¡¥¤¥ë¤òÄɲÃ" +"¥¢¥¯¥»¥¹¥í¥°¥Õ¥¡¥¤¥ë¤òÆÉ¤ß¤ä¤¹¤¤»þ´Ö¤ËÊÑ´¹" +"-d ¥Ñ¥é¥á¡¼¥¿¤Ç»þ´Ö¤Ç¥í¥°¥Õ¥¡¥¤¥ë¤òʬ³ä¤·¤Þ¤¹" +"by" +"reverse" +"normal" +"¸Å¤¤¥ì¥Ý¡¼¥È¤òºï½ü" +"¥Æ¥ó¥Ý¥é¥ê¥Õ¥¡¥¤¥ë¤òºï½ü" +"¥È¥Ã¥×" +"¥µ¥¤¥È" +"Sites & Users" +"Loading User table" +"Cannot load. Memory fault" +"Squid¥æ¡¼¥¶¥¢¥¯¥»¥¹¥ì¥Ý¡¼¥È" +"´ü´Ö" +"¥æ¡¼¥¶" +"¥¢¥¯¥»¥¹À襵¥¤¥È" +"Àܳ" +"¥Ð¥¤¥È¿ô" +"»ÈÍÑ»þ´Ö" +"¥ß¥êÉÃ" +"Ê¿¶Ñ" +"¸º¾¯¤·¤Æ¤¤¤ë¥¢¥¯¥»¥¹ (bytes)" +"¥æ¡¼¥¶ID" +"»þ´Ö" +"¥Ê¥ó¥Ð¡¼" +"¥Õ¥¡¥¤¥ë/´ü´Ö" +"¥ì¥Ý¡¼¥ÈºîÀ®Æü»þ" +"¥æ¡¼¥¶" +"Sort" +"Squid¥æ¡¼¥¶¥¨¡¼¥¸¥§¥ó¥È¥ì¥Ý¡¼¥È" +"¥¨¡¼¥¸¥§¥ó¥È" +"¹ç·×" +"¤³¤Î¥ì¥Ý¡¼¥È¤Ï°Ê²¼¤Î¥×¥í¥°¥é¥à¤Ë¤è¤Ã¤ÆºîÀ®¤µ¤ì¤Þ¤·¤¿" +"on" +"Æü/»þ´Ö" +"IP/NAME" +"Squid Abuse Report" +"OUT" +"IN" +"¥­¥ã¥Ã¥·¥å" +"¥æ¡¼¥¶/¥µ¥¤¥È" +"¥¹¥Þ¡¼¥È¥Õ¥£¥ë¥¿¡¼" +"Authentication failures" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/Latvian b/languages/Latvian new file mode 100644 index 0000000..e0af463 --- /dev/null +++ b/languages/Latvian @@ -0,0 +1,130 @@ +# by Juris Valdovskis +"Jâ" +"Nç" +"Latvieðu" +"Opcija" +"nepiecieðams arguments" +"Init" +"Lasu access log failu" +"Nevar atvçrt log failu" +"Nevar atvçrt pagaidu failu" +"Ieraksti nolasîti" +"ierakstîti" +"Log fails ar daþâda formâta ierakstiem" +"Pamata log formâts" +"Squid log formâts" +"Nepareizs log formâts" +"Ieraksti nav atrasti" +"Periods" +"lietojot" +"kâ pagaidu direktoriju" +"Kârtoju failu" +"Beigas" +"Parameteri" +"Datora vârds vai IP adrese" +"Datums no-lîdz" +"Datuma formâts" +"Europa" +"USA" +"IP atskaite" +"Lietot IP adresi lietotâja vietâ" +"Apmeklçtâ adrese" +"Laiks" +"Lietotâjs" +"Squid versija" +"Pagaidu direktorijs" +"Izpildes ziòojumi" +"Darbîbas ziòojumi" +"Ievades log fails" +"Izvades direktorijs" +"Izmantots" +"opcijas" +"E-pasta adrese, kur nosûtît atskaiti" +"stdout konsolei" +"Atskaite kârtojot pçc lietotâja un IP adreses" +"atskaites" +"Nevar atvçrt failu" +"AZLIEGTS" +"Atskaite veiksmîgi izveidota uz" +"Atskaite veiksmîgi izveidota un nosûtîta uz" +"Taisu failu" +"Taisu perioda failu" +"Fails" +"jau eksistç, pârceïu uz" +"Veidoju index.html" +"Kârtoju failu" +"Atskaite" +"Squid nav instalçts" +"Lûdzu izmantojiet -v, lai noteiktu Squid versiju" +"Ielâdçju konfigurâciju no" +"malloc kïûda" +"Ielâdçju paroïu failu no" +"Taisu atskaiti" +"Dekompresçju log failu" +"Kompresçju log failu" +"Fails nav atrasts" +"Nosaku IP adresi" +"Lasu useragent log failu" +"Ielâdçju izòçmumu failu no" +"izòçmums" +"Izòemot failu" +"Konfigurâcijas fails" +"Useragent log fails" +"Veidoju Useragent atskaiti" +"versija" +"limits beidzies" +"Pievienots failam" +"Konvertç access.log uz datumiem" +"Sadali log failu ar -d parametru" +"ar" +"apgriezti" +"normâls" +"Dzçðu vecos atskaiðu failus" +"Dzçðu pagaidu failus" +"Top" +"saites" +"Saites & Lietotâji" +"Ielâdçju lietotâju tabulu" +"Nevar ielâdçt. Atmiòas kïûda" +"Squid lietotâju atskaite" +"Periods" +"Lietotâjs" +"Apmeklçtâs lapas" +"Pievienot" +"Baiti" +"Izmantotais laiks" +"MILISEC" +"Vidçji" +"Samazinoði apmeklçts (baiti)" +"Lietotâjs" +"Laiks" +"Nummurs" +"Fails/Periods" +"Izveides datums" +"Lietotâji" +"Sakârtot" +"Squid Useragent's atskaite" +"AGENT" +"PAVISAM" +"Ìenerçts ar" +"uz" +"Datums/Laiks" +"IP/Vârds" +"Ârâ" +"Iekðâ" +"Keðs" +"Lietotâju saites" +"Gudrais filtrs" +"Autorizçðanâs kïûdas" +"Aizliegts" +"Topsaites" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/Polish b/languages/Polish new file mode 100644 index 0000000..d097372 --- /dev/null +++ b/languages/Polish @@ -0,0 +1,130 @@ +# by Wszebor Boksa +"Tak" +"Nie" +"Polski" +"Opcje" +"wymagany argument" +"Inicjalizacja" +"Czytam plik access log" +"Nie mo¿na otworzyæ pliku logowania" +"Nie mo¿na otworzyæ pliku przejœciowego" +"Zapisy przeczytane" +"zapisane" +"Loguj z mieszanym formatem zapisu (squid i common log)" +"Format logowania wspólny" +"Format logowania Squid'a" +"Loguj z nieprawid³owym formatem" +"Nie znaleziono danych" +"Przedzia³ czasowy" +"u¿ywam" +"jako katalog przejœciowy" +"Sortuje plik" +"Koniec" +"Parametry" +"Nazwa Host'a lub adres IP" +"Data od-do" +"Format daty" +"Europa" +"USA" +"Raport IP" +"U¿yj adresu IP zamiast USERID" +"Odwiedzane serwisy WWW" +"Czas" +"U¿ytk." +"Wersja Squid'a" +"Katalog przejœciowy" +"Komunikaty debugowania" +"Przetwarzanie komunikatów" +"Plik logowanie wejœciowy" +"Katalog wynikowy" +"U¿ytkowanie" +"opcje" +"Adres E-mail do wysy³ki raportów" +"standardowe wyjœcie dla konsoli" +"Raportuj wg. U¿ytk. i adresu IP" +"raporty" +"Nie mo¿na otworzyæ pliku" +"ZABRONIONY" +"Raport pomyœlnie wygenerowany..." +"Raport pomyœlnie wygenerowany i wys³any do" +"Tworzenie pliku" +"Tworzenie pliku przedzia³u" +"Plik" +"ju¿ istnieje, przeniesiony do" +"Tworzenie pliku index.html" +"Sortowanie pliku" +"Raport" +"Uwaga! Squid nie jest zainstalowany na tym komputerze" +"Proszê, u¿yæ parametru -v by ustawiæ wersje Squid'a" +"£adujê konfiguracje z" +"B³¹d malloc" +"£adujê plik hase³ z" +"Tworzenie raportu" +"Dekompresja pliku logowania" +"Kompresja pliku logowania" +"Plik nie zosta³ znaleziony!" +"Rozwi¹zujê adres IP" +"Czytam plik logowania useragent" +"Czytam plik wykluczenia z" +"wykluczone" +"Plik wykluczenia" +"Plik konfiguracji" +"Plik logowania agentów u¿ytkownika" +"Tworzê raport agentów u¿ytkownika" +"wersja" +"przekroczony limit" +"Dodane do pliku" +"Konwertuj plik access.log do czytelnej daty" +"Rozdziel plik logowania na datê z parametrem -d" +"przez" +"odwrotny" +"standardowy" +"Usuniecie pliku starego raportu" +"Usuniecie plików przejœciowych" +"Góra" +"serwisy" +"Serwisy & U¿ytkownicy" +"£adujê tabele U¿ytkowników" +"Nie mo¿na za³adowaæ. Pamiêæ RAM przepe³nion¹" +"Raport dostêpu U¿ytkowników do serwera Squid" +"Przedzia³ czasowy" +"U¿ytkownik" +"ODWIEDZONE SERWISY" +"PO£¥CZENIA" +"Bajt." +"CZAS U¯YTKOWANIA" +"MILISEK" +"ŒREDNIA" +"Zmniejszenie dostêpu (bajtów)" +"ID U¿ytk." +"CZAS" +"Nr" +"PLIK/PRZEDZ." +"DATA UTWORZ." +"U¯YT." +"Sortowanie" +"Raport SQUID'a - agentów U¿ytkowników" +"AGENT" +"SUMA" +"Wygenerowany przez" +"o" +"DATA/CZAS" +"IP/NAZWA" +"Wyj" +"Wyj" +"CACHE" +"Serwisy/U¿ytkownicy" +"Szybki Filtr" +"Autentykacja nie powiod³a siê!" +"Zabroniony" +"G³ówne Serwisy" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/Portuguese b/languages/Portuguese new file mode 100644 index 0000000..4aa2217 --- /dev/null +++ b/languages/Portuguese @@ -0,0 +1,130 @@ +# by Pedro Lineu Orso +"Sim" +"Nao" +"Portuguese" +"Opcao" +"requer um argumento" +"Inicio" +"Lendo arquivo acccess.log" +"Erro no open do arquivo log" +"Erro no open do arquivo temporario" +"Registros lidos" +"gravados" +"Log com registros mistos (squid e common log)" +"Log em format Common" +"Log em formato Squid" +"Log com formato invalido" +"Nao ha registros" +"Periodo" +"usando" +"como diretorio temporario" +"Classificando arquivo" +"Fim" +"Parametros" +"Hostname ou endereco IP" +"Data de-ate" +"Formato da data" +"Europa" +"EUA" +"Relatorio por IP" +"Utiliza endereco IP como usuario" +"Site acessado" +"Hora" +"Usuario" +"Squid versão" +"Diretorio para temporario" +"Mensagens de debug" +"Mensagens do processo" +"Log de entrada" +"Diretorio de saida" +"Uso" +"opcoes" +"Endereço email para envio do relatorio" +"stdout para saida na console" +"Relatorios por usuario e por endereço IP" +"relatorios" +"Erro no open do arquivo" +"NEGADO" +"Relatorio gerado com sucesso em" +"Relatorio gerado com sucesso e enviado para" +"Criando arquivo" +"Criando arquivo periodo" +"Arquivo" +"ja existe, movido para" +"Gerando index.html" +"Classificando" +"Relatorio" +"Squid nao instalado neste servidor." +"Por favor, use a opçao -v para informar a versão do Squid." +"Obtendo parametros do arquivo" +"erro no malloc" +"Carregando arquivo de senhas" +"Gerando relatorio" +"Descompactando arquivo log" +"Compactando arquivo log" +"Arquivo nao encontrado" +"Resolve endereco IP" +"Lendo arquivo useragent" +"Carregando arquivo de exclusao" +"Excluidos" +"Arquivo de exclusao" +"Arquivo de configuracao" +"Arquivo useragent log" +"Criando Useragent report" +"versao" +"Limit excedido" +"Adicionado no arquivo" +"Converte a data do access.log em formato legivel" +"Separa o access.log conforme a data entrada com -d" +"por" +"reverso" +"normal" +"Removendo relatorio antigo" +"Removendo arquivos temporarios" +"Top" +"sites" +"Sites & Users" +"Carregandpo a tabela de usuários" +"Falha de memoria na carga da tabela" +"Squid - Relatório de Acessos por Usuario" +"Periodo" +"Usuario" +"LOCAL ACESSADO" +"CONEXÃO" +"BYTES" +"TEMPO GASTO" +"MILISEG" +"MÉDIA" +"Acesso decrescente (bytes)" +"USUÁRIO" +"TEMPO" +"NUM" +"ARQUIVO/PERÍODO" +"DATA CRIAÇÃO" +"USUÁRIOS" +"Ordem" +"Squid - Relatório Useragent" +"AGENTE" +"TOTAL" +"Gerado por" +"em" +"DATA/HORA" +"IP/NOME" +"OUT" +"IN" +"CACHE" +"SitesUsers" +"SmartFilter" +"Falha de autenticação" +"Proibido" +"Topsites" +"SQUIDGUARD" +"REGRA" +"squidGuard" +"Log parsed do sarg salvo em" +"Log com formato sarg" +"Downloads" +"Gráfico" +"DIAS" +"DansGuardian" +"CAUSA" diff --git a/languages/Romanian b/languages/Romanian new file mode 100644 index 0000000..c0a5a4c --- /dev/null +++ b/languages/Romanian @@ -0,0 +1,130 @@ +# by Adrian Cretu +"Da" +"Nu" +"Romana" +"Optiune" +"necesita un argument" +"Initializare" +"Se citeste fisierul de accese" +"Nu poate fi deschis fisierul de accese" +"Nu poate fi creat fisierul temporar" +"Inregistrari citite" +"scrise" +"Fisier de loguri cu format mixat (squid si comun)" +"Loguri in format comun" +"Loguri in format squid" +"Loguri in format invalid" +"Nu s-au gasit inregistrari" +"Virgula" +"folosind" +"ca director temporar" +"Sortare fisier" +"Sfarsit" +"Parametri" +"Nume de host sau adresa IP" +"Data de la - pana la" +"Formatul datei" +"Europa" +"USA" +"Report adrese IP" +"Se foloseste adresa IP in loc de userid" +"Situri accesate" +"Ora" +"Utilizator" +"Versiunea squid" +"Director temporar" +"Mesaj de debug" +"Mesaje de proces" +"Log de intrare" +"Director de iesire" +"Utilizare" +"optiuni" +"Adresa email pentru trimiterea rapoartelor" +"stdout pentru consola" +"Rapoarte dupa user si adresa IP" +"rapoarte" +"Nu poate fi deshis fisierul" +"INTERZIS" +"Raport generat cu succes in" +"Raport generat cu succes si trimis la adresa" +"Se creaza fisierul" +"Se creaza fisierul despartit cu virgule" +"Fisier" +"exista deja, mutat in" +"Se genereaza fisierul index.html" +"Se sorteaza fisierul" +"Raport" +"Squid nu este instalat pe aceasta masina" +"Va rog sa folositi optiunea -v pentru a specifica versiunea de Squid" +"Se incarca configuratia din" +"eroare la apelul malloc" +"Se incarca fisierul de parole din" +"Se genereaza raportul" +"Se decompreseaza fisierul de loguri" +"Fisier de loguri comprimat" +"Fisierul nu a putut fi gasit" +"Se rezolva adresa de IP" +"Se citeste logul useragent" +"Se incarca fisierul de excluderi din" +"exclus" +"Fisierul de excluderi" +"Fisierul de configurare" +"Logurile useragent" +"Se genereaza raportul useragent" +"versiune" +"limita depasita" +"Adaugat la fisierul" +"Se converteste fisierul access.log catre o data legitima" +"Se imparte fisierul de loguri dupa data in parametrul -d" +"dupa" +"invers" +"normal" +"Se sterge vechiul raport" +"Se sterg fisierele temporare" +"Topul primelor" +"situri" +"Situri & Utilizatori" +"Se incarca tabela de utilizatori" +"Nu se poate incarca. Problema de memorie" +"Raportul de acces Squid" +"Perioada" +"Utilizator" +"SIT ACCESAT" +"CONECTARI" +"OCTETI" +"TIMP FOLOSIT" +"MILISECUNDE" +"MEDIU" +"Acces descrescator (octeti)" +"HOST" +"ORA" +"NR." +"FISIER/PERIOADA" +"DATA CREARII" +"UTILIZATORI" +"Sortare" +"Raportul Squid Useragent" +"AGENT" +"TOTAL" +"Generat de" +"la" +"DATA/ORA" +"IP/NUME" +"IESIRE" +"INTRARE" +"CACHE" +"SitesUsers" +"SmartFilter" +"Autentificari esuate" +"Interzis" +"Topul siturilor -" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/Russian_koi8 b/languages/Russian_koi8 new file mode 100644 index 0000000..fbac81d --- /dev/null +++ b/languages/Russian_koi8 @@ -0,0 +1,130 @@ +# by Andrew Okhmat +"äÁ" +"îÅÔ" +"Russian" +"ðÁÒÁÍÅÔÒÙ" +"ÔÒÅÂÕÅÔÓÑ ÁÒÇÕÍÅÎÔ" +"éÎÉÃÉÁÌÉÚÁÃÉÑ" +"þÔÅÎÉÅ ÆÁÊÌÁ ÖÕÒÎÁÌÁ" +"îÅ ÍÏÇÕ ÏÔËÒÙÔØ ÆÁÊÌ ÖÕÒÎÁÌÁ" +"îÅ ÍÏÇÕ ÏÔËÒÙÔØ ×ÒÅÍÅÎÎÙÊ ÆÁÊÌ" +"úÁÐÉÓÅÊ ÐÒÏÞÉÔÁÎÏ" +"ÚÁÐÉÓÁÎÏ" +"öÕÒÎÁÌ ÓÏÄÅÒÖÉÔ ÚÁÐÉÓÉ ÒÁÚÎÙÈ ÆÏÒÍÁÔÏ× (squid É ÄÒ.)" +"öÕÒÎÁÌ ÄÒÕÇÏÇÏ ÆÏÒÍÁÔÁ" +"öÕÒÎÁÌ × Squid-ÆÏÒÍÁÔÅ" +"öÕÒÎÁÌ × ÎÅ×ÅÒÎÏÍ ÆÏÒÍÁÔÅ" +"úÁÐÉÓÉ ÎÅ ÎÁÊÄÅÎÙ" +"ðÅÒÉÏÄ" +"ÉÓÐÏÌØÚÕÅÔÓÑ" +"ËÁË ×ÒÅÍÅÎÎÙÊ ËÁÔÁÌÏÇ" +"óÏÒÔÉÒÏ×ËÁ ÆÁÊÌÏ×" +"úÁ×ÅÒÛÅÎÏ" +"ðÁÒÁÍÅÔÒÙ" +"éÍÑ ÉÌÉ IP-ÁÄÒÅÓ" +"äÁÔÁ ÏÔ-ÄÏ" +"æÏÒÍÁÔ ÄÁÔÙ" +"å×ÒÏÐÁ" +"áÍÅÒÉËÁ" +"IP ÏÔÞÅÔ" +"éÓÐÏÌØÚÏ×ÁÔØ Ip-ÁÄÒÅÓ ×ÍÅÓÔÏ ÉÍÅÎÉ ÐÏÌØÚÏ×ÁÔÅÌÑ" +"áÄÒÅÓÁ" +"÷ÒÅÍÑ" +"éÍÑ" +"÷ÅÒÓÉÑ Squid" +"÷ÒÅÍÅÎÎÙÊ ËÁÔÁÌÏÇ" +"ïÔÌÁÄÏÞÎÙÅ ÓÏÏÂÝÅÎÉÑ" +"òÁÂÏÞÉÅ ÓÏÏÂÝÅÎÉÑ" +"÷ÈÏÄÑÝÉÊ ÖÕÒÎÁÌ" +"÷ÙÈÏÄÎÏÊ ËÁÔÁÌÏÇ" +"éÓÐÏÌØÚÏ×ÁÎÏ" +"ÐÁÒÁÍÅÔÒÙ" +"E-mail ÁÄÒÅÓ ÄÌÑ ÐÏÓÙÌËÉ ÏÔÞÅÔÁ" +"ÓÔ.×Ù×ÏÄ ÎÁ ËÏÎÓÏÌØ" +"ïÔÞÅÔ ÐÏ ÐÏÌØÚÏ×ÁÔÅÌÑÍ É IP-ÁÄÒÅÓÁÍ" +"ÏÔÞÅÔÙ" +"îÅ ÍÏÇÕ ÏÔËÒÙÔØ ÆÁÊÌ" +"úáðòåô" +"ïÔÞÅÔ ÕÓÐÅÛÎÏ ÓÇÅÎÅÒÉÒÏ×ÁÎ ×:" +"ïÔÞÅÔ ÕÓÐÅÛÎÏ ÓÇÅÎÅÒÉÒÏ×ÁÎ É ÏÔÏÓÌÁÎ" +"óÏÚÄÁÎÉÅ ÆÁÊÌÁ" +"óÏÚÄÁÎÉÅ ÆÁÊÌÁ ÐÅÒÉÏÄÁ" +"æÁÊÌ" +"ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ, ÐÅÒÅÎÅÓÅÎ ×" +"óÏÚÄÁÎÉÅ index.html" +"óÏÒÔÉÒÏ×ËÁ ÆÁÊÌÏ×" +"ïÔÞÅÔ" +"Squid ÎÅ ÕÓÔÁÎÏ×ÌÅÎ ÎÁ ÜÔÏÊ ÍÁÛÉÎÅ" +"ðÏÖÁÌÕÊÓÔÁ, ÉÓÐÏÌØÚÕÊÔÅ ÐÁÒÁÍÅÔÒ -v ÄÌÑ ÚÁÄÁÎÉÑ ×ÅÒÓÉÉ Squid" +"úÁÇÒÕÚËÁ ËÏÎÆÉÇÕÒÁÃÉÉ ÉÚ" +"ÏÛÉÂËÁ malloc" +"úÁÇÒÕÚËÁ ÆÁÊÌÁ ÐÁÒÏÌÅÊ ÉÚ" +"óÏÚÄÁÎÉÅ ÏÔÞÅÔÁ" +"òÁÓÐÁËÏ×ËÁ ÆÁÊÌÁ ÖÕÒÎÁÌÁ" +"óÖÁÔÉÅ ÆÁÊÌÁ ÖÕÒÎÁÌÁ" +"æÁÊÌ ÎÅ ÎÁÊÄÅÎ" +"ïÐÒÅÄÅÌÅÎÉÅ IP-ÁÄÒÅÓÁ" +"þÔÅÎÉÅ ÖÕÒÎÁÌÁ ÂÒÏÕÚÅÒÏ×" +"úÁÇÒÕÚËÁ ÉÓËÌÀÞÅÎÉÊ ÉÚ" +"ÉÓËÌÀÞÅÎÙ" +"æÁÊÌ ÉÓËÌÀÞÅÎÉÊ" +"æÁÊÌ ËÏÎÆÉÇÕÒÁÃÉÉ" +"öÕÒÎÁÌ ÂÒÏÕÚÅÒÏ×" +"óÏÚÄÁÎÉÅ ÏÔÞÅÔÁ ÐÏ ÂÒÏÕÚÅÒÁÍ" +"×ÅÒÓÉÑ" +"ÌÉÍÉÔ ÐÒÅ×ÙÛÅÎ" +"äÏÂÁ×ÌÅÎÏ × ÆÁÊÌ" +"ëÏ×ÅÒÔÉÒÕÊÔÅ ÆÁÊÌ access.log, ÞÔÏÂÙ ÄÁÔÁ ÂÙÌÁ ÐÏÎÑÔÎÏÊ" +"òÁÚÄÅÌÉÔÅ log ÆÁÊÌ ÐÏ ÄÁÔÅ, ÉÓÐÏÌØÚÕÑ ÐÁÒÁÍÅÔÒ -d" +"ÐÏ" +"× ÏÂÒÁÔÎÏÍ ÐÏÒÑÄËÅ" +"× ÏÂÙÞÎÏÍ ÐÏÒÑÄËÅ" +"õÄÁÌÑÀ ÓÔÁÒÙÊ ÆÁÊÌ ÏÔÞÅÔÁ" +"õÄÁÌÑÀ ×ÒÅÍÅÎÎÙÅ ÆÁÊÌÙ" +"ôÏÐ" +"óÁÊÔÙ" +"óÁÊÔÙ É ðÏÌØÚÏ×ÁÔÅÌÉ" +"úÁÇÒÕÖÁÀ ÔÁÂÌÉÃÕ ÐÏÌØÚÏ×ÁÔÅÌÑ" +"îÅ ÍÏÇÕ ÚÁÇÒÕÚÉÔØ. ïÛÉÂËÁ ÐÁÍÑÔÉ" +"ïÔÞÅÔ Ï ÒÁÂÏÔÅ ÐÏÌØÚÏ×ÁÔÅÌÅÊ ÞÅÒÅÚ Squid" +"ðÅÒÉÏÄ" +"ðÏÌØÚÏ×ÁÔÅÌØ" +"áÄÒÅÓÁ" +"ðÏÄËÌÀÞÅÎÉÊ" +"âÁÊÔ" +"ïÂÝÅÅ ×ÒÅÍÑ" +"íÉÌÌÉÓÅË." +"óÒÅÄÎÑÑ" +"ðÏ ÕÂÙ×ÁÎÉÀ (ÂÁÊÔÙ)" +"ðÏÌØÚÏ×ÁÔÅÌØ" +"÷ÒÅÍÑ" +"No" +"ðÅÒÉÏÄ" +"äÁÔÁ ÓÏÚÄÁÎÉÑ" +"ðÏÌØÚÏ×ÁÔÅÌÅÊ" +"ïÔÓÏÒÔÉÒÏ×ÁÎÏ" +"ïÔÞÅÔ Squid ÐÏ ÂÒÏÕÚÅÒÁÍ" +"âÒÏÕÚÅÒ" +"÷ÓÅÇÏ" +"óÇÅÎÅÒÉÒÏ×ÁÎ" +"ÎÁ" +"äÁÔÁ/÷ÒÅÍÑ" +"IP/éÍÑ" +"OUT" +"IN" +"CACHE" +"SitesUsers" +"SmartFilter" +"Authentication Failures" +"Denied" +"Topsites" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/Russian_windows1251 b/languages/Russian_windows1251 new file mode 100644 index 0000000..fb6beea --- /dev/null +++ b/languages/Russian_windows1251 @@ -0,0 +1,130 @@ +# by Palamarchuk Eugen and Dima I. Allaverdov +"Äà" +"Íåò" +"Russian" +"Ïàðàìåòðû" +"òðåáóåòñÿ àðãóìåíò" +"Èíèöèàëèçàöèÿ" +"×òåíèå ôàéëà æóðíàëà" +"Íå ìîãó îòêðûòü ôàéë æóðíàëà" +"Íå ìîãó îòêðûòü âðåìåííûé ôàéë" +"Çàïèñåé ïðî÷èòàíî" +"çàïèñàíî" +"Æóðíàë ñîäåðæèò çàïèñè ðàçíûõ ôîðìàòîâ (squid è äð.)" +"Æóðíàë äðóãîãî ôîðìàòà" +"Æóðíàë â Squid-ôîðìàòå" +"Æóðíàë â íåâåðíîì ôîðìàòå" +"Çàïèñè íå íàéäåíû" +"Ïåðèîä" +"èñïîëüçóåòñÿ" +"êàê âðåìåííûé êàòàëîã" +"Ñîðòèðîâêà ôàéëîâ" +"Çàâåðøåíî" +"Ïàðàìåòðû" +"Èìÿ èëè IP-àäðåñ" +"Äàòà îò-äî" +"Ôîðìàò äàòû" +"Åâðîïà" +"Àìåðèêà" +"IP îò÷åò" +"Èñïîëüçîâàòü Ip-àäðåñ âìåñòî èìåíè ïîëüçîâàòåëÿ" +"Àäðåñà" +"Âðåìÿ" +"Èìÿ" +"Âåðñèÿ Squid" +"Âðåìåííûé êàòàëîã" +"Îòëàäî÷íûå ñîîáùåíèÿ" +"Ðàáî÷èå ñîîáùåíèÿ" +"Âõîäÿùèé æóðíàë" +"Âûõîäíîé êàòàëîã" +"Èñïîëüçîâàíî" +"ïàðàìåòðû" +"E-mail àäðåñ äëÿ ïîñûëêè îò÷åòà" +"ñò.âûâîä íà êîíñîëü" +"Îò÷åò ïî ïîëüçîâàòåëÿì è IP-àäðåñàì" +"îò÷åòû" +"Íå ìîãó îòêðûòü ôàéë" +"ÇÀÏÐÅÒ" +"Îò÷åò óñïåøíî ñãåíåðèðîâàí â:" +"Îò÷åò óñïåøíî ñãåíåðèðîâàí è îòîñëàí" +"Ñîçäàíèå ôàéëà" +"Ñîçäàíèå ôàéëà ïåðèîäà" +"Ôàéë" +"óæå ñóùåñòâóåò, ïåðåíåñåí â" +"Ñîçäàíèå index.html" +"Ñîðòèðîâêà ôàéëîâ" +"Îò÷åò" +"Squid íå óñòàíîâëåí íà ýòîé ìàøèíå" +"Ïîæàëóéñòà, èñïîëüçóéòå ïàðàìåòð -v äëÿ çàäàíèÿ âåðñèè Squid" +"Çàãðóçêà êîíôèãóðàöèè èç" +"îøèáêà malloc" +"Çàãðóçêà ôàéëà ïàðîëåé èç" +"Ñîçäàíèå îò÷åòà" +"Ðàñïàêîâêà ôàéëà æóðíàëà" +"Ñæàòèå ôàéëà æóðíàëà" +"Ôàéë íå íàéäåí" +"Îïðåäåëåíèå IP-àäðåñà" +"×òåíèå æóðíàëà áðîóçåðîâ" +"Çàãðóçêà èñêëþ÷åíèé èç" +"èñêëþ÷åíû" +"Ôàéë èñêëþ÷åíèé" +"Ôàéë êîíôèãóðàöèè" +"Æóðíàë áðîóçåðîâ" +"Ñîçäàíèå îò÷åòà ïî áðîóçåðàì" +"âåðñèÿ" +"ëèìèò ïðåâûøåí" +"Äîáàâëåíî â ôàéë" +"Êîâåðòèðóéòå ôàéë access.log, ÷òîáû äàòà áûëà ïîíÿòíîé" +"Ðàçäåëèòå log ôàéë ïî äàòå, èñïîëüçóÿ ïàðàìåòð -d" +"ïî" +"â îáðàòíîì ïîðÿäêå" +"â îáû÷íîì ïîðÿäêå" +"Óäàëÿþ ñòàðûé ôàéë îò÷åòà" +"Óäàëÿþ âðåìåííûå ôàéëû" +"Òîï" +"Ñàéòû" +"Ñàéòû è Ïîëüçîâàòåëè" +"Çàãðóæàþ òàáëèöó ïîëüçîâàòåëÿ" +"Íå ìîãó çàãðóçèòü. Îøèáêà ïàìÿòè" +"Îò÷åò î ðàáîòå ïîëüçîâàòåëåé ÷åðåç Squid" +"Ïåðèîä" +"Ïîëüçîâàòåëü" +"Àäðåñà" +"Ïîäêëþ÷åíèé" +"Áàéò" +"Îáùåå âðåìÿ" +"Ìèëëèñåê." +"Ñðåäíÿÿ" +"Ïî óáûâàíèþ (áàéòû)" +"Ïîëüçîâàòåëü" +"Âðåìÿ" +"No" +"Ïåðèîä" +"Äàòà ñîçäàíèÿ" +"Ïîëüçîâàòåëåé" +"Îòñîðòèðîâàíî" +"Îò÷åò Squid ïî áðîóçåðàì" +"Áðîóçåð" +"Âñåãî" +"Ñãåíåðèðîâàí" +"íà" +"Äàòà/Âðåìÿ" +"IP/Èìÿ" +"OUT" +"IN" +"CACHE" +"SitesUsers" +"SmartFilter" +"Authentication Failures" +"Denied" +"Topsites" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/Serbian b/languages/Serbian new file mode 100644 index 0000000..7016d2c --- /dev/null +++ b/languages/Serbian @@ -0,0 +1,131 @@ +# by Radovan Drobnjakovic +"Yes" +"No" +"Serbian" +"Izbor" +"potreban argument" +"Init" +"Citanje access log datoteke" +"Nemoguce otvoriti log datoteku" +"Nemoguce otvoriti privremanu datoteku" +"Podaci procitani" +"upisano" +"Log ima pomesan format podataka (squid i common log)" +"Common log format" +"Squid log format" +"Log sa pogresnim formatom" +"Podaci nisu pronadjeni" +"Period" +"koristeci" +"kao privremen direktorijum" +"Sortiranje datoteke" +"Kraj" +"Parametri" +"Racunar ili njegova IP adresa" +"Datum od-do" +"Format datuma" +"Evropski" +"USA" +"IP izvestaj" +"Upotrebi IP adresu umesto korisnicke identifikacije" +"Posecene adrese na internetu" +"Vreme" +"Korisnik" +"Squid verzija" +"Privremeni direktorijum" +"Debug poruke" +"Obradi poruke" +"Ulazni log" +"Izlazni dir" +"Upotreba" +"izbor" +"E-mail adresa za slanje izvestaja" +"stdout za konzolu" +"Izvaestaj po korisniku i IP adresi" +"izvestaj" +"Nemoguce otvoriti datoteku ili je los putokaz" +"ODBIJA SE" +"Uspesno je generisan izvestaj" +"Izvestaj je uspesno generisan i upucen na" +"Pravljenje datoteke" +"Pravljenje datoteke za period" +"Datoteka" +"Vec postoji, preseljeno na" +"Pravljenje datoteke index.html" +"Sortiranje datoteke" +"Izvestaj" +"Squid nije instaliran na ovom racunaru" +"Upotrebi -v da podesis verziju za Squid" +"Ucitavanje konfiguracije iz" +"malloc greska" +"Ucitavanje datoteke sa lozinkama iz" +"Pravljenje izvestaja" +"Decompresija log datoteke" +"Kompresija log datoteke" +"Datoteka nije nadjena ili je los putokaz" +"Razresi IP Adresu" +"Citanje useragent log-a" +"Ucitavanje exclude datoteke iz" +"iskljuceno" +"Iskljuci datoteku" +"Konfiguraciona datoteka" +"Useragent log" +"Izvestaj o zloupotrebi" +"Pravljenje Useragent izvestaja" +"Pravljenje izvestaja o zloupotrebi" +"verzija" +"limit prekoracen" +"Dodato datoteci" +"Prevodjenje access.log datoteke u ? datum" +"Razdvajanje log datoteke preko -d parametra" +"by" +"obrnuti" +"normalno" +"Sklonjen stari izvestaj" +"Sklonjen privremeni izvestaj" +"Vrh" +"sajtovi" +"Sites & Users" +"Loading User table" +"Cannot load. Memory fault" +"Izvestaj o pristupu Squid korisnika" +"Period" +"Korisnik" +"POSECENE ADRESE NA INTERNET-u" +"BROJ KONEKCIJA" +"BAJTOVA" +"UPOTREBLJENO VREME" +"MILISEKUNDE" +"PROCENTUALNO" +"Smanjivanje pristupa (bajtova)" +"KORISNIK" +"VREME" +"BROJ" +"DATOTEKA/PERIOD" +"DATUM KREIRANJA" +"KORISNICI" +"Sortiranje" +"Squid Useragent izvestaj" +"AGENT" +"UKUPNO" +"Generisano od" +"on" +"DATUM/VREME" +"IP/IME" +"Squid izvestaj o zloupotrebi" +"IZASLO" +"USLO" +"CACHE" +"SitesUsers" +"SmartFilter" +"Authentication failures" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DansGuardian" +"DAYS" +"CAUSE" diff --git a/languages/Slovak b/languages/Slovak new file mode 100644 index 0000000..4be7c2d --- /dev/null +++ b/languages/Slovak @@ -0,0 +1,130 @@ +# by Du¹an Woletz +"Áno" +"Nie" +"Slovenèina" +"Voµba" +"vy¾aduje argument" +"Inicializácia" +"Èítam prístupový ¾urnál" +"Nemô¾em otvorí» ¾urnál" +"Nemô¾em otvorí» doèasný súbor" +"Záznamov naèítano" +"zapísane" +"®urnál má zmie¹ané oba ¾urnálové formáty (v¹eobecný a squid ¾urnál)" +"V¹eobecný formát ¾urnálu" +"Squid formát ¾urnálu" +"®urnál s neplatným formátom" +"Nena¹iel som ¾iadne záznamy" +"Obdobie" +"pou¾il som" +"ako prechodný adresár" +"Triedím súbor" +"Koniec" +"Parametre" +"Meno hostiteµa alebo IP adresa" +"Dátum od-do" +"Formát data" +"Európa" +"USA" +"IP správa" +"Pou¾i IP Adresu namiesto ID u¾ívateµa" +"Nav¹tívený server" +"Èas" +"U¾ívateµ" +"verzia Squidu" +"Doèasný adresár" +"Ladiaca zprávy" +"Správy o spracování" +"Vstupný ¾urnál" +"Výstupný adresár" +"Pou¾itie" +"voµby" +"Emailová adresa, na ktorú sa majú odosla» prehµady" +"stdout pre konzolu" +"Prehµady podµa u¾ívatela a IP adresy" +"prehµady" +"Nedá sa otvori» súbor" +"Zakázané" +"Prehµad úspe¹ne vygenerovaný" +"Prehµad úspe¹ne vygenerovaný a zaslaný na adresu" +"Vytváram súbor" +"Vytváram súbor období" +"Súbor" +"u¾ existuje, presúvám do" +"Vytváram index.html" +"Triedim súbor" +"Prehµad" +"Squid není na tomto poèítaèi nain¹talováný" +"Prosíme pou¾ite voµbu -v pre definovanie verzie Squidu" +"Naèítávam konfiguráciu z" +"chyba malloc" +"Naèítávam heslo zo súboru" +"Vytváram správu" +"Rozbaµujem ¾urnálový súbor" +"Balím ¾urnálový súbor" +"Súbor nebol nájdený" +"Prevádzam IP adresu na meno" +"Naèitávam ¾urnál s prehµadom klientov" +"Naèítávam súbor výnimok z" +"vyòaté" +"Súbor výnimok" +"Konfiguraèný súbor" +"®urnál s prehµadom klientov" +"Vytváram prehµad o klientoch" +"verzia" +"limit prekroèený" +"Pridáné do súboru" +"Prevedie súbor access.log na správný dátum" +"Rozdelí ¾urnálový súbor podµa data v parametru -d" +", napísal" +"opaène" +"normálne" +"Odstraòujem starý súbor s prehµadom" +"Odstraòujem prechodný súbor" +"Najlep¹ích" +"serverov" +"Tý¾dne" +"Loading User table" +"Cannot load. Memory fault" +"Prehµad o vyu¾ití Squidu podµa u¾ivatelov" +"Obdobie" +"U¾ívateµ" +"NAV©TÍVENÝ SERVER" +"SPOJENÍ" +"BYTOV" +"POU®ITÝ ÈAS" +"MILISEC" +"PRIEMER" +"Klesajúcí prístup (bytov)" +"ID U®ÍVATE¥A" +"ÈAS" +"PORADIE" +"SÚBOR/OBDOBIE" +"DÁTUM VZNIKU" +"U®ÍVATELIA" +"Triedenie" +"Prehµad o pou¾itých klientech pre Squid" +"KLIENT" +"CELKOM" +"Generoval" +"dòa" +"dátum/èas" +"IP/MÉNO" +"VÝSTUP" +"VSTUP" +"CACHE" +"SitesUsers" +"SmartFilter" +"Authentication Failures" +"Denied" +"Topsites" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/Spanish b/languages/Spanish new file mode 100644 index 0000000..76e3f0c --- /dev/null +++ b/languages/Spanish @@ -0,0 +1,130 @@ +# by Leonardo A. D'Angelo and Jose Luis Hernandez Lopez +"Si" +"No" +"Español" +"Opción" +"requiere un argumento" +"Inicialización" +"Leyendo archivo de log de accesos" +"No se puede abrir archivo de log" +"No se puede abrir archivo temporal" +"Registros leidos" +"escritos" +"El log tiene formatos de registro mezclados (squid y common log)" +"Formato Common log" +"Formato Squid log" +"Log con formato invalido" +"No se encontraron registros" +"Periodo" +"usando" +"como archivo temporario" +"Ordenando archivo" +"Fin" +"Parametros" +"Nombre de host o direccion IP" +"Fecha desde-hasta" +"Formato de fecha" +"Europa" +"USA" +"Reporte IP" +"Usa direccion IP en vez de userid" +"Sitio accedido" +"Hora" +"Usuario" +"Version de Squid" +"Directorio temporal" +"Mensajes de depuración" +"Mensajes de procesos" +"Log de entrada" +"Directorio de salida" +"Modo de uso" +"opciones" +"Direccion e-mail a donde enviar reportes" +"stdout para consola" +"Reportes por usuario y direccion IP" +"reportes" +"No se puede abrir archivo" +"DENEGADO" +"Reporte generado satisfactoriamente en" +"Reporte generado satisfactoriamente y enviado a" +"Creando archivo" +"Creando archivo de periodo" +"Archivo" +"ya existe, renombrando como" +"Creando index.html" +"Ordenando archivo" +"Reporte" +"Squid no instalado en esta maquina" +"Por favor, use la opcion -v para configurar la version de Squid" +"Cargando configuracion desde" +"error malloc" +"Cargando archivo de passwords desde" +"Creando reporte" +"Descompactando archivo de log" +"Compactando archivo de log" +"Archivo no encontrado" +"Resolviendo direccion IP" +"Leyendo log del agente de usuario" +"Cargando archivo de exclusiones desde" +"excluido" +"Archivo de exclusiones" +"Archivo de configuracion" +"Log del agente de usuario" +"Creando reporte de agente de usuario" +"version" +"limite excedido" +"Agregado al archivo" +"Convierte el archivo access.log a una fecha legible" +"Cambia el archivo de log por fecha en el parametro -d" +"por" +"inverso" +"normal" +"Borrando archivos viejos del reporte" +"Borrando archivos temporales" +"Top" +"sitios" +"Sitios y Usuarios" +"Cargando tabla de usuarios" +"No se puede cargar. Fallo de memoria" +"Reporte de Accesos de Usuarios de Squid" +"Período" +"Usuario" +"SITIO ACCEDIDO" +"CONEXION" +"BYTES" +"TIEMPO UTILIZADO" +"MILISEC" +"PROMEDIO" +"Acceso Decreciente (bytes)" +"USERID" +"HORA" +"NUM" +"ARCHIVO/PERIODO" +"FECHA CREACION" +"USUARIOS" +"Clasificado por" +"Reporte de Agente de Usuario Squid" +"AGENTE" +"TOTAL" +"Generado por" +"el" +"FECHA/HORA" +"IP/NOMBRE" +"SALIDA" +"ENTRADA" +"CACHE" +"Sitios de Usuarios" +"SmartFilter" +"Fallos de autenticaci&ocaute;n" +"Denegado" +"Topsites" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Bajados" +"Gráficos" +"DIAS" +"DansGuardian" +"CAUSA" diff --git a/languages/Turkish b/languages/Turkish new file mode 100644 index 0000000..33ef742 --- /dev/null +++ b/languages/Turkish @@ -0,0 +1,130 @@ +# by Evren Yurtesen +"Evet" +"Hayir" +"Turkish" +"Opsiyon" +"bir arguman gerekli" +"Init" +"erisim kutuk dosyasi okunuyor" +"Kutuk dosyasi acilamadi" +"Gecici dosya acilamadi" +"Okunan kayitlar" +"yazilan" +"Kutukte karisik bicimde kayitlar var (squid ve common kutuk)" +"Common kutuk bicimi" +"Squid kutuk bicimi" +"Gecersiz bicimdeki kutuk" +"Kayit bulunamadi" +"Periyod" +"gecici dizin olarak" +"kullaniliyor" +"Dosya siralaniyor" +"Son" +"Parametreler" +"Host ismi veya IP adresi" +"Tarih baslangic-bitis" +"Tarih bicimi" +"Avrupa" +"ABD" +"IP raporu" +"Userid yerine IP Adresi kullan" +"Erisilen site" +"Zaman" +"Kullanici" +"Squid surumu" +"Gecici dizin" +"Debug mesajlari" +"Islem mesajlari" +"Girdi kutugu" +"Cikti dizini" +"kullanim" +"opsiyonlar" +"Raporlari gondermek icin e-posta adresi" +"konsol icin stdout" +"Kullanici ve IP adresi ile raporlar" +"raporlar" +"Dosya acilamiyor" +"IZIN YOK" +"Raporun basari ile yaratildigi yer" +"Rapor basari ile yaratildi ve gonderildigi yer" +"Dosya yaratiliyor" +"Periyod dosyasi yaratiliyor" +"Dosya" +"zaten var, tasindigi yer" +"index.html yaratiliyor" +"Dosya siralaniyor" +"Rapor" +"Bu makinede squid kurulu degil" +"Lutfen, -v opsiyonunu Squid surumunu ayarlamak icin kullanin" +"Konfigurasyonun yuklendigi yer" +"malloc hatasi" +"Password dosyasinin yuklendigi yer" +"Rapor yaratiliyor" +"Kutuk dosyasi aciliyor" +"Kutuk dosyasi sikistiriliyor" +"Dosya bulunamadi" +"IP addreslerini Host ismine donustur" +"useragent kutugu okunuyor" +"Exclude dosyasi okunuyor" +"exclude yapildi" +"Exclude dosyasi" +"Konfigurasyon dosyasi" +"Useragent kutugu" +"Useragent raporu yaratiliyor" +"surum" +"limit asildi" +"Dosyaya eklendi" +"access.log dosyasini okunakli bir tarihe cevir" +"log dosyasini -d paremetresindeki tarihe gore parcala" +"ile" +"ters" +"normal" +"Eski rapor dosya(lar) siliniyor" +"Gecici dosya(lar) siliniyor" +"Top" +"siteler" +"Siteler & Kullanicilar" +"Kullanici tablosu yukleniyor" +"Yuklenemiyor. Hafiza hatasi" +"Squid Kullanicilari Erisim Raporu" +"Periyod" +"Kullanici" +"SITE" +"BAGLANTI" +"BYTE" +"HARCANAN ZAMAN" +"MILISANIYE" +"ORTALAMA" +"Azalan erisim (byte)" +"KULLANICI ADI" +"ZAMAN" +"USERID" +"DOSYA/PERIYOD" +"YARATILIS TARIHI" +"KULLANICILAR" +"Siralama" +"Squid Useragent'in Raporu" +"AGENT" +"TOPLAM" +"Yaratilma Tarihi" +"ile" +"TARIH/SAAT" +"IP/ISIM" +"DISARI" +"ICERI" +"CACHE" +"SitelerKullanicilar" +"SmartFilter" +"Authentication failures" +"Denied" +"Topsites" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +"DansGuardian" +"CAUSE" diff --git a/languages/Ukrainian_windows1251 b/languages/Ukrainian_windows1251 new file mode 100644 index 0000000..fd09847 --- /dev/null +++ b/languages/Ukrainian_windows1251 @@ -0,0 +1,130 @@ +# by Roman Vynar +"Òàê" +"ͳ" +"Ukrainian" +"Ïàðàìåòðè" +"ïîòð³áíèé ïàðàìåòð" +"²í³ö³àë³çàö³ÿ" +"×èòàííÿ ôàéëó æóðíàëó" +"Íå ìîæó â³äêðèòè ôàéë æóðíàëó" +"Íå ìîæó â³äêðèòè òèì÷àñîâèé ôàéë" +"Çàïèñ³â ïðî÷èòàíî" +"çàïèñàíî" +"Æóðíàë ì³ñòèòü çàïèñè ð³çíèõ ôîðìàò³â (squid ³ ³í.)" +"Æóðíàë ³íøîãî ôîðìàòó" +"Æóðíàë â Squid-ôîðìàò³" +"Æóðíàë â íåâ³ðíîìó ôîðìàò³" +"Çàïèñè íå çíàéäåí³" +"Ïåð³îä" +"Âèêîðèñòîâóºòüñÿ" +"ÿê òèì÷àñîâèé êàòàëîã" +"Ñîðòóâàííÿ ôàéë³â" +"Çðîáëåíî" +"Ïàðàìåòðè" +"Õîñò àáî IP-àäðåñà" +"Äàòà â³ä-äî" +"Ôîðìàò äàòè" +"ªâðîïà" +"ÑØÀ" +"IP çâ³ò" +"Âèêîðèñòîâóâàòè Ip-àäðåñó çàì³ñòü ³ìåí³ êîðèñòóâà÷à" +"Àäðåñà" +"×àñ" +"Êîðèñòóâà÷" +"Âåðñ³ÿ Squid" +"Òèì÷àñîâèé êàòàëîã" +"³äëàãîäæóâàëüí³ ïîâ³äîìëåííÿ" +"Ðîáî÷³ ïîâ³äîìëåííÿ" +"Âõ³äíèé æóðíàë" +"Âèõ³äíèé êàòàëîã" +"Âèêîðèñòàííÿ" +"ïàðàìåòðè" +"E-mail àäðåñà äëÿ â³äïðàâêè çâ³òó" +"ñò. âèâ³ä íà êîíñîëü" +"Çâ³ò ïî êîðèñòóâà÷àõ ³ IP-àäðåñàõ" +"çâ³òè" +"Íå ìîæó â³äêðèòè ôàéë" +"ÇÀÁÎÐÎÍÀ" +"Çâ³ò óñï³øíî ñãåíåðîâàíèé â:" +"Çâ³ò óñï³øíî ñãåíåðîâàíèé ³ íàä³ñëàíèé" +"Ñòâîðåííÿ ôàéëó" +"Ñòâîðåííÿ ôàéëó ïåð³îäó" +"Ôàéë" +"âæå ³ñíóº, ïåðåíåñåíèé â" +"Ñòâîðåííÿ index.html" +"Ñîðòóâàííÿ ôàéë³â" +"Çâ³ò" +"Squid íå âñòàíîâëåíèé íà ö³é ìàøèí³" +"Áóäü-ëàñêà, âèêîðèñòàéòå ïàðàìåòð -v äëÿ âñòàíîâëåííÿ âåðñ³¿ Squid" +"Çàâàíòàæåííÿ êîíô³ãóðàö³¿ ç" +"Ïîìèëêà malloc" +"Çàâàíòàæåííÿ ôàéëó ïàðîë³â ³ç" +"Ñòâîðåííÿ çâ³òó" +"Ðîçïàêóâàííÿ ôàéëó æóðíàëó" +"Ïàêóâàííÿ ôàéëó æóðíàëó" +"Ôàéë íå çíàéäåíèé" +"Âèçíà÷åííÿ IP-àäðåñè" +"×èòàííÿ æóðíàëó áðîóçåð³â" +"Çàâàíòàæåííÿ âèêëþ÷åíü ¿ç" +"âèêëþ÷åí³" +"Ôàéë âèêëþ÷åíü" +"Ôàéë êîíô³ãóðàö³¿" +"Æóðíàë áðîóçåð³â" +"Ñòâîðåííÿ çâ³òó ïî áðîóçåðàõ" +"âåðñ³ÿ" +"ë³ì³ò ïåðåâèøåíèé" +"Äîäàíî ó ôàéë" +"Êîíâåðòóéòå ôàéë access.log, ùîá äàòà áóëà çðîçóì³ëîþ" +"Ðîçä³ë³òü log ôàéë ïî äàò³, âèêîðèñòîâóþ÷è ïàðàìåòð -d" +"ïî" +"â çâîðîòíüîìó ïîðÿäêó" +"ïî ïîðÿäêó" +"Çíèùóþ ñòàðèé ôàéë çâ³òó" +"Çíèùóþ òèì÷àñîâ³ ôàéëè" +"Òîï" +"Ñàéòè" +"Ñàéòè ³ Êîðèñòóâà÷³" +"Çàâàíòàæóþ òàáëèöþ êîðèñòóâà÷à" +"Íå ìîæó çàâàíòàæèòè. Ïîìèëêà ïàì'ÿò³" +"Çâ³ò ïðî ðîáîòó êîðèñòóâà÷³â ÷åðåç Squid" +"Ïåð³îä" +"Êîðèñòóâà÷" +"Àäðåñà" +"ϳäêëþ÷åííÿ" +"Áàéò" +"Âèêîðèñòàíèé ÷àñ" +"̳ë³ñåê." +"Ñåðåäí³é" +"Ïî ñïàäàííþ (áàéòè)" +"Êîðèñòóâà÷" +"×àñ" +"¹" +"Ïåð³îä" +"Äàòà ñòâîðåííÿ" +"Êîðèñòóâà÷³" +"³äñîðòîâàíî" +"Çâ³ò Squid ïî áðîóçåðàõ" +"Áðîóçåð" +"Âñüîãî" +"Çãåíåðîâàíèé" +"íà" +"Äàòà/×àñ" +"IP/Õîñò" +"OUT" +"IN" +"CACHE" +"SitesUsers" +"ÑìàðòÔ³ëüòð" +"Ïîìèëêà àóòåíòèô³êàö³¿" +"Çàáîðîíåí³" +"Òîï ñàéòè" +"SQUIDGUARD" +"RULE" +"squidGuard" +"Sarg parsed log saved as" +"Sarg log format" +"Downloads" +"Graphic" +"DAYS" +DansGuardian" +"CAUSE" diff --git a/lastlog.c b/lastlog.c new file mode 100644 index 0000000..bf34da2 --- /dev/null +++ b/lastlog.c @@ -0,0 +1,112 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void mklastlog() +{ + + FILE *fp_in, *fp_ou; + DIR *dirp; + struct dirent *direntp; + char temp[MAXLEN]; + char warea[MAXLEN]; + char ftime[128]; + int ftot=0; + time_t t; + struct tm *local; + struct stat statb; + + if(strcmp(LastLog,"0") == 0) + return; + + sprintf(temp,"%slastlog1",outdir); + if((fp_ou=fopen(temp,"w"))==NULL) { + fprintf(stderr, "SARG: (lastlog) %s: %s\n",text[9],temp); + exit(1); + } + + dirp = opendir(outdir); + while ((direntp = readdir( dirp )) != NULL ){ + if(strstr(direntp->d_name,"-") == 0) + continue; + + sprintf(warea,"%s%s",outdir,direntp->d_name); + stat(warea,&statb); + t=statb.st_ctime; + local = localtime(&t); + strftime(ftime, 127, "%Y%m%d%H%M%S", local); + sprintf(buf,"%s %s\n",ftime,direntp->d_name); + fputs(buf,fp_ou); + ftot++; + } + + (void)rewinddir( dirp ); + (void)closedir( dirp ); + fclose(fp_ou); + + sprintf(buf,"sort -n -k 1,1 -o %slastlog %s",outdir,temp); + system(buf); + + unlink(temp); + + if(ftot<=atoi(LastLog)) { + sprintf(temp,"%slastlog",outdir); + if(access(temp, R_OK) == 0) + unlink(temp); + return; + } + + ftot-=atoi(LastLog); + + sprintf(temp,"%slastlog",outdir); + if((fp_in=fopen(temp,"r"))==NULL) { + fprintf(stderr, "SARG: (lastlog) %s: %s\n",text[9],temp); + exit(1); + } + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(warea,buf,' '); + buf[strlen(buf)-1]='\0'; + + if(ftot) { + if(debug) { + sprintf(msg,"%s: %s",text[81],buf); + debuga(msg); + } +// sprintf(temp,"%s%s",outdir,buf); + sprintf(temp,"rm -r %s%s",outdir,buf); + system(temp); + unlink(temp); + ftot--; + } + } + + fclose(fp_in); + sprintf(temp,"%slastlog",outdir); + unlink(temp); + + return; +} diff --git a/log.c b/log.c new file mode 100644 index 0000000..254dc2a --- /dev/null +++ b/log.c @@ -0,0 +1,1534 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +#define LEGACY_WRITE_USER +#define LEGACY_WRITE_DOWNLOAD +#define REPORT_EVERY_X_LINES 5000 + + +char *userfile; +char *excludefile; +char *excludeuser; + +char sz_Last_User[ MAXLEN ] = { 0 } ; +int bool_ShowReadStatistics ; + +numlist weekdays = { { 0, 1, 2, 3, 4, 5, 6 }, 7 }; +numlist hours = { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }, 24 }; + +void getusers(char *pwdfile, int debug); +void gethexclude(char *hexfile, int debug); +void getuexclude(char *uexfile, int debug); +void ttx(char *user); +int compar( const void *, const void * ); + +#define _FILE_OFFSET_BITS 64 + +int main(argc,argv) + int argc; + char *argv[]; +{ + + FILE *fp_in = NULL, *fp_ou = NULL, *fp_denied, *fp_usr, *fp_authfail, *fp_log; + + char sz_Download_Unsort[ 20000 ] ; + FILE * fp_Download_Unsort = NULL ; + FILE * fp_Write_User = NULL ; + + extern int optind; + extern int optopt; + extern char *optarg; + + char w[MAXLEN]; + char data[255]; + char elap[255]; + char none[255]; + char ip[MAXLEN]; + char msg[MAXLEN]; + char tam[255]; + char fun[255]; + char wuser[MAXLEN]; + char code[MAXLEN]; + char code2[MAXLEN]; + char smartfilter[MAXLEN]; + char dia[128]; + char wdata[128]; + char mes[30]; + char ano[30]; + char hora[30]; + char wtemp[MAXLEN]; + char wtemp2[255]; + char date[255]; + char arq[255]; + char arq_log[255]; + char warq[255][255]; + char hm[15], hmf[15], hmr[15], whm[15]; + int chm=0; + char uagent[MAXLEN]; + char hexclude[MAXLEN]; + char csort[MAXLEN]; + char tbuf[128]; + char tbuf2[128]; + char zip[20]; + char *str; + char bufz[MAXLEN]; + char bufy[MAXLEN]; + int common; + int common_log=0; + int squid_log=0; + int ch; + int d; + int x, l, i; + int errflg=0; + int puser=0; + int fhost=0; + int dns=0; + int fuser=0; + int idata=0; + int narq=0; + int iarq=0; + int exstring=0; + int i0=0,i1=0,i2=0,i3=0,i4=0,i5=0,i6=0,i7=0,i8=0; + long totregsl=0; + long totregsg=0; + long totregsx=0; + long totper=0; + long int max_elapsed=0; + time_t tt; + struct tm *t; + unsigned long nreg=0; + off_t recs1=0; + unsigned long recs2=0; + struct rlimit rl; + int OutputNonZero = REPORT_EVERY_X_LINES ; + + BgImage[0]='\0'; + LogoImage[0]='\0'; + LogoText[0]='\0'; + PasswdFile[0]='\0'; + OutputEmail[0]='\0'; + Ip2Name[0]='\0'; + UserAgentLog[0]='\0'; + ExcludeHosts[0]='\0'; + ExcludeUsers[0]='\0'; + ConfigFile[0]='\0'; + code[0]='\0'; + LastLog[0]='\0'; + UserIp[0]='\0'; + MaxElapsed[0]='\0'; + ReportType[0]='\0'; + UserTabFile[0]='\0'; + BlockIt[0]='\0'; + ExternalCSSFile[0]='\0'; + SquidGuardLogFormat[0]='\0'; + + strcpy(AccessLog,"/usr/local/squid/var/logs/access.log"); + sprintf(ExcludeCodes,"%s/exclude_codes",SYSCONFDIR); + strcpy(GraphDaysBytesBarColor,"orange"); + strcpy(BgColor,"#FFFFFF"); + strcpy(TxColor,"#000000"); + strcpy(TxBgColor,"lavender"); + strcpy(TiColor,"darkblue"); + strcpy(Width,"80"); + strcpy(Height,"45"); + strcpy(LogoTextColor,"#000000"); + strcpy(HeaderColor,"darkblue"); + strcpy(HeaderBgColor,"#DDDDDD"); + strcpy(FontSize,"9px"); + strcpy(TempDir,"/tmp"); + strcpy(OutputDir,"/usr/local/etc/httpd/htdocs/squid-reports"); + strcpy(Ip2Name,"no"); + strcpy(DateFormat,"u"); + strcpy(OverwriteReport,"no"); + strcpy(RemoveTempFiles,"yes"); + strcpy(ReplaceIndex,"index.html"); + strcpy(Index,"yes"); + strcpy(RecordsWithoutUser,"ip"); + strcpy(UseComma,"no"); + strcpy(MailUtility,"mailx"); + strcpy(TopSitesNum,"100"); + strcpy(UserIp,"no"); + strcpy(TopuserSortField,"BYTES"); + strcpy(UserSortField,"BYTES"); + strcpy(TopuserSortOrder,"reverse"); + strcpy(UserSortOrder,"reverse"); + strcpy(TopsitesSortField,"CONNECT"); + strcpy(TopsitesSortType,"D"); + strcpy(LongUrl,"no"); + strcpy(language,"English"); + strcpy(FontFace,"Verdana,Tahoma,Arial"); + strcpy(datetimeby,"bytes"); + strcpy(CharSet,"ISO-8859-1"); + strcpy(Privacy,"no"); + strcpy(PrivacyString,"***.***.***.***"); + strcpy(PrivacyStringColor,"blue"); + strcpy(SuccessfulMsg,"yes"); + strcpy(TopUserFields,"NUM DATE_TIME USERID CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE"); + strcpy(UserReportFields,"CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE"); + strcpy(DataFileDelimiter,";"); + strcpy(DataFileFields,"user;date;time;url;connect;bytes;in_cache;out_cache;elapsed"); + strcpy(SiteUserTimeDateType,"table"); + strcpy(ShowReadStatistics,"yes"); + strcpy(IndexSortOrder,"D"); + strcpy(ShowSargInfo,"yes"); + strcpy(ShowSargLogo,"yes"); + strcpy(ParsedOutputLog,"no"); + strcpy(ParsedOutputLogCompress,"/bin/gzip"); + strcpy(DisplayedValues,"abbreviation"); + strcpy(HeaderFontSize,"9px"); + strcpy(TitleFontSize,"11px"); + strcpy(AuthUserFile,"/usr/local/sarg/passwd"); + strcpy(AuthName,"SARG, Restricted Access"); + strcpy(AuthType,"basic"); + strcpy(Require,"require user admin %u"); + strcpy(DownloadSuffix,"7z,ace,arj,avi,bat,bin,bz2,bzip,cab,com,cpio,dll,doc,dot,exe,gz,iso,lha,lzh,mdb,mov,mp3,mpeg,mpg,mso,nrg,ogg,ppt,rar,rtf,shs,src,sys,tar,tgz,vcd,vob,wma,wmv,zip"); + strcpy(Graphs,"yes"); + strcpy(Ulimit,"20000"); + strcpy(NtlmUserFormat,"domainname+username"); + + dia[0]='\0'; + mes[0]='\0'; + ano[0]='\0'; + hora[0]='\0'; + tmp[0]='\0'; + tmp2[0]='\0'; + tmp3[0]='\0'; + wtemp[0]='\0'; + wtemp2[0]='\0'; + us[0]='\0'; + date[0]='\0'; + df[0]='\0'; + uagent[0]='\0'; + hexclude[0]='\0'; + addr[0]='\0'; + hm[0]='\0'; + hmf[0]='\0'; + site[0]='\0'; + outdir[0]='\0'; + elap[0]='\0'; + email[0]='\0'; + zip[0]='\0'; + UserInvalidChar[0]='\0'; + DataFile[0]='\0'; + SquidGuardConf[0]='\0'; + DansGuardianConf[0]='\0'; + + excode=0; + denied_count=0; + download_count=0; + authfail_count=0; + dansguardian_count=0; + squidguard_count=0; + DeniedReportLimit=10; + AuthfailReportLimit=10; + DansGuardianReportLimit=10; + SquidGuardReportLimit=10; + UserReportLimit=0; + debug=0; + debugz=0; + debugm=0; + iprel=0; + userip=0; + color1=0; + color2=0; + color3=0; + sarglog=0; + isalog=0; + + bzero(IncludeUsers, MAXLEN); + bzero(ExcludeString, MAXLEN); + + for(x=0; x<=254; x++) + warq[x][0]='\0'; + + language_load(language); + strcpy(Title,text[88]); + + while((ch = getopt(argc, argv, "a:b:c:d:e:f:g:u:l:o:r:s:t:w:hijmnpvxyz")) != -1){ + switch(ch) + { + case 'a': + strcpy(addr,optarg); + break; + case 'b': + strcpy(uagent,optarg); + break; + case 'c': + strcpy(hexclude,optarg); + break; + case 'd': + strcpy(date,optarg); + strcpy(cduntil,optarg); + getword(cdfrom,cduntil,'-'); + date_from(date, cdfrom, cduntil); + dfrom=atoi(cdfrom); + duntil=atoi(cduntil); + break; + case 'e': + strcpy(email,optarg); + break; + case 'f': + strcpy(ConfigFile,optarg); + break; + case 'g': + strcpy(df,optarg); + break; + case 'h': + usage(argv[0]); + exit(0); + break; + case 'i': + iprel++; + break; + case 'l': + strcpy(warq[narq],optarg); + narq++; + break; + case 'm': + debugm++; + break; + case 'n': + dns++; + break; + case 'o': + strcpy(outdir,optarg); + break; + case 'p': + userip++; + break; + case 's': + strcpy(site,optarg); + break; + case 't': + if(strstr(optarg,"-") == 0) { + strcpy(hm,optarg); + strcpy(hmf,optarg); + } else { + getword(hm,optarg,'-'); + strcpy(hmf,optarg); + } + if(strlen(hm) > 5) { + printf("SARG: time period must be MM or MM:SS. Exit.\n"); + exit(1); + } + bzero(whm,15); + if(strstr(hm,":") != 0) { + getword(warea,hm,':'); + sprintf(whm,"%s%s",warea,hm); + strcpy(hm,whm); + } + bzero(whm,15); + if(strstr(hmf,":") != 0) { + getword(warea,hmf,':'); + sprintf(whm,"%s%s",warea,hmf); + strcpy(hmf,whm); + } + break; + case 'u': + strcpy(us,optarg); + break; + case 'v': + version(); + break; + case 'w': + strcpy(tmp,optarg); + break; + case 'x': + debug++; + break; + case 'y': + langcode++; + break; + case 'z': + debugz++; + break; + case ':': + fprintf(stderr, "Option -%c require an argument\n",optopt); + errflg++; + break; + case '?': + usage(argv[0]); + exit(1); + break; + } + + } + + if (errflg) { + usage(argv[0]); + exit(2); + } + + if(debug) + debuga("Init"); + + if(ConfigFile[0] == '\0') + sprintf(ConfigFile,"%s/sarg.conf",SYSCONFDIR); + else { + if(access(ConfigFile, R_OK) != 0) { + sprintf(msg,"Cannot open config file: %s - %s",ConfigFile,strerror(errno)); + debuga(msg); + exit(1); + } + } + + if(access(ConfigFile, R_OK) == 0) + getconf(debugm, ConfigFile, AccessLog, debug, BgColor, TxColor, TxBgColor, TiColor, LogoImage, LogoText, LogoTextColor, Width, Height, Title, BgImage, FontFace, HeaderColor, HeaderBgColor, FontSize, PasswdFile, TempDir, OutputDir, OutputEmail, Ip2Name, TopuserSortField, UserSortField, TopuserSortOrder, UserSortOrder, UserAgentLog, ExcludeHosts, DateFormat, ExcludeUsers, PerUserLimitFile, PerUserLimit, UserIp, MaxElapsed); + + if(debugz) { + fprintf(stderr, "SARG: ConfigFile.........= %s\n",ConfigFile); + fprintf(stderr, "SARG: AccessLog..........= %s\n",AccessLog); + fprintf(stderr, "SARG: BgColor............= %s\n",BgColor); + fprintf(stderr, "SARG: TxColor............= %s\n",TxColor); + fprintf(stderr, "SARG: TxBgColor..........= %s\n",TxBgColor); + fprintf(stderr, "SARG: TiColor............= %s\n",TiColor); + fprintf(stderr, "SARG: LogoImage..........= %s\n",LogoImage); + fprintf(stderr, "SARG: LogoText...........= %s\n",LogoText); + fprintf(stderr, "SARG: LogoTextColor......= %s\n",LogoTextColor); + fprintf(stderr, "SARG: Width..............= %s\n",Width); + fprintf(stderr, "SARG: Height.............= %s\n",Height); + fprintf(stderr, "SARG: Title..............= %s\n",Title); + fprintf(stderr, "SARG: BgImage............= %s\n",BgImage); + fprintf(stderr, "SARG: FontFace...........= %s\n",FontFace); + fprintf(stderr, "SARG: HeaderColor........= %s\n",HeaderColor); + fprintf(stderr, "SARG: HeaderBgColor......= %s\n",HeaderBgColor); + fprintf(stderr, "SARG: FontSize...........= %s\n",FontSize); + fprintf(stderr, "SARG: PasswdFile.........= %s\n",PasswdFile); + fprintf(stderr, "SARG: TempDir............= %s\n",TempDir); + fprintf(stderr, "SARG: OutputDir..........= %s\n",OutputDir); + fprintf(stderr, "SARG: Ip2Name............= %s\n",Ip2Name); + fprintf(stderr, "SARG: TopuserSortField.........= %s\n",TopuserSortField); + fprintf(stderr, "SARG: UserSortField.........= %s\n",UserSortField); + fprintf(stderr, "SARG: TopuserSortOrder.........= %s\n",TopuserSortOrder); + fprintf(stderr, "SARG: UserSortOrder.........= %s\n",UserSortOrder); + fprintf(stderr, "SARG: UserAgentLog.......= %s\n",UserAgentLog); + fprintf(stderr, "SARG: ExcludeHosts.......= %s\n",ExcludeHosts); + fprintf(stderr, "SARG: DateFormat.........= %s\n",DateFormat); + fprintf(stderr, "SARG: ExcludeUsers.......= %s\n",ExcludeUsers); + fprintf(stderr, "SARG: PerUserLimitFile...= %s\n",PerUserLimitFile); + fprintf(stderr, "SARG: PerUserLimit.......= %s\n",PerUserLimit); + fprintf(stderr, "SARG: UserIp.............= %s\n",UserIp); + fprintf(stderr, "SARG: MaxElapsed.........= %s\n",MaxElapsed); + fprintf(stderr, "SARG: LastLog............= %s\n",LastLog); + fprintf(stderr, "SARG:\n"); + } + + dataonly=0; + if(DataFile[0] != '\0'); + dataonly++; + + str2=(char *)subs(TopUserFields,"%BYTES","SETYB"); + strcpy(TopUserFields,str2); + + str2=(char *)subs(UserReportFields,"%BYTES","SETYB"); + strcpy(UserReportFields,str2); + + if(!narq) { + strcpy(warq[0],AccessLog); + narq++; + } + + if(strcmp(hexclude,"onvert") == 0 && strcmp(site,"plit") != 0) { + convlog(warq[0], df, dfrom, duntil); + exit(0); + } + + if(strcmp(site,"plit") == 0) { + splitlog(warq[0], df, dfrom, duntil, hexclude); + exit(0); + } + + if(ExcludeCodes[0] != '\0') { + if((excludecode=(char *) malloc(1024))==NULL) { + fprintf(stderr, "SARG: %s (1024):\n",text[59]); + exit(1); + } + bzero(excludecode,1024); + load_excludecodes(); + } + + if(access(PasswdFile, R_OK) == 0) { + getusers(PasswdFile,debug); + puser++; + } + + if(hexclude[0] == '\0') + strcpy(hexclude,ExcludeHosts); + if(strlen(hexclude) > 0) { + if(access(hexclude, R_OK) != 0) { + sprintf(msg,"Cannot open exclude_hosts file: %s - %s",hexclude,strerror(errno)); + debuga(msg); + exit(1); + } else { + gethexclude(hexclude,debug); + fhost++; + } + } + + if(ReportType[0] == '\0') + strcpy(ReportType,"topsites users_sites sites_users date_time denied auth_failures site_user_time_date"); + + if(access(ExcludeUsers, R_OK) == 0) { + getuexclude(ExcludeUsers,debug); + fuser++; + } + + indexonly=0; + if(fuser) { + if(strstr(excludeuser,"indexonly") != 0) + indexonly++; + } + if(strcmp(ExcludeUsers,"indexonly") == 0) + indexonly++; + if(strcmp(Index,"only") == 0) + indexonly++; + + if(dns) + strcpy(Ip2Name,"yes"); + + if(strcmp(UserIp,"yes") == 0) + userip++; + + if(strlen(MaxElapsed)>1) + max_elapsed=atol(MaxElapsed); + + if(strlen(outdir)<1) + strcpy(outdir,OutputDir); + strcat(outdir,"/"); + + + if(arq[0] == '\0') + strcpy(arq,AccessLog); + + if(uagent[0] == '\0') + strcpy(uagent,UserAgentLog); + + if(tmp[0] == '\0') + strcpy(tmp,TempDir); + else + strcpy(TempDir,tmp); + + if(df[0] == '\0') + strcpy(df,DateFormat); + else + strcpy(DateFormat,df); + + if(df[0] == '\0') { + strcpy(df,"u"); + strcpy(DateFormat,"u"); + } + + if(strlen(email)<1){ + if(strlen(OutputEmail)>0) + strcpy(email,OutputEmail); + } + + strcpy(tmp2,tmp); + strcpy(tmp4,tmp); + strcpy(tmp5,tmp); + strcpy(tmp6,tmp); + + if(strlen(email) > 0) { + sprintf(wtemp2,"%s/sarg_tmp",tmp2); + my_mkdir(wtemp2); + strcat(tmp2,"/sarg_tmp"); + strcpy(outdir,tmp2); + strcat(outdir,"/"); + } + + strcat(tmp2,"/sarg.log"); + + sprintf(warea,"%s/sarg",tmp); + if(access(warea, R_OK) == 0) { + sprintf(tmp3,"rm -rf %s",warea); + system(tmp3); + } + + sprintf(tmp3,"%s/sarg",tmp); + my_mkdir(tmp3); + strcat(tmp4,"/denied.log.unsort"); + strcat(tmp5,"/denied.log"); + strcat(tmp6,"/authfail.log.unsort"); + + if(debug) { + fprintf(stderr, "SARG: %s:\nSARG:\n",text[22]); + fprintf(stderr, "SARG: %35s (-a) = %s\n",text[23],addr); + fprintf(stderr, "SARG: %35s (-b) = %s\n",text[71],uagent); + fprintf(stderr, "SARG: %35s (-c) = %s\n",text[69],hexclude); + fprintf(stderr, "SARG: %35s (-d) = %s\n",text[24],date); + fprintf(stderr, "SARG: %35s (-e) = %s\n",text[41],email); + fprintf(stderr, "SARG: %35s (-f) = %s\n",text[70],ConfigFile); + if(strcmp(df,"e") == 0) + fprintf(stderr, "SARG: %35s (-g) = %s (dd/mm/yyyy)\n",text[25],text[26]); + if(strcmp(df,"u") == 0) + fprintf(stderr, "SARG: %35s (-g) = %s (mm/dd/yyyy)\n",text[25],text[27]); + if(strcmp(df,"w") == 0) + fprintf(stderr, "SARG: %35s (-g) = %s (yyyy/ww)\n",text[25],text[85]); + if(iprel) + fprintf(stderr, "SARG: %35s (-i) = %s\n",text[28],text[1]); + else + fprintf(stderr, "SARG: %35s (-i) = %s\n",text[28],text[2]); + fprintf(stderr, "SARG: %35s (-l) = %s\n",text[37],arq); + if(strcmp(Ip2Name,"yes") == 0) + fprintf(stderr, "SARG: %35s (-n) = %s\n",text[65],text[1]); + else + fprintf(stderr, "SARG: %35s (-n) = %s\n",text[65],text[2]); + fprintf(stderr, "SARG: %35s (-o) = %s\n",text[38],outdir); + if(strcmp(UserIp,"yes") == 0) + fprintf(stderr, "SARG: %35s (-p) = %s\n",text[29],text[1]); + else + fprintf(stderr, "SARG: %35s (-p) = %s\n",text[29],text[2]); + fprintf(stderr, "SARG: %35s (-s) = %s\n",text[30],site); + fprintf(stderr, "SARG: %35s (-t) = %s\n",text[31],hm); + fprintf(stderr, "SARG: %35s (-u) = %s\n",text[32],us); + fprintf(stderr, "SARG: %35s (-w) = %s\n",text[34],tmp); + if(debug) + fprintf(stderr, "SARG: %35s (-x) = %s\n",text[35],text[1]); + else + fprintf(stderr, "SARG: %35s (-x) = %s\n",text[35],text[2]); + if(debugz) + fprintf(stderr, "SARG: %35s (-z) = %s\n",text[36],text[1]); + else + fprintf(stderr, "SARG: %35s (-z) = %s\n",text[36],text[2]); + fprintf(stderr, "SARG:\n"); + } + + if(debugm) { + printf("%s:\nSARG:\n",text[22]); + printf("%35s (-a) = %s\n",text[23],addr); + printf("%35s (-b) = %s\n",text[71],uagent); + printf("%35s (-c) = %s\n",text[69],hexclude); + printf("%35s (-d) = %s\n",text[24],date); + printf("%35s (-e) = %s\n",text[41],email); + printf("%35s (-f) = %s\n",text[70],ConfigFile); + if(strcmp(df,"e") == 0) + printf("%35s (-g) = %s (dd/mm/yyyy)\n",text[25],text[26]); + if(strcmp(df,"u") == 0) + printf("%35s (-g) = %s (mm/dd/yyyy)\n",text[25],text[27]); + if(strcmp(df,"w") == 0) + printf("%35s (-g) = %s (yyyy/ww)\n",text[25],text[85]); + if(iprel) + printf("%35s (-i) = %s\n",text[28],text[1]); + else + printf("%35s (-i) = %s\n",text[28],text[2]); + printf("%35s (-l) = %s\n",text[37],arq); + if(strcmp(Ip2Name,"yes") == 0) + printf("%35s (-n) = %s\n",text[65],text[1]); + else + printf("%35s (-n) = %s\n",text[65],text[2]); + printf("%35s (-o) = %s\n",text[38],outdir); + if(strcmp(UserIp,"yes") == 0) + printf("%35s (-p) = %s\n",text[29],text[1]); + else + printf("%35s (-p) = %s\n",text[29],text[2]); + printf("%35s (-s) = %s\n",text[30],site); + printf("%35s (-t) = %s\n",text[31],hm); + printf("%35s (-u) = %s\n",text[32],us); + printf("%35s (-w) = %s\n",text[34],tmp); + if(debug) + printf("%35s (-x) = %s\n",text[35],text[1]); + else + printf("%35s (-x) = %s\n",text[35],text[2]); + if(debugz) + printf("%35s (-z) = %s\n",text[36],text[1]); + else + printf("%35s (-z) = %s\n",text[36],text[2]); + printf("sarg %s: %s\n",text[73],VERSION); + printf("Language=%s\n\n",text[3]); + } + + if(debug){ + sprintf(msg,"sarg %s: %s",text[73],VERSION); + debuga(msg); + } +#if defined(RLIMIT_NOFILE) + getrlimit (RLIMIT_NOFILE, &rl); +#else #if defined(RLIMIT_OFILE) + getrlimit (RLIMIT_OFILE, &rl); +#endif + l1 = rl.rlim_cur; + l2 = rl.rlim_max; + + rl.rlim_cur = atol(Ulimit); + rl.rlim_max = atol(Ulimit); +#if defined(RLIMIT_NOFILE) + if(setrlimit (RLIMIT_NOFILE, &rl) == -1) { +#else #if defined(RLIMIT_OFILE) + if(setrlimit (RLIMIT_OFILE, &rl) == -1) { +#endif + sprintf(msg,"setrlimit error - %s\n",strerror(errno)); + debuga(msg); + } + + if(debug) { + sprintf(msg,"Maximum file descriptor: cur=%ld max=%ld, changed to cur=%ld max=%ld",l1,l2,rl.rlim_cur,rl.rlim_max); + debuga(msg); + } + + if(UserTabFile[0] != '\0') { + if(debug) { + sprintf(msg,"%s: %s",text[86],UserTabFile); + debuga(msg); + } + if((fp_usr=fopen(UserTabFile,"r"))==NULL) { + fprintf(stderr, "%s: (log) %s: %s - %s\n",argv[0],text[45],UserTabFile,strerror(errno)); + exit(1); + } + nreg = lseek(fileno(fp_usr), 0, SEEK_END); + lseek(fileno(fp_usr), 0, 0); + if((userfile=(char *) malloc(nreg+100))==NULL){ + fprintf(stderr, "%s ERROR: %s",argv[0],text[87]); + exit(1); + } + bzero(userfile,nreg+100); + strncat(userfile,":",1); + z1=0; + z2=1; + while(fgets(buf,MAXLEN,fp_usr)!=NULL){ + buf[strlen(buf)-1]='\0'; + if(strstr(buf,"\r") != 0) + buf[strlen(buf)-1]='\0'; + getword(bufy,buf,' '); + for(z1=0; z1<=strlen(bufy); z1++) { + userfile[z2]=bufy[z1]; + z2++; + } + strncat(userfile,":",1); + for(z1=0; z1<=strlen(buf); z1++) { + userfile[z2]=buf[z1]; + z2++; + } + strncat(userfile,":",1); + } + fclose(fp_usr); + } + + sprintf ( sz_Download_Unsort , "%s/sarg/download.unsort", tmp); + bool_ShowReadStatistics = ( strcmp(ShowReadStatistics,"yes") == 0 ) ; + + while(narq--) { + strcpy(arq,warq[iarq]); + iarq++; + + strcpy(arqtt,arq); + decomp(arq,zip,tmp); + if(debug) { + sprintf(msg, "%s: %s",text[7],arq); + debuga(msg); + } + +#if defined(HAVE_FOPEN64) + if((fp_in=(long)fopen64(arq,"r"))==NULL) { +#else + if((fp_in=fopen(arq,"r"))==NULL) { +#endif + fprintf(stderr, "%s: (log) %s: %s - %s\n",argv[0],text[8],arq,strerror(errno)); + exit(1); + } + fgets(bufz,sizeof(bufz),fp_in); + if(!isalog) { + if(strncmp(bufz,"#Software: Mic",14) == 0) + isalog++; + } + if(strncmp(bufz,"*** SARG Log ***",16) == 0) { + getword(val2,arqtt,'-'); + getword(val2,arqtt,'_'); + getword(val3,arqtt,'-'); + getword(val3,arqtt,'_'); + sprintf(periodo,"%s-%s",val2,val3); + sarglog=1; + } else lseek(fileno(fp_in), 0, 0); + + if(strcmp(ParsedOutputLog, "no") != 0 && !sarglog) { + if(access(ParsedOutputLog,R_OK) != 0) { + sprintf(csort,"%s",ParsedOutputLog); + my_mkdir(csort); + } + sprintf(arq_log,"%s/sarg_temp.log",ParsedOutputLog); + if((fp_log=fopen(arq_log,"w"))==NULL) { + fprintf(stderr, "%s: (log) %s: %s - %s\n",argv[0],text[8],arq_log,strerror(errno)); + exit(1); + } + fputs("*** SARG Log ***\n",fp_log); + } + + if(strstr(ReportType,"denied") != 0) { + if((fp_denied=fopen(tmp4,"w"))==NULL) { + fprintf(stderr, "%s: (log) %s: %s - %s\n",argv[0],text[45],tmp4,strerror(errno)); + exit(1); + } + } + + if(DataFile[0]=='\0') { + if(strstr(ReportType,"denied") != 0 || strstr(ReportType,"auth_failures") != 0) { + if((fp_authfail=fopen(tmp6,"w"))==NULL) { + fprintf(stderr, "%s: (log) %s: %s - %s\n",argv[0],text[45],tmp6,strerror(errno)); + exit(1); + } + } + } + + // pre-Read the file only if I have to show stats + if(bool_ShowReadStatistics) { + rewind(fp_in); + recs1=0; + recs2=0; + while( fgets(bufz,sizeof(bufz),fp_in) != NULL ) + recs1++; + rewind(fp_in); + + printf("SARG: Records in file: %d, reading: %3.2f%%\r",recs1,(float) 0); + fflush( stdout ) ; + } + + + while(fgets(bufz,sizeof(bufz),fp_in)!=NULL) { + recs2++; + if( bool_ShowReadStatistics && ! --OutputNonZero) { + perc = recs2 * 100 ; + perc = perc / recs1 ; + printf("SARG: Records in file: %d, reading: %3.2f%%\r",recs1,perc); + fflush (stdout); + OutputNonZero = REPORT_EVERY_X_LINES ; + } + if(strlen(bufz) > MAXLEN-1) continue; + if(!bufz[0]) continue; + if(strstr(bufz,"HTTP/0.0") != 0) continue; + if(strstr(bufz,"logfile turned over") != 0) continue; + if(bufz[0] == ' ') continue; + if(strlen(bufz) < 58) continue; + + // Record only hours usage which is required + tt = (time_t) strtoul( bufz, NULL, 10 ); + t = localtime( &tt ); + + if( bsearch( &( t -> tm_wday ), weekdays.list, weekdays.len, + sizeof( int ), compar ) == NULL ) + continue; + + if( bsearch( &( t -> tm_hour ), hours.list, hours.len, + sizeof( int ), compar ) == NULL ) + continue; + + // exclude_string + exstring=0; + if(strlen(ExcludeString) > 0) { + strcpy(warea,bufz); + strcpy(html,ExcludeString); + while(strstr(html,":") != 0) { + getword(val1,html,':'); + if((str=(char *) strstr(warea,val1)) != (char *) NULL ) + exstring++; + } + if((str=(char *) strstr(warea,html)) != (char *) NULL ) + exstring++; + } + if(exstring) continue; + + strcpy(bufy,bufz); + if ((str = strchr(bufz, '\n')) != NULL) + *str = '\0'; /* strip \n */ + + totregsl++; + common=0; + if(debugm) + printf("BUF=%s\n",bufz); + + if(!sarglog && !isalog) { + getword(data,bufz,' '); + if((str=(char *) strstr(data, ".")) != (char *) NULL ) { + if((str=(char *) strstr(str+1, ".")) != (char *) NULL ) { + strcpy(ip,data); + strcpy(elap,"0"); + getword(user,bufz,' '); + getword(none,bufz,' '); + getword(data,bufz,']'); + getword(fun,bufz,'"'); + getword(fun,bufz,' '); + getword(url,bufz,' '); + getword(code2,bufz,' '); + getword(code2,bufz,' '); + getword(tam,bufz,' '); + if((str=(char *) strstr(bufz, " ")) != (char *) NULL ) + getword(code,bufz,' '); + else strcpy(code,bufz); + + if ((str = strchr(code, ':')) != NULL) + *str = '/'; + + if(strcmp(tam,"\0") == 0) + strcpy(tam,"0"); + + common++; + common_log=1; + } + } + + if(!common) { + getword(elap,bufz,' '); + while(strcmp(elap,"") == 0) + getword(elap,bufz,' '); + getword(ip,bufz,' '); + getword(code,bufz,' '); + getword(tam,bufz,' '); + getword(fun,bufz,' '); + getword(url,bufz,' '); + getword(user,bufz,' '); + squid_log=1; + } + } else if(!isalog) { + getword(data,bufz,' '); + getword(hora,bufz,' '); + getword(user,bufz,' '); + getword(ip,bufz,' '); + getword(url,bufz,' '); + getword(tam,bufz,' '); + getword(code,bufz,' '); + getword(elap,bufz,' '); + getword(smartfilter,bufz,' '); + } else if(isalog) { + if(!i0) { + getword(val1,bufz,' '); + while(strstr(bufz,"\t") != 0) { + getword(val1,bufz,'\t'); + i0++; + if(strcmp(val1,"c-ip") == 0) i1=i0; + if(strcmp(val1,"cs-username") == 0) i2=i0; + if(strcmp(val1,"date") == 0) i3=i0; + if(strcmp(val1,"time") == 0) i4=i0; + if(strcmp(val1,"time-taken") == 0) i5=i0; + if(strcmp(val1,"sc-bytes") == 0) i6=i0; + if(strcmp(val1,"cs-uri") == 0) i7=i0; + if(strcmp(val1,"sc-status") == 0) i8=i0; + } + } + fgets(bufz,sizeof(bufz),fp_in); + strcpy(val1,bufz); + for(x=0; x<=i1-1; x++) getword3(ip,val1,'\t'); + strcpy(val1,bufz); + for(x=0; x<=i2-1; x++) getword3(user,val1,'\t'); + strcpy(val1,bufz); + for(x=0; x<=i3-1; x++) getword3(data,val1,'\t'); + strcpy(val1,bufz); + for(x=0; x<=i4-1; x++) getword3(hora,val1,'\t'); + strcpy(val1,bufz); + for(x=0; x<=i5-1; x++) getword3(elap,val1,'\t'); + strcpy(val1,bufz); + for(x=0; x<=i6-1; x++) getword3(tam,val1,'\t'); + strcpy(val1,bufz); + for(x=0; x<=i7-1; x++) getword3(url,val1,'\t'); + strcpy(val1,bufz); + for(x=0; x<=i8-1; x++) getword3(code,val1,'\t'); + + if(strcmp(code,"401") == 0 || strcmp(code,"403") == 0 || strcmp(code,"407") == 0) { + sprintf(val1,"DENIED/%s",code); + strcpy(code,val1); + } + getword(ano,data,'-'); + getword(mes,data,'-'); + strcpy(dia,data); + conv_month_name(mes); + sprintf(data," %s/%s/%s:%s",dia,mes,ano,hora); + } + + // include_users + if(strlen(IncludeUsers) > 0) { + sprintf(val1,":%s:",user); + if((str=(char *) strstr(IncludeUsers,val1)) == (char *) NULL ) + continue; + } + + if(excode) { + if(vercode(code)) { + totregsx++; + continue; + } + } + + if(testvaliduserchar(user)) + continue; + + while(strstr(user,"%5c") != 0 || strstr(user,"%20") != 0) { + getword(w,user,'%'); + strcpy(wuser,user+2); + sprintf(user,"%s.%s",w,wuser); + } + + str=user; + for(z1=0; z1tm_hour,t->tm_min,t->tm_sec); + } else { + strcpy(wtemp,data+1); + getword(data,wtemp,':'); + getword(hora,wtemp,' '); + getword(dia,data,'/'); + getword(mes,data,'/'); + getword(ano,data,'/'); + + if(strcmp(df,"u") == 0) + sprintf(tbuf,"%s%s%s",ano,mes,dia); + if(strcmp(df,"e") == 0) + sprintf(tbuf,"%s%s%s",dia,mes,ano); + builddia(dia,mes,ano,df,wdata); + idata=atoi(wdata); + } + } else { + getword(mes,data,'/'); + getword(dia,data,'/'); + strcpy(ano,data); + } + + if(debugm) + printf("DATE=%s IDATA=%d DFROM=%d DUNTIL=%d\n",date,idata,dfrom,duntil); + + l=1; + if(strlen(us)>0){ + if(strcmp(user,us)==0) + l=1;else l=0; + } + + if(l){ + if(strlen(addr)>0){ + if(strcmp(addr,ip)==0) + l=1;else l=0; + } + if(fhost) { + l=vhexclude(excludefile,ip); + if(l) l=vhexclude(excludefile,url); + if(!l) + totregsx++; + } + } + + if(l){ + if(strlen(date) > 0){ + if(idata >= dfrom && idata <= duntil) + l=1;else l=0; + } + } + if(l){ + if(strlen(hm)>0) { + strcpy(whm,hora); + bzero(hmr,15); + chm++; + while(chm) { + getword(warea,whm,':'); + strncat(hmr,warea,2); + chm--; + } + strncat(hmr,whm,2); + + if(atoi(hmr) >= atoi(hm) && atoi(hmr) <= atoi(hmf)) + l=1;else l=0; + } + } + if(l){ + if(strlen(site)>0){ + if(strstr(url,site)!=0) + l=1;else l=0; + } + } + + if(userip) + strcpy(user,ip); + + if(strcmp(user,"-") == 0 || strcmp(user," ") == 0 || strcmp(user,"") == 0) { + if(strcmp(RecordsWithoutUser,"ip") == 0) + strcpy(user,ip); + if(strcmp(RecordsWithoutUser,"ignore") == 0) + continue; + if(strcmp(RecordsWithoutUser,"everybody") == 0) + strcpy(user,"everybody"); + } + + if(puser) { + sprintf(wuser,":%s:",user); + if(strstr(userfile, wuser) == 0) + continue; + } + + if(l) { + if(fuser) { + l=vuexclude(excludeuser,user); + if(!l) + totregsx++; + } + } + + if(l) { + if(userip) + fixip(user); + } + + if(l&&max_elapsed) { + if(atol(elap)>max_elapsed) { + elap[0]='0'; + elap[1]='\0'; + } + } + + if(l) { + if(strcmp(user,"-") !=0 && strlen(url) > 0 && strcmp(user," ") !=0 && strcmp(user,"") !=0 && strcmp(user,":") !=0){ + if((str=(char *) strstr(bufz, "[SmartFilter:")) != (char *) NULL ) { + str[strlen(str)-1]='\0'; + sprintf(smartfilter,"\"%s\"",str+1); + } else sprintf(smartfilter,"\"\""); + + sprintf(bufz, "%s %s %s %s %s %s %s %s %s\n",dia,hora,user,ip,url,tam,code,elap,smartfilter); + +#ifdef LEGACY_WRITE_USER + sprintf(tmp3,"%s/sarg/%s.unsort",tmp,user); +#if defined(HAVE_FOPEN64) + if((fp_ou=fopen64(tmp3,"a"))==NULL) { +#else + if((fp_ou=fopen(tmp3,"a"))==NULL) { +#endif + fprintf(stderr, "%s: (log) %s: %s - %s\n",argv[0],text[9],tmp3,strerror(errno)); + exit(1); + } + fputs(bufz,fp_ou); + +#else + if ( strcmp ( user , sz_Last_User ) != 0 ) { + if ( fp_Write_User ) + fclose( fp_Write_User ) ; + sprintf (tmp3, "%s/sarg/%s.unsort", tmp, user); + +#if defined(HAVE_FOPEN64) + if ((fp_Write_User = fopen64 (tmp3, "a")) == NULL) { +#else + if ((fp_Write_User = fopen (tmp3, "a")) == NULL) { +#endif + fprintf (stderr, "%s: (log) %s: %s - %s\n", argv[0], text[9], tmp3, strerror(errno)); + exit (1); + } + strcpy( sz_Last_User , user ) ; + } + fputs (bufz, fp_Write_User); +#endif + + if(strcmp(ParsedOutputLog, "no") != 0 && !sarglog) + fputs(bufz,fp_log); + +#ifdef LEGACY_WRITE_USER + fclose(fp_ou); +#endif + totregsg++; + + if(download_flag) { + sprintf(bufz, "%s %s %s %s %s\n",dia,hora,user,ip,download_url); + +#ifdef LEGACY_WRITE_DOWNLOAD + sprintf(tmp3,"%s/sarg/download.unsort",tmp); +#if defined(HAVE_FOPEN64) + if((fp_ou=fopen64(tmp3,"a"))==NULL) { +#else + if((fp_ou=fopen(tmp3,"a"))==NULL) { +#endif + fprintf(stderr, "%s: (log) %s: %s - %s\n",argv[0],text[9],tmp3,strerror(errno)); + exit(1); + } + fputs(bufz,fp_ou); + fclose(fp_ou); +#else + if ( ! fp_Download_Unsort ) { +#if defined(HAVE_FOPEN64) + if ((fp_Download_Unsort = fopen64 ( sz_Download_Unsort, "a")) == NULL) { +#else + if ((fp_Download_Unsort = fopen (sz_Download_Unsort, "a")) == NULL) { +#endif + fprintf (stderr, "%s: (log) %s: %s - %s\n", argv[0], text[9], tmp3, strerror(errno)); + exit (1); + } + } + fputs (bufz, fp_Download_Unsort); +#endif + } + + if(strstr(ReportType,"denied") != 0 || strstr(ReportType,"auth_failures") != 0) { + if(strstr(code,"DENIED/403") != 0) { + sprintf(bufz, "%s %s %s %s %s\n",dia,hora,user,ip,urly); + fputs(bufz,fp_denied); + denied_count++; + } + if(strstr(code,"DENIED/401") != 0 || strstr(code,"DENIED/407") != 0) { + sprintf(bufz, "%s %s %s %s %s\n",dia,hora,user,ip,urly); + if(fp_authfail) + fputs(bufz,fp_authfail); + authfail_count++; + } + } + + if(!totper && !sarglog){ + totper++; + sprintf(periodo,"%s-",tbuf); + sprintf(per_hour,"%s-",tbuf2); + if(strlen(date)>0) + fixper(tbuf, periodo, cduntil); + if(debugz){ + debugaz("tbuf",tbuf); + debugaz("periodo",periodo); + } + } + } + + if(debugm){ + printf("IP=\t%s\n",ip); + printf("USER=\t%s\n",user); + printf("ELAP=\t%s\n",elap); + printf("DATE=\t%s\n",dia); + printf("TIME=\t%s\n",hora); + printf("FUNC=\t%s\n",fun); + printf("URL=\t%s\n",url); + printf("CODE=\t%s\n",code); + printf("LEN=\t%s\n",tam); + } + } + } + if( bool_ShowReadStatistics ) + printf("SARG: Records in file: %d, reading: %3.2f%%\n",recs1, (float) 100 ); + } + + if ( fp_Download_Unsort ) + fclose (fp_Download_Unsort); + + if (fp_Write_User) + fclose (fp_Write_User); + + if(debug) { + sprintf(msg, " %s: %ld, %s: %ld, %s: %ld",text[10],totregsl,text[11],totregsg,text[68],totregsx); + debuga(msg); + + if((common_log) && (squid_log)) + debuga(text[12]); + + if((common_log) && (!squid_log)) + debuga(text[13]); + + if((!common_log) && (squid_log)) + debuga(text[14]); + + if(sarglog) + debuga(text[124]); + + if((!common_log) && (!squid_log) && (!sarglog) && (!isalog)) { + if(!totregsg) { + fprintf(stderr, "SARG: %s\n",text[16]); + fprintf(stderr, "SARG: %s\n",text[21]); + } else fprintf(stderr, "SARG: %s\n",text[15]); + bzero(msg,sizeof(msg)); + fclose(fp_in); +// fclose(fp_ou); + if(fp_denied) + fclose(fp_denied); + if(fp_authfail) + fclose(fp_authfail); + if(tmp4) + unlink(tmp4); + if(tmp6) + unlink(tmp6); + unlink(tmp3); + exit(0); + } + } + + if(!totregsg){ + fprintf(stderr, "SARG: %s\n",text[16]); + fprintf(stderr, "SARG: %s\n",text[21]); + fclose(fp_in); +// fclose(fp_ou); + if(fp_denied) + fclose(fp_denied); + if(fp_authfail) + fclose(fp_authfail); + exit(0); + } + + if(date[0] == '\0' && !sarglog) { + strcat(periodo,tbuf); + strcat(per_hour,tbuf2); + } + + if(debugz){ + debugaz("data",dia); + debugaz("tbuf",tbuf); + debugaz("periodo",periodo); + } + + if(debug){ + sprintf(msg, "%s: %s",text[17],periodo); + debuga(msg); + } + + fclose(fp_in); +// fclose(fp_ou); + if(fp_denied) + fclose(fp_denied); + if(fp_authfail) + fclose(fp_authfail); + + if(strcmp(ParsedOutputLog, "no") != 0 && !sarglog) { + fclose(fp_log); + strcpy(val1,periodo); + getword(val2,val1,'-'); + getword(val3,per_hour,'-'); + sprintf(val4,"%s/sarg-%s_%s-%s_%s.log",ParsedOutputLog,val2,val3,val1,per_hour); + rename(arq_log,val4); + strcpy(arq_log,val4); + + if(strcmp(ParsedOutputLogCompress,"nocompress") != 0) { + sprintf(val1,"%s %s",ParsedOutputLogCompress,arq_log); + system(val1); + } + + if(debug) { + sprintf(msg,"%s %s",text[123],arq_log); + debuga(msg); + } + } + + sort_users_log(tmp, debug); + + if(strstr(ReportType,"denied") != 0) { + sprintf(csort,"sort -T %s -k 3,3 -k 5,5 -o %s %s",tmp,tmp5,tmp4); + system(csort); + unlink(tmp4); + } + + report_gen: + if(strlen(DataFile) > 0) + data_file(tmp); + else + gerarel(); + + unlink(tmp2); + if(strstr(ReportType,"denied") != 0) + unlink(tmp5); + + if((strlen(zip) > 0 && strcmp(zip,"zcat") !=0)) { + recomp(arq, zip); } +// else unlink(arq); + + if(debug) + debuga(text[21]); + + sprintf(csort,"rm -rf %s",tmp); + system(csort); + + exit(0); + +} + + +void getusers(char *pwdfile, int debug) +{ + + FILE *fp_usr; + char buf[255]; + char Msg[255]; + char user[255]; + unsigned long int nreg=0; + + if(debug) { + sprintf(Msg,"%s: %s",text[60],pwdfile); + debuga(Msg); + } + + if ((fp_usr = fopen(pwdfile, "r")) == NULL) { + fprintf(stderr, "SARG: (getusers) %s: %s - %s\n",text[45],pwdfile,strerror(errno)); + exit(1); + } + + nreg = lseek(fileno(fp_usr), (off_t)0, SEEK_END); + nreg = nreg+5000; + lseek(fileno(fp_usr), (off_t)0, 0); + + if((userfile=(char *) malloc(nreg))==NULL){ + fprintf(stderr, "SARG: %s (%ld):\n",text[59],nreg); + exit(1); + } + + bzero(userfile,nreg); + sprintf(userfile,":"); + + while(fgets(buf,255,fp_usr)!=NULL){ + getword(user,buf,':'); + strncat(userfile,user,strlen(user)); + strncat(userfile,":",1); + } + + fclose(fp_usr); + + return; +} + + +void gethexclude(char *hexfile, int debug) +{ + + FILE *fp_ex; + char buf[255]; + char Msg[255]; + unsigned long int nreg=0; + + if(debug) { + sprintf(Msg,"%s: %s",text[67],hexfile); + debuga(Msg); + } + + if ((fp_ex = fopen(hexfile, "r")) == NULL) { + fprintf(stderr, "SARG: (gethexclude) %s: %s - %s\n",text[45],hexfile,strerror(errno)); + exit(1); + } + + nreg = lseek(fileno(fp_ex), (off_t)0, SEEK_END); + lseek(fileno(fp_ex), (off_t)0, 0); + + if((excludefile=(char *) malloc(nreg+11))==NULL){ + fprintf(stderr, "SARG: %s (%ld):\n",text[59],nreg); + exit(1); + } + + bzero(excludefile,nreg+11); + + while(fgets(buf,255,fp_ex)!=NULL){ + if(strstr(buf,"#") != 0) + continue; + buf[strlen(buf)-1]='\0'; + strcat(excludefile,buf); + strcat(excludefile," "); + } + + strcat(excludefile,"*FIM* "); + + fclose(fp_ex); + + return; +} + + +void getuexclude(char *uexfile, int debug) +{ + + FILE *fp_ex; + char buf[255]; + char Msg[255]; + unsigned long int nreg=0; + + if(debug) { + sprintf(Msg,"%s: %s",text[67],uexfile); + debuga(Msg); + } + + if ((fp_ex = fopen(uexfile, "r")) == NULL) { + fprintf(stderr, "SARG: (gethexclude) %s: %s - %s\n",text[45],uexfile,strerror(errno)); + exit(1); + } + + nreg = lseek(fileno(fp_ex), (off_t)0, SEEK_END); + lseek(fileno(fp_ex), (off_t)0, 0); + + if((excludeuser=(char *) malloc(nreg+11))==NULL){ + fprintf(stderr, "SARG: %s (%ld):\n",text[59],nreg); + exit(1); + } + + bzero(excludeuser,nreg+11); + + while(fgets(buf,255,fp_ex)!=NULL){ + if(strstr(buf,"#") != 0) + continue; + buf[strlen(buf)-1]='\0'; + strcat(excludeuser,buf); + strcat(excludeuser," "); + } + + strcat(excludeuser,"*FIM* "); + + fclose(fp_ex); + + return; +} diff --git a/patches/oleg b/patches/oleg new file mode 100644 index 0000000..1c798f3 --- /dev/null +++ b/patches/oleg @@ -0,0 +1,541 @@ +From xsov@mail.ru Sun Apr 24 16:42:06 2005 +Received: 194.67.23.121 / smx1.brturbo.com +Received: from [212.48.203.89] (port=1505 helo=[192.168.0.77]) by + mx1.mail.ru with asmtp id 1DPgEw-0006L9-00 for orso@brturbo.com; Sun, 24 + Apr 2005 16:29:35 +0400 +From: Oleg +To: Pedro Lineu Orso +Subject: sarg-2.0.6 new patches +Date: Sun, 24 Apr 2005 16:42:06 +0400 +User-Agent: KMail/1.7.2 +MIME-Version: 1.0 +Content-Type: Multipart/Mixed; boundary="Boundary-00=_eQ5aCJp/CximSea" +Message-Id: <200504241642.06841.xsov@mail.ru> +X-Evolution-Source: pop://orso@pop.brturbo.com + + +--Boundary-00=_eQ5aCJp/CximSea +Content-Type: text/plain; charset="koi8-r" +Content-Disposition: inline +Content-Transfer-Encoding: 8bit + + Good day, Pedro! + + Again me :-) I just make some new good patches for sarg and review my old +patches to sarg, so there is: + +1) CONTRIBUTORS.patch: +Look at the CONTRIBUTORS file, there is two equal lines about Evren Yurtesen +, I just remove first one, the second (equal to first) +is here, on place. + +2) grepday.patch: +I add internationalisation of SARG user graph by using iconv function, which +is presented only in Linux, so I add required #ifdef and other stuff to clean +compile code on other platforms. + +3) htmllogreport.patch: +Fixed two issues: +- '?' symbol problems for apache and other cgi-supporting web server which +doesn't support '?' symbol in links (all of them interprete this like +parameter to cgi script); +- some good optimization to all three similar cicles in these files by +reducing false checks in 'if ...' strings. + +4) index.patch: +Fixes segfault, produced by inproper use of strncpy functions, look - strncpy +doesn't copy leading '\0' symbol! + +5) repday.patch: +Just localisation support for this type of report, patch is simple, just look +at it. + +6) siteuser.patch: +Support usertab IP->USERNAME change in siteuser report, which was removed +prior to sarg-2.0.0 versions. +WARNING: I'm not sure about bugs in this patch, but must warn you, that we +don't heavily test this patch in other configurations! + +7) Russian_koi8.patch: +Just proper Russian koi8 localisation, believe me, it is good enought, because +I'm russian :-) + +Pedro, can you tell which my patches you will include in next sarg release? +None of all previous sended to you my patches was included in sarg +releases ... :-( + +And one bugreport: +SARG version: 2.0.6 (clean, downloaded from sf.net, without any additional +patches) +OS: Linux Slackware 10.1 +Reproduction of bug: +tar xvfz sarg-2.0.6.tar.gz +cd sarg-2.0.6 +autoconf +./configure +make +gcc -c -I. -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" +-DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DHAVE_DIRENT_H=1 +-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_STDIO_H=1 -DHAVE_STDLIB_H=1 +-DHAVE_STRING_H=1 -DHAVE_STRINGS_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_TIME_H=1 +-DHAVE_UNISTD_H=1 -DHAVE_DIRENT_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_NETDB_H=1 +-DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_NETINET_IN_H=1 +-DHAVE_SYS_STAT_H=1 -DHAVE_CTYPE_H=1 -DHAVE_GD_H=1 -DHAVE_GDFONTL_H=1 +-DHAVE_GDFONTT_H=1 -DHAVE_GDFONTS_H=1 -DHAVE_GDFONTMB_H=1 -DHAVE_GDFONTG_H=1 +-DHAVE_ERRNO_H=1 -DHAVE_FOPEN64=1 -g -O2 -w -DBINDIR=\"/usr/bin\" +-DSYSCONFDIR=\"/usr/local/sarg\" -DHTMLDIR=\"/var/www/html\" log.c +log.c: In function `main': +log.c:127: error: storage size of 'rl' isn't known +log.c:668: error: `RLIMIT_OFILE' undeclared (first use in this function) +log.c:668: error: (Each undeclared identifier is reported only once +log.c:668: error: for each function it appears in.) +make: *** [log.o] Error 1 + +Best regards, +Sapon Oleg, +RusBusinessSecurity Co. Ltd. + +--Boundary-00=_eQ5aCJp/CximSea +Content-Type: text/x-diff; charset="koi8-r"; name="CONTRIBUTORS.patch" +Content-Disposition: attachment; filename="CONTRIBUTORS.patch" +Content-Transfer-Encoding: 8bit + +diff -ru sarg-2.0.6/CONTRIBUTORS sarg-2.0.6rbs/CONTRIBUTORS +--- sarg-2.0.6/CONTRIBUTORS 2004-11-22 16:37:02.000000000 +0300 ++++ sarg-2.0.6rbs/CONTRIBUTORS 2004-11-25 03:05:24.000000000 +0300 +@@ -10,7 +10,6 @@ + Dima I. Allaverdov + Eugeny Kuzakov + Evren Yurtesen +-Evren Yurtesen + Hanni Daniel + Ilya V. Komarov + Jose Luiz + +--Boundary-00=_eQ5aCJp/CximSea +Content-Type: text/x-diff; charset="koi8-r"; name="grepday.patch" +Content-Disposition: attachment; filename="grepday.patch" +Content-Transfer-Encoding: 8bit + +diff -ur sarg-2.0.6/configure.in sarg-2.0.6rbs/configure.in +--- sarg-2.0.6/configure.in 2005-02-21 21:13:21.000000000 +0300 ++++ sarg-2.0.6rbs/configure.in 2005-04-24 15:31:31.000000000 +0400 +@@ -40,7 +40,7 @@ + + AC_CHECK_HEADERS(stdio.h stdlib.h string.h strings.h sys/time.h time.h unistd.h sys/dirent.h \ + dirent.h sys/socket.h netdb.h arpa/inet.h sys/types.h netinet/in.h sys/stat.h \ +- ctype.h gd.h gdfontl.h gdfontt.h gdfonts.h gdfontmb.h gdfontg.h errno.h) ++ ctype.h gd.h gdfontl.h gdfontt.h gdfonts.h gdfontmb.h gdfontg.h iconv.h errno.h) + + AC_CHECK_LIB(gd, gdImagePng,LIBS="-lgd ${LIBS}"; HAVE_GD="yes", HAVE_GD="") + +diff -ur sarg-2.0.6/grepday.c sarg-2.0.6rbs/grepday.c +--- sarg-2.0.6/grepday.c 2005-04-23 02:27:48.000000000 +0400 ++++ sarg-2.0.6rbs/grepday.c 2005-04-24 15:34:19.000000000 +0400 +@@ -36,6 +36,38 @@ + char *font1 = SYSCONFDIR"/fonts/Verdana.TTF"; + char s[15]; + ++#ifdef HAVE_ICONV_H ++#include ++#define SARGgdImageStringFT I18NgdImageStringFT ++ ++BGD_DECLARE(char *) I18NgdImageStringFT (gdImage * im, int *brect, int fg, char *fontlist, ++ double ptsize, double angle, int x, int y, ++ char *string) ++{ ++ iconv_t localtoutf; ++ char *sstring, *str, *sstr, *retval; ++ size_t slen, sslen; ++ ++ slen = strlen(string) + 1; // We must include string termination character ++ sslen = slen * 2; // We assume that UTF8 maximum 2 times large than local ++ sstring = (char *)malloc(sslen); ++ ++ str = (char *) string; ++ sstr = (char *) sstring; ++ ++ localtoutf = iconv_open ("UTF-8", CharSet); ++ iconv (localtoutf, &str, &slen, &sstr, &sslen); ++ iconv_close (localtoutf); ++ ++ retval = gdImageStringFTEx (im, brect, fg, fontlist, ptsize, angle, x, y, sstring, gdFTEX_Unicode); ++ free(sstring); ++ ++ return retval; ++} ++#else ++#define SARGgdImageStringFT gdImageStringFT ++#endif ++ + void *bar(long long int *n) + { + #ifdef HAVE_GD +@@ -173,7 +205,7 @@ + + snprintf(v,6,"%s",fixnum(num,0)); + +- gdImageStringFT(im,&brect[0],black,font1,5,0.0,x1-1,val-12,v); ++ SARGgdImageStringFT(im,&brect[0],black,font1,5,0.0,x1-1,val-12,v); + + points[0].x = x1+17; + points[0].y = val-5; +@@ -270,7 +302,7 @@ + y=65; + for(x=1; x<=31; x++) { + sprintf(s,"%02d",x); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,y,437,s); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,y,437,s); + y=y+20; + } + +@@ -281,51 +313,51 @@ + if(strcmp(DateFormat,"e") == 0) + strftime(ftime, 127, "%d/%b/%Y-%H:%M", local); + +- gdImageStringFT(im,&brect[0],darkblue,font1,6,0.0,620,470,ftime); +- gdImageStringFT(im,&brect[0],darkblue,font1,9,0.0,257,15,"SARG, "); +- gdImageStringFT(im,&brect[0],darkblue,font1,9,0.0,300,15,Title); ++ SARGgdImageStringFT(im,&brect[0],darkblue,font1,6,0.0,620,470,ftime); ++ if(strcmp(ShowSargInfo,"yes") == 0) SARGgdImageStringFT(im,&brect[0],darkblue,font1,9,0.0,257,15,"SARG, "); ++ SARGgdImageStringFT(im,&brect[0],darkblue,font1,9,0.0,300,15,Title); + sprintf(warea,"%s: %s",text[89],periodo); +- gdImageStringFT(im,&brect[0],darkblue,font1,7,0.0,300,27,warea); ++ SARGgdImageStringFT(im,&brect[0],darkblue,font1,7,0.0,300,27,warea); + sprintf(warea,"%s: %s",text[90],name); +- gdImageStringFT(im,&brect[0],darkblue,font1,7,0.0,300,38,warea); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,418," 50K"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,408,"250K"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,398,"500K"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,388," 1M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,378," 2M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,368," 3M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,358," 4M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,348," 5M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,338," 6M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,328," 7M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,318," 8M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,308," 9M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,298," 10M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,288," 15M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,278," 20M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,268," 30M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,258," 40M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,248," 50M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,238," 60M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,228," 70M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,218," 80M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,208," 90M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,198,"100M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,188,"200M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,178,"300M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,168,"400M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,158,"500M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,148,"600M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,138,"700M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,128,"800M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,118,"900M"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,108," 1G"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23, 98," 2G"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23, 88," 3G"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23, 78," 4G"); +- gdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23, 68," 5G"); +- gdImageStringFT(im,&brect[0],black,font1,10,3.14/2,20,248,text[93]); +- gdImageStringFT(im,&brect[0],black,font1,10,0.0,330,460,text[127]); ++ SARGgdImageStringFT(im,&brect[0],darkblue,font1,7,0.0,300,38,warea); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,418," 50K"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,408,"250K"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,398,"500K"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,388," 1M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,378," 2M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,368," 3M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,358," 4M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,348," 5M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,338," 6M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,328," 7M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,318," 8M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,308," 9M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,298," 10M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,288," 15M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,278," 20M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,268," 30M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,258," 40M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,248," 50M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,238," 60M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,228," 70M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,218," 80M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,208," 90M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,198,"100M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,188,"200M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,178,"300M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,168,"400M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,158,"500M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,148,"600M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,138,"700M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,128,"800M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,118,"900M"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23,108," 1G"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23, 98," 2G"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23, 88," 3G"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23, 78," 4G"); ++ SARGgdImageStringFT(im,&brect[0],dimgray,font1,7,0.0,23, 68," 5G"); ++ SARGgdImageStringFT(im,&brect[0],black,font1,10,3.14/2,20,248,text[93]); ++ SARGgdImageStringFT(im,&brect[0],black,font1,10,0.0,330,460,text[127]); + + sprintf(graph,"%s/%s/graph_day.png",dirname,user); + sprintf(wdirname,"%s/%s.day",tmp,user); + +--Boundary-00=_eQ5aCJp/CximSea +Content-Type: text/x-diff; charset="koi8-r"; name="htmllogreport.patch" +Content-Disposition: attachment; filename="htmllogreport.patch" +Content-Transfer-Encoding: 8bit + +diff -ur sarg-2.0.6/html.c sarg-2.0.6rbs/html.c +--- sarg-2.0.6/html.c 2005-04-23 02:27:48.000000000 +0400 ++++ sarg-2.0.6rbs/html.c 2005-04-24 15:58:36.000000000 +0400 +@@ -349,23 +349,11 @@ + for(s=ltext110; *s; ++s) + *s=tolower(*s); + } +- z1=0; +- z2=0; +- strcpy(siteind,url); ++ strcpy(siteind,urly); + str=siteind; +- for(z1=0; z1<=strlen(str); z1++) { +- if(str[z1]=='-') ++ for(z1=0; z1",usuario,siteind,ltext110,text[55]); + } else { +diff -ur sarg-2.0.6/log.c sarg-2.0.6rbs/log.c +--- sarg-2.0.6/log.c 2005-04-23 01:03:19.000000000 +0400 ++++ sarg-2.0.6rbs/log.c 2005-04-24 16:00:53.000000000 +0400 +@@ -974,21 +974,11 @@ + sprintf(user,"%s.%s",w,wuser); + } + +- z1=0; +- z2=0; + str=user; +- for(z1=0; z1<=strlen(str); z1++) { ++ for(z1=0; z1\n", fp_ou ); + + if(strcmp(datetimeby,"bytes") == 0) +- strcpy( html, "BYTES" ); ++ strcpy( html, text[93] ); + else + strcpy( html, "H:M:S" ); + + for( i = 0; i < hours.len; i++ ) + fprintf( fp_ou, +- "%02dH
%s\n", hours.list[ i ], html ); ++ "%d%s
%s\n", hours.list[ i ], text[129], html ); + fprintf( fp_ou, + "%s
%s\n", text[107], html ); + + +--Boundary-00=_eQ5aCJp/CximSea +Content-Type: text/x-diff; charset="koi8-r"; name="Russian_koi8.patch" +Content-Disposition: attachment; filename="Russian_koi8.patch" +Content-Transfer-Encoding: 8bit + +diff -ru sarg-2.0.6/languages/Russian_koi8 sarg-2.0.6rbs/languages/Russian_koi8 +--- sarg-2.0.6/languages/Russian_koi8 2004-11-22 16:37:02.000000000 +0300 ++++ sarg-2.0.6rbs/languages/Russian_koi8 2004-11-25 03:02:36.000000000 +0300 +@@ -1,4 +1,4 @@ +-# by Andrew Okhmat ++# by Andrew Okhmat and Sapon Oleg + "äÁ" + "îÅÔ" + "Russian" +@@ -27,7 +27,7 @@ + "å×ÒÏÐÁ" + "áÍÅÒÉËÁ" + "IP ÏÔÞÅÔ" +-"éÓÐÏÌØÚÏ×ÁÔØ Ip-ÁÄÒÅÓ ×ÍÅÓÔÏ ÉÍÅÎÉ ÐÏÌØÚÏ×ÁÔÅÌÑ" ++"éÓÐÏÌØÚÏ×ÁÔØ IP-ÁÄÒÅÓ ×ÍÅÓÔÏ ÉÍÅÎÉ ÐÏÌØÚÏ×ÁÔÅÌÑ" + "áÄÒÅÓÁ" + "÷ÒÅÍÑ" + "éÍÑ" +@@ -81,7 +81,7 @@ + "× ÏÂÙÞÎÏÍ ÐÏÒÑÄËÅ" + "õÄÁÌÑÀ ÓÔÁÒÙÊ ÆÁÊÌ ÏÔÞÅÔÁ" + "õÄÁÌÑÀ ×ÒÅÍÅÎÎÙÅ ÆÁÊÌÙ" +-"ôÏÐ" ++"ôÏÐ ÓÁÊÔÙ" + "óÁÊÔÙ" + "óÁÊÔÙ É ðÏÌØÚÏ×ÁÔÅÌÉ" + "úÁÇÒÕÖÁÀ ÔÁÂÌÉÃÕ ÐÏÌØÚÏ×ÁÔÅÌÑ" +@@ -113,13 +113,18 @@ + "OUT" + "IN" + "CACHE" +-"SitesUsers" +-"óÍÁÒÔæÉÌØÔÒ" +-"ïÛÉÂËÁ ÁÕÔÅÎÔÉÆÉËÁÃÉÉ" ++"óÁÊÔÙ É ðÏÌØÚÏ×ÁÔÅÌÉ" ++"SmartFilter" ++"ïÛÉÂËÉ ÁÕÔÅÎÔÉÆÉËÁÃÉÉ" ++"úáðòåô" ++"ôÏÐ ÓÁÊÔÙ" + "SQUIDGUARD" +-"RULE" ++"ðÒÁ×ÉÌÏ" + "squidGuard" +-"Sarg parsed log saved as" +-"Sarg log format" +-"Graphic" +-"DAYS" ++"öÕÒÎÁÌ, ÏÂÒÁÂÏÔÁÎÎÙÊ Sarg ÓÏÈÒÁÎÅÎ ×" ++"æÏÒÍÁÔ ÆÁÊÌÁ ÖÕÒÎÁÌÁ Sarg" ++"úÁËÁÞËÉ" ++"äÉÁÇÒÁÍÍÁ" ++"äÎÉ" ++"äÎÉ" ++"þ" + +--Boundary-00=_eQ5aCJp/CximSea +Content-Type: text/x-diff; charset="koi8-r"; name="siteuser.patch" +Content-Disposition: attachment; filename="siteuser.patch" +Content-Transfer-Encoding: 8bit + +diff -ru sarg-2.0.6/siteuser.c sarg-2.0.6rbs/siteuser.c +--- sarg-2.0.6/siteuser.c 2005-04-20 20:52:20.000000000 +0400 ++++ sarg-2.0.6rbs/siteuser.c 2005-02-21 21:13:23.000000000 +0300 +@@ -131,6 +131,24 @@ + continue; + if(userip) + fixip(user); ++ ++ if(UserTabFile[0] != '\0') { ++ sprintf(warea,":%s:",user); ++ if((str=(char *) strstr(userfile,warea)) != (char *) NULL ) { ++ z1=0; ++ str2=(char *) strstr(str+1,":"); ++ str2++; ++ bzero(name, MAXLEN); ++ while(str2[z1] != ':') { ++ name[z1]=str2[z1]; ++ z1++; ++ } ++ } else strcpy(name,user); ++ } else strcpy(name,user); ++ ++ if(strcmp(Ip2Name,"yes") == 0) ++ ip2name(user); ++ + if(strcmp(Ip2Name,"yes") == 0) + ip2name(user); + +@@ -143,9 +161,9 @@ + regs++; + } + +- sprintf(wuser," %s ",user); ++ sprintf(wuser," %s ",name); + if(strstr(users,wuser) == 0 && strcmp(url,ourl) == 0) { +- strcat(users,user); ++ strcat(users,name); + strcat(users," "); + ucount++; + if(ucount>4) { +@@ -168,7 +186,7 @@ + fputs(html,fp_ou); + regs++; + ucount=0; +- strcpy(users,user); ++ strcpy(users,name); + strcat(users," "); + strcpy(ourl,url); + } + +--Boundary-00=_eQ5aCJp/CximSea +Content-Type: text/x-diff; charset="koi8-r"; name="index.patch" +Content-Disposition: attachment; filename="index.patch" +Content-Transfer-Encoding: 8bit + +diff -ur sarg-2.0.6/index.c sarg-2.0.6rbs/index.c +--- sarg-2.0.6/index.c 2005-02-21 21:13:23.000000000 +0300 ++++ sarg-2.0.6rbs/index.c 2005-04-24 07:40:41.000000000 +0400 +@@ -78,6 +78,7 @@ + bzero(newname, 512); + strncat(newname,direntp->d_name,4); + strncpy(month,direntp->d_name+4,3); ++ month[3]='\0'; + conv_month(month); + strcat(newname,month); + strncat(newname,direntp->d_name+7,2); + +--Boundary-00=_eQ5aCJp/CximSea-- + diff --git a/patches/oleg1 b/patches/oleg1 new file mode 100644 index 0000000..33a8712 --- /dev/null +++ b/patches/oleg1 @@ -0,0 +1,322 @@ +From xsov@mail.ru Fri May 6 04:30:56 2005 +Received: 194.67.23.149 / smx2.brturbo.com +Received: from [212.48.201.194] (port=40725 helo=[192.168.0.77]) by + mx3.mail.ru with asmtp id 1DTqX4-0008GO-00 for orso@brturbo.com.br; Fri, + 06 May 2005 04:17:31 +0400 +From: Oleg +To: Pedro Lineu Orso +Subject: Re: sarg-2.0.6 new patches +Date: Fri, 6 May 2005 04:30:56 +0400 +User-Agent: KMail/1.7.2 +References: <200504241642.06841.xsov@mail.ru> + <1115290770.4499.7.camel@lcaklds49> +In-Reply-To: <1115290770.4499.7.camel@lcaklds49> +MIME-Version: 1.0 +Content-Type: Multipart/Mixed; boundary="Boundary-00=_BrreCrvUGWRZVaY" +Message-Id: <200505060430.57213.xsov@mail.ru> +X-Evolution-Source: pop://orso@pop.brturbo.com.br + + +--Boundary-00=_BrreCrvUGWRZVaY +Content-Type: text/plain; charset="koi8-r" +Content-Disposition: inline +Content-Transfer-Encoding: 8bit + +Hello Pedro! + +PL > I have implemented your patches on sarg-2.0.7 and there are some sarg +PL > users asking me +PL > about this one: +PL > +PL > . Fixes segfault, produced by inproper use of strncpy functions, look - +PL > strncpy +PL > +PL > Can you please explain when segfault happens? +PL > +PL > I've seen that the forth characted of month[] in index.c is set to null +PL > to avoid strcat to segfault, but I cannot understand when this is +PL > needed. + +I have big-big squid.log file, and this error is produced only when I use +"LongUrl=yes" option in configuration file, I deeply debug code and see, that +error was at that place of code. I also can assume that overrun of '\0' +symbol was produced by error in other part of code. If you want I can get +part of my squid.log file, which produce this error and send it to you with +my squid.conf file (but I can do this not so fast, because file is very +large, and I can't send sensitive information from it to anybody). + +I include here another my patches for new sarg 2.0.7 version: +1) topuser.diff: +URL size is too small for URL with coded symbols, like %2f for slash ('/') +symbol, I see URLs in my squid.log file with length about 1400 characters. So +because there was number 1024 (I don't know where you get it, may be from +some RFC?), and one symbol can be 3-times longer, I enlarge buffer to 3072 +characters (3 x 1024). + +2) util.diff +There I replace all '<=12' condition to '<12' because array of months has 12 +elements, which are numbered from 0, so: +0 - 1st (January) +1 - 2nd (February) +... +11 - 12th (December) +and condition <=12 will loop for 13 elements, that is wrong. + +I also remove unneeded 'return;' at the ends of some functions (I don't think +it is required for other operating systems). + +Regards, Oleg. + +--Boundary-00=_BrreCrvUGWRZVaY +Content-Type: text/x-diff; charset="koi8-r"; name="topuser.diff" +Content-Disposition: attachment; filename="topuser.diff" +Content-Transfer-Encoding: 8bit + +--- sarg-2.0.7/topuser.c 2005-05-02 17:55:04.000000000 +0400 ++++ sarg-2.0.7rbs/topuser.c 2005-05-04 03:53:48.000000000 +0400 +@@ -38,7 +38,7 @@ + int posicao=0; + char olduser[MAXLEN], csort[MAXLEN], periodo[MAXLEN], arqper[MAXLEN]; + char wger[MAXLEN], top1[MAXLEN], top2[MAXLEN], top3[MAXLEN]; +- char user[MAXLEN], nacc[20], nbytes[20], url[1024], preg[8000], tusr[MAXLEN]; ++ char user[MAXLEN], nacc[20], nbytes[20], url[3072], preg[8000], tusr[MAXLEN]; + char ip[MAXLEN], hora[9], data[11], elap[15], incac[15], oucac[15], html[MAXLEN]; + char ipantes[MAXLEN], nameantes[MAXLEN]; + char sfield[10]="2,2"; + +--Boundary-00=_BrreCrvUGWRZVaY +Content-Type: text/x-diff; charset="koi8-r"; name="util.diff" +Content-Disposition: attachment; filename="util.diff" +Content-Transfer-Encoding: 8bit + +--- sarg-2.0.7/util.c 2005-05-02 17:55:04.000000000 +0400 ++++ sarg-2.0.7rbs/util.c 2005-05-04 04:04:01.000000000 +0400 +@@ -246,7 +246,7 @@ + ndia[0]='\0'; + nmes[0]='\0'; + +- for(x=0; x<=12; x++) { ++ for(x=0; x<12; x++) { + if(strcmp(mtab1[x],mes) == 0) { + strncpy(nmes,mtab2[x],sizeof(nmes)-1); + nmes[sizeof(nmes)-1]=0; +@@ -262,9 +262,6 @@ + + strncpy(dia,ndia,sizeof(dia)-1); + dia[sizeof(dia)-1]=0; +- +- return; +- + } + + +@@ -275,15 +272,12 @@ + + nmes[0]='\0'; + +- for(x=0; x<=12; x++) { ++ for(x=0; x<12; x++) { + if(strcmp(mtab1[x],mes) == 0) + strcpy(nmes,mtab2[x]); + } + + sprintf(wdata,"%s%s%s",ano,nmes,dia); +- +- return; +- + } + + +@@ -291,13 +285,10 @@ + { + int x; + +- for(x=0; x<=12; x++) { ++ for(x=0; x<12; x++) { + if(strcmp(mtab1[x],month) == 0) + strcpy(month,mtab2[x]); + } +- +- return; +- + } + + +@@ -305,7 +296,7 @@ + { + int x; + +- for(x=0; x<=12; x++) { ++ for(x=0; x<12; x++) { + if(strcmp(mtab2[x],month) == 0) + strcpy(month,mtab1[x]); + } +@@ -328,7 +319,7 @@ + strncpy(ano,duntil,4); + ano[4]='\0'; + +- for(x=0; x<=12; x++) { ++ for(x=0; x<12; x++) { + if(strcmp(mtab2[x],mes) == 0) + strcpy(mes,mtab1[x]); + } +@@ -339,23 +330,18 @@ + sprintf(warea,"%s%s%s",ano,mes,dia); + + strcat(periodo,warea); +- return; + } + + + void debuga(char *msg) + { + fprintf(stderr, "SARG: %s\n",msg); +- +- return; + } + + + void debugaz(char *head, char *msg) + { + fprintf(stderr, "SARG: (util) %s=%s\n",head, msg); +- +- return; + } + + +@@ -384,8 +370,6 @@ + } + ip[0]='\0'; + sprintf(ip,"%s%s%s%s%s%s%s",n1,sep,n2,sep,n3,sep,wip); +- +- return; + } + + +@@ -499,9 +483,6 @@ + strcpy(href," +To: Pedro Lineu Orso +Subject: Re: sarg-2.0.6 new patches +Date: Fri, 6 May 2005 04:30:56 +0400 +User-Agent: KMail/1.7.2 +References: <200504241642.06841.xsov@mail.ru> + <1115290770.4499.7.camel@lcaklds49> +In-Reply-To: <1115290770.4499.7.camel@lcaklds49> +MIME-Version: 1.0 +Content-Type: Multipart/Mixed; boundary="Boundary-00=_BrreCrvUGWRZVaY" +Message-Id: <200505060430.57213.xsov@mail.ru> +X-Evolution-Source: pop://orso@pop.brturbo.com.br + + +--Boundary-00=_BrreCrvUGWRZVaY +Content-Type: text/plain; charset="koi8-r" +Content-Disposition: inline +Content-Transfer-Encoding: 8bit + +Hello Pedro! + +PL > I have implemented your patches on sarg-2.0.7 and there are some sarg +PL > users asking me +PL > about this one: +PL > +PL > . Fixes segfault, produced by inproper use of strncpy functions, look - +PL > strncpy +PL > +PL > Can you please explain when segfault happens? +PL > +PL > I've seen that the forth characted of month[] in index.c is set to null +PL > to avoid strcat to segfault, but I cannot understand when this is +PL > needed. + +I have big-big squid.log file, and this error is produced only when I use +"LongUrl=yes" option in configuration file, I deeply debug code and see, that +error was at that place of code. I also can assume that overrun of '\0' +symbol was produced by error in other part of code. If you want I can get +part of my squid.log file, which produce this error and send it to you with +my squid.conf file (but I can do this not so fast, because file is very +large, and I can't send sensitive information from it to anybody). + +I include here another my patches for new sarg 2.0.7 version: +1) topuser.diff: +URL size is too small for URL with coded symbols, like %2f for slash ('/') +symbol, I see URLs in my squid.log file with length about 1400 characters. So +because there was number 1024 (I don't know where you get it, may be from +some RFC?), and one symbol can be 3-times longer, I enlarge buffer to 3072 +characters (3 x 1024). + +2) util.diff +There I replace all '<=12' condition to '<12' because array of months has 12 +elements, which are numbered from 0, so: +0 - 1st (January) +1 - 2nd (February) +... +11 - 12th (December) +and condition <=12 will loop for 13 elements, that is wrong. + +I also remove unneeded 'return;' at the ends of some functions (I don't think +it is required for other operating systems). + +Regards, Oleg. + +--Boundary-00=_BrreCrvUGWRZVaY +Content-Type: text/x-diff; charset="koi8-r"; name="topuser.diff" +Content-Disposition: attachment; filename="topuser.diff" +Content-Transfer-Encoding: 8bit + +--- sarg-2.0.7/topuser.c 2005-05-02 17:55:04.000000000 +0400 ++++ sarg-2.0.7rbs/topuser.c 2005-05-04 03:53:48.000000000 +0400 +@@ -38,7 +38,7 @@ + int posicao=0; + char olduser[MAXLEN], csort[MAXLEN], periodo[MAXLEN], arqper[MAXLEN]; + char wger[MAXLEN], top1[MAXLEN], top2[MAXLEN], top3[MAXLEN]; +- char user[MAXLEN], nacc[20], nbytes[20], url[1024], preg[8000], tusr[MAXLEN]; ++ char user[MAXLEN], nacc[20], nbytes[20], url[3072], preg[8000], tusr[MAXLEN]; + char ip[MAXLEN], hora[9], data[11], elap[15], incac[15], oucac[15], html[MAXLEN]; + char ipantes[MAXLEN], nameantes[MAXLEN]; + char sfield[10]="2,2"; + +--Boundary-00=_BrreCrvUGWRZVaY +Content-Type: text/x-diff; charset="koi8-r"; name="util.diff" +Content-Disposition: attachment; filename="util.diff" +Content-Transfer-Encoding: 8bit + +--- sarg-2.0.7/util.c 2005-05-02 17:55:04.000000000 +0400 ++++ sarg-2.0.7rbs/util.c 2005-05-04 04:04:01.000000000 +0400 +@@ -246,7 +246,7 @@ + ndia[0]='\0'; + nmes[0]='\0'; + +- for(x=0; x<=12; x++) { ++ for(x=0; x<12; x++) { + if(strcmp(mtab1[x],mes) == 0) { + strncpy(nmes,mtab2[x],sizeof(nmes)-1); + nmes[sizeof(nmes)-1]=0; +@@ -262,9 +262,6 @@ + + strncpy(dia,ndia,sizeof(dia)-1); + dia[sizeof(dia)-1]=0; +- +- return; +- + } + + +@@ -275,15 +272,12 @@ + + nmes[0]='\0'; + +- for(x=0; x<=12; x++) { ++ for(x=0; x<12; x++) { + if(strcmp(mtab1[x],mes) == 0) + strcpy(nmes,mtab2[x]); + } + + sprintf(wdata,"%s%s%s",ano,nmes,dia); +- +- return; +- + } + + +@@ -291,13 +285,10 @@ + { + int x; + +- for(x=0; x<=12; x++) { ++ for(x=0; x<12; x++) { + if(strcmp(mtab1[x],month) == 0) + strcpy(month,mtab2[x]); + } +- +- return; +- + } + + +@@ -305,7 +296,7 @@ + { + int x; + +- for(x=0; x<=12; x++) { ++ for(x=0; x<12; x++) { + if(strcmp(mtab2[x],month) == 0) + strcpy(month,mtab1[x]); + } +@@ -328,7 +319,7 @@ + strncpy(ano,duntil,4); + ano[4]='\0'; + +- for(x=0; x<=12; x++) { ++ for(x=0; x<12; x++) { + if(strcmp(mtab2[x],mes) == 0) + strcpy(mes,mtab1[x]); + } +@@ -339,23 +330,18 @@ + sprintf(warea,"%s%s%s",ano,mes,dia); + + strcat(periodo,warea); +- return; + } + + + void debuga(char *msg) + { + fprintf(stderr, "SARG: %s\n",msg); +- +- return; + } + + + void debugaz(char *head, char *msg) + { + fprintf(stderr, "SARG: (util) %s=%s\n",head, msg); +- +- return; + } + + +@@ -384,8 +370,6 @@ + } + ip[0]='\0'; + sprintf(ip,"%s%s%s%s%s%s%s",n1,sep,n2,sep,n3,sep,wip); +- +- return; + } + + +@@ -499,9 +483,6 @@ + strcpy(href," +To: Pedro Lineu Orso +Subject: Re: sarg-2.0.6 new patches +Date: Wed, 11 May 2005 23:30:30 +0400 +User-Agent: KMail/1.7.2 +References: <200504241642.06841.xsov@mail.ru> + <200505060430.57213.xsov@mail.ru> <1115814131.8900.1.camel@lcaklds49> +In-Reply-To: <1115814131.8900.1.camel@lcaklds49> +MIME-Version: 1.0 +Content-Type: Multipart/Mixed; boundary="Boundary-00=_W1lgCFYB9s7BJUS" +Message-Id: <200505112330.30670.xsov@mail.ru> +X-Evolution-Source: pop://orso@pop.brturbo.com.br/ + + +--Boundary-00=_W1lgCFYB9s7BJUS +Content-Type: text/plain; charset="koi8-r" +Content-Disposition: inline +Content-Transfer-Encoding: 8bit + +Hello Pedro! + +I found the bugplace, it is already fixed by me in previous topuser.diff patch +for 2.0.7 (not by those 6 patches for 2.0.6), howeverer I include my log file +example here with configuration files: +- sarg.conf; +- exclude_codes; +- access.log. + +It looks like in this access.log example the one symbol is replaced by 6 (for +example: %u049F), so in previous topuser.diff patch there must be 1024*6 = +6144 size for array url (I include new, modified topuser.diff patch for +2.0.7, which will fix this bug). So, for now, the part of old my patch for +2.0.6, which adds '\0' at the end of line is not necessary. + +I also include here my recommendations for "download_suffix" option default +value (look at extensions-was.txt for old values and extensions-be.txt for +new). I mark with star "(*)" symbol most important changes. + +Regards, Oleg. + +÷ ÓÏÏÂÝÅÎÉÉ ÏÔ óÒÅÄÁ 11 íÁÊ 2005 16:22 ×Ù ÎÁÐÉÓÁÌÉ: +PL > Hello Oleg, +PL > +PL > May I have some of that log file to try to hack sarg, and you sarg.conf +PL > file too, please? +PL > +PL > Thanks + +--Boundary-00=_W1lgCFYB9s7BJUS +Content-Type: text/plain; charset="koi8-r"; name="extensions-be.txt" +Content-Disposition: attachment; filename="extensions-be.txt" +Content-Transfer-Encoding: 8bit + +tgz - archive +tar - archive(*) +cpio - archive +zip - archive +arj - archive +bzip - archive +bz2 - archive +gz - archive +rar - archive +ace - archive +lha - archive +lzh - archive +cab - archive +7z - archive +tar - archive +cpio - archive + +doc - office suite document +mdb - office suite document +ppt - office suite document +rtf - office suite document +mso - office suite document(?) +dot - office suite document(?) + +bin - conatain binary executable +com - conatain binary executable +sys - conatain binary executable +exe - conatain binary executable +dll - conatain binary executable +bin - conatain binary executable +scr - conatain binary executable(*) +bat - conatain binary executable + +iso - cd/dvd image +nrg - cd/dvd image +vcd - cd/dvd image(*) +vob - cd/dvd image(*) + +mp3 - multimedia +avi - multimedia +mpg - multimedia +mpeg - multimedia +wma - multimedia +wmv - multimedia(*) +ogg - multimedia +mov - multimedia + +=================================== +adt - don't know +drv$ - don't know +src - don't know +shs - don't know + +--Boundary-00=_W1lgCFYB9s7BJUS +Content-Type: text/x-diff; charset="koi8-r"; name="topuser.diff" +Content-Disposition: attachment; filename="topuser.diff" +Content-Transfer-Encoding: 8bit + +--- sarg-2.0.7/topuser.c 2005-05-02 17:55:04.000000000 +0400 ++++ sarg-2.0.7rbs/topuser.c 2005-05-04 03:53:48.000000000 +0400 +@@ -38,7 +38,7 @@ + int posicao=0; + char olduser[MAXLEN], csort[MAXLEN], periodo[MAXLEN], arqper[MAXLEN]; + char wger[MAXLEN], top1[MAXLEN], top2[MAXLEN], top3[MAXLEN]; +- char user[MAXLEN], nacc[20], nbytes[20], url[1024], preg[8000], tusr[MAXLEN]; ++ char user[MAXLEN], nacc[20], nbytes[20], url[6144], preg[8000], tusr[MAXLEN]; + char ip[MAXLEN], hora[9], data[11], elap[15], incac[15], oucac[15], html[MAXLEN]; + char ipantes[MAXLEN], nameantes[MAXLEN]; + char sfield[10]="2,2"; + +--Boundary-00=_W1lgCFYB9s7BJUS +Content-Type: text/plain; charset="koi8-r"; name="extensions-was.txt" +Content-Disposition: attachment; filename="extensions-was.txt" +Content-Transfer-Encoding: 8bit + +tgz - archive +zip - archive +arj - archive +bzip - archive +bz2 - archive +gz - archive +rar - archive +ace - archive +lha - archive +lzh - archive +cab - archive + +doc - office suite document +mdb - office suite document +ppt - office suite document +rtf - office suite document +mso - office suite document(?) +dot - office suite document(?) + +bin - conatain binary executable +com - conatain binary executable +sys - conatain binary executable +exe - conatain binary executable +dll - conatain binary executable +bin - conatain binary executable + +iso - cd/dvd image + +mp3 - multimedia +avi - multimedia +mpg - multimedia +mpeg - multimedia + +=================================== +adt - don't know +drv$ - don't know +src - don't know +shs - don't know + +--Boundary-00=_W1lgCFYB9s7BJUS +Content-Type: text/plain; charset="koi8-r"; name="sarg.conf" +Content-Disposition: attachment; filename="sarg.conf" +Content-Transfer-Encoding: 8bit + +# sarg.conf +# +# TAG: language +# Available languages: +# Bulgarian_windows1251 +# Catalan +# Czech +# Dutch +# English +# French +# German +# Hungarian +# Indonesian +# Italian +# Japanese +# Latvian +# Polish +# Portuguese +# Romanian +# Russian_koi8 +# Russian_windows1251 +# Serbian +# Spanish +# Turkish +# +language Russian_koi8 + +# TAG: access_log file +# Where is the access.log file +# sarg -l file +# +access_log /mnt/access.log + +# TAG: graphs yes|no +# Use graphics where is possible. +# graph_days_bytes_bar_color blue|green|yellow|orange|brown|red +# +graphs yes +graph_days_bytes_bar_color orange + +# TAG: title +# Especify the title for html page. +# + +# TAG: font_face +# Especify the font for html page. +# +font_face Tahoma,Verdana,Arial + +# TAG: header_color +# Especify the header color +# +header_color darkblue + +# TAG: header_bgcolor +# Especify the header bgcolor +# +header_bgcolor blanchedalmond + +# TAG: font_size +# Especify the text font size +# +font_size 10px + +# TAG: header_font_size +# Especify the header font size +# +header_font_size 10px + +# TAG: title_font_size +# Especify the title font size +# +title_font_size 20px + +# TAG: background_color +# TAG: background_color +# Html page background color +# +background_color white + +# TAG: text_color +# Html page text color +# +text_color #000000 + +# TAG: text_bgcolor +# Html page text background color +# +text_bgcolor lavender + +# TAG: title_color +# Html page title color +# +title_color green + +# TAG: logo_image +# Html page logo. +# + +# TAG: logo_text +# Html page logo text. +# +#logo_text "" + +# TAG: logo_text_color +# Html page logo texti color. +# +#logo_text_color #000000 + +# TAG: logo_image_size +# Html page logo image size. +# width height +# +image_size 253 35 + +# TAG: background_image +# Html page background image +# +#background_image none + +# TAG: password +# User password file used by authentication +# If used here, reports will be generated only for that users. +# +password none + +# TAG: temporary_dir +# Temporary directory name for work files +# sarg -w dir +# +temporary_dir /tmp + +# TAG: output_dir +# The reports will be saved in that directory +# sarg -o dir +# +output_dir /xxx + +# TAG: output_email +# Email address to send the reports. If you use this tag, no html reports will be generated. +# sarg -e email +# +output_email none + +# TAG: resolve_ip yes/no +# Convert ip address to dns name +# sarg -n +resolve_ip no + +# TAG: user_ip yes/no +# Use Ip Address instead userid in reports. +# sarg -p +user_ip no + +# TAG: topuser_sort_field field normal/reverse +# Sort field for the Topuser Report. +# Allowed fields: USER CONNECT BYTES TIME +# +topuser_sort_field BYTES reverse + +# TAG: user_sort_field field normal/reverse +# Sort field for the User Report. +# Allowed fields: SITE CONNECT BYTES TIME +# +user_sort_field BYTES reverse + +# TAG: exclude_users file +# users within the file will be excluded from reports. +# you can use indexonly to have only index.html file. +# +exclude_users none + +# TAG: exclude_hosts file +# Hosts, domains or subnets will be excluded from reports. +# +# Eg.: 192.168.10.10 - exclude ip address only +# 192.168.10.0 - exclude full C class +# s1.acme.foo - exclude hostname only +# acme.foo - exclude full domain name +# +exclude_hosts none + +# TAG: useragent_log file +# Put here where is useragent.log to nable useragent report. +# +#useragent_log none + +# TAG: date_format +# Date format in reports: e (European=dd/mm/yy), u (American=mm/dd/yy), w (Weekly=yy.ww) +# +date_format e + +# TAG: per_user_limit file MB +# Saves userid on file if download exceed n MB. +# This option allow you to disable user access if user exceed a download limit. +# +per_user_limit none + +# TAG: lastlog n +# How many reports files must be keept in reports directory. +# The oldest report file will be automatically removed. +# 0 - no limit. +# +lastlog 0 + +# TAG: remove_temp_files yes +# Remove temporary files: geral, usuarios, top, periodo from root report directory. +# +remove_temp_files yes + +# TAG: index yes|no|only +# Generate the main index.html. +# only - generate only the main index.html +# +index yes + +# TAG: overwrite_report yes|no +# yes - if report date already exist then will be overwrited. +# no - if report date already exist then will be renamed to filename.n, filename.n+1 +# +overwrite_report yes + +# TAG: records_without_userid ignore|ip|everybody +# What can I do with records without user id (no authentication) in access.log file ? +# +# ignore - This record will be ignored. +# ip - Use ip address instead. (default) +# everybody - Use "everybody" instead. +# +records_without_userid ip + +# TAG: use_comma no|yes +# Use comma instead point in reports. +# Eg.: use_comma yes => 23,450,110 +# use_comma no => 23.450.110 +# +use_comma no + +# TAG: mail_utility mail|mailx +# Mail command to use to send reports via SMTP +# +#mail_utility mailx + +# TAG: topsites_num n +# How many sites in topsites report. +# +topsites_num 100 + +# TAG: topsites_sort_order CONNECT|BYTES A|D +# Sort for topsites report, where A=Ascendent, D=Descendent +# +topsites_sort_order BYTES D + +# TAG: index_sort_order A/D +# Sort for index.html, where A=Ascendent, D=Descendent +# +index_sort_order D + +# TAG: exclude_codes file +# Ignore records with these codes. Eg.: NONE/400 +# +exclude_codes /xxx/exclude_codes + +# TAG: replace_index string +# Replace "index.html" in the main index file with this string +# If null "index.html" is used +# +#replace_index + +# TAG: max_elapsed milliseconds +# If elapsed time is recorded in log is greater than max_elapsed use 0 for elapsed time. +# Use 0 for no checking +# +max_elapsed 0 +# 8 Hours +#max_elapsed 28800000 + +# TAG: report_type type +# What kind of reports to generate. +# topsites - shows the site, connect and bytes +# sites_users - shows which users were accessing a site +# users_sites - shows sites accessed by the user +# date_time - shows the amount of bytes used by day and hour +# denied - shows all denied sites with full URL +# auth_failures - shows autentication failures +# site_user_time_date - shows sites, dates, times and bytes +# +# Eg.: report_type topsites denied +# +#report_type topsites sites_users users_sites date_time denied auth_failures site_user_time_date +report_type topsites sites_users users_sites date_time denied auth_failures site_user_time_date + +# TAG: usertab filename +# You can change the "userid" or the "ip address" to be a real user name on the rpeorts. +# Table syntax: +# userid name or ip address name +# Eg: +# SirIsaac Isaac Newton +# vinci Leonardo da Vinci +# 192.168.10.1 Karol Wojtyla +# +# Each line must be terminated with '\n' +# + +# TAG: long_url yes|no +# If yes, the full url is showed in report. +# If no, only the site will be showed +# +# YES option generate very big sort files and reports. +# +long_url yes + +# TAG: date_time_by bytes|elap +# Date/Time reports will use bytes or elapsed time? +# +date_time_by bytes + +# TAG: charset name +# ISO 8859 is a full series of 10 standardized multilingual single-byte coded (8bit) +# graphic character sets for writing in alphabetic languages +# You can use the following charsets: +# Latin1 - West European +# Latin2 - East European +# Latin3 - South European +# Latin4 - North European +# Cyrillic +# Arabic +# Greek +# Hebrew +# Latin5 - Turkish +# Latin6 +# Windows-1251 +# Koi8-r +# +charset KOI8-R + +# TAG: user_invalid_char "&/" +# Records that contain invalid characters in userid will be ignored by Sarg. +# +#user_invalid_char "&/" + +# TAG: privacy yes|no +# privacy_string "***.***.***.***" +# privacy_string_color blue +# In some countries the sysadm cannot see the visited sites by a restrictive law. +# Using privacy yes the visited url will be changes by privacy_string and the link +# will be removed from reports. +# +privacy no +#privacy_string "***.***.***.***" +#privacy_string_color blue + +# TAG: include_users "user1:user2:...:usern" +# Reports will be generated only for listed users. +# +#include_users none + +# TAG: exclude_string "string1:string2:...:stringn" +# Records from access.log file that contain one of listed strings will be ignored. +# +#exclude_string none + +# TAG: show_successful_message yes|no +# Shows "Successful report generated on dir" at end of process. +# +show_successful_message no + +# TAG: show_read_statistics yes|no +# Shows some reading statistics. +# +show_read_statistics no + +# TAG: topuser_fields +# Which fields must be in Topuser report. +# +topuser_fields NUM DATE_TIME USERID CONNECT BYTES %BYTES TOTAL AVERAGE + +# TAG: user_report_fields +# Which fields must be in User report. +# +user_report_fields CONNECT BYTES %BYTES TOTAL AVERAGE + +# TAG: topuser_num n +# How many users in topsites report. 0 = no limit +# +topuser_num 0 + +# TAG: site_user_time_date_type list|table +# generate reports for site_user_time_date in list or table format +# +site_user_time_date_type table + +# TAG: datafile file +# Save the report results in a file to populate some database +# +#datafile none +#datafile /tmp/p8 + +# TAG: datafile_delimiter ";" +# ascii character to use as a field separator in datafile +# +#datafile_delimiter ";" + +# TAG: datafile_fields all +# Which data fields must be in datafile +# user;date;time;url;connect;bytes;in_cache;out_cache;elapsed +# +#datafile_fields user;date;time;url;connect;bytes;in_cache;out_cache;elapsed + +# TAG: weekdays +# The weekdays to take account ( Sunday->0, Saturday->6 ) +# Example: +#weekdays 1-3,5 +# Default: +weekdays 0-6 + +# TAG: hours +# The hours to take account +# Example: +#hours 7-12,14,16,18-20 +# Default: +hours 0-23 + +# TAG: squidguard_conf file +# path to squidGuard.conf file +# Generate reports from SquidGuard logs. +# Use 'none' to disable. +# squidguard_conf /usr/local/squidGuard/squidGuard.conf +# +#squidguard_conf none + +# TAG: squidguard_log_format +# Format string SquidGuard logs. +# REJIK #year#-#mon#-#day# #hour# #list#:#tmp# #ip# #user# #tmp#/#tmp#/#url#/#end# +# SQUIDGUARD #year#-#mon#-#day# #hour# #tmp#/#list#/#tmp#/#tmp#/#url#/#tmp# #ip#/#tmp# #user# #end# +#squidguard_log_format #year#-#mon#-#day# #hour# #tmp#/#list#/#tmp#/#tmp#/#url#/#tmp# #ip#/#tmp# #user# #end# + +# TAG: show_sarg_info yes|no +# shows sarg information and site path on each report bottom +# +show_sarg_info no + +# TAG: show_sarg_logo yes|no +# shows sarg logo +# +show_sarg_logo no + +# TAG: parsed_output_log directory +# Saves the processed log in a sarg format after parsing the squid log file. +# This is a way to dump all of the data structures out, after parsing from +# the logs (presumably this data will be much smaller than the log files themselves), +# and pull them back in for later processing and merging with data from previous logs. +# +#parsed_output_log none + +# TAG parsed_output_log_compress /bin/gzip|/usr/bin/bzip2|nocompress +# sarg logs compress util +# +#parsed_output_log_compress /bin/gzip + +# TAG displayed_values bytes|abbreviation +# how the values will be displayed in reports. +# eg. bytes - 209.526 +# abbreviation - 210K +# +displayed_values bytes + +# Report limits +# TAG authfail_report_limit n +# TAG denied_report_limit n +# TAG siteusers_report_limit n +# TAG squidguard_report_limit n +# TAG user_report_limit n +# report limits (lines). +# '0' no limit +# +authfail_report_limit 0 +denied_report_limit 0 +siteusers_report_limit 0 +squidguard_report_limit 0 +user_report_limit 0 + +# TAG www_document_root dir +# Where is your Web DocumentRoot +# Sarg will create sarg-php directory with some PHP modules: +# - sarg-squidguard-block.php - add urls from user reports to squidGuard DB +# +www_document_root /xxx + +# TAG block_it module_url +# This tag allow you to pass urls from user reports to a cgi or php module, +# to be blocked by some Squid acl +# +# Eg.: block_it /sarg-php/sarg-block-it.php +# sarg-block-it is a php that will append a url to a flat file. +# You must change /var/www/html/sarg-php/sarg-block-it to point to your file +# in $filename variable, and chown to a httpd owner. +# +# sarg will pass http://module_url?url=url +# +block_it none + +# TAG external_css_file path +# This tag allow internal sarg css override. +# Sarg use theses style classes: +# .body body class +# .info sarg information class, align=center +# .title title class, align=center +# .header header class, align:left +# .header2 header class, align:right +# .header3 header class, align:right +# .text text class, align:left +# .data table text class, align:right +# .data2 table text class, align:right, border colors +# .link link class +# +# There is a sample in /usr/local/sarg/etc/css.tpl +# +#external_css_file none + +# TAG user_authentication yes|no +# Allow user authentication in User Reports using .htaccess +# Parameters: +# AuthUserFile - where the user password file is +# AuthName - authentication realm. Eg "Members Only" +# AuthType - authenticaion type - basic +# Require - authorized users to see the report. +# %u - user report +# +# user_authentication no +# AuthUserFile /usr/local/sarg/passwd +# AuthName "SARG, Restricted Access" +# AuthType Basic +# Require user admin %u + +# TAG download_suffix "suffix,suffix,...,suffix" +# file suffix to be considered as "download" in Download report. +# Use 'none' to disable. +# +download_suffix "tgz,zip,arj,bzip,bz2,gz,rar,ace,doc,iso,adt,bin,cab,com,dot,drv$,lha,lzh,mdb,mso,ppt,rtf,src,shs,sys,exe,dll,mp3,avi,mpg,mpeg" + +--Boundary-00=_W1lgCFYB9s7BJUS +Content-Type: text/x-log; charset="koi8-r"; name="access.log" +Content-Disposition: attachment; filename="access.log" +Content-Transfer-Encoding: 8bit + +1112196006.509 265 192.168.77.15 TCP_MISS/200 296 GET http://kmindex.ru/c/?id=313791&id2=48&v=30&l=http%3A//www.alkonvvs.ru/&r=http%3A//www.yandex.ru/yandsearch%3Ftext%3D%25D2%25EE%25F0%25E3%25EE%25E2%25FB%25E5+%25E2%25E8%25F2%25F0%25E8%25ED%25FB%26holdreq%3D%25D2%25EE%25F0%25E3%25EE%25E2%25EE%25E5+%25EE%25E1%25EE%25F0%25F3%25E4%25EE%25E2%25E0%25ED%25E8%25E5%26stype%3Dwww&t=%u0422%u043E%u0440%u0433%u043E%u0432%u043E%u0435%20%u043E%u0431%u043E%u0440%u0443%u0434%u043E%u0432%u0430%u043D%u0438%u0435%2C%20%u043F%u0440%u043E%u0434%u0430%u0436%u0430%20%u0442%u043E%u0440%u0433%u043E%u0432%u043E%u0433%u043E%20%u043E%u0431%u043E%u0440%u0443%u0434%u043E%u0432%u0430%u043D%u0438%u044F%3A%20%u0432%u0438%u0442%u0440%u0438%u043D%u0430%20%u0438%20%u0432%u0438%u0442%u0440%u0438%u043D%u044B%20%u0438%u0437%20%u0430%u043B%u044E%u043C%u0438%u043D%u0438%u0435%u0432%u043E%u0433%u043E%20%u043F%u0440%u043E%u0444%u0438%u043B%u044F%2C%20%u043F%u0440%u043E%u0441%u0442%u043E%20%u0430%u043B%u044E%u043C%u0438%u043D%u0438%u0435%u0432%u044B%u0439%20%u043F%u0440%u043E%u0444%u0438%u043B%u044C%20%u0434%u043B%u044F%20%u0432%u044B%u0441%u0442%u0430%u0432%u043E%u0447%u043D%u043E%u0433%u043E%20%u043E%u0431%u043E%u0440%u0443%u0434%u043E%u0432%u0430%u043D%u0438%u044F%20-%20%u043E%u0442%20%u043A%u043E%u043C%u043F%u0430%u043D%u0438%u0438%20ALCON-BBC&f=0&d=0.95783290883686160.014756022435909899 - DIRECT/217.174.98.3 image/gif + +--Boundary-00=_W1lgCFYB9s7BJUS +Content-Type: text/plain; charset="koi8-r"; name="exclude_codes" +Content-Disposition: attachment; filename="exclude_codes" +Content-Transfer-Encoding: 8bit + +NONE/400 +TCP_MEM_HIT/200 +TCP_REFRESH_HIT/304 +TCP_REFRESH_HIT/200 +TCP_IMS_HIT/304 +TCP_HIT/200 +TCP_NEGATIVE_HIT/404 + +--Boundary-00=_W1lgCFYB9s7BJUS-- + diff --git a/repday.c b/repday.c new file mode 100644 index 0000000..f478a30 --- /dev/null +++ b/repday.c @@ -0,0 +1,233 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +extern numlist hours; + +void report_day(char *user, int *iprel, int *ipuser) +{ + + FILE *fp_in, *fp_ou; + + char data[20]; + char dia[3]; + char mes[3]; + char ano[3]; + char odata[20]; + char hora[20]; + char elap[20]; + char oelap[20]; + char whora[3]; + char html[8000]; + char arqout[MAXLEN]; + char wdirname[MAXLEN]; + char wuser[255]; + char c[ 24 ][20]; + int count=0; + int ihora=0; + long long int telap=0; + long long int v[ 24 ] = { 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L }; + long long int t[ 24 ] = { 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L }; + long long int tt=0, ttt=0; + char ftime[128]; + int i; + + sprintf(arqout,"%s/%s/d%s.html",dirname,user,user); + sprintf(wdirname,"%s/%s.day",tmp,user); + + if(access(wdirname, R_OK) != 0) + return; + + if((fp_in=fopen(wdirname,"r"))==NULL) { + fprintf(stderr, "SARG: (repday) %s: %s\n",text[8],wdirname); + exit(1); + } + + if((fp_ou=fopen(arqout,"w"))==NULL) { + fprintf(stderr, "SARG: (repday) %s: %s\n",text[8],arqout); + exit(1); + } + + fputs("\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + sprintf(html," \n",CharSet); + fputs(html,fp_ou); + css(fp_ou); + fputs("\n",fp_ou); + + if(strlen(FontFace) > 0) { + sprintf(html,"\n",FontFace); + fputs(html,fp_ou); + } + + sprintf(html,"\n",BgColor,TxColor,BgImage); + fputs(html,fp_ou); + + if(strlen(LogoImage) > 0) { + fputs("
\n",fp_ou); + sprintf(html,"
%s\n",LogoImage,Width,Height,LogoTextColor,LogoText); + fputs(html,fp_ou); + fputs("
\n",fp_ou); + } + + show_sarg(fp_ou,"../.."); + fputs("
\n",fp_ou); + sprintf(html,"\n",Title); + fputs(html,fp_ou); + + fputs("
%s
\n",fp_ou); + fputs("
\n",fp_ou); + + sprintf(html,"\n",text[89],periodo); + fputs(html,fp_ou); + + strcpy(wuser,user); + if(strstr(wuser,"_") != 0) + fixip(wuser); + + if(strcmp(Ip2Name,"yes") == 0) + if((str=(char *) strstr(name, ".")) != (char *) NULL) { + if((str=(char *) strstr(str+1, ".")) != (char *) NULL) + ip2name(wuser); + } + + if(UserTabFile[0] != '\0') { + sprintf(warea,":%s:",wuser); + if((str=(char *) strstr(userfile,warea)) != (char *) NULL ) { + z1=0; + str2=(char *) strstr(str+1,":"); + str2++; + bzero(name, MAXLEN); + while(str2[z1] != ':') { + name[z1]=str2[z1]; + z1++; + } + } else strcpy(name,wuser); + } else strcpy(name,user); + + sprintf(html,"\n",text[90],name); + fputs(html,fp_ou); + + fputs("\n",fp_ou); + fputs("
%s: %s
%s: %s
\n",fp_ou); + + fputs("\n", fp_ou); + + fputs( "\n", fp_ou ); + + if(strcmp(datetimeby,"bytes") == 0) + strcpy( html, "BYTES" ); + else + strcpy( html, "H:M:S" ); + + for( i = 0; i < hours.len; i++ ) + fprintf( fp_ou, + "\n", hours.list[ i ], html ); + fprintf( fp_ou, + "\n", text[107], html ); + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(data,buf,' '); + if(!count) { + strcpy(odata,data); + count++; + } + + getword(hora,buf,' '); + getword(elap,buf,' '); + elap[strlen(elap)-1]='\0'; + + if(strcmp(data,odata) != 0) { + strcpy(oelap,elap); + + for( i = 0; i < hours.len; i++ ) + sprintf(c[ hours.list[ i ] ],"%s",fixtime(v[ hours.list[ i ] ])); + + for( i = 8; i <= 17; i++ ) + if(strcmp(c[ hours.list[ i ] ],"00:00:00") == 0) + bzero(c[ hours.list[ i ] ],12); + + fprintf( fp_ou, + "\n", odata ); + for( i = 0; i < hours.len; i++ ) + fprintf( fp_ou, + "\n", c[ hours.list[ i ] ] ); + fprintf( fp_ou, + "\n", fixtime(tt) ); + + tt=0; + for( i = 0; i < hours.len; i++ ) v[ hours.list[ i ] ]=0; + strcpy(odata,data); + strcpy(elap,oelap); + } + + ihora=atoi(hora); + + v[ ihora ]+=my_atoll(elap); + tt+=my_atoll(elap); + t[ ihora ]+=my_atoll(elap); + ttt+=my_atoll(elap); + + } + + for( i = 0; i < hours.len; i++ ) + sprintf(c[ hours.list[ i ] ],"%s",fixtime(v[ hours.list[ i ] ])); + + for( i = 0; i < hours.len; i++ ) + if(strcmp(c[ hours.list[ i ] ],"00:00:00") == 0) bzero(c[ hours.list[ i ] ],12); + + fprintf( fp_ou, + "\n", data ); + for( i = 0; i < hours.len; i++ ) + fprintf( fp_ou, + "\n", c[ hours.list[ i ] ] ); + fprintf( fp_ou, + "\n", fixtime(tt) ); + + for( i = 0; i < hours.len; i++ ) + sprintf(c[ hours.list[ i ] ],"%s",fixtime(t[ hours.list[ i ] ])); + + fprintf( fp_ou, + "\n", text[107] ); + for( i = 0; i < hours.len; i++ ) + fprintf( fp_ou, + "\n", c[ hours.list[ i ] ] ); + fprintf( fp_ou, + "\n", fixtime(ttt) ); + + fputs("\n\n",fp_ou); + + show_info(fp_ou); + + fclose(fp_in); + fclose(fp_ou); + + return; +} diff --git a/report.c b/report.c new file mode 100644 index 0000000..d1a0d0c --- /dev/null +++ b/report.c @@ -0,0 +1,654 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" +#include "include/defs.h" + +void gerarel() +{ + + FILE *fp_in, *fp_ou; + + char accdia[11], acchora[9], accuser[MAXLEN], accip[MAXLEN], accurl[MAXLEN], accbytes[12], accelap[10]; + char oldaccdia[11], oldacchora[9], oldaccip[MAXLEN], wdir[MAXLEN], per1[MAXLEN]; + char wdirname[MAXLEN], oldurl[MAXLEN], oldaccuser[MAXLEN]; + char olduser[MAXLEN], oldmsg[50], acccode[50], oldaccelap[10], oldacccode[50], user[MAXLEN]; + char ipantes[MAXLEN], nameantes[MAXLEN], wdname[MAXLEN], wname2[MAXLEN]; + char accsmart[MAXLEN]; + char wcrc[50]; + char crc2[50]; + char u2[255]; + long long int nbytes=0; + long long int nelap=0; + long long int nacc=0; + long long int rtotal=0; + long long int incache=0; + long long int oucache=0; + char *s; + DIR *dirp; + struct dirent *direntp; + + ipantes[0]='\0'; + nameantes[0]='\0'; + smartfilter=0; + + sprintf(dirname, "%s%s", outdir, periodo); + sprintf(wdir, "%s%s", outdir, periodo); + strcpy(per1,periodo); + vrfydir(wdir, per1, addr, site, us, email); + + if(debugz){ + debugaz("dirname",dirname); + debugaz("wdir",wdir); + } + + strcpy(wdirname,dirname); + gperiodo(); + + if(strlen(UserAgentLog) > 0 && email[0] == '\0') + useragent(); + + olduser[0]='\0'; + strncat(tmp,"/sarg",5); + + dirp = opendir(tmp); + while ((direntp = readdir( dirp )) != NULL ) { + if(strstr(direntp->d_name,".log") == 0) + continue; + if(strncmp(direntp->d_name,"download.log",12) == 0) + continue; + sprintf(tmp3,"%s/%s",tmp,direntp->d_name); + if((fp_in=fopen(tmp3,"r"))==NULL){ + fprintf(stderr, "SARG: (report) %s: %s\n",text[45],tmp); + exit(1); + } + + strcpy(wdname,direntp->d_name); + strip_prefix: + getword(wname2,wdname,'.'); + strcat(user,wname2); + + if(strcmp(wdname,"log") !=0) { + strcat(user,"."); + goto strip_prefix; + } + + strcpy(wdirname,dirname); + maketmp(user,tmp,debug,indexonly); + maketmp_hour(user,tmp,indexonly); + + ttopen=0; + bzero(html_old, MAXLEN); + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(accdia,buf,' '); + getword(acchora,buf,' '); + getword(accuser,buf,' '); + getword(accip,buf,' '); + getword(accurl,buf,' '); + getword(accbytes,buf,' '); + getword(acccode,buf,' '); + if(strncmp(acccode,"TCP_DENIED/407",14) == 0) + continue; + getword(accelap,buf,' '); + getword(accsmart,buf,' '); + getword(accsmart,buf,'"'); + + if(strlen(accsmart) > 0) { + smartfilter++; + strcpy(wdirname,dirname); + grava_SmartFilter(wdirname,accuser,accip,accdia,acchora,accurl,accsmart); + } + + if(strcmp(Ip2Name,"yes") == 0) { + if(strcmp(accip,ipantes) != 0) { + strcpy(ipantes,accip); + ip2name(accip); + strcpy(nameantes,accip); + } else strcpy(accip,nameantes); + } + + strcpy(wdirname,dirname); + gravatmp_hora(wdirname,accuser,accdia,acchora,accelap,accbytes,indexonly); + + if(iprel){ + strcpy(wdirname,dirname); + gravaporuser(accuser,wdirname,accurl,accip,accdia,acchora,accbytes,accelap,indexonly); + } + + if(!rtotal){ + strcpy(oldurl,accurl); + strcpy(oldacccode,acccode); + strcpy(oldaccelap,accelap); + strcpy(oldaccuser,accuser); + strcpy(oldaccip,accip); + strcpy(oldaccdia,accdia); + strcpy(oldacchora,acchora); + rtotal++; + } + + if(site[0] != '\0') { + if(strcmp(oldaccuser,accuser) != 0){ + strcpy(oldmsg,"OK"); + if(strstr(oldacccode,"DENIED") != 0) + sprintf(oldmsg,"%s",text[46]); + gravatmp(oldaccuser,wdirname,oldurl,nacc,nbytes,oldmsg,nelap,indexonly,incache,oucache); + gravager(wdirname,oldaccuser,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap, + incache,oucache); + nacc=0; + nbytes=0; + nelap=0; + incache=0; + oucache=0; + } + } else { + if(strcmp(oldurl,accurl) != 0 || strcmp(oldaccuser,accuser) != 0){ + strcpy(oldmsg,"OK"); + if(strstr(oldacccode,"DENIED") != 0) + sprintf(oldmsg,"%s",text[46]); + strcpy(wdirname,dirname); + gravatmp(oldaccuser,wdirname,oldurl,nacc,nbytes,oldmsg,nelap,indexonly,incache,oucache); + strcpy(wdirname,dirname); + gravager(wdirname,oldaccuser,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache); + nacc=0; + nbytes=0; + nelap=0; + incache=0; + oucache=0; + if(strcmp(oldaccuser,accuser) != 0) + ind2=0; + } + } + nacc++; + nbytes+=my_atoll(accbytes); + nelap+=my_atoll(accelap); + + if(strstr(ReportType,"site_user_time_date") != 0) { + if(!ttopen) { + ind2++; + strcpy(siteind,accurl); + str=siteind; + for(z1=0; z1 255) { + strncpy(val7,arqtt,255); + bzero(arqtt,MAXLEN); + strcpy(arqtt,val7); + } + if ((fp_tt = fopen(arqtt, "w")) == 0) { + fprintf(stderr, "SARG: (report) %s: %s\n",text[45],arqtt); + exit(1); + } + ttopen=1; + + if(strcmp(Privacy,"yes") == 0) + sprintf(httplink,"%s", \ + FontSize,PrivacyStringColor,PrivacyString,PrivacyString); + else + sprintf(httplink,"%s",FontSize,accurl,accurl); + + sprintf(ltext110,"%s",text[110]); + if(ltext110){ + for(s=ltext110; *s; ++s) + *s=tolower(*s); + } + + fputs("\n",fp_tt); + fputs("\n",fp_tt); + fputs("\n",fp_tt); + sprintf(html," \n",CharSet); + fputs(html,fp_tt); + css(fp_tt); + fputs("\n",fp_tt); + + sprintf(html,"\n",BgColor,TxColor,BgImage); + fputs(html,fp_tt); + + fputs("
%02dH
%s
%s
%s
%s%s%s
%s%s%s
%s%s%s
\n",fp_tt); + + if(strlen(LogoImage) > 0) { + sprintf(html,"\n",Title); + fputs(html,fp_tt); + + strcpy(u2,user); + if(strcmp(Ip2Name,"yes") == 0) + ip2name(u2); + if(UserTabFile[0] != '\0') { + sprintf(warea,":%s:",u2); + if((str=(char *) strstr(userfile,warea)) != (char *) NULL ) { + z1=0; + str2=(char *) strstr(str+1,":"); + str2++; + bzero(name, MAXLEN); + while(str2[z1] != ':') { + name[z1]=str2[z1]; + z1++; + } + } else strcpy(name,u2); + } else strcpy(name,u2); + + sprintf(html,"\n",text[89],periodo); + fputs(html,fp_tt); + sprintf(html,"\n",text[90],name); + fputs(html,fp_tt); + sprintf(html,"\n",text[104],UserSortField,UserSortOrder); + fputs(html,fp_tt); + sprintf(html,"\n",text[32],text[55]); + fputs(html,fp_tt); + + fputs("
%s\n",LogoImage,Width,Height,LogoTextColor,LogoText); + fputs(html,fp_tt); + } + + show_sarg(fp_tt, "../.."); + + sprintf(html,"
%s
%s: %s
%s: %s
%s: %s, %s
%s %s
\n",fp_tt); + fputs("
\n",fp_tt); + fputs("",fp_tt); + bzero(tmp4, MAXLEN); + bzero(tmp5, MAXLEN); + strncpy(tmp4,text[110],4); + strncpy(tmp5,text[110]+5,4); + sprintf(html,"\n",text[91],tmp4,tmp5); + fputs(html,fp_tt); + } + + sprintf(html,"\n",accurl,accdia,acchora); + + if(strcmp(html,html_old) != 0) + fputs(html,fp_tt); + strcpy(html_old, html); + } else { + bzero(ltext110, 50); + } + + strcpy(wcrc,acccode); + getword(crc2,wcrc,'/'); + + if(strstr(crc2,"MISS") != 0) + oucache+=my_atoll(accbytes); + else incache+=my_atoll(accbytes); + + strcpy(oldurl,accurl); + + if(strcmp(accuser,oldaccuser) != 0) { + strcpy(wdirname,dirname); + totaliza_day(tmp,oldaccuser,indexonly); + } + + strcpy(oldaccuser,accuser); + strcpy(oldacccode,acccode); + strcpy(oldaccelap,accelap); + strcpy(oldaccip,accip); + strcpy(oldaccdia,accdia); + strcpy(oldacchora,acchora); + + } + bzero(user,MAXLEN); + fclose(fp_in); + unlink(tmp3); +} + + strcpy(oldmsg,"OK"); + if(strstr(oldacccode,"DENIED") != 0) + sprintf(oldmsg,"%s",text[46]); + strcpy(wdirname,dirname); + gravatmpf(oldaccuser,wdirname,oldurl,nacc,nbytes,oldmsg,nelap,indexonly,incache,oucache); + strcpy(wdirname,dirname); + gravager(wdirname,oldaccuser,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache); + strcpy(wdirname,dirname); + totaliza_day(tmp,oldaccuser,indexonly); + + tmpsort(); + + strcpy(wdirname,dirname); + totalger(wdirname, debug, outdir); + + if(strlen(email) == 0) { + download_report(); + + if(strlen(DansGuardianConf) > 0) { + strcpy(wdirname,dirname); + dansguardian_log(); + } + + if(strlen(SquidGuardConf) > 0) { + strcpy(wdirname,dirname); + squidguard_log(); + } + + strcpy(wdirname,dirname); + topuser(); + + if(strstr(ReportType,"topsites") != 0) + topsites(); + + if(strstr(ReportType,"sites_users") != 0) + siteuser(); + gen_denied_report(); + + strcpy(wdirname,dirname); + authfail_report(); + + if(smartfilter) + smartfilter_report(); + + if(strlen(DansGuardianConf) > 0) + dansguardian_report(); + + if(strlen(SquidGuardConf) > 0) + squidguard_report(); + + if(strstr(ReportType,"users_sites") != 0) + htmlrel(); + + geraindex(); + + if(strncmp(SuccessfulMsg,"yes",3) == 0) + fprintf(stderr, "SARG: %s %s\n",text[47],dirname); + } else { + strcpy(wdirname,dirname); + geramail(wdirname, debug, outdir, userip, email, TempDir); + + if(strcmp(email,"stdout") != 0) { + if(strncmp(SuccessfulMsg,"yes",3) == 0) + fprintf(stderr, "SARG: %s %s\n",text[48],email); + } + } + + if(indexonly) { + strcpy(wdirname,dirname); + index_only(wdirname, debug); + } + + removetmp(dirname); + + return; +} + + +void maketmp(char *user, char *dirname, int debug, int indexonly) +{ + + FILE *fp_ou; + + char wdirname[MAXLEN]; + + if(indexonly) return; + if(strstr(ReportType,"users_sites") == 0) return; + + strcpy(wdirname,tmp); + strcat(wdirname,"/"); + strcat(wdirname,user); + + if(debug){ + sprintf(msg,"%s: %s",text[49],wdirname); + debuga(msg); + } + + strcat(wdirname,".utmp"); + if((fp_ou=fopen(wdirname,"w"))==NULL){ + fprintf(stderr, "SARG: (report) %s: %s\n",text[45],wdirname); + exit(1); + } + + fclose(fp_ou); + return; +} + + +void maketmp_hour(char *user, char *dirname, int indexonly) +{ + + FILE *fp_ou; + + char wdirname[MAXLEN]; + + if(indexonly) return; + if(strstr(ReportType,"users_sites") == 0) return; + + strcpy(wdirname,tmp); + strcat(wdirname,"/"); + strcat(wdirname,user); + + strcat(wdirname,".htmp"); + if((fp_ou=fopen(wdirname,"w"))==NULL){ + fprintf(stderr, "SARG: (report-1) %s: %s - %s\n",text[45],wdirname,strerror(errno)); + exit(1); + } + + fclose(fp_ou); + return; +} + + +void gravatmp(char *oldaccuser, char *dirname, char *oldurl, long long int nacc, long long int nbytes, char *oldmsg, long long int nelap, int indexonly, long long int incache, long long int oucache) +{ + + FILE *fp_ou; + + char reg[MAXLEN]; + char wdirname[MAXLEN]; + + if(indexonly) return; + if(strstr(ReportType,"users_sites") == 0) return; + + strcpy(wdirname,tmp); + strcat(wdirname,"/"); + strcat(wdirname,oldaccuser); + strcat(wdirname,".utmp"); + + if((fp_ou=fopen(wdirname,"a"))==NULL){ + fprintf(stderr, "SARG: (report) %s: %s\n",text[45],wdirname); + exit(1); + } + + my_lltoa(nacc,val1,15); + my_lltoa(nbytes,val2,15); + my_lltoa(nelap,val3,15); + my_lltoa(incache,val4,15); + my_lltoa(oucache,val5,15); + sprintf(reg,"%s %s %s %s %s %s %s\n",val1,val2,oldurl,oldmsg,val3,val4,val5); + fputs(reg,fp_ou); + + fclose(fp_ou); + ttopen=0; + + if(fp_tt) { + fputs("
%s%s%s
%s%s%s
\n",fp_tt); + fputs("\n\n",fp_tt); + fclose(fp_tt); + } + + return; + +} + + +void gravatmp_hora(char *dirname, char *user, char *data, char *hora, char *elap, char *bytes, int indexonly) +{ + + FILE *fp_ou; + + char reg[MAXLEN]; + char wdirname[MAXLEN]; + + if(indexonly) return; + if(strstr(ReportType,"users_sites") == 0) return; + + strcpy(wdirname,tmp); + strcat(wdirname,"/"); + strcat(wdirname,user); + strcat(wdirname,".htmp"); + + if((fp_ou=fopen(wdirname,"a"))==NULL){ + fprintf(stderr, "SARG: (report-2) %s: %s - %s\n",text[45],wdirname,strerror(errno)); + exit(1); + } + + if(strcmp(datetimeby,"bytes") == 0) + sprintf(reg,"%s %s %s\n",data,hora,bytes); + else sprintf(reg,"%s %s %s\n",data,hora,elap); + fputs(reg,fp_ou); + + fclose(fp_ou); + + return; +} + + +void gravaporuser(char *user, char *dirname, char *url, char *ip, char *data, char *hora, char *tam, char *elap, int indexonly) +{ + + FILE *fp_ou; + + char reg[MAXLEN]; + char wdirname[MAXLEN]; + + if(indexonly) return; + if(strstr(ReportType,"users_sites") == 0) return; + + strcpy(wdirname,tmp); + strcat(wdirname,"/"); + strcat(wdirname,user); + strcat(wdirname,".ip"); + + if((fp_ou=fopen(wdirname,"a"))==NULL){ + fprintf(stderr, "SARG: (report) %s: %s\n",text[45],wdirname); + exit(1); + } + + sprintf(reg,"%s %s %s %s %s %s\n",ip,url,data,hora,tam,elap); + fputs(reg,fp_ou); + + fclose(fp_ou); + + return; + +} + + +void gravatmpf(char *oldaccuser, char *dirname, char *oldurl, long long int nacc, long long int nbytes, char *oldmsg, long long int nelap, int indexonly, long long int incache, long long int oucache) +{ + + FILE *fp_ou; + + char reg[MAXLEN]; + char wdirname[MAXLEN]; + + if(indexonly) return; + if(strstr(ReportType,"users_sites") == 0) return; + + strcpy(wdirname,tmp); + strcat(wdirname,"/"); + strcat(wdirname,oldaccuser); + strcat(wdirname,".utmp"); + + if((fp_ou=fopen(wdirname,"a"))==NULL){ + fprintf(stderr, "SARG: (report) %s: %s\n",text[45],wdirname); + exit(1); + } + + my_lltoa(nacc,val1,15); + my_lltoa(nbytes,val2,15); + my_lltoa(nelap,val3,15); + my_lltoa(incache,val4,15); + my_lltoa(oucache,val5,15); + sprintf(reg,"%s %s %s %s %s %s %s\n",val1,val2,oldurl,oldmsg,val3,val4,val5); + fputs(reg,fp_ou); + + fclose(fp_ou); + ttopen=0; + ind2=0; + + if(fp_tt) { + fputs("\n",fp_tt); + fputs("\n",fp_tt); + fclose(fp_tt); + } + + return; + +} + + +void gravager(char *dirname, char *user, long long int nacc, char *url, long long int nbytes, char *ip, char *hora, char *dia, long long int nelap, long long int incache, long long int oucache) +{ + + FILE *fp_ou; + char reg[MAXLEN]; + + strcat(dirname,"/"); + strcat(dirname,"geral"); + + if((fp_ou=fopen(dirname,"a"))==NULL){ + fprintf(stderr, "SARG: (report) %s: %s\n",text[45],dirname); + exit(1); + } + + my_lltoa(nacc,val1,15); + my_lltoa(nbytes,val2,15); + my_lltoa(nelap,val3,15); + my_lltoa(incache,val4,15); + my_lltoa(oucache,val5,15); + sprintf(reg,"%s %s %s %s %s %s %s %s %s %s\n",user,val1,val2,url,ip,hora,dia,val3,val4,val5); + fputs(reg,fp_ou); + + fclose(fp_ou); + return; + +} + +void grava_SmartFilter(char *dirname, char *user, char *ip, char *data, char *hora, char *url, char *smart) +{ + + FILE *fp_ou; + + char reg[MAXLEN]; + char wdirname[MAXLEN]; + + sprintf(wdirname,"%s/smartfilter.unsort",dirname); + + if((fp_ou=fopen(wdirname,"a"))==NULL){ + fprintf(stderr, "SARG: (report) %s: %s\n",text[45],wdirname); + exit(1); + } + + sprintf(reg,"%s %s %s %s %s %s\n",user,data,hora,ip,url,smart); + fputs(reg,fp_ou); + fputs("\n\n",fp_tt); + + fclose(fp_ou); + + return; + +} diff --git a/sarg-php/COPYING b/sarg-php/COPYING new file mode 100644 index 0000000..a43ea21 --- /dev/null +++ b/sarg-php/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/sarg-php/INSTALL b/sarg-php/INSTALL new file mode 100644 index 0000000..e3e887b --- /dev/null +++ b/sarg-php/INSTALL @@ -0,0 +1,9 @@ +* +To use sarg-squidGuard you need to change: + +1. These two variables on sarg-squidguard-block.php file: +$SargConf = "/usr/local/sarg/sarg.conf"; +$squidGuardConf = "/usr/local/squidGuard/squidGuard.conf"; + +2.change the squidGuard db file to the same httpd process owner: +chown apache /var/www/html/sarg-php diff --git a/sarg-php/LANGUAGES b/sarg-php/LANGUAGES new file mode 100644 index 0000000..b71e69e --- /dev/null +++ b/sarg-php/LANGUAGES @@ -0,0 +1,16 @@ +This PHP modules is under i18n. +Available languages: + + English Pedro Orso + Brazilian_Portuguese Pedro Orso + French Jacques GRILLOT + Russian Michael Stepanenko + +Thank you, my friends. + +If you want to traslate, follow this steps: + +1. edit translation.this file +2. translate every msgid sentence in msgstr tag +3. send to orso@brturbo.com to implement + * plase send your name and email address. diff --git a/sarg-php/language.php b/sarg-php/language.php new file mode 100755 index 0000000..f5bc8b9 --- /dev/null +++ b/sarg-php/language.php @@ -0,0 +1,58 @@ + diff --git a/sarg-php/sarg-block-it.php b/sarg-php/sarg-block-it.php new file mode 100755 index 0000000..925b827 --- /dev/null +++ b/sarg-php/sarg-block-it.php @@ -0,0 +1,52 @@ +
\n"; + echo ""; + print (gettext("Return")); + echo " "; + print (gettext (" to Sarg.")); +} diff --git a/sarg-php/sarg-squidguard-block.php b/sarg-php/sarg-squidguard-block.php new file mode 100755 index 0000000..2104bfc --- /dev/null +++ b/sarg-php/sarg-squidguard-block.php @@ -0,0 +1,89 @@ +\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "
"; +print(gettext ("Sarg-SquidGuard - URL Blocking")); +echo "
"; +print(gettext ("Choose the rule set where")); +echo " $url "; +print(gettext ("will by added")); +echo "
\n"; +echo "\n"; + +$lines=file($squidGuardConf); +array_walk($lines,'parse_config'); + +if (is_dir($dbhome)) { + if ($ha1 = opendir($dbhome)) { + while (false !== ($file = readdir($ha1))) { + if ($file == '.' || $file == '..') continue; + echo "\n"; + $dir2 = $dbhome.'/'.$file; + if (is_dir($dir2)) { + if ($ha2 = opendir($dir2)) { + while (false !== ($file2 = readdir($ha2))) { + if ($file2 == '.' || $file2 == '..') continue; + echo "\n"; + } + } + closedir($ha2); + } + } + closedir($ha1); + } +} + +echo "
$file
$file2
\n"; +echo "\n"; +?> diff --git a/sarg-php/sarg-squidguard-block2.php b/sarg-php/sarg-squidguard-block2.php new file mode 100755 index 0000000..46a568c --- /dev/null +++ b/sarg-php/sarg-squidguard-block2.php @@ -0,0 +1,58 @@ +
\n"; + echo ""; + print (gettext("Return")); + echo " "; + print (gettext (" to Sarg.")); +} diff --git a/sarg-php/style.php b/sarg-php/style.php new file mode 100755 index 0000000..cb63b26 --- /dev/null +++ b/sarg-php/style.php @@ -0,0 +1,42 @@ +"); +echo (".title {font-family:Verdana,Tahoma,Arial;font-size:11px;color:#006699;background-color:#FFFFFF;text-align:center;}"); +echo (".header {font-family:Verdana,Tahoma,Arial;font-size:9px;color:darkblue;background-color:#DDDDDD;text-align:left;}"); +echo (".header2 {font-family:Verdana,Tahoma,Arial;font-size:10px;color:red;}"); +echo (".data {font-family:Verdana,Tahoma,Arial;color:#000000;font-size:9px;text-align:right;}"); +echo (".data a:link,a:visited {font-family:Verdana,Tahoma,Arial;color:#0000FF;font-size:9px;text-align:right;text-decoration:none;}"); +echo (".data2 {font-family:Verdana,Tahoma,Arial;color:#000000;font-size:9px;}"); +echo (".data2 a:link,a:visited{font-family:Verdana,Tahoma,Arial;color:#0000FF;font-size:9px;background-color:lavender;text-decoration:none;}"); +echo (""); + +echo (""); +echo (""); +echo (" "); +echo (""); +?> diff --git a/sarg-php/translate.this b/sarg-php/translate.this new file mode 100644 index 0000000..f8621d6 --- /dev/null +++ b/sarg-php/translate.this @@ -0,0 +1,68 @@ +/* + * AUTHOR: Pedro Lineu Orso rso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +msgid "" +msgstr "" +"Project-Id-Version: sarg-squidGuard 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2004-08-12 11:14-0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: sarg-squidguard-block2.php:10 +msgid "Could not open the file" +msgstr "" + +#: sarg-squidguard-block2.php:19 +msgid "Write error" +msgstr "" + +#: sarg-squidguard-block2.php:23 +msgid "Done!" +msgstr "" + +#: sarg-squidguard-block2.php:27 +msgid "Return" +msgstr "" + +#: sarg-squidguard-block2.php:30 +msgid " to Sarg." +msgstr "" + +#: sarg-squidguard-block.php:29 +msgid "Sarg-SquidGuard - URL Blocking" +msgstr "" + +#: sarg-squidguard-block.php:33 +msgid "Choose the rule set where" +msgstr "" + +#: sarg-squidguard-block.php:36 +msgid "will by added" +msgstr "" diff --git a/sarg.1 b/sarg.1 new file mode 100644 index 0000000..65d4ea2 --- /dev/null +++ b/sarg.1 @@ -0,0 +1,144 @@ +.\" Hey, EMACS: -*- nroff -*- +.\" First parameter, NAME, should be all caps +.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection +.\" other parameters are allowed: see man(7), man(1) +.TH SARG 1 "September 25, 2004" +.\" Please adjust this date whenever revising the manpage. +.\" +.\" Some roff macros, for reference: +.\" .nh disable hyphenation +.\" .hy enable hyphenation +.\" .ad l left justify +.\" .ad b justify to both left and right margins +.\" .nf disable filling +.\" .fi enable filling +.\" .br insert line break +.\" .sp insert n+1 empty lines +.\" for manpage-specific macros, see man(7) +.SH NAME +sarg \- Squid Analysis Report Generator +.SH SYNOPSIS +.B sarg +.RI [ options ] +.SH DESCRIPTION +\fBsarg\fP is a logfile parser and anylizer for the \fBSquid Web Proxy Cache\fP, +which can be found at \fBhttp://www.squid-cache.org/\fP. +This manual page documents briefly the +.B sarg +command. More information is available at \fBhttp://sarg.sourceforge.net/\fP. +This manual page was originally written for the Debian distribution +because the author didn't include one in favor of documentation +in the GNU Info format; see below. +.PP +.\" TeX users may be more comfortable with the \fB\fP and +.\" \fI\fP escape sequences to invode bold face and italics, +.\" respectively. +\fBsarg\fP is a tool that allows you to view "where" your users are going to on +the Internet. \fBsarg\fP generates reports in HTML, with fields such as: users, +IP Addresses, bytes, sites, and times. These HTML files can appear in your +web server's directory for browsing by users or administrators. You may also +have \fBsarg\fP email the reports to the Squid Cache administrator. +.PP +\fBsarg\fP can take the \fBsquid\fP access log as its input, or optionally the +\fBsquidGuard http://www.squidguard.org/\fP Squid filter/redirector logfile format. +.SH OPTIONS +A summary of options is included below. +.TP +.B \-h +Show summary of options. +.TP +.B \-a [hostname|ip address] +Limits report to records containing the specified hostname/ip address +.TP +.B \-b filename +Enables UserAgent log and writes it to +.IR "filename". +.TP +.B \-c filename +Uses +.IR "filename" +as the exclude files to select records that are not counted. +.TP +.B \-d date +Uses +.IR "date" +as the timelimit during logfile processing. Format for +.IR "date" +is +.B dd/mm/yyyy-dd/mm/yyyy +.TP +.B \-e email +Sends report to +.IR "email" +(stdout for console). +.TP +.B \-f filename +Reads configuration from +.IR "filename". +.TP +.B \-g e|u +Sets date format in generated reports. +.br +\fBe\fP = Europe -> dd/mm/yy +.br +\fBu\fP = USA -> mm/dd/yy +.TP +.B \-i +Generates reports by user and ip address. +.br +\fBNOTE:\fP This requires the 'report_type' +option in config file to contain "users_sites". +.TP +.B \-l filename +Uses +.IR "filename" +as the input log. +.TP +.B \-n +Enables ip address resolution. +.TP +.B \-o dir +Writes report in +.IR "dir". +.TP +.B \-p +Generates reports using ip address instead of userid. +.TP +.B \-s string +Limits report to the site specified by +.IR "string +[eg. www.debian.org] +.TP +.B \-t string +Limits records counted in statistics based on time-of-day. Format for +\fIstring\fP is \fBHH\fP or \fBHH:MM\fP or \fBHH:MM:SS\fP. +.TP +.B \-u user +Limits reports to \fIuser\fP activities. +.TP +.B \-w dir +Uses \fIdir\fP for temporary files. +.TP +.B \-x +Writes messages on processes to \fBSTDOUT\fP +.TP +.B \-x +Writes debug messages to \fBSTDOUT\fP +.TP +.B \-convert +Convert the logfile's date/time field to human-readable. +.TP +.B \-split +Split the log file by date in \fB-d\fP parameter. +.SH FILES +.BR /usr/local/sarg/sarg.conf +.br +.B /usr/local/squid/logs/access.log +.br +.B /usr/local/squidGuard/logs/squidGuard.log +.SH SEE ALSO +squid(8) +.SH AUTHOR +This manual page was written by Luigi Gangitano , +for the Debian GNU/Linux system (but may be used by others). Revised +by Billy Newsom. diff --git a/sarg.conf b/sarg.conf new file mode 100644 index 0000000..86c86c9 --- /dev/null +++ b/sarg.conf @@ -0,0 +1,563 @@ +# sarg.conf +# +# TAG: language +# Available languages: +# Bulgarian_windows1251 +# Catalan +# Czech +# Dutch +# English +# French +# German +# Greek +# Hungarian +# Indonesian +# Italian +# Japanese +# Latvian +# Polish +# Portuguese +# Romanian +# Russian_koi8 +# Russian_windows1251 +# Serbian +# Slovak +# Spanish +# Turkish +# +#language English + +# TAG: access_log file +# Where is the access.log file +# sarg -l file +# +#access_log /usr/local/squid/var/logs/access.log + +# TAG: graphs yes|no +# Use graphics where is possible. +# graph_days_bytes_bar_color blue|green|yellow|orange|brown|red +# +#graphs yes +#graph_days_bytes_bar_color orange + +# TAG: title +# Especify the title for html page. +# +#title "Squid User Access Reports" + +# TAG: font_face +# Especify the font for html page. +# +#font_face Tahoma,Verdana,Arial + +# TAG: header_color +# Especify the header color +# +#header_color darkblue + +# TAG: header_bgcolor +# Especify the header bgcolor +# +#header_bgcolor blanchedalmond + +# TAG: font_size +# Especify the text font size +# +#font_size 9px + +# TAG: header_font_size +# Especify the header font size +# +#header_font_size 9px + +# TAG: title_font_size +# Especify the title font size +# +#title_font_size 11px + +# TAG: background_color +# TAG: background_color +# Html page background color +# +# background_color white + +# TAG: text_color +# Html page text color +# +#text_color #000000 + +# TAG: text_bgcolor +# Html page text background color +# +#text_bgcolor lavender + +# TAG: title_color +# Html page title color +# +#title_color green + +# TAG: logo_image +# Html page logo. +# +#logo_image none + +# TAG: logo_text +# Html page logo text. +# +#logo_text "" + +# TAG: logo_text_color +# Html page logo texti color. +# +#logo_text_color #000000 + +# TAG: logo_image_size +# Html page logo image size. +# width height +# +#image_size 80 45 + +# TAG: background_image +# Html page background image +# +#background_image none + +# TAG: password +# User password file used by authentication +# If used here, reports will be generated only for that users. +# +#password none + +# TAG: temporary_dir +# Temporary directory name for work files +# sarg -w dir +# +#temporary_dir /tmp + +# TAG: output_dir +# The reports will be saved in that directory +# sarg -o dir +# +#output_dir /var/www/html/squid-reports + +# TAG: output_email +# Email address to send the reports. If you use this tag, no html reports will be generated. +# sarg -e email +# +#output_email none + +# TAG: resolve_ip yes/no +# Convert ip address to dns name +# sarg -n +#resolve_ip no + +# TAG: user_ip yes/no +# Use Ip Address instead userid in reports. +# sarg -p +#user_ip no + +# TAG: topuser_sort_field field normal/reverse +# Sort field for the Topuser Report. +# Allowed fields: USER CONNECT BYTES TIME +# +#topuser_sort_field BYTES reverse + +# TAG: user_sort_field field normal/reverse +# Sort field for the User Report. +# Allowed fields: SITE CONNECT BYTES TIME +# +#user_sort_field BYTES reverse + +# TAG: exclude_users file +# users within the file will be excluded from reports. +# you can use indexonly to have only index.html file. +# +#exclude_users none + +# TAG: exclude_hosts file +# Hosts, domains or subnets will be excluded from reports. +# +# Eg.: 192.168.10.10 - exclude ip address only +# 192.168.10.0 - exclude full C class +# s1.acme.foo - exclude hostname only +# acme.foo - exclude full domain name +# +#exclude_hosts none + +# TAG: useragent_log file +# Put here where is useragent.log to nable useragent report. +# +#useragent_log none + +# TAG: date_format +# Date format in reports: e (European=dd/mm/yy), u (American=mm/dd/yy), w (Weekly=yy.ww) +# +#date_format u + +# TAG: per_user_limit file MB +# Saves userid on file if download exceed n MB. +# This option allow you to disable user access if user exceed a download limit. +# +#per_user_limit none + +# TAG: lastlog n +# How many reports files must be keept in reports directory. +# The oldest report file will be automatically removed. +# 0 - no limit. +# +#lastlog 0 + +# TAG: remove_temp_files yes +# Remove temporary files: geral, usuarios, top, periodo from root report directory. +# +#remove_temp_files yes + +# TAG: index yes|no|only +# Generate the main index.html. +# only - generate only the main index.html +# +#index yes + +# TAG: overwrite_report yes|no +# yes - if report date already exist then will be overwrited. +# no - if report date already exist then will be renamed to filename.n, filename.n+1 +# +#overwrite_report no + +# TAG: records_without_userid ignore|ip|everybody +# What can I do with records without user id (no authentication) in access.log file ? +# +# ignore - This record will be ignored. +# ip - Use ip address instead. (default) +# everybody - Use "everybody" instead. +# +#records_without_userid ip + +# TAG: use_comma no|yes +# Use comma instead point in reports. +# Eg.: use_comma yes => 23,450,110 +# use_comma no => 23.450.110 +# +#use_comma no + +# TAG: mail_utility mail|mailx +# Mail command to use to send reports via SMTP +# +#mail_utility mailx + +# TAG: topsites_num n +# How many sites in topsites report. +# +#topsites_num 100 + +# TAG: topsites_sort_order CONNECT|BYTES A|D +# Sort for topsites report, where A=Ascendent, D=Descendent +# +#topsites_sort_order CONNECT D + +# TAG: index_sort_order A/D +# Sort for index.html, where A=Ascendent, D=Descendent +# +#index_sort_order D + +# TAG: exclude_codes file +# Ignore records with these codes. Eg.: NONE/400 +# +#exclude_codes /usr/local/sarg/exclude_codes + +# TAG: replace_index string +# Replace "index.html" in the main index file with this string +# If null "index.html" is used +# +#replace_index + +# TAG: max_elapsed milliseconds +# If elapsed time is recorded in log is greater than max_elapsed use 0 for elapsed time. +# Use 0 for no checking +# +#max_elapsed 0 +# 8 Hours +max_elapsed 28800000 + +# TAG: report_type type +# What kind of reports to generate. +# topsites - shows the site, connect and bytes +# sites_users - shows which users were accessing a site +# users_sites - shows sites accessed by the user +# date_time - shows the amount of bytes used by day and hour +# denied - shows all denied sites with full URL +# auth_failures - shows autentication failures +# site_user_time_date - shows sites, dates, times and bytes +# +# Eg.: report_type topsites denied +# +#report_type topsites sites_users users_sites date_time denied auth_failures site_user_time_date + +# TAG: usertab filename +# You can change the "userid" or the "ip address" to be a real user name on the reports. +# Table syntax: +# userid name or ip address name +# Eg: +# SirIsaac Isaac Newton +# vinci Leonardo da Vinci +# 192.168.10.1 Karol Wojtyla +# +# Each line must be terminated with '\n' +# +#usertab none + +# TAG: long_url yes|no +# If yes, the full url is showed in report. +# If no, only the site will be showed +# +# YES option generate very big sort files and reports. +# +#long_url no + +# TAG: date_time_by bytes|elap +# Date/Time reports will use bytes or elapsed time? +# +#date_time_by bytes + +# TAG: charset name +# ISO 8859 is a full series of 10 standardized multilingual single-byte coded (8bit) +# graphic character sets for writing in alphabetic languages +# You can use the following charsets: +# Latin1 - West European +# Latin2 - East European +# Latin3 - South European +# Latin4 - North European +# Cyrillic +# Arabic +# Greek +# Hebrew +# Latin5 - Turkish +# Latin6 +# Windows-1251 +# Koi8-r +# +#charset Latin1 + +# TAG: user_invalid_char "&/" +# Records that contain invalid characters in userid will be ignored by Sarg. +# +#user_invalid_char "&/" + +# TAG: privacy yes|no +# privacy_string "***.***.***.***" +# privacy_string_color blue +# In some countries the sysadm cannot see the visited sites by a restrictive law. +# Using privacy yes the visited url will be changes by privacy_string and the link +# will be removed from reports. +# +#privacy no +#privacy_string "***.***.***.***" +#privacy_string_color blue + +# TAG: include_users "user1:user2:...:usern" +# Reports will be generated only for listed users. +# +#include_users none + +# TAG: exclude_string "string1:string2:...:stringn" +# Records from access.log file that contain one of listed strings will be ignored. +# +#exclude_string none + +# TAG: show_successful_message yes|no +# Shows "Successful report generated on dir" at end of process. +# +#show_successful_message yes + +# TAG: show_read_statistics yes|no +# Shows some reading statistics. +# +#show_read_statistics yes + +# TAG: topuser_fields +# Which fields must be in Topuser report. +# +#topuser_fields NUM DATE_TIME USERID CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE + +# TAG: user_report_fields +# Which fields must be in User report. +# +#user_report_fields CONNECT BYTES %BYTES IN-CACHE-OUT USED_TIME MILISEC %TIME TOTAL AVERAGE + +# TAG: topuser_num n +# How many users in topsites report. 0 = no limit +# +#topuser_num 0 + +# TAG: site_user_time_date_type list|table +# generate reports for site_user_time_date in list or table format +# +#site_user_time_date_type table + +# TAG: datafile file +# Save the report results in a file to populate some database +# +#datafile none +#datafile /tmp/p8 + +# TAG: datafile_delimiter ";" +# ascii character to use as a field separator in datafile +# +#datafile_delimiter ";" + +# TAG: datafile_fields all +# Which data fields must be in datafile +# user;date;time;url;connect;bytes;in_cache;out_cache;elapsed +# +#datafile_fields user;date;time;url;connect;bytes;in_cache;out_cache;elapsed + +# TAG: weekdays +# The weekdays to take account ( Sunday->0, Saturday->6 ) +# Example: +#weekdays 1-3,5 +# Default: +#weekdays 0-6 + +# TAG: hours +# The hours to take account +# Example: +#hours 7-12,14,16,18-20 +# Default: +#hours 0-23 + +# TAG: dansguardian_conf file +# DansGuardian.conf file path +# Generate reports from DansGuardian logs. +# Use 'none' to disable it. +# dansguardian_conf /usr/dansguardian/dansguardian.conf +# +#dansguardian_conf none + +# TAG: squidguard_conf file +# path to squidGuard.conf file +# Generate reports from SquidGuard logs. +# Use 'none' to disable. +# squidguard_conf /usr/local/squidGuard/squidGuard.conf +# +#squidguard_conf none + +# TAG: squidguard_log_format +# Format string SquidGuard logs. +# REJIK #year#-#mon#-#day# #hour# #list#:#tmp# #ip# #user# #tmp#/#tmp#/#url#/#end# +# SQUIDGUARD #year#-#mon#-#day# #hour# #tmp#/#list#/#tmp#/#tmp#/#url#/#tmp# #ip#/#tmp# #user# #end# +#squidguard_log_format #year#-#mon#-#day# #hour# #tmp#/#list#/#tmp#/#tmp#/#url#/#tmp# #ip#/#tmp# #user# #end# + +# TAG: show_sarg_info yes|no +# shows sarg information and site path on each report bottom +# +#show_sarg_info yes + +# TAG: show_sarg_logo yes|no +# shows sarg logo +# +#show_sarg_logo yes + +# TAG: parsed_output_log directory +# Saves the processed log in a sarg format after parsing the squid log file. +# This is a way to dump all of the data structures out, after parsing from +# the logs (presumably this data will be much smaller than the log files themselves), +# and pull them back in for later processing and merging with data from previous logs. +# +#parsed_output_log none + +# TAG parsed_output_log_compress /bin/gzip|/usr/bin/bzip2|nocompress +# sarg logs compress util +# +#parsed_output_log_compress /bin/gzip + +# TAG displayed_values bytes|abbreviation +# how the values will be displayed in reports. +# eg. bytes - 209.526 +# abbreviation - 210K +# +#displayed_values bytes + +# Report limits +# TAG authfail_report_limit n +# TAG denied_report_limit n +# TAG siteusers_report_limit n +# TAG squidguard_report_limit n +# TAG user_report_limit n +# report limits (lines). +# '0' no limit +# +#authfail_report_limit 10 +#denied_report_limit 10 +#siteusers_report_limit 0 +#squidguard_report_limit 10 +#user_report_limit 0 + +# TAG www_document_root dir +# Where is your Web DocumentRoot +# Sarg will create sarg-php directory with some PHP modules: +# - sarg-squidguard-block.php - add urls from user reports to squidGuard DB +# +#www_document_root /var/www/html + +# TAG block_it module_url +# This tag allow you to pass urls from user reports to a cgi or php module, +# to be blocked by some Squid acl +# +# Eg.: block_it /sarg-php/sarg-block-it.php +# sarg-block-it is a php that will append a url to a flat file. +# You must change /var/www/html/sarg-php/sarg-block-it to point to your file +# in $filename variable, and chown to a httpd owner. +# +# sarg will pass http://module_url?url=url +# +#block_it none + +# TAG external_css_file path +# This tag allow internal sarg css override. +# Sarg use theses style classes: +# .body body class +# .info sarg information class, align=center +# .title title class, align=center +# .header header class, align:left +# .header2 header class, align:right +# .header3 header class, align:right +# .text text class, align:left +# .data table text class, align:right +# .data2 table text class, align:right, border colors +# .link link class +# +# There is a sample in /usr/local/sarg/etc/css.tpl +# +#external_css_file none + +# TAG user_authentication yes|no +# Allow user authentication in User Reports using .htaccess +# Parameters: +# AuthUserFile - where the user password file is +# AuthName - authentication realm. Eg "Members Only" +# AuthType - authenticaion type - basic +# Require - authorized users to see the report. +# %u - user report +# +# user_authentication no +# AuthUserFile /usr/local/sarg/passwd +# AuthName "SARG, Restricted Access" +# AuthType Basic +# Require user admin %u + +# TAG download_suffix "suffix,suffix,...,suffix" +# file suffix to be considered as "download" in Download report. +# Use 'none' to disable. +# +#download_suffix "7z,ace,arj,avi,bat,bin,bz2,bzip,cab,com,cpio,dll,doc,dot,exe,gz,iso,lha,lzh,mdb,mov,mp3,mpeg,mpg,mso,nrg,ogg,ppt,rar,rtf,shs,src,sys,tar,tgz,vcd,vob,wma,wmv,zip" + +# ulimit n +# The maximum number of open file descriptors to avoid "Too many open files" error message. +# You need to run sarg as root to use ulimit tag. +# +#ulimit 20000 + +# TAG: ntlm_user_format username|domainname+username +# NTLM users format. +# +#ntlm_user_format domainname+username diff --git a/siteuser.c b/siteuser.c new file mode 100644 index 0000000..9213f04 --- /dev/null +++ b/siteuser.c @@ -0,0 +1,213 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void siteuser() +{ + + FILE *fp_in, *fp_ou; + + char user[MAXLEN]; + char url[MAXLEN]; + char wuser[MAXLEN]; + char ourl[MAXLEN]; + char nacc[20]; + char nbytes[20]; + char csort[255]; + char geral[MAXLEN]; + char geral2[MAXLEN]; + char per[MAXLEN]; + char html[MAXLEN]; + char sites[MAXLEN]; + char report[MAXLEN]; + char periodo[100]; + char ftime[128]; + int regs=0; + int ucount=0; + char *users; + + sprintf(geral,"%s/geral",dirname); + sprintf(sites,"%s/sites",dirname); + sprintf(geral2,"%s/geral2",dirname); + sprintf(per,"%s/periodo",dirname); + sprintf(report,"%s/siteuser.html",dirname); + + if ((fp_in = fopen(per, "r")) == 0) { + fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],per); + exit(1); + } + + fgets(periodo,sizeof(periodo),fp_in); + fclose(fp_in); + + sprintf(csort,"sort -k 4,4 -k 1,1 -o %s %s",geral2,geral); + system(csort); + + if((fp_in=fopen(geral2,"r"))==NULL) { + fprintf(stderr, "SARG: (topsite) %s: %s\n",text[8],geral2); + exit(1); + } + + if((fp_ou=fopen(report,"w"))==NULL) { + fprintf(stderr, "SARG: (topsite) %s: %s\n",text[8],report); + exit(1); + } + + fputs("\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + sprintf(html," \n",CharSet); + fputs(html,fp_ou); + css(fp_ou); + fputs("\n",fp_ou); + + if(strlen(FontFace) > 0) { + sprintf(url,"\n",FontFace); + fputs(url,fp_ou); + } + + sprintf(url,"\n",BgColor,TxColor,BgImage); + fputs(url,fp_ou); + + if(strlen(LogoImage) > 0) { + fputs("
\n",fp_ou); + sprintf(url,"
%s\n",LogoImage,Width,Height,LogoTextColor,LogoText); + fputs(url,fp_ou); + fputs("
\n",fp_ou); + } + + show_sarg(fp_ou, ".."); + fputs("
\n",fp_ou); + sprintf(url,"\n",Title); + fputs(url,fp_ou); + + sprintf(url,"\n",text[89],periodo); + fputs(url,fp_ou); + sprintf(url,"\n",text[85]); + fputs(url,fp_ou); + fputs("
%s
%s: %s
%s
\n",fp_ou); + + fputs("
\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + sprintf(url,"\n",text[100],text[91],text[103]); + fputs(url,fp_ou); + + user[0]='\0'; + ourl[0]='\0'; + + if((users=(char *) malloc(204800))==NULL){ + fprintf(stderr, "SARG: ERROR: %s",text[87]); + exit(1); + } + strcat(users," "); + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(user,buf,' '); + if(strcmp(user,"TOTAL") == 0) + continue; + if(userip) + fixip(user); + + if(UserTabFile[0] != '\0') { + sprintf(warea,":%s:",user); + if((str=(char *) strstr(userfile,warea)) != (char *) NULL ) { + z1=0; + str2=(char *) strstr(str+1,":"); + str2++; + bzero(name, MAXLEN); + while(str2[z1] != ':') { + name[z1]=str2[z1]; + z1++; + } + } else strcpy(name,user); + } else strcpy(name,user); + + if(strcmp(Ip2Name,"yes") == 0) + ip2name(user); + + if(strcmp(Ip2Name,"yes") == 0) + ip2name(user); + + getword(nacc,buf,' '); + getword(nbytes,buf,' '); + getword(url,buf,' '); + + if(!regs) { + strcpy(ourl,url); + regs++; + } + + sprintf(wuser," %s ",name); + if(strstr(users,wuser) == 0 && strcmp(url,ourl) == 0) { + strcat(users,name); + strcat(users," "); + ucount++; + if(ucount>4) { + strcat(users,"
"); + ucount=0; + } + } + + if(SiteUsersReportLimit) { + if(regs >= SiteUsersReportLimit) + continue; + } + + if(strlen(BlockIt) > 0) + sprintf(BlockImage," ",wwwDocumentRoot,BlockIt,ourl); + else BlockImage[0]='\0'; + + if(strcmp(url,ourl) != 0) { + sprintf(html,"\n",regs,BlockImage,ourl,ourl,users); + fputs(html,fp_ou); + regs++; + ucount=0; + strcpy(users,name); + strcat(users," "); + strcpy(ourl,url); + } + } + + sprintf(html,"\n",regs,ourl,ourl,users); + fputs(html,fp_ou); + + unlink(geral2); + + fputs("
%s%s%s
%d%s%s%s
%d%s%s
\n",fp_ou); + + show_info(fp_ou); + + fputs("\n\n",fp_ou); + + fclose(fp_in); + fclose(fp_ou); + + return; + +} diff --git a/smartfilter.c b/smartfilter.c new file mode 100644 index 0000000..ce16185 --- /dev/null +++ b/smartfilter.c @@ -0,0 +1,223 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void smartfilter_report() +{ + + FILE *fp_in = NULL, *fp_ou = NULL, *fp_user = NULL; + + char url[MAXLEN]; + char html[MAXLEN]; + char html2[MAXLEN]; + char csort[255]; + char smart_in[MAXLEN]; + char smart_ou[MAXLEN]; + char per[MAXLEN]; + char sites[MAXLEN]; + char report[MAXLEN]; + char periodo[100]; + char ip[MAXLEN]; + char user[MAXLEN]; + char ouser[MAXLEN]; + char data[15]; + char hora[15]; + char smartcat[256]; + char smartheader[15]; + char ftime[128]; + char smartuser[MAXLEN]; + char *str; + int fuser=0; + + ouser[0]='\0'; + + sprintf(smartheader,"%s",text[116]); + strup(smartheader); + + sprintf(smart_in,"%s/smartfilter.unsort",dirname); + sprintf(sites,"%s/sites",dirname); + sprintf(smart_ou,"%s/smartfilter.log",dirname); + sprintf(per,"%s/periodo",dirname); + sprintf(report,"%s/smartfilter.html",dirname); + + if ((fp_in = fopen(per, "r")) == 0) { + fprintf(stderr, "SARG: (smartfilter) %s: %s\n",text[45],per); + exit(1); + } + + fgets(periodo,sizeof(periodo),fp_in); + fclose(fp_in); + + sprintf(csort,"sort -n -k 1,1 -k 2,2 -k 3,3 -o %s %s",smart_ou,smart_in); + system(csort); + unlink(smart_in); + + if((fp_in=fopen(smart_ou,"r"))==NULL) { + fprintf(stderr, "SARG: (smartfilter) %s: %s\n",text[8],smart_ou); + exit(1); + } + + if((fp_ou=fopen(report,"w"))==NULL) { + fprintf(stderr, "SARG: (smartfilter) %s: %s\n",text[8],report); + exit(1); + } + + fputs("\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + sprintf(html," \n",CharSet); + fputs(html,fp_ou); + fputs("\n",fp_ou); + + if(strlen(FontFace) > 0) { + sprintf(url,"\n",FontFace); + fputs(url,fp_ou); + } + + sprintf(url,"\n",BgColor,TxColor,BgImage); + fputs(url,fp_ou); + + fputs("
\n",fp_ou); + + if(strlen(LogoImage) > 0) { + sprintf(url,"\n",TiColor,Title); + fputs(url,fp_ou); + + sprintf(url,"\n",HeaderBgColor,FontSize,text[89],periodo); + fputs(url,fp_ou); + sprintf(url,"\n",HeaderBgColor,FontSize,text[116],text[55]); + fputs(url,fp_ou); + fputs("
%s\n",LogoImage,Width,Height,LogoTextColor,LogoText); + fputs(url,fp_ou); + } + + sprintf(url,"
%s
%s: %s
%s %s
\n",fp_ou); + + fputs("
\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + sprintf(url,"\n",HeaderBgColor,FontSize,text[98],HeaderBgColor,FontSize,text[111],HeaderBgColor,FontSize,text[110],HeaderBgColor,FontSize,text[91],HeaderBgColor,FontSize,smartheader); + fputs(url,fp_ou); + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(user,buf,' '); + getword(data,buf,' '); + getword(hora,buf,' '); + getword(ip,buf,' '); + getword(url,buf,' '); + getword(smartcat,buf,'\n'); + + if((str=(char *) strstr(user, "_")) != (char *) NULL ) { + if((str=(char *) strstr(str+1, "_")) != (char *) NULL ) + fixip(user); + } + + if(strcmp(ouser,user) != 0) { + strcpy(ouser,user); + sprintf(smartuser,"%s/denied_%s.html",dirname,user); + if(fuser) { + fuser=0; + fputs("
%s%s%s%s%s
\n",fp_user); + if(strcmp(ShowSargInfo,"yes") == 0) { + zdate(ftime, DateFormat); + sprintf(html2,"

%s %s-%s %s %s
\n",text[108],URL,PGM,VERSION,text[109],ftime); + fputs(html2,fp_user); + } + fputs("\n\n",fp_user); + fclose(fp_user); + } + if ((fp_user = fopen(smartuser, "a")) == 0) { + fprintf(stderr, "SARG: (smartfilter) %s: %s\n",text[45],smartuser); + exit(1); + } + fuser=1; + + fputs("\n",fp_ou); + fputs("\n",fp_user); + fputs("\n",fp_user); + sprintf(html," \n",CharSet); + fputs(html,fp_user); + fputs("\n",fp_user); + + if(strlen(FontFace) > 0) { + sprintf(html2,"\n",FontFace); + fputs(url,fp_user); + } + sprintf(html2,"\n",BgColor,TxColor,BgImage); + fputs(html2,fp_user); + fputs("
\n",fp_user); + if(strlen(LogoImage) > 0) { + sprintf(html2,"\n",TiColor,Title); + fputs(html2,fp_user); + sprintf(html2,"\n",HeaderBgColor,FontSize,text[89],periodo); + fputs(html2,fp_user); + sprintf(html2,"\n",HeaderBgColor,FontSize,text[90],FontSize,user); + fputs(html2,fp_user); + fputs("
%s\n",LogoImage,Width,Height,LogoTextColor,LogoText); + fputs(html2,fp_user); + } + sprintf(html2,"
%s
%s: %s
%s: %s
\n",fp_user); + fputs("
\n",fp_user); + fputs("\n",fp_user); + fputs("\n",fp_user); + fputs("\n",fp_user); + sprintf(html2,"\n",HeaderBgColor,FontSize,text[98],HeaderBgColor,FontSize,text[111],HeaderBgColor,FontSize,text[110],HeaderBgColor,FontSize,text[91],HeaderBgColor,FontSize,smartheader); + fputs(html2,fp_user); + } + sprintf(html2,"\n",TxBgColor,FontSize,user,TxBgColor,FontSize,ip,TxBgColor,FontSize,data,hora,TxBgColor,FontSize,url,TxBgColor,FontSize,smartcat); + fputs(html2,fp_user); + + sprintf(html,"\n",TxBgColor,FontSize,user,TxBgColor,FontSize,ip,TxBgColor,FontSize,data,hora,TxBgColor,FontSize,url,TxBgColor,FontSize,smartcat); + fputs(html,fp_ou); + } + + fputs("
%s%s%s%s%s
%s%s%s-%s%s%s
%s%s%s-%s%s%s
\n",fp_ou); + + if(strcmp(ShowSargInfo,"yes") == 0) { + zdate(ftime, DateFormat); + sprintf(html,"

%s %s-%s %s %s
\n",text[108],URL,PGM,VERSION,text[109],ftime); + fputs(html,fp_ou); + } + + fputs("\n\n",fp_user); + + fclose(fp_ou); + if(fp_user) { + fputs("\n",fp_user); + if(strcmp(ShowSargInfo,"yes") == 0) { + zdate(ftime, DateFormat); + sprintf(html2,"

%s %s-%s %s %s
\n",text[108],URL,PGM,VERSION,text[109],ftime); + fputs(html2,fp_user); + } + fputs("\n\n",fp_user); + fclose(fp_user); + } + + return; +} diff --git a/sort.c b/sort.c new file mode 100644 index 0000000..1f5669c --- /dev/null +++ b/sort.c @@ -0,0 +1,155 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void tmpsort() +{ + + DIR *dirp; + struct dirent *direntp; + + char csort[MAXLEN]; + char arqou[MAXLEN], arqin[MAXLEN], wnome[MAXLEN], wnome2[MAXLEN]; + char field1[10]="2,2"; + char field2[10]="1,1"; + char field3[10]="3,3"; + char order[4]="-r"; + + if(indexonly) return; + if(strstr(ReportType,"users_sites") == 0) return; + + wnome[0]='\0'; + wnome2[0]='\0'; + + dirp = opendir(tmp); + while ((direntp = readdir( dirp )) != NULL ){ + if(strstr(direntp->d_name,".utmp") == 0) + continue; + + strcpy(wentp,direntp->d_name); + + wnome[0]='\0'; + striptmp: + getword(wnome2,wentp,'.'); + strcat(wnome,wnome2); + + if(strcmp(wentp,"utmp") !=0) { + strcat(wnome,"."); + goto striptmp; + } + + strcpy(arqou,tmp); + strcat(arqou,"/"); + strcpy(arqin,arqou); + strcat(arqou,wnome); + strcat(arqin,direntp->d_name); + + if(debug) { + sprintf(msg,"%s: %s",text[54],arqou); + debuga(msg); + } + + strup(UserSortField); + strlow(UserSortOrder); + + if(strcmp(UserSortField,"CONNECT") == 0) { + strcpy(field1,"1,1"); + strcpy(field2,"2,2"); + strcpy(field3,"3,3"); + } + + if(strcmp(UserSortField,"SITE") == 0) { + strcpy(field1,"3,3"); + strcpy(field2,"2,2"); + strcpy(field3,"1,1"); + } + + if(strcmp(UserSortField,"TIME") == 0) { + strcpy(field1,"5,5"); + strcpy(field2,"2,2"); + strcpy(field3,"1,1"); + } + + if(strcmp(UserSortOrder,"normal") == 0) + order[0]='\0'; + + strcat(arqou,".txt"); + sprintf(csort,"sort -n -T %s %s -k %s -k %s -k %s -o %s %s",TempDir,order,field1,field2,field3,arqou,arqin); + system(csort); + unlink(arqin); + + } + + (void)rewinddir( dirp ); + (void)closedir( dirp ); + return; +} + +void sort_users_log(char *tmp, int debug) +{ + + DIR *dirp; + struct dirent *direntp; + char csort[MAXLEN]; + char wtmp[MAXLEN]; + char wname2[MAXLEN]; + char wdname[MAXLEN]; + + sprintf(wtmp,"%s/sarg",tmp); + + dirp = opendir(wtmp); + while ( (direntp = readdir( dirp )) != NULL ){ + if(strstr(direntp->d_name,".unsort") == 0) + continue; + strcpy(wdname,direntp->d_name); + + bzero(user, MAXLEN); + strip_unsort: + getword(wname2,wdname,'.'); + strcat(user,wname2); + + if(strcmp(wdname,"unsort") !=0) { + strcat(user,"."); + goto strip_unsort; + } + + if(strcmp(direntp->d_name,"download.unsort") == 0) + sprintf(csort,"sort -T %s -k 3,3 -k 1,1 -k 2,2 -k 5,5 -o %s/%s.log %s/%s.unsort", + tmp, wtmp, user, wtmp, user); + else + sprintf(csort,"sort -T %s -k 5,5 -k 1,1 -k 2,2 -o %s/%s.log %s/%s.unsort", + tmp, wtmp, user, wtmp, user); + system(csort); + sprintf(wdname,"%s/%s.unsort",wtmp,user); + unlink(wdname); + bzero(user, MAXLEN); + + } + (void)rewinddir( dirp ); + (void)closedir( dirp ); + + return; +} diff --git a/splitlog.c b/splitlog.c new file mode 100644 index 0000000..208dcb3 --- /dev/null +++ b/splitlog.c @@ -0,0 +1,76 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void splitlog(char *arq, char *df, int dfrom, int duntil, char *convert) +{ + + FILE *fp_in; + char buf[MAXLEN]; + char data[30]; + char dia[11]; + char hora[9]; + char wdata[20]; + time_t tt; + int idata=0; + struct tm *t; + + if(arq[0] == '\0') + strcpy(arq,"/usr/local/squid/logs/access.log"); + + if((fp_in=fopen(arq,"r"))==NULL) { + fprintf(stderr, "SARG: (splitlog) %s: %s\n",text[8],arq); + exit(1); + } + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(data,buf,' '); + tt=atoi(data); + t=localtime(&tt); + + if(dfrom) { + strftime(wdata, 127, "%Y%m%d", t); + idata=atoi(wdata); + if(idata < dfrom || idata > duntil) + continue; + } + + if(strcmp(convert,"onvert") != 0) { + printf("%s %s",data,buf); + continue; + } + + if(strncmp(df,"e",1) == 0) + strftime(dia, 127, "%d/%m/%Y", t); + else + strftime(dia, 127, "%m/%d/%Y", t); + + sprintf(hora,"%02d:%02d:%02d",t->tm_hour,t->tm_min,t->tm_sec); + printf("%s %s %s",dia,hora,buf); + } + + fclose(fp_in); +} diff --git a/squidguard_log.c b/squidguard_log.c new file mode 100644 index 0000000..cc80be4 --- /dev/null +++ b/squidguard_log.c @@ -0,0 +1,190 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +int squidguard_log() +{ + + FILE *fp_in = NULL, *fp_ou = NULL, *fp_guard = NULL; + char guard_in[MAXLEN]; + char guard_ou[MAXLEN]; + char logdir[MAXLEN]; + char year[10], mon[10], day[10], hour[15]; + char list[MAXLEN]; + char user[MAXLEN]; + char ip[30]; + char wdata[127]; + char bufbsf[255]; + char leks[5], sep[2], res[MAXLEN]; + int idata=0; + int x, y; + + if(strlen(SquidGuardConf) < 1) + return; + + bzero(day, 3); + bzero(mon, 4); + bzero(year, 5); + + if(strcmp(df,"e") == 0) { + strncpy(day,periodo,2); + strncpy(mon,periodo+2,3); + strncpy(year,periodo+5,4); + conv_month(mon); + sprintf(warea,"%s%s%s",year,mon,day); + dfrom=atoi(warea); + strncpy(day,periodo+10,2); + strncpy(mon,periodo+12,3); + strncpy(year,periodo+15,4); + conv_month(mon); + sprintf(warea,"%s%s%s",year,mon,day); + duntil=atoi(warea); + } else { + strncpy(day,periodo+7,2); + strncpy(mon,periodo+4,3); + strncpy(year,periodo,4); + conv_month(mon); + sprintf(warea,"%s%s%s",year,mon,day); + dfrom=atoi(warea); + strncpy(day,periodo+17,2); + strncpy(mon,periodo+14,3); + strncpy(year,periodo+10,4); + conv_month(mon); + sprintf(warea,"%s%s%s",year,mon,day); + duntil=atoi(warea); + } + + sprintf(guard_in,"%s/squidguard.unsort",tmp); + sprintf(guard_ou,"%s/squidguard.log",tmp); + + if(access(SquidGuardConf, R_OK) != 0) { + sprintf(msg,"Cannot open squidGuard config file: %s",SquidGuardConf); + debuga(msg); + exit(1); + } + + if((fp_guard=fopen(SquidGuardConf,"r"))==NULL) { + fprintf(stderr, "SARG: (squidguard) %s: %s\n",text[8],SquidGuardConf); + exit(1); + } + + if((fp_ou=fopen(guard_in,"a"))==NULL) { + fprintf(stderr, "SARG: (squidguard) %s: %s\n",text[8],guard_in); + exit(1); + } + + while(fgets(buf,sizeof(buf),fp_guard)!=NULL) { + if(strstr(buf,"\n") != 0) + buf[strlen(buf)-1]='\0'; + if(strstr(buf,"logdir ") != 0) { + getword(logdir,buf,' '); + getword(logdir,buf,' '); + } + if((str=(char *) strstr(buf, "log")) != (char *) NULL ) { + str=str+3; + str2[0]='\0'; + y=0; + for (x=0; x<=strlen(str); x++) { + if (str[x] != ' ' && str[x] != '\t') { + str2[y] = str[x]; + y++; + } + } + + sprintf(wentp,"%s/%s",logdir,str2); + + if(debug) { + strcpy(buf,text[7]); + + getword(urly,buf,' '); + getword(href,buf,' '); + sprintf(msg,"%s squidGuard %s: %s",urly,buf,wentp); + debuga(msg); + } + + if((fp_in=fopen(wentp,"r"))==NULL) { + fprintf(stderr, "SARG: (squidguard) %s: %s\n",text[8],wentp); + exit(1); + } + + while(fgets(buf,sizeof(buf),fp_in) != NULL) { + + if(strlen(SquidGuardLogFormat) > 0) { + strcpy(bufbsf,SquidGuardLogFormat); + leks[0]='\0'; + getword(leks,bufbsf,'#'); + while(strcmp(leks,"end") != 0) { + getword(leks,bufbsf,'#'); + getword(sep,bufbsf,'#'); + if(strcmp(leks,"end") != 0) { + getword(res,buf,sep[0]); + if(strcmp(leks,"year") == 0) + strcpy(year,res); + else if(strcmp(leks,"year") == 0) + strcpy(year,res); + else if(strcmp(leks,"mon") == 0) + strcpy(mon,res); + else if(strcmp(leks,"day") == 0) + strcpy(day,res); + else if(strcmp(leks,"hour") == 0) + strcpy(hour,res); + else if(strcmp(leks,"list") == 0) + strcpy(list,res); + else if(strcmp(leks,"ip") == 0) + strcpy(ip,res); + else if(strcmp(leks,"user") == 0) + strcpy(user,res); + else if(strcmp(leks,"url") == 0) + strcpy(url,res); + } + } + } + + sprintf(warea,"%s%s%s",year,mon,day); + sprintf(wdata,"%s%s%s",year,mon,day); + idata = atoi(wdata); + + if(idata >= dfrom && idata <= duntil) { + if(strcmp(user,"-") == 0) { + strcpy(user,ip); + bzero(ip, 30); + } + sprintf(tmp6,"%s %s%s%s %s %s %s %s\n",user,year,mon,day,hour,ip,url,list); + fputs(tmp6, fp_ou); + squidguard_count++; + } + } + fclose(fp_in); + } + } + + fclose(fp_guard); + fclose(fp_ou); + sprintf(tmp6,"sort -k 1,1 -k 2,2 -k 4,4 %s -o %s",guard_in, guard_ou); + system(tmp6); + unlink(guard_in); + return; +} diff --git a/squidguard_report.c b/squidguard_report.c new file mode 100644 index 0000000..0dad8db --- /dev/null +++ b/squidguard_report.c @@ -0,0 +1,214 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void squidguard_report() +{ + + FILE *fp_in = NULL, *fp_ou = NULL; + + char url[MAXLEN]; + char html[MAXLEN]; + char html2[MAXLEN]; + char squidguard_in[MAXLEN]; + char squidguard_ou[MAXLEN]; + char per[MAXLEN]; + char report[MAXLEN]; + char periodo[100]; + char ip[MAXLEN]; + char rule[255]; + char oip[MAXLEN]; + char user[MAXLEN]; + char ouser[MAXLEN]; + char data[15]; + char data2[15]; + char hora[15]; + char ftime[128]; + char *str; + int z=0; + int count=0; + + ouser[0]='\0'; + + sprintf(squidguard_in,"%s/squidguard.log",tmp); + if(!squidguard_count) { + unlink(squidguard_in); + return; + } + + sprintf(per,"%s/periodo",dirname); + sprintf(report,"%s/squidguard.html",dirname); + + if ((fp_in = fopen(per, "r")) == 0) { + fprintf(stderr, "SARG: (squidguard) %s: %s\n",text[45],per); + exit(1); + } + + fgets(periodo,sizeof(periodo),fp_in); + fclose(fp_in); + + if((fp_in=fopen(squidguard_in,"r"))==NULL) { + fprintf(stderr, "SARG: (squidguard) %s: %s\n",text[8],squidguard_in); + exit(1); + } + + if((fp_ou=fopen(report,"w"))==NULL) { + fprintf(stderr, "SARG: (squidguard) %s: %s\n",text[8],report); + exit(1); + } + + fputs("\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + sprintf(html," \n",CharSet); + fputs(html,fp_ou); + css(fp_ou); + fputs("\n",fp_ou); + + if(strlen(FontFace) > 0) { + sprintf(url,"\n",FontFace); + fputs(url,fp_ou); + } + + sprintf(url,"\n",BgColor,TxColor,BgImage); + fputs(url,fp_ou); + + if(strlen(LogoImage) > 0) { + fputs("
\n",fp_ou); + sprintf(url,"
\ + %s\n",LogoImage,Width,Height,LogoTextColor,LogoText); + fputs(url,fp_ou); + fputs("
\n",fp_ou); + } + + show_sarg(fp_ou,".."); + fputs("
\n",fp_ou); + sprintf(url,"\n",Title); + fputs(url,fp_ou); + + sprintf(url,"\n",text[89],periodo); + fputs(url,fp_ou); + sprintf(url,"\n",text[120],text[55]); + fputs(url,fp_ou); + fputs("
%s
%s: %s
%s %s
\n",fp_ou); + + fputs("
\n",fp_ou); + fputs("\n",fp_ou); + sprintf(url,"\n",text[98],text[111],text[110],text[91],text[121]); + fputs(url,fp_ou); + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(user,buf,' '); + getword(data2,buf,' '); + getword(hora,buf,' '); + getword(ip,buf,' '); + getword(url,buf,' '); + getword(rule,buf,'\n'); + + if(strcmp(UserIp,"yes") == 0) + strcpy(user,ip); + + bzero(data, 15); + if(strncmp(df,"u",1) != 0) { + strncpy(data,data2+6,2); + strcat(data,"/"); + strncat(data,data2+4,2); + strcat(data,"/"); + strncat(data,data2,4); + } else { + strncpy(data,data2+4,2); + strcat(data,"/"); + strncat(data,data2+6,2); + strcat(data,"/"); + strncat(data,data2,4); + } + + if((str=(char *) strstr(user, "_")) != (char *) NULL ) { + if((str=(char *) strstr(str+1, "_")) != (char *) NULL ) + fixip(user); + } + + if(strcmp(Ip2Name,"yes") == 0) + ip2name(ip); + + if(!z) { + strcpy(ouser,user); + strcpy(oip,ip); + z++; + } else { + if(strcmp(ouser,user) == 0) + user[0]='\0'; + if(user[0] != '\0') + strcpy(ouser,user); + if(strcmp(oip,ip) == 0) + ip[0]='\0'; + if(ip[0] != '\0') + strcpy(oip,ip); + } + + if(UserTabFile[0] != '\0') { + sprintf(warea,":%s:",user); + if((str=(char *) strstr(userfile,warea)) != (char *) NULL ) { + z1=0; + str2=(char *) strstr(str+1,":"); + str2++; + bzero(name, MAXLEN); + while(str2[z1] != ':') { + name[z1]=str2[z1]; + z1++; + } + } else strcpy(name,user); + } else strcpy(name,user); + + if(SquidGuardReportLimit) { + if(strcmp(ouser2,name) == 0) { + count++; + } else { + count=1; + strcpy(ouser2,name); + } + if(count >= SquidGuardReportLimit) + continue; + } + + sprintf(html2,"\n",name,ip,data,hora,url,url,rule); + fputs(html2,fp_ou); + } + + fputs("
%s%s%s%s%s
%s%s%s-%s%s%s
\n",fp_ou); + + show_info(fp_ou); + + fputs("\n\n",fp_ou); + + fclose(fp_in); + fclose(fp_ou); + + unlink(squidguard_in); + + return; +} diff --git a/topsites.c b/topsites.c new file mode 100644 index 0000000..7ed40e0 --- /dev/null +++ b/topsites.c @@ -0,0 +1,244 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void topsites() +{ + + FILE *fp_in, *fp_ou; + + char url[MAXLEN]; + char ourl[MAXLEN]; + char nacc[20]; + char nbytes[20]; + char ntime[20]; + char ntemp[20]; + char ttnacc[20]; + char ttnbytes[20]; + char ttntime[20]; + char csort[255]; + char geral[MAXLEN]; + char geral2[MAXLEN]; + char geral3[MAXLEN]; + char per[MAXLEN]; + char sites[MAXLEN]; + char report[MAXLEN]; + char periodo[100]; + char ftime[128]; + char sortf[10]; + char sortt[10]; + long long int tnacc=0; + long long int tnbytes=0; + long long int tntime=0; + long long int twork1=0, twork2=0, twork3=0; + int regs=0; + + + sprintf(geral,"%s/geral",dirname); + sprintf(sites,"%s/sites",dirname); + sprintf(geral2,"%s/geral2",dirname); + sprintf(geral3,"%s/geral3",dirname); + sprintf(per,"%s/periodo",dirname); + sprintf(report,"%s/topsites.html",dirname); + + if ((fp_in = fopen(per, "r")) == 0) { + fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],per); + exit(1); + } + + fgets(periodo,sizeof(periodo),fp_in); + fclose(fp_in); + + sprintf(csort,"sort -k 4,4 -o %s %s",geral2,geral); + system(csort); + + if((fp_in=fopen(geral2,"r"))==NULL) { + fprintf(stderr, "SARG: (topsite) %s: %s\n",text[8],geral2); + exit(1); + } + + if((fp_ou=fopen(geral3,"w"))==NULL) { + fprintf(stderr, "SARG: (topsite) %s: %s\n",text[8],geral3); + exit(1); + } + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(url,buf,' '); + if(strcmp(url,"TOTAL") == 0) { + getword(ttnacc,buf,' '); + getword(ttnbytes,buf,' '); + getword(ttntime,buf,' '); + continue; + } + getword(nacc,buf,' '); + getword(nbytes,buf,' '); + getword(url,buf,' '); + getword(ntemp,buf,' '); + getword(ntemp,buf,' '); + getword(ntemp,buf,' '); + getword(ntime,buf,' '); + + if(!regs) { + strcpy(ourl,url); + regs++; + } + + if(strcmp(url,ourl) != 0) { + my_lltoa(tnacc,val1,15); + my_lltoa(tnbytes,val2,15); + my_lltoa(tntime,val3,15); + sprintf(buf,"%s %s %s %s\n",val1,val2,val3,ourl); + fputs(buf, fp_ou); + strcpy(ourl,url); + tnacc=0; + tnbytes=0; + tntime=0; + } + + tnacc+=my_atoll(nacc); + tnbytes+=my_atoll(nbytes); + tntime+=my_atoll(ntime); + } + + my_lltoa(tnacc,val1,15); + my_lltoa(tnbytes,val2,15); + my_lltoa(tntime,val3,15); + sprintf(buf,"%s %s %s %s\n",val1,val2,val3,ourl); + fputs(buf, fp_ou); + + fclose(fp_in); + fclose(fp_ou); + unlink(geral2); + + strlow(TopsitesSortField); + strlow(TopsitesSortType); + + if(strcmp(TopsitesSortField,"connect") == 0) + strcpy(sortf,"1,1"); + if(strcmp(TopsitesSortField,"bytes") == 0) + strcpy(sortf,"2,2"); + if(strcmp(TopsitesSortType,"a") == 0) + strcpy(sortt," "); + if(strcmp(TopsitesSortType,"d") == 0) + strcpy(sortt,"-r"); + + sprintf(csort,"sort %s -k %s -o %s %s",sortt,sortf,sites,geral3); + system(csort); + + unlink(geral2); + unlink(geral3); + + if((fp_in=fopen(sites,"r"))==NULL) { + fprintf(stderr, "SARG: (topsite) %s: %s\n",text[8],sites); + exit(1); + } + + if((fp_ou=fopen(report,"w"))==NULL) { + fprintf(stderr, "SARG: (topsite) %s: %s\n",text[8],report); + exit(1); + } + + regs=0; + + fputs("\n",fp_ou); + fputs("\n",fp_ou); + fputs("\n",fp_ou); + sprintf(html," \n",CharSet); + fputs(html,fp_ou); + css(fp_ou); + fputs("\n",fp_ou); + + sprintf(url,"\n",BgColor,TxColor,BgImage); + fputs(url,fp_ou); + + if(strlen(LogoImage) > 0) { + fputs("
\n",fp_ou); + sprintf(url,"
%s\n",LogoImage,Width,Height,LogoTextColor,LogoText); + fputs(url,fp_ou); + fputs("
\n",fp_ou); + } + + show_sarg(fp_ou,".."); + fputs("
\n",fp_ou); + sprintf(url,"\n",Title); + fputs(url,fp_ou); + + sprintf(url,"\n",text[89],periodo); + fputs(url,fp_ou); + sprintf(url,"\n",text[83],TopSitesNum,text[84]); + fputs(url,fp_ou); + fputs("
%s
%s: %s
%s %s %s
\n",fp_ou); + + fputs("
\n",fp_ou); + fputs("\n",fp_ou); + sprintf(url," \ + \ + \n", \ + text[100],text[91],text[92],text[93],text[99]); + fputs(url,fp_ou); + + regs=1; + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + if(regs>atoi(TopSitesNum)) + break; + getword(nacc,buf,' '); + getword(nbytes,buf,' '); + getword(ntime,buf,' '); + getword(url,buf,' '); + + twork1=my_atoll(nacc); + twork2=my_atoll(nbytes); + twork3=my_atoll(ntime); + + sprintf(wwork1,"%s",fixnum(twork1,1)); + sprintf(wwork2,"%s",fixnum(twork2,1)); + sprintf(wwork3,"%s",fixnum(twork3,1)); + + if(strlen(BlockIt) > 0) + sprintf(BlockImage," ",wwwDocumentRoot,BlockIt,url); + else BlockImage[0]='\0'; + + + sprintf(ourl,"\n",regs,BlockImage,url,url,wwork1,wwork2,wwork3); + fputs(ourl,fp_ou); + regs++; + } + + + fputs("
%s%s%s%s%s
%d%s%s%s%s%s
\n",fp_ou); + + show_info(fp_ou); + + fputs("\n\n",fp_ou); + + fclose(fp_in); + fclose(fp_ou); + + return; + +} diff --git a/topuser.c b/topuser.c new file mode 100644 index 0000000..e173ec7 --- /dev/null +++ b/topuser.c @@ -0,0 +1,678 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +int topuser() +{ + + FILE *fp_in, *fp_ou, *fp_top1, *fp_top2, *fp_top3; + long long int ttnbytes=0, ttnacc=0, tnacc=0; + long long int tnbytes=0, ttnelap=0, tnelap=0; + long long int tnincache=0, tnoucache=0, ttnincache=0, ttnoucache=0; + float perc=0.00; + float perc2=0.00; + float inperc=0.00, ouperc=0.00; + int posicao=0; + char olduser[MAXLEN], csort[MAXLEN], periodo[MAXLEN], arqper[MAXLEN]; + char wger[MAXLEN], top1[MAXLEN], top2[MAXLEN], top3[MAXLEN]; + char user[MAXLEN], nacc[20], nbytes[20], preg[MAXLEN], tusr[MAXLEN]; + char ip[MAXLEN], hora[9], data[11], elap[15], incac[15], oucac[15], html[MAXLEN]; + char ipantes[MAXLEN], nameantes[MAXLEN]; + char sfield[10]="2,2"; + char order[3]="-r"; + char wheader[512]; + char ftime[128]; + int totuser=0; + int topcount=0; + char *s; + + ipantes[0]='\0'; + nameantes[0]='\0'; + + strcpy(wger,dirname); + strcpy(top1,dirname); + strcpy(top2,dirname); + strcpy(top3,dirname); + strcpy(tusr,dirname); + strcat(wger,"/geral"); + strcat(top1,"/top"); + strcat(top2,"/top.tmp"); + strcat(tusr,"/usuarios"); + strcat(top3,"/index.html"); + + if((fp_in=fopen(wger,"r"))==NULL) { + fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],wger); + exit(1); + } + + if((fp_top2=fopen(top2,"w"))==NULL) { + fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],top2); + exit(1); + } + + fscanf(fp_in,"%s",user); + fscanf(fp_in,"%s",nacc); + fscanf(fp_in,"%s",nbytes); + fscanf(fp_in,"%s",url); + fscanf(fp_in,"%s",ip); + fscanf(fp_in,"%s",hora); + fscanf(fp_in,"%s",data); + fscanf(fp_in,"%s",elap); + fscanf(fp_in,"%s",incac); + fscanf(fp_in,"%s",oucac); + + strcpy(olduser,user); + totuser=1; + + while(!feof(fp_in)) { + if(strcmp(olduser,user) != 0) { + if(strcmp(user,"TOTAL") != 0) + totuser++; + + my_lltoa(tnbytes,val1,15); + my_lltoa(tnacc,val2,15); + my_lltoa(tnelap,val3,15); + my_lltoa(tnincache,val4,15); + my_lltoa(tnoucache,val5,15); + sprintf(preg,"%s %s %s %s %s %s\n",olduser,val1,val2,val3,val4,val5); + fputs(preg,fp_top2); + + strcpy(olduser,user); + ttnbytes+=tnbytes; + ttnacc+=tnacc; + ttnelap+=tnelap; + ttnincache+=tnincache; + ttnoucache+=tnoucache; + tnbytes=0; + tnacc=0; + tnelap=0; + tnincache=0; + tnoucache=0; + } + + tnbytes+=my_atoll(nbytes); + tnacc+=my_atoll(nacc); + tnelap+=my_atoll(elap); + tnincache+=my_atoll(incac); + tnoucache+=my_atoll(oucac); + + fscanf(fp_in,"%s",user); + fscanf(fp_in,"%s",nacc); + fscanf(fp_in,"%s",nbytes); + fscanf(fp_in,"%s",url); + fscanf(fp_in,"%s",ip); + fscanf(fp_in,"%s",hora); + fscanf(fp_in,"%s",data); + fscanf(fp_in,"%s",elap); + fscanf(fp_in,"%s",incac); + fscanf(fp_in,"%s",oucac); + + if(strcmp(user,"TOTAL") == 0) + continue; + } + + my_lltoa(tnbytes,val1,15); + my_lltoa(tnacc,val2,15); + my_lltoa(tnelap,val3,15); + my_lltoa(tnincache,val4,15); + my_lltoa(tnoucache,val5,15); + sprintf(preg,"%s %s %s %s %s %s\n",olduser,val1,val2,val3,val4,val5); + fputs(preg,fp_top2); + + ttnbytes+=tnbytes; + ttnacc+=tnacc; + ttnelap+=tnelap; + ttnincache+=tnincache; + ttnoucache+=tnoucache; + + my_lltoa(ttnbytes,val1,15); + my_lltoa(ttnacc,val2,15); + my_lltoa(ttnelap,val3,15); + my_lltoa(ttnincache,val4,15); + my_lltoa(ttnoucache,val5,15); + sprintf(preg,"TOTAL %s %s %s %s %s\n",val1,val2,val3,val4,val5); + fclose(fp_in); + fclose(fp_top2); + + strup(TopuserSortField); + strlow(TopuserSortOrder); + + if(strcmp(TopuserSortField,"USER") == 0) + strcpy(sfield,"1,1"); + + if(strcmp(TopuserSortField,"CONNECT") == 0) + strcpy(sfield,"3,3"); + + if(strcmp(TopuserSortField,"TIME") == 0) + strcpy(sfield,"4,4"); + + if(strcmp(TopuserSortOrder,"normal") == 0) + order[0]='\0'; + + sprintf(csort,"sort -n -T %s %s -k %s -o %s %s", TempDir, order, sfield, top1, top2); + system(csort); + + unlink(top2); + + if((fp_top1=fopen(top1,"a"))==NULL) { + fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],top1); + exit(1); + } + fputs(preg,fp_top1); + fclose(fp_top1); + + if((fp_top1=fopen(top1,"r"))==NULL) { + fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],top1); + exit(1); + } + + if((fp_top3=fopen(top3,"w"))==NULL) { + fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],top3); + exit(1); + } + + /* + * get period + */ + + strcpy(arqper,dirname); + strcat(arqper,"/periodo"); + + if ((fp_in = fopen(arqper, "r")) == 0) { + fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],arqper); + exit(1); + } + + fgets(periodo,sizeof(periodo),fp_in); + fclose(fp_in); + + fputs("\n",fp_top3); + fputs("\n",fp_top3); + fputs("\n",fp_top3); + sprintf(html," \n",CharSet); + fputs(html,fp_top3); + fputs("\n",fp_top3); + + css(fp_top3); + + sprintf(preg,""); + fputs(preg,fp_top3); + + if(strlen(LogoImage) > 0) { + fputs("
\n",fp_top3); + sprintf(preg,"\n",LogoImage,Width,Height,LogoTextColor,LogoText); + fputs(preg,fp_top3); + fputs("
%s
\n",fp_top3); + } + + show_sarg(fp_top3, ".."); + fputs("
\n",fp_top3); + sprintf(preg,"\n",Title); + fputs(preg,fp_top3); + + sprintf(preg,"\n",text[89],periodo); + fputs(preg,fp_top3); + strcat(wheader,(char *)text[104]); + strcat(wheader,": "); + strcat(wheader,TopuserSortField); + strcat(wheader,", "); + strcat(wheader,TopuserSortOrder); + sprintf(preg,"\n",wheader); + fputs(preg,fp_top3); + sprintf(preg,"\n",text[55]); + fputs(preg,fp_top3); + + fputs("
%s
%s: %s
%s
Topuser %s
\n",fp_top3); + fputs("
\n",fp_top3); + fputs("\n",fp_top3); + + if(strstr(ReportType,"topsites") != 0) { + sprintf(preg,"\n",text[119],text[55]); + fputs(preg,fp_top3); + } + + if(strstr(ReportType,"sites_users") != 0) { + sprintf(preg,"\n",text[85],text[55]); + fputs(preg,fp_top3); + } + + if(dansguardian_count) { + sprintf(preg,"\n",text[128],text[55]); + fputs(preg,fp_top3); + } + + if(squidguard_count) { + sprintf(preg,"\n",text[122],text[55]); + fputs(preg,fp_top3); + } + + if(download_count) { + sprintf(preg,"\n",text[125],text[55]); + fputs(preg,fp_top3); + } + + if(denied_count) { + sprintf(preg,"\n",text[118],text[55]); + fputs(preg,fp_top3); + } + + if(authfail_count) { + sprintf(preg,"\n",text[117],text[55]); + fputs(preg,fp_top3); + } + + if(smartfilter) { + sprintf(preg,"\n",text[116],text[55]); + fputs(preg,fp_top3); + } + strcpy(preg,"\n"); + fputs(preg,fp_top3); + + strcpy(val1,text[100]); + strcpy(val2,text[98]); + strcpy(val3,text[92]); + strcpy(val4,text[93]); + sprintf(val11,"%%%s",text[93]); + sprintf(val5,"%s-%s-%s",text[113],text[114],text[112]); + strcpy(val6,text[94]); + strcpy(val7,text[95]); + sprintf(val8,"%%%s",text[99]); + strcpy(val9,"colspan=2"); + bzero(val10, 255); + + strcpy(hbc1,"class=\"header\""); + strcpy(hbc2,"class=\"header\""); + strcpy(hbc3,"class=\"header\""); + strcpy(hbc4,"class=\"header\""); + strcpy(hbc5,"class=\"header3\""); + strcpy(hbc6,"class=\"header\""); + strcpy(hbc7,"class=\"header\""); + strcpy(hbc8,"class=\"header\""); + strcpy(hbc9,"class=\"header\""); + strcpy(hbc10,"class=\"header\""); + + if(strstr(TopUserFields,"NUM") == 0) { + bzero(val1, 255); + bzero(hbc1, 30); + } + if(strstr(TopUserFields,"USERID") == 0) { + bzero(val2, 255); + bzero(hbc2, 30); + } + if(strstr(TopUserFields,"CONNECT") == 0) { + bzero(val3, 255); + bzero(hbc3, 30); + } + if(strstr(TopUserFields,"BYTES") == 0) { + bzero(val4, 255); + bzero(hbc4, 30); + } + if(strstr(TopUserFields,"SETYB") == 0) { + bzero(val11, 255); + bzero(hbc9, 30); + } + if(strstr(TopUserFields,"IN-CACHE-OUT") == 0) { + bzero(val5, 255); + bzero(hbc5, 30); + bzero(val9, 255); + strcpy(val10,""); + } + if(strstr(TopUserFields,"USED_TIME") == 0) { + bzero(val6, 255); + bzero(hbc6, 30); + } + if(strstr(TopUserFields,"MILISEC") == 0) { + bzero(val7, 255); + bzero(hbc7, 30); + } + if(strstr(TopUserFields,"%TIME") == 0) { + bzero(val8, 255); + bzero(hbc8, 30); + } + + sprintf(preg,"\n",hbc1,val1,hbc1,hbc2,val2,hbc3,val3,hbc4,val4,hbc9,val11,hbc5,val9,val5,val10,hbc6,val6,hbc7,val7,hbc8,val8); + + fputs(preg,fp_top3); + + fscanf(fp_top1,"%s",user); + fscanf(fp_top1,"%s",nbytes); + fscanf(fp_top1,"%s",nacc); + fscanf(fp_top1,"%s",elap); + fscanf(fp_top1,"%s",incac); + fscanf(fp_top1,"%s",oucac); + + while(!feof(fp_top1)) { + if(atoi(TopUsersNum) > 0 && topcount >= atoi(TopUsersNum)) goto final; + strcpy(user2,user); + tnbytes=my_atoll(nbytes); + + if(tnbytes) { + perc=tnbytes * 100; + perc=perc / ttnbytes; + } else perc = 0; + + if(atol(elap)) { + perc2=atol(elap); + perc2=((perc2 * 100) / ttnelap); + } else perc2 = 0; + + if(atol(incac)) { + inperc=atol(incac); + inperc=((inperc * 100) / tnbytes); + } else inperc = 0; + + if(atol(oucac)) { + ouperc=atol(oucac); + ouperc=((ouperc * 100) / tnbytes); + } else ouperc = 0; + + strcpy(href," "); + strcpy(href2," "); + strcpy(href3," "); + + if(strcmp(user,"TOTAL") != 0){ + sprintf(href,"",user); + strcat(href,user); + strcat(href2,user); + strcat(href,".html'>"); + strcat(href2,".html'>"); + } + + if(strcmp(Graphs,"yes") != 0) + bzero(href3,MAXLEN); + + posicao++; + + tnelap=my_atoll(elap); + + if(userip) { + fixip(user2); + if(strcmp(Ip2Name,"yes") == 0) { + if(strcmp(user2,ipantes) != 0) { + strcpy(ipantes,user2); + ip2name(user2); + strcpy(nameantes,user2); + } else strcpy(user2,nameantes); + } + } + + if(strstr(ReportType,"date_time") != 0) { + sprintf(ltext110,"%s",text[110]); + if(ltext110){ + for(s=ltext110; *s; ++s) + *s=tolower(*s); + } + } else { + bzero(href2, MAXLEN); + bzero(ltext110, 50); + sprintf(val1,"%s/d%s.html",dirname,user); + unlink(val1); + } + + if(UserTabFile[0] != '\0' && strstr(user2,".") != 0) { + sprintf(warea,":%s:",user2); + if((str=(char *) strstr(userfile,warea)) != (char *) NULL ) { + z1=0; + str2=(char *) strstr(str+1,":"); + str2++; + bzero(name, MAXLEN); + while(str2[z1] != ':') { + name[z1]=str2[z1]; + z1++; + } + } else strcpy(name,user2); + } else strcpy(name,user2); + + if(strcmp(Ip2Name,"yes") == 0) { + if((str=(char *) strstr(name, ".")) != (char *) NULL) { + if((str=(char *) strstr(str+1, ".")) != (char *) NULL) + ip2name(name); + } + } + + twork=my_atoll(nacc); + my_lltoa(twork,nacc,0); + sprintf(wwork1,"%s",fixnum(twork,1)); + sprintf(wwork2,"%s",fixnum(tnbytes,1)); + sprintf(wwork3,"%s",fixnum(tnelap,1)); + + sprintf(val1,"%d",posicao); +#ifdef HAVE_GD + sprintf(val2,"%s %s\n",href3,text[126],text[55],href2,ltext110,text[55]); +#else + sprintf(val2,"%s\n",href2,ltext110,text[55]); +#endif + + sprintf(val3,"%3.2f%%",perc); + sprintf(val4,"%3.2f%%",inperc); + sprintf(val5,"%3.2f%%",ouperc); + sprintf(val6,"%s",buildtime(tnelap)); + sprintf(val7,"%3.2f%%",perc2); + + strcpy(hbc1,"class=\"data\""); + strcpy(hbc2,"class=\"data2\""); + strcpy(hbc3,"class=\"data\""); + strcpy(hbc4,"class=\"data\""); + strcpy(hbc5,"class=\"data\""); + strcpy(hbc6,"class=\"data\""); + strcpy(hbc7,"class=\"data\""); + strcpy(hbc8,"class=\"data\""); + strcpy(hbc9,"class=\"data\""); + strcpy(hbc10,"class=\"data\""); + + if(strstr(TopUserFields,"NUM") == 0) { + bzero(val1, 255); + bzero(hbc1, 30); + } + if(strstr(TopUserFields,"USERID") == 0) { + bzero(val2, 255); + bzero(hbc2, 30); + } + if(strstr(TopUserFields,"CONNECT") == 0) { + bzero(wwork1, 255); + bzero(hbc3, 30); + } + if(strstr(TopUserFields,"BYTES") == 0) { + bzero(wwork2, 255); + bzero(hbc4, 30); + } + if(strstr(TopUserFields,"SETYB") == 0) { + bzero(val3, 255); + bzero(hbc5, 30); + } + if(strstr(TopUserFields,"IN-CACHE-OUT") == 0) { + bzero(val4, 255); + bzero(hbc6, 30); + } + if(strstr(TopUserFields,"IN-CACHE-OUT") == 0) { + bzero(val5, 255); + bzero(hbc7, 30); + } + if(strstr(TopUserFields,"USED_TIME") == 0) { + bzero(val6, 255); + bzero(hbc8, 30); + } + if(strstr(TopUserFields,"MILISEC") == 0) { + bzero(wwork3, 255); + bzero(hbc9, 30); + } + if(strstr(TopUserFields,"%TIME") == 0) { + bzero(val7, 255); + bzero(hbc10, 30); + } + + if(strstr(ReportType,"users_sites") == 0) + href[0]='\0'; + + sprintf(preg,"\n",hbc1,val1,hbc2,val2,hbc2,href,name,hbc3,wwork1,hbc4,wwork2,hbc5,val3,hbc6,val4,hbc7,val5,hbc8,val6,hbc9,wwork3,hbc10,val7); + + if(strstr(user,"TOTAL") != 0) { + + if(atol(incac)) { + inperc=ttnbytes / 100; + inperc=atol(incac) / inperc; + } else inperc = 0; + + if(atol(oucac)) { + ouperc=ttnbytes / 100; + ouperc=atol(oucac) / ouperc; + } else ouperc = 0; + + sprintf(wwork1,"%s",fixnum(ttnacc,1)); + sprintf(wwork2,"%s",fixnum(ttnbytes,1)); + sprintf(wwork3,"%s",fixnum(ttnelap,1)); + + strcpy(hbc1,"class=\"header2\""); + strcpy(hbc2,"class=\"header2\""); + strcpy(hbc3,"class=\"header2\""); + strcpy(hbc4,"class=\"header2\""); + strcpy(hbc5,"class=\"header2\""); + strcpy(hbc6,"class=\"header2\""); + strcpy(hbc7,"class=\"header2\""); + strcpy(hbc8,"class=\"header2\""); + strcpy(hbc9,"class=\"header2\""); + strcpy(hbc10,"class=\"header\""); + + sprintf(val4,"%3.2f%%",inperc); + sprintf(val5,"%3.2f%%",ouperc); + sprintf(val6,"%s",buildtime(ttnelap)); + sprintf(val7,"%3.2f%%",perc2); + + if(strstr(TopUserFields,"CONNECT") == 0) { + bzero(wwork1, 255); + bzero(hbc1, 30); + } + if(strstr(TopUserFields,"BYTES") == 0) { + bzero(wwork2, 255); + bzero(hbc2, 30); + } + if(strstr(TopUserFields,"IN-CACHE-OUT") == 0) { + bzero(val4, 255); + bzero(val5, 255); + bzero(hbc3, 30); + bzero(hbc4, 30); + } + if(strstr(TopUserFields,"USED_TIME") == 0) { + bzero(val6, 255); + bzero(hbc5, 30); + } + if(strstr(TopUserFields,"MILISEC") == 0) { + bzero(wwork3, 255); + bzero(hbc6, 30); + } + + if(strstr(ReportType,"date_time") != 0) { + if(strstr(TopUserFields,"TOTAL") != 0) + sprintf(preg,"\n",hbc10,text[107],hbc1,wwork1,hbc2,wwork2,hbc3,val4,hbc4,val5,hbc5,val6,hbc6,wwork3); + } else if(strstr(TopUserFields,"TOTAL") != 0) + sprintf(preg,"\n",hbc10,text[107],hbc1,wwork1,hbc2,wwork2,hbc3,val4,hbc4,val5,hbc5,val6,hbc6,wwork3); + } + + fputs(preg,fp_top3); + + topcount++; + + fscanf(fp_top1,"%s",user); + fscanf(fp_top1,"%s",nbytes); + fscanf(fp_top1,"%s",nacc); + fscanf(fp_top1,"%s",elap); + fscanf(fp_top1,"%s",incac); + fscanf(fp_top1,"%s",oucac); + } + + if(ttnbytes) { + tnbytes=ttnbytes / totuser; + } else tnbytes=0; + + twork=ttnacc/totuser; + twork2=ttnelap/totuser; + sprintf(wwork1,"%s",fixnum(twork,1)); + sprintf(wwork2,"%s",fixnum(tnbytes,1)); + sprintf(wwork3,"%s",fixnum(twork2,1)); + + if(strstr(TopUserFields,"CONNECT") == 0) { + bzero(wwork1, 255); + bzero(hbc1, 30); + } + if(strstr(TopUserFields,"BYTES") == 0) { + bzero(wwork2, 255); + bzero(hbc2, 30); + } + if(strstr(TopUserFields,"IN-CACHE-OUT") == 0) { + bzero(val4, 255); + bzero(val5, 255); + bzero(hbc3, 30); + bzero(hbc4, 30); + } + if(strstr(TopUserFields,"USED_TIME") == 0) { + bzero(val6, 255); + bzero(hbc5, 30); + } + if(strstr(TopUserFields,"MILISEC") == 0) { + bzero(wwork3, 255); + bzero(hbc6, 30); + } + + if((strstr(ReportType,"date_time") != 0 && strstr(TopUserFields,"AVERAGE") != 0)) { + sprintf(preg,"\n",hbc10,text[96],hbc1,wwork1,hbc2,wwork2,hbc3,buildtime(ttnelap/totuser),hbc4,wwork3); + fputs(preg,fp_top3); + } else if(strstr(TopUserFields,"AVERAGE") != 0) { + sprintf(preg,"\n",hbc10,text[96],hbc1,wwork1,hbc2,wwork2,hbc3,buildtime(ttnelap/totuser),hbc4,wwork3); + fputs(preg,fp_top3); + } + + if(strlen(UserAgentLog) > 0) { + fputs("\n",fp_top3); + fputs("\n",fp_top3); + fputs("\n",fp_top3); + } + + strcpy(preg,"

%s %s
%s %s
%s %s
%s %s
%s %s
%s %s
%s %s
%s %s
%s%s%s%s%s%s%s%s%s%s
%s%s%s%s%s%s%s%s%s%s%s%s
%s%s%15s%s%s%s%s
%s%s%15s%s%s%s%s
%s%s%15s%s%s
%s%s%15s%s%s
Useragent Report
"); + fputs(preg,fp_top3); + + show_info(fp_top3); + +final: + fclose(fp_top1); + unlink(top1); + + if((fp_ou=fopen(tusr,"w"))==NULL) { + fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],tusr); + exit(1); + } + + sprintf(preg,"%d\n",totuser); + fputs(preg,fp_ou); + + fputs("\n\n",fp_top3); + fclose(fp_top3); + fclose(fp_ou); + + return; +} diff --git a/totday.c b/totday.c new file mode 100644 index 0000000..02c6156 --- /dev/null +++ b/totday.c @@ -0,0 +1,128 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void totaliza_day(const char *tmp, char *user, int indexonly) +{ + + FILE *fp_in, *fp_ou; + + char data[20]; + char hora[20]; + char min[20]; + char elap[20]; + char odata[20]; + char ohora[20]; + char oelap[20]; + char hm[20]; + char ohm[20]; + char csort[255]; + char wdirname[MAXLEN]; + char sortout[MAXLEN]; + char arqout[MAXLEN]; + int regs=0; + long long int telap=0; + long long int tused=0; + + if(indexonly) return; + if(strstr(ReportType,"users_sites") == 0) return; + + sprintf(wdirname,"%s/%s.htmp",tmp,user); + sprintf(arqout,"%s/%s.day",tmp,user); + sprintf(sortout,"%s/%s.sort",tmp,user); + + sprintf(csort,"sort -k 1,1 -k 2,2 -o %s %s",sortout,wdirname); + system(csort); + + unlink(wdirname); + + if((fp_in=fopen(sortout,"r"))==NULL) { + fprintf(stderr, "SARG: (totday) %s: %s\n",text[8],sortout); + exit(1); + } + + if((fp_ou=fopen(arqout,"w"))==NULL) { + fprintf(stderr, "SARG: (totday) %s: %s\n",text[8],arqout); + exit(1); + } + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + if(strstr(buf,"\n") != 0) + buf[strlen(buf)-1]='\0'; + + getword(data,buf,' '); + getword(hora,buf,':'); + getword(min,buf,':'); + getword(elap,buf,' '); + strcpy(elap,buf); + sprintf(hm,"%s%s",hora,min); + + if(!regs) { + strcpy(odata,data); + strcpy(ohora,hora); + strcpy(oelap,elap); + strcpy(ohm,hm); + regs++; + } + + if(strcmp(hora,ohora) != 0) { + if(tused > telap) + tused=telap; + + my_lltoa(telap,val1,15); + sprintf(buf,"%s %s %s\n",odata,ohora,val1); + fputs(buf, fp_ou); + strcpy(odata,data); + strcpy(ohora,hora); + strcpy(ohm,hm); + telap=0; + tused=0; + } + + if(strcmp(ohm,hm) != 0) { + tused+=60000; + strcpy(ohm,hm); + } + + telap+=my_atoll(elap); + + } + + if(tused > telap) + tused=telap; + + my_lltoa(telap,val1,15); + sprintf(buf,"%s %s %s\n",data,hora,val1); + fputs(buf, fp_ou); + + fclose(fp_in); + fclose(fp_ou); + + unlink(sortout); + + return; + +} diff --git a/totger.c b/totger.c new file mode 100644 index 0000000..71ca364 --- /dev/null +++ b/totger.c @@ -0,0 +1,104 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +int totalger(const char *dirname, int debug, const char *outdir) + +{ + + + FILE *fp_in, *fp_ou; + long long int tnacc=0; + long long int tnbytes=0; + long long int telap=0; + long long int tincache=0, toucache=0; + char wger[MAXLEN], user[MAXLEN], nacc[10], nbytes[10], url[1024]; + char ip[MAXLEN], hora[9], data[11], elap[15]; + char incac[15], oucac[15]; + + strcpy(wger,dirname); + strcat(wger,"/geral"); + + if((fp_in=fopen(wger,"r"))==NULL) { + fprintf(stderr, "SARG: (totger) %s: %s\n",text[45],wger); + exit(1); + } + + fscanf(fp_in,"%s",user); + fscanf(fp_in,"%s",nacc); + fscanf(fp_in,"%s",nbytes); + fscanf(fp_in,"%s",url); + fscanf(fp_in,"%s",ip); + fscanf(fp_in,"%s",hora); + fscanf(fp_in,"%s",data); + fscanf(fp_in,"%s",elap); + fscanf(fp_in,"%s",incac); + fscanf(fp_in,"%s",oucac); + + while(!feof(fp_in)) + { + + tnacc+=my_atoll(nacc); + tnbytes+=my_atoll(nbytes); + telap+=my_atoll(elap); + tincache+=my_atoll(incac); + toucache+=my_atoll(oucac); + + fscanf(fp_in,"%s",user); + fscanf(fp_in,"%s",nacc); + fscanf(fp_in,"%s",nbytes); + fscanf(fp_in,"%s",url); + fscanf(fp_in,"%s",ip); + fscanf(fp_in,"%s",hora); + fscanf(fp_in,"%s",data); + fscanf(fp_in,"%s",elap); + fscanf(fp_in,"%s",incac); + fscanf(fp_in,"%s",oucac); + } + + fclose(fp_in); + + strcpy(wger,dirname); + strcat(wger,"/geral"); + + if((fp_ou=fopen(wger,"a"))==NULL) { + fprintf(stderr, "SARG: (totger) %s: %s\n",text[45],wger); + exit(1); + } + + url[0]='\0'; + + my_lltoa(tnacc,val1,15); + my_lltoa(tnbytes,val2,15); + my_lltoa(telap,val3,15); + my_lltoa(tincache,val4,15); + my_lltoa(toucache,val5,15); + sprintf(url,"TOTAL %s %s %s %s %s\n",val1,val2,val3,val4,val5); + fputs(url,fp_ou); + fclose(fp_ou); + + return (0); +} diff --git a/usage.c b/usage.c new file mode 100644 index 0000000..1ce2071 --- /dev/null +++ b/usage.c @@ -0,0 +1,58 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void usage(char *prog) +{ + fprintf(stderr, "%s: %s [%s...]\n", prog,text[39],text[40]); + fprintf(stderr, "%5s-a %s\n"," ",text[23]); + fprintf(stderr, "%5s-b %s\n"," ",text[71]); + fprintf(stderr, "%5s-c %s\n"," ",text[69]); + fprintf(stderr, "%5s-d %s dd/mm/yyyy-dd/mm/yyyy\n"," ",text[24]); + fprintf(stderr, "%5s-e %s (%s)\n"," ",text[41],text[42]); + fprintf(stderr, "%5s-f %s (%s/sarg.conf)\n"," ",text[70],SYSCONFDIR); + fprintf(stderr, "%5s-g %s [e=%s -> dd/mm/yy, u=%s -> mm/dd/yy]\n"," ",text[25],text[26],text[27]); + fprintf(stderr, "%5s-h Help (this...)\n"," "); + fprintf(stderr, "%5s-i %s\n"," ",text[43]); + fprintf(stderr, "%5s-l %s\n"," ",text[37]); + fprintf(stderr, "%5s-n %s\n"," ",text[65]); + fprintf(stderr, "%5s-o %s\n"," ",text[38]); + fprintf(stderr, "%5s-p %s (%s)\n"," ",text[29],text[44]); + fprintf(stderr, "%5s-s %s [Eg. www.microsoft.com, www.netscape.com]\n"," ",text[30]); + fprintf(stderr, "%5s-t %s [HH, HH:MM]\n"," ",text[31]); + fprintf(stderr, "%5s-u %s\n"," ",text[32]); + fprintf(stderr, "%5s-w %s\n"," ",text[34]); + fprintf(stderr, "%5s-x %s\n"," ",text[36]); + fprintf(stderr, "%5s-z %s\n"," ",text[35]); + fprintf(stderr, "%5s-convert %s\n"," ",text[76]); + fprintf(stderr, "%5s-split %s\n"," ",text[77]); + fprintf(stderr, "\n\t%s-%s %s Pedro Lineu Orso - orso@brturbo.com.br\n",PGM,VERSION,text[78]); + fprintf(stderr, "\thttp://www.sarg-squid.org\n"); + fprintf(stderr, "\n\tPease donate to the sarg project:"); + fprintf(stderr, "\n\t\thttp://sarg.sourceforge.net/donations.php\n\n"); + + return; +} diff --git a/useragent.c b/useragent.c new file mode 100644 index 0000000..effe721 --- /dev/null +++ b/useragent.c @@ -0,0 +1,310 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +#include "include/conf.h" + +void useragent() +{ + + FILE *fp_in = NULL, *fp_ou = NULL, *fp_ht = NULL; + char tmp[MAXLEN], tmp2[MAXLEN]; + char ip[MAXLEN], data[255], agent[255], user[255]; + char ipantes[MAXLEN], nameantes[MAXLEN]; + char tagent[7]; + char csort[120]; + char msg[255]; + char ftime[128]; + char user_old[255]="$#%0a3bc6"; + char agent_old[255]="$#%0a3bc6"; + char html[255]; + char hfile[MAXLEN]; + char idate[MAXLEN], fdate[MAXLEN]; + int agentot=0, agentot2=0, agentdif=0, cont=0; + float perc=0; + unsigned long totregsl=0; + + ip[0]='\0'; + data[0]='\0'; + agent[0]='\0'; + user[0]='\0'; + user_old[0]='\0'; + agent_old[0]='\0'; + ipantes[0]='\0'; + nameantes[0]='\0'; + + sprintf(hfile,"%s/%s/useragent.html", outdir,periodo); + + sprintf(tmp,"%s/squagent.unsort",TempDir); + sprintf(tmp2,"%s/squagent.log",TempDir); + + if((fp_in=fopen(UserAgentLog,"r"))==NULL) { + fprintf(stderr, "SARG: (useragent) %s: %s\n",text[45],UserAgentLog); + exit(1); + } + + if((fp_ou=fopen(tmp,"w"))==NULL) { + fprintf(stderr, "SARG: (email) %s: %s\n",text[45],tmp); + exit(1); + } + + if(debug) { + sprintf(msg,"%s: %s",text[66],UserAgentLog); + debuga(msg); + } + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + totregsl++; + getword(ip,buf,' '); + getword(data,buf,'['); + getword(data,buf,' '); + if(totregsl == 1) + strcpy(idate,data); + getword(agent,buf,'"'); + getword(agent,buf,'"'); + + if(strlen(buf)) { + getword(user,buf,' '); + getword(user,buf,'\n'); + } + + if(user[0] == '-') + strcpy(user,ip); + if(strlen(user) == 0) + strcpy(user,ip); + + sprintf(buf,"%s\\%s\\%s\\%s\\\n",ip,data,agent,user); + fputs(buf,fp_ou); + user[0]='\0'; + } + + strcpy(fdate,data); + + if(debug) { + sprintf(msg, " %s: %ld",text[10],totregsl); + debuga(msg); + } + + fclose(fp_in); + fclose(fp_ou); + + if (fp_ht) { + fclose(fp_ht); + } + + if(debug) { + sprintf(msg,"%s: %s",text[54],tmp2); + debuga(msg); + } + + sprintf(csort,"sort -n -t '\\' -k 4,4 -k 3,3 -k 2,2 -k 1,1 -o %s %s",tmp2,tmp); + system(csort); + + unlink(tmp); + + if((fp_in=fopen(tmp2,"r"))==NULL) { + fprintf(stderr, "SARG: (useragent) %s: %s\n",text[45],tmp2); + exit(1); + } + + if((fp_ht=fopen(hfile,"w"))==NULL) { + fprintf(stderr, "SARG: (useragent) %s: %s\n",text[45],hfile); + exit(1); + } + + if(debug) + debuga(text[72]); + + fputs("\n",fp_ht); + fputs("\n",fp_ht); + fputs("\n",fp_ht); + sprintf(html," \n",CharSet); + fputs(html,fp_ht); + fputs("\n",fp_ht); + + if(strlen(FontFace) > 0) { + sprintf(html,"\n",FontFace); + fputs(html,fp_ht); + } + + sprintf(html,"\n",BgColor,TxColor,BgImage); + fputs(html,fp_ht); + + + if(strlen(LogoImage) > 0) { + fputs("
\n",fp_ht); + sprintf(html,"
%s\n",LogoImage,Width,Height,LogoTextColor,LogoText); + fputs(html,fp_ht); + fputs("
\n",fp_ht); + } + + show_sarg(fp_ht,".."); + fputs("
\n",fp_ht); + sprintf(html,"\n",TiColor,text[105]); + fputs(html,fp_ht); + + fputs("",fp_ht); + fputs("
%s
\n",fp_ht); + + fputs("
\n",fp_ht); + + sprintf(html,"\n",HeaderBgColor,FontSize,text[89],TxBgColor,FontSize,idate,fdate); + fputs(html,fp_ht); + + fputs("
%s:%s - %s
\n",fp_ht); + fputs("
\n",fp_ht); + fputs("",fp_ht); + + sprintf(html,"\n",HeaderBgColor,FontSize,HeaderColor,text[98],HeaderBgColor,FontSize,HeaderColor,text[106]); + fputs(html,fp_ou); + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(ip,buf,'\\'); + + if(strcmp(Ip2Name,"yes") == 0) { + if(strcmp(ip,ipantes) != 0) { + strcpy(ipantes,ip); + ip2name(ip); + strcpy(nameantes,ip); + } else strcpy(ip,nameantes); + } + + getword(data,buf,'\\'); + getword(agent,buf,'\\'); + getword(user,buf,'\\'); + + if(strcmp(user,user_old) != 0) { + sprintf(html,"\n",TxBgColor,FontSize,user,TxBgColor,FontSize,agent); + fputs(html,fp_ht); + strcpy(user_old,user); + strcpy(agent_old,agent); + } else { + if(strcmp(agent,agent_old) != 0) { + sprintf(html,"\n",TxBgColor,FontSize,agent); + fputs(html,fp_ht); + strcpy(agent_old,agent); + } + } + } + + fputs("
%s%s
%s%s
%s
\n",fp_ht); + fclose(fp_in); + fclose(fp_ou); + + sprintf(csort,"sort -n -t '\\' -k 3,3 -o %s %s",tmp,tmp2); + system(csort); + + unlink(tmp2); + + if((fp_in=fopen(tmp,"r"))==NULL) { + fprintf(stderr, "SARG: (useragent) %s: %s\n",text[45],tmp); + exit(1); + } + + if((fp_ou=fopen(tmp2,"w"))==NULL) { + fprintf(stderr, "SARG: (useragent) %s: %s\n",text[45],tmp2); + exit(1); + } + + agent_old[0]='\0'; + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + getword(ip,buf,'\\'); + getword(data,buf,'\\'); + getword(agent,buf,'\\'); + + if(!cont) { + cont++; + strcpy(agent_old,agent); + } + + agentot++; + + if(strcmp(agent,agent_old) != 0) { + agentdif++; + sprintf(html,"%06d %s\n",agentot,agent_old); + fputs(html,fp_ou); + strcpy(agent_old,agent); + agentot2+=agentot; + agentot=1; + } + } + agentdif++; + sprintf(html,"%06d %s\n",agentot,agent); + fputs(html,fp_ou); + agentot2+=agentot; + + fclose(fp_in); + fclose(fp_ou); + + unlink(tmp); + + sprintf(csort,"sort -n -r -k 1,1 -o %s %s",tmp,tmp2); + system(csort); + + unlink(tmp2); + + if((fp_in=fopen(tmp,"r"))==NULL) { + fprintf(stderr, "SARG: (useragent) %s: %s\n",text[45],tmp); + exit(1); + } + + if((fp_ht=fopen(hfile,"a"))==NULL) { + fprintf(stderr, "SARG: (useragent) %s: %s\n",text[45],hfile); + exit(1); + } + + fputs("

\n",fp_ht); + + fputs("
\n",fp_ht); + sprintf(html,"\n",HeaderBgColor,FontSize,HeaderColor,text[106],HeaderBgColor,FontSize,HeaderColor,text[107],HeaderBgColor,FontSize,HeaderColor); + fputs(html,fp_ht); + + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + buf[strlen(buf)-1]='\0'; + getword(tagent,buf,' '); + perc=atoi(tagent) * 100; + perc=perc / agentot2; + + sprintf(html,"\n",TxBgColor,FontSize,buf,TxBgColor,FontSize,atoi(tagent),TxBgColor,FontSize,perc); + fputs(html,fp_ht); + } + + fputs("
%s%s%%
%s%d%3.2f
\n",fp_ht); + if(strcmp(ShowSargInfo,"yes") == 0) { + zdate(ftime, DateFormat); + sprintf(html,"

%s %s-%s %s %s
\n",text[108],URL,PGM,VERSION,text[109],ftime); + fputs(html,fp_ht); + } + + fputs("\n\n\n",fp_ht); + fclose(fp_in); + fclose(fp_ht); + + unlink(tmp); + + return; + +} diff --git a/util.c b/util.c new file mode 100644 index 0000000..2d21c5a --- /dev/null +++ b/util.c @@ -0,0 +1,1114 @@ +/* + * AUTHOR: Pedro Lineu Orso orso@brturbo.com.br + * 1998, 2005 + * SARG Squid Analysis Report Generator http://sarg-squid.org + * + * SARG donations: + * please look at http://sarg.sourceforge.net/donations.php + * --------------------------------------------------------------------- + * + * 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, USA. + * + */ + +// #define LEGACY_MY_ATOLL +// #define LEGACY_TESTVALIDUSERCHAR + +#include "include/conf.h" + +static char mtab1[12][4]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; +static char mtab2[12][3]={"01","02","03","04","05","06","07","08","09","10","11","12"}; + +void getword(char *word, char *line, int stop) +{ + int x = 0,y; + int loop=0; + int limit=10000; + char wline[MAXLEN]; + + strcpy(wline,line); + + if(strlen(line) < 3) { + word[0]='\0'; + return; + } + + for(x=0;((line[x]) && (line[x] != stop ));x++) { + loop++; + if(loop>=limit) { + printf("SARG: getword loop detected.\n"); + printf("SARG: Record=\"%s\"\n",wline); + printf("SARG: searching for \'x%x\'\n",stop); + printf("SARG: Maybe you have a broken record or garbage in your access.log file.\n"); + word[0]='\0'; + exit(1); + } + word[x] = line[x]; + } + + word[x] = '\0'; + if(line[x]) ++x; + y=0; + + while((line[y++] = line[x++])); +} + +char * getword2(char *word, char *line, int stop) +{ + int x = 0 , y; + int limit=MAXLEN; + + if(strlen(line) < 3) { + word[0]='\0'; + return( line ) ; + } + + // printf( "IN Buffer <%s>\n" , line ) ; + for(x=0;((line[x]) && (line[x] != stop && limit ));x++ , limit-- ) { + word[x] = line[x]; + } + if( ! limit) { + printf("SARG: getword2 loop detected.\n"); + printf("SARG: Buffer=\"%s\"\n",line); + printf("SARG: searching for \'x%x\'\n",stop); + printf("SARG: Maybe you have a broken record or garbage in your access.log file.\n"); + exit(1); + } + + word[x] = '\0'; + // printf( "Value <%s>\n" , word ) ; + // printf( "OUT Buffer <%s>\n" , line+x+1 ) ; + return( line + x +1) ; +} + +void getword3(char *word, char *line, int stop) +{ + int x = 0,y; + int loop=0; + + for(x=0;((line[x]) && (line[x] != stop ));x++) + word[x] = line[x]; + word[x] = '\0'; + if(line[x]) ++x; + y=0; + while((line[y++] = line[x++])); +} + + +#ifdef LEGACY_MY_ATOLL + +// BMG (bguillory@email.com) +// 3 August 1999 +long long int my_atoll (const char *nptr) +#define MAXLLL 30 //maximum number of digits in long long (a guess) +{ + int offset=0, x; + long long int returnval=0; + char one_digit[2]; + + one_digit[1]='\0'; + + // Soak up all the white space + while (isspace(nptr[offset])) { + offset++; + } //while + + //For each character left to right + //change the character to a single digit + //multiply what we had before by 10 and add the new digit + for(x=offset; x<=MAXLLL+offset && isdigit(nptr[x]); x++) { + sprintf(one_digit, "%c", nptr[x]); //I don't know how else to do this + returnval = (returnval * 10) + atoi(one_digit); + } //for + + return returnval; + +} //my_atoll + +#else + +#define MAXLLL 30 //maximum number of digits in long long (a guess) +long long int my_atoll (const char *nptr) +{ + long long int returnval=0; + char * t = nptr ; + int max_digits = MAXLLL ; + + // Soak up all the white space + while (isspace( *t )) { + t++; + } //while + + //For each character left to right + //change the character to a single digit + //multiply what we had before by 10 and add the new digit + + for( ; --max_digits && isdigit( *t ) ; t++ ) + { + returnval = ( returnval * 10 ) + ( *t - '0' ) ; + } + + return returnval; + +} //my_atoll + +#endif + + +void my_mkdir(char *name) +{ + char w0[255]; + char w1[255]; + char w2[255]; + + if(strncmp(name,".",1) == 0 || strncmp(name,"/",1) != 0) { + fprintf(stderr,"SARG: Ivalid path (%s). Please, use absolute paths only.\n",name); + fprintf(stderr,"SARG: process aborted.\n"); + exit(1); + } + + strcpy(w0,name); + strcpy(w2,"/"); + getword(w1,w0,'/'); + while(strstr(w0,"/") != 0) { + getword(w1,w0,'/'); + strcat(w2,w1); + if(access(w2, R_OK) != 0) { + if(mkdir(w2,0755)) { + fprintf(stderr,"SARG: mkdir %s %s\n",w2,strerror(errno)); + fprintf(stderr,"SARG: process aborted.\n"); + exit(1); + } + } + strcat(w2,"/"); + } + strcat(w2,w0); + if(access(w2, R_OK) != 0) { + if(mkdir(w2,0755)) { + fprintf(stderr,"SARG: mkdir %s %s\n",w2,strerror(errno)); + fprintf(stderr,"SARG: process aborted.\n"); + exit(1); + } + } +} + + +void my_lltoa(unsigned long long int n, char s[], int len) +{ + int i = 0; + int x = 0; + char ww[50]; + do { + s[i++] = (n % 10) + '0'; + } while ((n /= 10) > 0); + s[i] = '\0'; + { + int c,i,j; + for (i = 0, j = strlen(s)-1; isizeof(ww)?sizeof(ww):i); + strcpy(s,ww); + } + +} + + +void builddia(char *dia, char *mes, char *ano, char *df, char *wdata) +{ + char ndia[11]; + char nmes[3]; + int x; + + if(strlen(dia) < 1) return; + + ndia[0]='\0'; + nmes[0]='\0'; + + for(x=0; x<12; x++) { + if(strcmp(mtab1[x],mes) == 0) { + strncpy(nmes,mtab2[x],sizeof(nmes)-1); + nmes[sizeof(nmes)-1]=0; + break; + } + } + + snprintf(wdata,9,"%s%s%s",ano,nmes,dia); + + if(strncmp(df,"u",1) != 0) + snprintf(ndia,sizeof(ndia),"%s/%s/%s",dia,nmes,ano); + else + snprintf(ndia,sizeof(ndia),"%s/%s/%s",nmes,dia,ano); + + strcpy(dia,ndia); + +} + + +void buildymd(char *dia, char *mes, char *ano, char *wdata) +{ + char nmes[3]; + int x; + + nmes[0]='\0'; + + for(x=0; x<12; x++) { + if(strcmp(mtab1[x],mes) == 0) + strcpy(nmes,mtab2[x]); + } + + sprintf(wdata,"%s%s%s",ano,nmes,dia); + +} + + +void conv_month(char *month) +{ + int x; + + for(x=0; x<12; x++) { + if(strcmp(mtab1[x],month) == 0) + strcpy(month,mtab2[x]); + } + +} + + +void conv_month_name(char *month) +{ + int x; + + for(x=0; x<12; x++) { + if(strcmp(mtab2[x],month) == 0) + strcpy(month,mtab1[x]); + } +} + + +void fixper(char *tbuf, char *periodo, char *duntil) +{ + + char warea[50]; + char dia[5], mes[5], ano[5]; + int x; + + warea[0]='\0'; + + strncpy(dia,duntil+6,2); + dia[2]='\0'; + strncpy(mes,duntil+4,2); + mes[2]='\0'; + strncpy(ano,duntil,4); + ano[4]='\0'; + + for(x=0; x<12; x++) { + if(strcmp(mtab2[x],mes) == 0) + strcpy(mes,mtab1[x]); + } + + if(strcmp(df,"e") == 0) + sprintf(warea,"%s%s%s",dia,mes,ano); + if(strcmp(df,"u") == 0) + sprintf(warea,"%s%s%s",ano,mes,dia); + + strcat(periodo,warea); +} + + +void debuga(char *msg) +{ + fprintf(stderr, "SARG: %s\n",msg); + +} + + +void debugaz(char *head, char *msg) +{ + fprintf(stderr, "SARG: (util) %s=%s\n",head, msg); + +} + + +void fixip(char *ip) +{ + char n1[MAXLEN], n2[MAXLEN], n3[MAXLEN]; + char wip[MAXLEN]; + char sep[2]="."; + int iflag=0; + + strcpy(wip,ip); + + if(strstr(ip,".") != 0) { + strcpy(sep,"_"); + iflag++; + } + + if(iflag) { + getword(n1,wip,'.'); + getword(n2,wip,'.'); + getword(n3,wip,'.'); + } else { + getword(n1,wip,'_'); + getword(n2,wip,'_'); + getword(n3,wip,'_'); + } + ip[0]='\0'; + sprintf(ip,"%s%s%s%s%s%s%s",n1,sep,n2,sep,n3,sep,wip); + +} + + +char *fixnum(long long int value, int n) +#define MAXIMO 1024 +{ + char num[MAXIMO]; + char buf[MAXIMO * 2]; + char *pbuf; + char ret[MAXIMO * 2]; + char *pret; + float perc=0; + register int i, j, k; + static char abbrev[30]; + + my_lltoa(value, num, 0); + + if(strcmp(DisplayedValues,"abbreviation") == 0) { + if(strlen(num) <= 3) + sprintf(abbrev,"%s",num); + if(strlen(num) == 4 || strlen(num) == 7 || strlen(num) == 10 || strlen(num) == 13) { + snprintf(abbrev,2,"%s",num); + strncat(abbrev,".",1); + strncat(abbrev,num+1,2); + if(!n) return(abbrev); + if(strlen(num) == 4) + strncat(abbrev,"K",1); + else if(strlen(num) == 7) + strncat(abbrev,"M",1); + else if(strlen(num) == 10) + strncat(abbrev,"G",1); + else if(strlen(num) == 13) + strncat(abbrev,"T",1); + } + if(strlen(num) == 5 || strlen(num) == 8 || strlen(num) == 11 || strlen(num) == 14) { + snprintf(abbrev,3,"%s",num); + strncat(abbrev,".",1); + strncat(abbrev,num+2,2); + if(!n) return(abbrev); + if(strlen(num) == 5) + strncat(abbrev,"K",1); + else if(strlen(num) == 8) + strncat(abbrev,"M",1); + else if(strlen(num) == 11) + strncat(abbrev,"G",1); + else if(strlen(num) == 14) + strncat(abbrev,"T",1); + } + if(strlen(num) == 6 || strlen(num) == 9 || strlen(num) == 12 || strlen(num) == 15) { + snprintf(abbrev,4,"%s",num); + strncat(abbrev,".",1); + strncat(abbrev,num+3,2); + if(!n) return(abbrev); + if(strlen(num) == 6) + strncat(abbrev,"K",1); + else if(strlen(num) == 9) + strncat(abbrev,"M",1); + else if(strlen(num) == 12) + strncat(abbrev,"G",1); + else if(strlen(num) == 15) + strncat(abbrev,"T",1); + } + + return(abbrev); + } + + bzero(buf, MAXIMO*2); + + pbuf = buf; + pret = ret; + k = 0; + + for ( i = strlen(num) - 1, j = 0 ; i > -1; i--) { + if ( k == 2 && i != 0 ) { + k = 0; + pbuf[j++] = num[i]; + if(strcmp(UseComma,"yes") == 0) + pbuf[j++] = ','; + else pbuf[j++] = '.'; + continue; + } + pbuf[j] = num[i]; + j++; + k++; + } + + pret[0]='\0'; + + for ( i = strlen(pbuf) - 1, j = 0 ; i > -1; i--, j++) + pret[j] = pbuf[i]; + + pret[j] = '\0'; + + return pret; +} + + +void buildhref(char * href) +{ + char whref[MAXLEN]; + + if(strcmp(href,"./") == 0){ + href[0]='\0'; + strcat(href," 0) { + strcat(wdir,"-"); + strcat(wdir,us); + } + if(strlen(addr) > 0) { + strcat(wdir,"-"); + strcat(wdir,addr); + } + if(strlen(site) > 0) { + strcat(wdir,"-"); + strcat(wdir,site); + } + + if(strcmp(dirname,wdir) != 0) + strcpy(dirname,wdir); + + strcpy(dirname2,dirname); + + if(strcmp(OverwriteReport,"no") == 0) { + while(num) { + if(access(wdir,R_OK) == 0) { + sprintf(wdir,"%s.%d",dirname,num); + sprintf(per2,"%s.%d",per1,num); + num++; + count++; + } else + break; + } + + if(count > 0) { + if(debug) + fprintf(stderr, "SARG: %s: %s %s %s\n",text[51],dirname2,text[52],wdir); + rename(dirname2,wdir); + } + } else { + if(access(dir,R_OK) == 0) { + sprintf(csort,"rm -r %s",dir); + system(csort); + } + } + + my_mkdir(dirname); + + strcpy(dirname2,wdir); + sprintf(images,"%simages",outdir); + mkdir(images,0755); + + sprintf(wdir,"date >%s/%s",dirname,"date"); + system(wdir); + + sprintf(per2,"%s/images",SYSCONFDIR); + + dirp = opendir(per2); + if(dirp==NULL) { + fprintf(stderr, "SARG: (util) %s %s: %s\n","Can't open directory", per2,strerror(errno)); + return; + } + while ((direntp = readdir( dirp )) != NULL ){ + if(strncmp(direntp->d_name,".",1) == 0) + continue; + sprintf(val10,"%s/%s",per2,direntp->d_name); + sprintf(val11,"%s/%s",images,direntp->d_name); + img_in = fopen(val10, "rb"); + if(img_in!=NULL) { + img_ou = fopen(val11, "wb"); + if(img_ou!=NULL) { + while (c!=EOF) { + c = fgetc(img_in); + if(c==EOF) break; + fputc(c,img_ou); + } + c=0; + fclose(img_ou); + } else + fprintf(stderr,"SARG: (util): %s %s: %s\n", text[45]?text[45]:"Can't open/create file", val11, strerror(errno)); + } else + fprintf(stderr,"SARG: (util): %s %s: %s\n", text[45]?text[45]:"Can't open file", val10, strerror(errno)); + + fclose(img_in); + } + (void) rewinddir(dirp); + (void) closedir(dirp); + + return; + + +} + + +void strip_latin(char *line) +{ + char buf[255]; + char warea[255]; + + while(strstr(line,"&") != 0){ + getword(warea,line,'&'); + strncat(warea,line,1); + getword(buf,line,';'); + strcat(warea,line); + strcpy(line,warea); + } + + return; + +} + +void zdate(char *ftime, char *DateFormat) +{ + + time_t t; + struct tm *local; + + t = time(NULL); + local = localtime(&t); + if(strcmp(DateFormat,"u") == 0) + strftime(ftime, 127, "%b/%d/%Y %H:%M", local); + if(strcmp(DateFormat,"e") == 0) + strftime(ftime, 127, "%d/%b/%Y-%H:%M", local); + if(strcmp(DateFormat,"w") == 0) + strftime(ftime, 127, "%V-%H-%M", local); + + return; +} + + +char *fixtime(long int elap) +{ + + int num = elap / 1000; + int hor = 0; + int min = 0; + int sec = 0; + static char buf[12]; + + if(strcmp(datetimeby,"bytes") == 0) { + sprintf(buf,"%s",fixnum(elap,1)); + return buf; + } + + buf[0]='\0'; + + if(num<1) { + sprintf(buf,"00:00:%02ld",elap); + return buf; + } + + hor=num / 3600; + min=(num % 3600) / 60; + sec=num % 60; + + sprintf(buf,"%01d:%02d:%02d",hor,min,sec); + + if(strcmp(buf,"0:00:00") == 0) + strcpy(buf,"0"); + + return buf; + +} + + +void date_from(char *date, char *dfrom, char *duntil) +{ + + char diaf[10]; + char mesf[10]; + char anof[10]; + char diau[10]; + char mesu[10]; + char anou[10]; + static char wdate[50]; + + + strcpy(wdate,date); + if(strstr(wdate,"-") == 0) { + strcat(wdate,"-"); + strcat(wdate,date); + strcpy(date,wdate); + } + + getword(diaf,wdate,'/'); + getword(mesf,wdate,'/'); + getword(anof,wdate,'-'); + getword(diau,wdate,'/'); + getword(mesu,wdate,'/'); + strcpy(anou,wdate); + + sprintf(dfrom,"%s%s%s",anof,mesf,diaf); + sprintf(duntil,"%s%s%s",anou,mesu,diau); + return; +} + + +char *strlow(char *string) +{ + char *s; + + if (string) + { + for (s = string; *s; ++s) + *s = tolower(*s); + } + + return string; +} + + + + +char *strup(char *string) +{ + char *s; + + if (string) + { + for (s = string; *s; ++s) + *s = toupper(*s); + } + + return string; +} + + +char *subs(char *str, char *from, char *to) +{ + char *tmp; + char *ret; + unsigned int ss, st; + + if(strstr(str,from) == 0) + return (char *) str; + + ss = strlen(str); st = strlen(to); + ret = (char *) malloc(ss + st); + bzero(ret,ss+st); + + tmp = strstr(str, from); + if ( tmp == (char *) NULL ) + return (char *) NULL; + strncpy(ret, str, ss - strlen(tmp)); + strcat(ret, to); + strcat(ret, (tmp+strlen(from))); + return (char *) ret; +} + + +void removetmp(char *outdir) +{ + + FILE *fp_in; + char warea[256]; + + if(strcmp(RemoveTempFiles,"yes") != 0) { + return; + } else { + if(debug) { + sprintf(msg,"%s: geral, periodo",text[82]); + debuga(msg); + } + sprintf(warea,"%s/geral",outdir); + if((fp_in=fopen(warea,"r"))==NULL){ + fprintf(stderr, "SARG: (removetmp) %s: %s\n",text[45],warea); + exit(1); + } + while(fgets(buf,sizeof(buf),fp_in)!=NULL) { + if(strncmp(buf,"TOTAL",5) == 0) + break; + } + fclose(fp_in); + if((fp_in=fopen(warea,"w"))==NULL){ + fprintf(stderr, "SARG: (removetmp) %s: %s\n",text[45],warea); + exit(1); + } + fputs(buf,fp_in); + fclose(fp_in); + sprintf(warea,"%s/periodo",outdir); + unlink(warea); + } + + return; +} + +void load_excludecodes() +{ + + FILE *fp_in; + char data[80]; + + if((fp_in=fopen(ExcludeCodes,"r"))==NULL) { + fprintf(stderr, "SARG: (util) Cannot open file: %s (exclude_codes)\n",ExcludeCodes); + exit(1); + } + + while(fgets(data,80,fp_in)!=NULL) { + data[strlen(data)-1]='\0'; + strcat(excludecode,data); + strcat(excludecode,";"); + excode++; + } + + fclose(fp_in); + return; + +} + +int vercode(char *code) +{ + char warea[1024]; + char cod[80]; + int z; + + strcpy(warea,excludecode); + for(z=0; z<=excode-1; z++) { + getword(cod,warea,';'); + if(strcmp(code,cod) == 0) + return 1; + } + return 0; +} + +void fixnone(char *str) +{ + if(strstr(str,"\n") != 0) + str[strlen(str)-1]='\0'; + if(strcmp(str,"none") == 0) + str[0]='\0'; + + return; +} + +#ifdef LEGACY_TESTVALIDUSERCHAR +int testvaliduserchar(char *user) +{ + + int x=0; + int y=0; + + for (y=0; y *(int *)b ) return 1; + if( *(int *)a < *(int *)b ) return -1; + return 0; +} + +int getnumlist( char *buf, numlist *list, const int len, const int maxvalue ) +{ int i, j, d, flag, r1, r2; + char *pbuf, **bp, *strbufs[ 24 ]; + + bp = strbufs; + strtok( buf, " \t" ); + for( *bp = strtok( NULL, "," ), list->len = 0; *bp; *bp = strtok( NULL, "," ) ) + { if( ++bp >= &strbufs[ 24 ] ) + break; + list->len++; + } + if( ! list->len ) + return -1; + d = 0; + for( i = 0; i < list->len; i++ ) + { if( strstr( strbufs[ i ], "-" ) != 0 ) + { pbuf = strbufs[ i ]; + strtok( pbuf, "-" ); + pbuf = strtok( NULL, "\0" ); + r1 = atoi( strbufs[ i ] ); + if( ( r2 = atoi( pbuf ) ) >= maxvalue || r1 >= r2 ) + return -1; + if( i + d + ( r2 - r1 ) + 1 <= len ) + { for( j = r1; j <= r2; j++ ) + list->list[ i + d++ ] = j; + d--; + } + } + else + if( ( list->list[ i + d ] = atoi( strbufs[ i ] ) ) >= maxvalue ) + return 1; + } + list->len += d; + qsort( list->list, list->len, sizeof( int ), compar ); + do + { flag = 0; + for( i = 0; i < list->len - 1; i++ ) + if( list->list[ i ] == list->list[ i + 1 ] ) + { for( j = i + 1; j < list->len; j++ ) + list->list[ j - 1 ] = list->list[ j ]; + list->len--; + flag = 1; + break; + } + } while( flag ); + return 0; +} + + +void show_info(FILE *fp_ou) +{ + + if(strcmp(ShowSargInfo,"yes") == 0) { + zdate(ftime, DateFormat); + sprintf(html,"


%s %s-%s %s %s
\n",text[108],URL,PGM,VERSION,text[109],ftime); + fputs(html,fp_ou); + } +} + +void show_sarg(FILE *fp_ou, char *ind) +{ + if(strcmp(ShowSargLogo,"yes") == 0) { + fputs("
\n",fp_ou); + sprintf(html,"\n",ind,Title); + fputs(html,fp_ou); + sprintf(html,"\n",Title); + fputs(html,fp_ou); + fputs("
 Squid Analysis Report Generator
 
\n",fp_ou); + } +} + +char url_module(char *url, char *w2) +{ + int x, y; + char w[255]; + + bzero(w, 255); + bzero(w2, 255); + y=0; + for(x=strlen(url)-1; x>=0; x--) { + if(url[x] == '/' || y>255) break; + w[y]=url[x]; + y++; + } + + y=0; + for(x=strlen(w)-1; x>=0; x--) { + w2[y]=w[x]; + y++; + } + + return; +} + +void version() +{ + printf("SARG Version: %s\n",VERSION); + exit(0); +} -- 2.47.2