From a367d9bc548caacdee53c58aa288a086e69cef3f Mon Sep 17 00:00:00 2001 From: Arnaud Quette Date: Wed, 1 Jun 2011 22:31:49 +0200 Subject: [PATCH] Imported Upstream version 2.6.1 --- COPYING | 2 +- ChangeLog | 388 ++++++ LICENSE-GPL2 | 339 ++++++ LICENSE-GPL3 | 676 +++++++++++ Makefile.am | 3 +- Makefile.in | 5 +- NEWS | 45 + UPGRADING | 5 + aclocal.m4 | 82 +- clients/Makefile.in | 1 - clients/upsrw.c | 3 +- clients/upssched.c | 7 +- common/Makefile.in | 1 - common/parseconf.c | 2 +- conf/Makefile.in | 1 - config.guess | 149 +-- config.sub | 47 +- configure | 1823 ++++++---------------------- configure.in | 16 +- data/Makefile.in | 1 - data/cmdvartab | 3 +- data/driver.list.in | 28 +- data/html/Makefile.in | 1 - docs/FAQ.txt | 36 +- docs/Makefile.in | 1 - docs/configure.txt | 4 +- docs/documentation.txt | 2 +- docs/download.txt | 21 +- docs/features.txt | 3 +- docs/images/advanced.png | Bin 32046 -> 45511 bytes docs/images/bigbox.png | Bin 17562 -> 25121 bytes docs/images/bizarre.png | Bin 34200 -> 48365 bytes docs/images/simple.png | Bin 10145 -> 16662 bytes docs/man/Makefile.in | 1 - docs/man/apcsmart.8 | 4 +- docs/man/bcmxcp.8 | 4 +- docs/man/bcmxcp_usb.8 | 4 +- docs/man/belkin.8 | 4 +- docs/man/belkinunv.8 | 4 +- docs/man/bestfcom.8 | 4 +- docs/man/bestfortress.8 | 4 +- docs/man/bestuferrups.8 | 4 +- docs/man/bestups.8 | 4 +- docs/man/blazer.8 | 4 +- docs/man/clone.8 | 4 +- docs/man/dummy-ups.8 | 6 +- docs/man/dummy-ups.txt | 2 +- docs/man/etapro.8 | 4 +- docs/man/everups.8 | 4 +- docs/man/gamatronic.8 | 4 +- docs/man/genericups.8 | 4 +- docs/man/hosts.conf.5 | 4 +- docs/man/isbmex.8 | 4 +- docs/man/ivtscd.8 | 4 +- docs/man/libupsclient-config.1 | 4 +- docs/man/liebert-esp2.8 | 4 +- docs/man/liebert.8 | 4 +- docs/man/masterguard.8 | 4 +- docs/man/metasys.8 | 6 +- docs/man/metasys.txt | 2 +- docs/man/mge-shut.8 | 4 +- docs/man/mge-utalk.8 | 4 +- docs/man/microdowell.8 | 4 +- docs/man/netxml-ups.8 | 4 +- docs/man/nut.conf.5 | 4 +- docs/man/nutupsdrv.8 | 4 +- docs/man/oneac.8 | 4 +- docs/man/optiups.8 | 4 +- docs/man/powercom.8 | 85 +- docs/man/powercom.txt | 149 ++- docs/man/powerman-pdu.8 | 4 +- docs/man/powerpanel.8 | 4 +- docs/man/rhino.8 | 4 +- docs/man/richcomm_usb.8 | 4 +- docs/man/safenet.8 | 4 +- docs/man/snmp-ups.8 | 4 +- docs/man/solis.8 | 4 +- docs/man/tripplite.8 | 4 +- docs/man/tripplite_usb.8 | 4 +- docs/man/tripplitesu.8 | 4 +- docs/man/ups.conf.5 | 71 +- docs/man/ups.conf.txt | 43 + docs/man/upsc.8 | 4 +- docs/man/upscli_connect.3 | 4 +- docs/man/upscli_disconnect.3 | 4 +- docs/man/upscli_fd.3 | 4 +- docs/man/upscli_get.3 | 4 +- docs/man/upscli_list_next.3 | 4 +- docs/man/upscli_list_start.3 | 4 +- docs/man/upscli_readline.3 | 4 +- docs/man/upscli_sendline.3 | 4 +- docs/man/upscli_splitaddr.3 | 4 +- docs/man/upscli_splitname.3 | 4 +- docs/man/upscli_ssl.3 | 4 +- docs/man/upscli_strerror.3 | 4 +- docs/man/upscli_upserror.3 | 4 +- docs/man/upsclient.3 | 4 +- docs/man/upscmd.8 | 4 +- docs/man/upscode2.8 | 4 +- docs/man/upsd.8 | 4 +- docs/man/upsd.conf.5 | 4 +- docs/man/upsd.users.5 | 4 +- docs/man/upsdrvctl.8 | 4 +- docs/man/upsimage.cgi.8 | 4 +- docs/man/upslog.8 | 4 +- docs/man/upsmon.8 | 4 +- docs/man/upsmon.conf.5 | 4 +- docs/man/upsrw.8 | 4 +- docs/man/upssched.8 | 4 +- docs/man/upssched.conf.5 | 4 +- docs/man/upsset.cgi.8 | 4 +- docs/man/upsset.conf.5 | 4 +- docs/man/upsstats.cgi.8 | 4 +- docs/man/upsstats.html.5 | 4 +- docs/man/usbhid-ups.8 | 4 +- docs/man/victronups.8 | 4 +- docs/nut-names.txt | 5 + docs/stable-hcl.txt | 31 +- docs/website/Makefile.am | 1 + docs/website/Makefile.in | 2 +- docs/website/news.txt | 2 + docs/website/web-layout.conf | 28 +- drivers/Makefile.in | 1 - drivers/apc-hid.c | 73 +- drivers/apcsmart.c | 434 +++++-- drivers/apcsmart.h | 62 +- drivers/bcmxcp.c | 14 +- drivers/bcmxcp_ser.c | 17 +- drivers/bcmxcp_usb.c | 2 +- drivers/blazer.c | 7 +- drivers/blazer_usb.c | 15 +- drivers/cps-hid.c | 18 +- drivers/dstate.c | 48 +- drivers/dummy-ups.c | 15 +- drivers/eaton-mib.c | 23 +- drivers/genericups.c | 8 +- drivers/libhid.c | 10 +- drivers/liebert-esp2.c | 334 ++++- drivers/liebert-hid.c | 4 +- drivers/main.c | 27 + drivers/metasys.c | 80 +- drivers/mge-hid.c | 23 +- drivers/microdowell.c | 6 +- drivers/powercom.c | 215 +++- drivers/powercom.h | 26 +- drivers/rhino.c | 83 +- drivers/snmp-ups.c | 6 +- drivers/solis.c | 41 +- drivers/usb-common.h | 5 +- include/Makefile.am | 5 +- include/Makefile.in | 7 +- include/config.h.in | 15 - include/nut_stdint.h | 34 + include/nut_version.h | 2 +- lib/Makefile.in | 1 - lib/libupsclient-config.in | 2 +- lib/libupsclient.pc.in | 2 +- ltmain.sh | 4 +- m4/ax_create_stdint_h.m4 | 725 ----------- scripts/Makefile.am | 1 + scripts/Makefile.in | 2 +- scripts/augeas/Makefile.in | 1 - scripts/augeas/nutupsconf.aug.in | 2 + scripts/hal/Makefile.in | 1 - scripts/hal/ups-nut-device.fdi.in | 55 +- scripts/hotplug/Makefile.in | 1 - scripts/hotplug/libhid.usermap | 16 +- scripts/perl/Nut.pm | 959 +++++++++++++++ scripts/python/Makefile.in | 1 - scripts/udev/Makefile.in | 1 - scripts/udev/nut-usbups.rules.in | 16 +- scripts/upower/95-upower-hid.rules | 8 +- server/Makefile.in | 1 - server/netinstcmd.c | 26 +- server/netlist.c | 2 +- server/upsd.c | 4 + tools/Makefile.in | 1 - tools/nut-usbinfo.pl | 13 +- 178 files changed, 4651 insertions(+), 3279 deletions(-) create mode 100644 LICENSE-GPL2 create mode 100644 LICENSE-GPL3 create mode 100644 include/nut_stdint.h delete mode 100644 m4/ax_create_stdint_h.m4 create mode 100644 scripts/perl/Nut.pm diff --git a/COPYING b/COPYING index 606347e..883d3b1 100644 --- a/COPYING +++ b/COPYING @@ -5,7 +5,7 @@ The files in the scripts/python/ directory are released under GNU General Public License (GPL) version 3, or (at your option) any later version. See - "LICENSE.GPL3" in the root of this distribution. + "LICENSE-GPL3" in the root of this distribution. The Perl client module (scripts/perl/Nut.pm) is released under the same license as Perl itself. That is to say either GPL version 1 or (at your option) diff --git a/ChangeLog b/ChangeLog index a21849b..12e3085 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,391 @@ +2011-06-01 Arnaud Quette + + * [r3023] docs/download.txt: Add the missing SHA-256 sum on the + Download page / section + * [r3022] NEWS, UPGRADING, configure.in, docs/download.txt, + docs/website/news.txt: Final update for 2.6.1 release + * [r3021] docs/configure.txt: Update '--with-all' option + documentation + * [r3020] configure.in: HAL deprecation (continued): HAL support is + not enabled anymore when using '--with-all' configure option + * [r3019] drivers/mge-hid.c: Add support for 'battery.runtime.low' + * [r3018] data/cmdvartab: Add the missing entry for + 'ups.efficiency' + * [r3017] data/driver.list.in: Add Vivaldi EA200 LED to the list of + richcomm_usb supported models (reported by Sergey Talchuk) + * [r3016] drivers/mge-hid.c: Add 'ups.efficiency' data, supported + by Eaton 5 PX + +2011-05-31 Arnaud Quette + + * [r3015] docs/nut-names.txt: Documentation the new + 'ups.efficiency' NUT variable + * [r3014] data/driver.list.in: Add Eaton 5 PX to the list of + usbhid-ups, mge-shut and newmge-shut supported models + * [r3013] scripts/upower/95-upower-hid.rules: Update UPower script + with Phoenixtec fix + * [r3012] tools/nut-usbinfo.pl: Do not overwrite manufacturer names + with empty values + * [r3011] drivers/liebert-hid.c: Fix USB VendorID 0x06da, which is + Phoenixtec, not Liebert + * [r3010] docs/download.txt: Update Subversion access information, + following Alioth update + * [r3009] docs/download.txt, docs/website/news.txt: Add the Windows + Beta package information + +2011-05-27 Arjen de Korte + + * [r3008] scripts/upower/95-upower-hid.rules: Update upower script + with Powerware entry + * [r3006] drivers/blazer.c: Don't log status read failures until + MAXTRIES subsequent failures. Occasional communication errors are + common for these devices and are not a concern. + +2011-05-26 Arnaud Quette + + * [r3005] drivers/bcmxcp.c, drivers/bcmxcp_ser.c: Improve bcmxcp + support for older PowerWare 9315 (patch from Chris Adams) + +2011-05-25 Arnaud Quette + + * [r3002] server/netinstcmd.c: Fix the missing 'extra value' + handling for instant commands + +2011-05-24 msoltyspl-guest + + * [r2997] drivers/apcsmart.c: apcmsart.c: fix + upsdrv_shutdown_advanced() - with 'continue' statement, sdcmd_*s + ignoring 'n' weren't called. + +2011-05-20 Arjen de Korte + + * [r2994] drivers/blazer_usb.c: Don't use the USB_DEVICE() + declaration macro with non compliant identifiers, such as + blazer_usb' krauler subdriver (missing from previous commit) + +2011-05-20 Arnaud Quette + + * [r2993] drivers/blazer_usb.c, drivers/usb-common.h: Don't use the + USB_DEVICE() declaration macro with non compliant identifiers, + such as blazer_usb' krauler subdriver + +2011-05-19 Arnaud Quette + + * [r2991] server/netlist.c: State explicitely when device + description is not available, to avoid user confusion (reported + by Noel David Torres Taño, Debian bug #595773 + * [r2990] docs/man/powercom.txt, drivers/powercom.c: Improve + formating and wording of the powercom documentation, manual page + and driver messages (patch from Keven L. Ates) + +2011-05-13 Arnaud Quette + + * [r2984] drivers/powercom.c, drivers/powercom.h: Improve PowerCom + BNT 1500A and BNT-other support, and bump driver version to 0.13 + (patch from Keven L. Ates) + +2011-04-30 Arnaud Quette + + * [r2979] data/driver.list.in: Complete Informer Compact supported + VA ratings (reported by Dushan Tcholich) + +2011-04-27 Arnaud Quette + + * [r2978] docs/website/Makefile.am: Enable website quirks to + address Internet Explorer 6, which were missing since 2.6.0 + publication + * [r2977] docs/website/web-layout.conf: Complete meta keywords, and + enable meta name and keywords on all pages + * [r2976] data/driver.list.in: Add Numeric 3000 SW to the list of + blazer_ser supported models (reported by Petr Kubánek) + +2011-04-26 Arjen de Korte + + * [r2975] data/driver.list.in, drivers/blazer_usb.c: Add support + for GE EP series + + [http://lists.alioth.debian.org/pipermail/nut-upsuser/2011-April/006788.html] + +2011-04-18 Arnaud Quette + + * [r2973] drivers/libhid.c: Smarter solution for r2972 (pointed by + Arjen de Korte) + * [r2972] drivers/libhid.c: Trim extraneous end-of-line, in buggy + HID string tables, which results in upsc breaking the + communication pipe (Ubuntu bug #753661) + +2011-04-15 Arnaud Quette + + * [r2971] docs/stable-hcl.txt: Detail existing guidelines for + reporting new device entry + * [r2970] docs/features.txt: Refreshed graphic illustrations + credits + * [r2969] docs/images/advanced.png, docs/images/bigbox.png, + docs/images/bizarre.png, docs/images/simple.png: Refreshed + graphic illustrations (provided by Eaton) + +2011-04-01 Arjen de Korte + + * [r2964] data/driver.list.in: Add Inform Sinus SS 210 to list of + supported devices + + [http://lists.alioth.debian.org/pipermail/nut-upsuser/2011-March/006767.html] + * [r2963] drivers/cps-hid.c: Clamp reported battery charge to 100% + (seems to report AbsoluteStateOfCharge instead of + RemainingCapacity) + + [http://lists.alioth.debian.org/pipermail/nut-upsuser/2011-March/006770.html] + +2011-03-31 fbohe-guest + + * [r2962] data/driver.list.in, drivers/mge-hid.c: Add Eaton + Powerware 9140 to the list of usbhid-ups supported models + +2011-03-29 Arjen de Korte + + * [r2961] drivers/blazer.c, drivers/blazer_usb.c: Make the + terminating '\r' in the Q1 reply optional + +2011-03-29 Arnaud Quette + + * [r2960] lib/libupsclient-config.in, lib/libupsclient.pc.in: Fix + remaining references to LIBSSL_LDFLAGS, instead of LIBSSL_LIBS, + which cause unresolved symbol on libupsclient users (reported by + Fabrice Coutadeur on Ubuntu) + +2011-03-23 fbohe-guest + + * [r2957] INSTALL: Reverting previous commit (should not be in the + trunk) + * [r2956] INSTALL: Add information about installing Windows + +2011-03-18 Arjen de Korte + + * [r2952] include/Makefile.am: The include/nut_stdint.h file is no + longer a generated one (part two) + * [r2951] include/Makefile.am: The include/nut_stdint.h file is no + longer a generated one + * [r2950] configure.in, include, include/nut_stdint.h, + m4/ax_create_stdint_h.m4: Clean up fixed width integer types. + + All C99 capable systems have , which shall include + . + * [r2947] drivers/solis.c: Fix typo in previous commit + * [r2945] drivers/solis.c: Fix compilation warning (no functional + change) + * [r2944] data/driver.list.in: Update driver list for SVEN Power + Pro+ series (recent models ship with a different USB to serial + implementation) + * [r2942] clients/upssched.c, configure.in, drivers/dstate.c, + server/upsd.c: The third argument to accept is an int on HPUX if + _XOPEN_SOURCE_EXTENDED is not defined (reverting previous commit) + * [r2941] configure.in: Quick check to see if defining '-munix=95' + on HPUX fixes a problem with the accept() call + +2011-03-15 Chetan Agarwal + + * [r2936] drivers/rhino.c: Fix compilation error (no functional + change) + * [r2935] drivers/rhino.c: Fix missing comment closure from + previous commit (no functional change) + * [r2934] drivers/bcmxcp_usb.c, drivers/microdowell.c, + drivers/rhino.c, drivers/solis.c: Fix remaining C++ style + comments, to conform to the NUT coding rules (no functional + change) + on behalf of Prachi Gandhi (prachisgandhi@eaton.com) + +2011-03-14 Arjen de Korte + + * [r2933] configure.in: Quick check to see if defining _REENTRANT + on HPUX fixes a compilation warning + +2011-03-14 Arnaud Quette + + * [r2932] data/driver.list.in: Add IPAR Mini Energy ME 800 to the + list of blazer_usb supported models + +2011-03-06 Arjen de Korte + + * [r2930] drivers/apcsmart.c: Fix another compilation warning. Some + compilers (rightfully) claim that the value of 'n' may be used + without initialization. Until this is resolved, skip over this if + the value isn't set. + * [r2929] drivers/apcsmart.c: Fix compilation warning + * [r2928] drivers/apcsmart.h: Add additional Matrix models + [http://lists.alioth.debian.org/pipermail/nut-upsdev/2011-March/005319.html] + * [r2927] drivers/apcsmart.c: Flush the input buffer before sending + a command [on behalf of Michal Soltys ] + * [r2926] drivers/apcsmart.c, drivers/apcsmart.h: protocol_verify() + only cares about explicitly specified commands + and variables [on behalf of Michal Soltys ] + * [r2925] drivers/apcsmart.c: Additional driver variables that can + be set to influence shutdown behavior [on behalf of Michal Soltys + ] + * [r2924] drivers/apcsmart.c: Update version and author info [on + behalf of Michal Soltys ] + * [r2923] drivers/apcsmart.c: Deal with more different shutdown + methods [on behalf of Michal Soltys ] + * [r2922] drivers/apcsmart.c: As 'b' can return different things + than firmware version on some old + models, prefer 'V' over 'b' [on behalf of Michal Soltys + ] + * [r2921] drivers/apcsmart.c: remove superfluous status_commit() + [on behalf of Michal Soltys ] + * [r2920] drivers/apcsmart.c, drivers/apcsmart.h: adjust ignored + chars and handle over/~over [on behalf of Michal Soltys + ] + * [r2919] drivers/apcsmart.c: cosmetics [on behalf of Michal Soltys + ] + * [r2918] drivers/apcsmart.c, drivers/apcsmart.h: remove APC_IGNORE + [on behalf of Michal Soltys ] + * [r2917] drivers/apcsmart.h: add compat hardware, add commands [on + behalf of Michal Soltys ] + * [r2916] drivers/apcsmart.h: comsetics - adjust tabs [on behalf of + Michal Soltys ] + +2011-03-02 Charles Lepple + + * [r2915] docs/FAQ.txt: Update Mac power-on FAQ + +2011-03-01 Arnaud Quette + + * [r2913] drivers/liebert-esp2.c: Improved Liebert ESP II support, + including UPS shutdown (poweroff), 1 and 3-phase input and output + variables, and most input / output / bypass / nominal variables, + along with a fix for the USB to serial cable (patch from Farkas + Levente and Spiros Ioannou) + * [r2912] data/driver.list.in: Add Eaton Powerware 9140, using the + serial interface, to the list of bcmxcp supported models + +2011-02-25 Charles Lepple + + * [r2910] docs/download.txt: Moved SHA-256 value into download + page, and reformatted a bit. + +2011-02-24 Arnaud Quette + + * [r2909] data/driver.list.in: Add several upscode2 supported + devices that were reported on the list: + http://lists.alioth.debian.org/pipermail/nut-upsdev/2011-February/005281.html + http://lists.alioth.debian.org/pipermail/nut-upsuser/2005-July/000031.html + +2011-02-21 Arnaud Quette + + * [r2906] data/driver.list.in, drivers/mge-hid.c: Add Eaton Ellipse + ECO (with Eco control support) to the list of usbhid-ups + supported models + * [r2905] drivers/eaton-mib.c: Add support for the first ambient + sensor (up to 8 sensors can be supported) on Eaton ePDU managed + * [r2904] clients/upsrw.c: Add the missing 'help' handler ('-h') to + the supported options + +2011-02-20 Arjen de Korte + + * [r2903] docs/man/ups.conf.txt, drivers/dstate.c: Variables that + have an override. in ups.conf are now really immutable. + They can't be changed anymore (not even if they would have been + R/W otherwise). Rationale is, that if a user wants to override a + value, we should honor that request. + + Added documentation accordingly (and corrected previous commit). + * [r2902] docs/man/ups.conf.txt, drivers/dstate.c, drivers/main.c: + Add 'ignorelb' flag to list of UPS fields in ups.conf to override + the LB condition reported by the UPS. + + This allows all drivers that report battery.charge + (battery.runtime) to shutdown early by setting this flag and + battery.charge.low (battery.runtime.low) in ups.conf. + * [r2901] data/driver.list.in: Removing subdriver setting (cypress + is auto detected for this VID:PID combination, so there is no + need to specify this in usb.conf) + +2011-02-19 Charles Lepple + + * [r2900] data/driver.list.in: Add Mustek Yukai PowerMust 1000 USB + + Reported by Noel David Torres Taño: + http://lists.alioth.debian.org/pipermail/nut-upsuser/2010-August/006163.html + + Other models may be supported as well. + * http://www.mustek.com.tw/Yukai/html/prod_ups/PowerMust1000.html + * http://www.mustek.com.tw/Yukai/html/UPS.html + +2011-02-17 Arnaud Quette + + * [r2899] docs/download.txt: Preliminary support for source release + hash, using unsigned SHA256 sum + +2011-02-15 Arjen de Korte + + * [r2898] common/parseconf.c: In PCONF_CTX_t, argsize is an array + of type size_t values, so instead of using sizeof(int *) we + really should use sizeof(size_t) for the size of individual + elements + +2011-02-15 Charles Lepple + + * [r2897] data/driver.list.in: Re-add some devices to + driver.list.in from r2516 + + These entries seem to have been dropped, potentially due to the + rename from + driver.list to driver.list.in, and the format change. + +2011-02-11 Arjen de Korte + + * [r2893] drivers/libhid.c: Restore the nut-2.4.1 behavior for + reading reports from devices + +2011-02-09 Arjen de Korte + + * [r2891] drivers/dummy-ups.c: Prefer 'snprintf' and 'snprintfcat' + over 'strncat' (the latter can overflow the destination buffer) + +2011-02-09 fbohe-guest + + * [r2888] drivers/dummy-ups.c: Fix a memory leak in dummy-ups + driver + +2011-02-08 Arjen de Korte + + * [r2887] drivers/apc-hid.c: Add yet another way to shutdown the + APC CS-500 + + [http://lists.alioth.debian.org/pipermail/nut-upsuser/2011-January/006550.html] + +2011-02-02 Arnaud Quette + + * [r2884] drivers/mge-hid.c: Fix a wrong value mapping resolution, + and bump driver's HID data version to 1.20 + * [r2883] docs/website/web-layout.conf: Unconditional inclusion of + Google Analytics code + * [r2882] docs/man/dummy-ups.txt, docs/man/metasys.txt, + drivers/apcsmart.c, drivers/dummy-ups.c, drivers/genericups.c, + drivers/metasys.c, drivers/snmp-ups.c: Fix some spelling errors + (base patch from Laurent Bigonville, from Debian) + +2011-01-31 Charles Lepple + + * [r2877] docs/documentation.txt, docs/download.txt: Update URL for + Trac. + +2011-01-28 Arnaud Quette + + * [r2874] configure.in: Add missing variables setting, to allow + AC_SUBST() propagation + +2011-01-22 Arjen de Korte + + * [r2850] drivers/apc-hid.c: Add mappings to APC HID subdriver + +2011-01-17 Charles Lepple + + * [r2836] scripts/Makefile.am: Include perl/Nut.pm in tarball. + * [r2835] COPYING, Makefile.am: Include LICENSE-GPL{2,3} in + tarball. + + Made the text in COPYING agree with the filenames. + 2011-01-14 Arnaud Quette * [r2832] docs/download.txt, docs/website/news.txt: Missing website diff --git a/LICENSE-GPL2 b/LICENSE-GPL2 new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/LICENSE-GPL2 @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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 + + 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) + + 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 Street, 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 Lesser General +Public License instead of this License. diff --git a/LICENSE-GPL3 b/LICENSE-GPL3 new file mode 100644 index 0000000..4432540 --- /dev/null +++ b/LICENSE-GPL3 @@ -0,0 +1,676 @@ + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + 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 +state 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) + + 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 3 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, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program 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, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU 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 Lesser General +Public License instead of this License. But first, please read +. + diff --git a/Makefile.am b/Makefile.am index 82c212c..60db46f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -8,7 +8,8 @@ ACLOCAL_AMFLAGS = -I m4 SUBDIRS = include common clients conf data docs drivers lib \ tools scripts server -EXTRA_DIST = MAINTAINERS UPGRADING +# COPYING is included automatically. +EXTRA_DIST = LICENSE-GPL2 LICENSE-GPL3 MAINTAINERS UPGRADING # ---------------------------------------------------------------------- # flags to pass to ./configure when calling "make distcheck" and "make diff --git a/Makefile.in b/Makefile.in index f7b5c89..2f6c7aa 100644 --- a/Makefile.in +++ b/Makefile.in @@ -43,7 +43,6 @@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ depcomp install-sh ltmain.sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ @@ -290,7 +289,9 @@ ACLOCAL_AMFLAGS = -I m4 SUBDIRS = include common clients conf data docs drivers lib \ tools scripts server -EXTRA_DIST = MAINTAINERS UPGRADING + +# COPYING is included automatically. +EXTRA_DIST = LICENSE-GPL2 LICENSE-GPL3 MAINTAINERS UPGRADING # ---------------------------------------------------------------------- # flags to pass to ./configure when calling "make distcheck" and "make diff --git a/NEWS b/NEWS index ab1bb39..e381249 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,51 @@ If you're upgrading from an earlier version, see the UPGRADING file. For a complete list of changes, please refer to the ChangeLog file. +--------------------------------------------------------------------------- +Release notes for NUT 2.6.1 - what's new since 2.6.0: + + - the various recent USB regressions have been definitely fixed. + + - NUT now propose a variable to expose UPS efficiency (ups.efficiency). + Eaton 5 PX already uses it. + + - the Perl module from Gabor Kiss (rewritten from Kit Peters') is now + distributed with NUT source code. + + - support for new devices: Eaton Ellipse ECO, Powerware 9140, Eaton 5 PX, and + ambient sensor on Eaton ePDU managed ; GE EP series ; Inform Sinus SS 210 ; + IPAR Mini Energy ME 800 ; Mustek Yukai PowerMust 1000 USB ; Numeric 3000 SW ; + SVEN Power Pro+ series (recent models) ; Vivaldi EA200 LED. + + - liebert-esp2: Improved Liebert ESP II support, including UPS shutdown + (poweroff), 1 and 3-phase input and output variables, and most + input / output / bypass / nominal variables. There is also a fix for the + USB to serial cable (Farkas Levente and Spiros Ioannou). + + - powercom has improved PowerCom BNT 1500A and BNT-other support, along with + driver documentation and code conformance to the NUT rules (Keven L. Ates). + + - apcsmart has more improved UPS poweroff support and options (Michal Soltys). + + - blazer has also seen some improvements. + + - usbhid-ups has completed a bit supported variables for APC and Eaton / MGE. + + - on the quality assurance side, Eaton has worked on fixing a few non + conformances, like C++ style comments and warnings, using a newly developed + verification tool (Prachi Gandhi). + + - fix remaining references to LIBSSL_LDFLAGS, instead of LIBSSL_LIBS, + which cause unresolved symbol on libupsclient users (Fabrice Coutadeur). + + - the website has now a better support for Internet Explorer 6. + + - graphic illustrations, used for the Features page on the website Features + and chapter of the user manual, have been refreshed (courtesy of Eaton). + + - more bugfixes, cleanup and improvements, on both source code and + documentation. + --------------------------------------------------------------------------- Release notes for NUT 2.6.0 - what's new since 2.4.3: diff --git a/UPGRADING b/UPGRADING index 9336069..12680d9 100644 --- a/UPGRADING +++ b/UPGRADING @@ -7,6 +7,11 @@ This file lists changes that affect users who installed older versions of this software. When upgrading from an older version, be sure to check this file to see if you need to make changes to your system. +Changes from 2.6.0 to 2.6.1 +--------------------------- + +- nothing that affects upgraded systems. + Changes from 2.4.3 to 2.6.0 --------------------------- diff --git a/aclocal.m4 b/aclocal.m4 index 9da2cb1..99662b0 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -13,14 +13,14 @@ m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],, -[m4_warning([this file was generated for autoconf 2.65. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.67],, +[m4_warning([this file was generated for autoconf 2.67. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) -# longlong.m4 serial 13 -dnl Copyright (C) 1999-2007 Free Software Foundation, Inc. +# longlong.m4 serial 14 +dnl Copyright (C) 1999-2007, 2009-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. @@ -41,33 +41,33 @@ AC_DEFUN([AC_TYPE_LONG_LONG_INT], [AC_LINK_IFELSE( [_AC_TYPE_LONG_LONG_SNIPPET], [dnl This catches a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004. - dnl If cross compiling, assume the bug isn't important, since - dnl nobody cross compiles for this platform as far as we know. - AC_RUN_IFELSE( - [AC_LANG_PROGRAM( - [[@%:@include - @%:@ifndef LLONG_MAX - @%:@ define HALF \ - (1LL << (sizeof (long long int) * CHAR_BIT - 2)) - @%:@ define LLONG_MAX (HALF - 1 + HALF) - @%:@endif]], - [[long long int n = 1; - int i; - for (i = 0; ; i++) - { - long long int m = n << i; - if (m >> i != n) - return 1; - if (LLONG_MAX / 2 < m) - break; - } - return 0;]])], - [ac_cv_type_long_long_int=yes], - [ac_cv_type_long_long_int=no], - [ac_cv_type_long_long_int=yes])], + dnl If cross compiling, assume the bug isn't important, since + dnl nobody cross compiles for this platform as far as we know. + AC_RUN_IFELSE( + [AC_LANG_PROGRAM( + [[@%:@include + @%:@ifndef LLONG_MAX + @%:@ define HALF \ + (1LL << (sizeof (long long int) * CHAR_BIT - 2)) + @%:@ define LLONG_MAX (HALF - 1 + HALF) + @%:@endif]], + [[long long int n = 1; + int i; + for (i = 0; ; i++) + { + long long int m = n << i; + if (m >> i != n) + return 1; + if (LLONG_MAX / 2 < m) + break; + } + return 0;]])], + [ac_cv_type_long_long_int=yes], + [ac_cv_type_long_long_int=no], + [ac_cv_type_long_long_int=yes])], [ac_cv_type_long_long_int=no])]) if test $ac_cv_type_long_long_int = yes; then - AC_DEFINE([HAVE_LONG_LONG_INT], 1, + AC_DEFINE([HAVE_LONG_LONG_INT], [1], [Define to 1 if the system has the type `long long int'.]) fi ]) @@ -90,7 +90,7 @@ AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT], [ac_cv_type_unsigned_long_long_int=yes], [ac_cv_type_unsigned_long_long_int=no])]) if test $ac_cv_type_unsigned_long_long_int = yes; then - AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], 1, + AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1], [Define to 1 if the system has the type `unsigned long long int'.]) fi ]) @@ -103,30 +103,27 @@ AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT], AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET], [ AC_LANG_PROGRAM( - [[/* Test preprocessor. */ - #if ! (-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) - error in preprocessor; - #endif - #if ! (18446744073709551615ULL <= -1ull) - error in preprocessor; - #endif + [[/* For now, do not test the preprocessor; as of 2007 there are too many + implementations with broken preprocessors. Perhaps this can + be revisited in 2012. In the meantime, code should not expect + #if to work with literals wider than 32 bits. */ /* Test literals. */ long long int ll = 9223372036854775807ll; long long int nll = -9223372036854775807LL; unsigned long long int ull = 18446744073709551615ULL; /* Test constant expressions. */ typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) - ? 1 : -1)]; + ? 1 : -1)]; typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 - ? 1 : -1)]; + ? 1 : -1)]; int i = 63;]], [[/* Test availability of runtime routines for shift and division. */ long long int llmax = 9223372036854775807ll; unsigned long long int ullmax = 18446744073709551615ull; return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) - | (llmax / ll) | (llmax % ll) - | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) - | (ullmax / ull) | (ullmax % ull));]]) + | (llmax / ll) | (llmax % ll) + | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) + | (ullmax / ull) | (ullmax % ull));]]) ]) # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. @@ -1135,7 +1132,6 @@ AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/ax_compare_version.m4]) -m4_include([m4/ax_create_stdint_h.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) diff --git a/clients/Makefile.in b/clients/Makefile.in index d2ca2fc..71f8770 100644 --- a/clients/Makefile.in +++ b/clients/Makefile.in @@ -54,7 +54,6 @@ DIST_COMMON = $(am__include_HEADERS_DIST) $(dist_bin_SCRIPTS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ diff --git a/clients/upsrw.c b/clients/upsrw.c index 21649ff..aacbfe8 100644 --- a/clients/upsrw.c +++ b/clients/upsrw.c @@ -405,7 +405,7 @@ int main(int argc, char **argv) const char *prog = xbasename(argv[0]); char *password = NULL, *username = NULL, *setvar = NULL; - while ((i = getopt(argc, argv, "+s:p:u:V")) != -1) { + while ((i = getopt(argc, argv, "+hs:p:u:V")) != -1) { switch (i) { case 's': @@ -420,6 +420,7 @@ int main(int argc, char **argv) case 'V': printf("Network UPS Tools %s %s\n", prog, UPS_VERSION); exit(EXIT_SUCCESS); + case 'h': default: usage(prog); exit(EXIT_SUCCESS); diff --git a/clients/upssched.c b/clients/upssched.c index e707248..6fcb5c3 100644 --- a/clients/upssched.c +++ b/clients/upssched.c @@ -356,7 +356,11 @@ static void conn_add(int sockfd) int acc, ret; conn_t *tmp, *last; struct sockaddr_un saddr; +#if defined(__hpux) && !defined(_XOPEN_SOURCE_EXTENDED) + int salen; +#else socklen_t salen; +#endif salen = sizeof(saddr); acc = accept(sockfd, (struct sockaddr *) &saddr, &salen); @@ -495,9 +499,6 @@ static void start_daemon(int lockfd) struct timeval tv; fd_set rfds; conn_t *tmp, *tmpnext; - socklen_t fromlen; - - fromlen = sizeof(struct sockaddr); us_serialize(SERIALIZE_INIT); diff --git a/common/Makefile.in b/common/Makefile.in index 8006e9e..c0e19e2 100644 --- a/common/Makefile.in +++ b/common/Makefile.in @@ -42,7 +42,6 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in atexit.c \ setenv.c snprintf.c strerror.c ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ diff --git a/common/parseconf.c b/common/parseconf.c index 1680db7..bc6d6a1 100644 --- a/common/parseconf.c +++ b/common/parseconf.c @@ -129,7 +129,7 @@ static void add_arg_word(PCONF_CTX_t *ctx) pconf_fatal(ctx, "realloc arglist failed"); ctx->argsize = realloc(ctx->argsize, - sizeof(int *) * ctx->numargs); + sizeof(size_t) * ctx->numargs); if (!ctx->argsize) pconf_fatal(ctx, "realloc argsize failed"); diff --git a/conf/Makefile.in b/conf/Makefile.in index 8dd6128..18708a5 100644 --- a/conf/Makefile.in +++ b/conf/Makefile.in @@ -42,7 +42,6 @@ DIST_COMMON = $(am__dist_sysconf_DATA_DIST) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/upssched.conf.sample.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ diff --git a/config.guess b/config.guess index e3a2116..c2246a4 100755 --- a/config.guess +++ b/config.guess @@ -1,10 +1,10 @@ #! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 # Free Software Foundation, Inc. -timestamp='2009-06-10' +timestamp='2009-12-30' # 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 @@ -27,16 +27,16 @@ timestamp='2009-06-10' # the same distribution terms that you use for the rest of that program. -# Originally written by Per Bothner . -# Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # -# The plan is that this can be called by configure scripts if you -# don't specify an explicit build system type. +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` @@ -56,8 +56,9 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free +Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -333,6 +334,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" @@ -807,12 +811,12 @@ EOF i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; - *:Interix*:[3456]*) + *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; - EM64T | authenticamd | genuineintel) + authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) @@ -854,6 +858,20 @@ EOF i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ @@ -876,6 +894,17 @@ EOF frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; @@ -901,39 +930,18 @@ EOF #endif #endif EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^CPU/{ - s: ::g - p - }'`" + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - exit ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in @@ -942,8 +950,11 @@ EOF *) echo hppa-unknown-linux-gnu ;; esac exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux @@ -966,58 +977,6 @@ EOF xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; - i*86:Linux:*:*) - # The BFD linker knows what the default object file format is, so - # first see if it will tell us. cd to the root directory to prevent - # problems with other programs or directories called `ld' in the path. - # Set LC_ALL=C to ensure ld outputs messages in English. - ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ - | sed -ne '/supported targets:/!d - s/[ ][ ]*/ /g - s/.*supported targets: *// - s/ .*// - p'` - case "$ld_supported_targets" in - elf32-i386) - TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" - ;; - esac - # Determine whether the default compiler is a.out or elf - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - #ifdef __ELF__ - # ifdef __GLIBC__ - # if __GLIBC__ >= 2 - LIBC=gnu - # else - LIBC=gnulibc1 - # endif - # else - LIBC=gnulibc1 - # endif - #else - #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) - LIBC=gnu - #else - LIBC=gnuaout - #endif - #endif - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' - /^LIBC/{ - s: ::g - p - }'`" - test x"${LIBC}" != x && { - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit - } - test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } - ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both @@ -1247,6 +1206,16 @@ EOF *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} diff --git a/config.sub b/config.sub index eb0389a..c2d1257 100755 --- a/config.sub +++ b/config.sub @@ -1,10 +1,10 @@ #! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 # Free Software Foundation, Inc. -timestamp='2009-06-11' +timestamp='2010-01-22' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software @@ -32,13 +32,16 @@ timestamp='2009-06-11' # Please send patches to . Submit a context -# diff and a properly formatted ChangeLog entry. +# diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + # 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. @@ -72,8 +75,9 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free +Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -149,7 +153,7 @@ case $os in -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray) + -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; @@ -284,6 +288,7 @@ case $basic_machine in | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ + | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ @@ -291,13 +296,14 @@ case $basic_machine in | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ + | ubicom32 \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; - m6811 | m68hc11 | m6812 | m68hc12) + m6811 | m68hc11 | m6812 | m68hc12 | picochip) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none @@ -340,7 +346,7 @@ case $basic_machine in | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ @@ -368,15 +374,17 @@ case $basic_machine in | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ - | romp-* | rs6000-* \ + | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile-* | tilegx-* \ | tron-* \ + | ubicom32-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ @@ -726,6 +734,9 @@ case $basic_machine in basic_machine=ns32k-utek os=-sysv ;; + microblaze) + basic_machine=microblaze-xilinx + ;; mingw32) basic_machine=i386-pc os=-mingw32 @@ -1076,6 +1087,11 @@ case $basic_machine in basic_machine=tic6x-unknown os=-coff ;; + # This must be matched before tile*. + tilegx*) + basic_machine=tilegx-unknown + os=-linux-gnu + ;; tile*) basic_machine=tile-unknown os=-linux-gnu @@ -1247,6 +1263,9 @@ 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. + -auroraux) + os=-auroraux + ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; @@ -1268,8 +1287,8 @@ case $os in # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ - | -kopensolaris* \ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ @@ -1290,7 +1309,7 @@ case $os in | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1423,6 +1442,8 @@ case $os in -dicos*) os=-dicos ;; + -nacl*) + ;; -none) ;; *) diff --git a/configure b/configure index 260bf0e..071b034 100755 --- a/configure +++ b/configure @@ -1,11 +1,11 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.65 for nut 2.6.0. +# Generated by GNU Autoconf 2.67 for nut 2.6.1. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. # # # This configure script is free software; the Free Software Foundation @@ -316,7 +316,7 @@ $as_echo X"$as_dir" | test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p @@ -356,19 +356,19 @@ else fi # as_fn_arith -# as_fn_error ERROR [LINENO LOG_FD] -# --------------------------------- +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with status $?, using 1 if that was 0. +# script with STATUS, using 1 if that was 0. as_fn_error () { - as_status=$?; test $as_status -eq 0 && as_status=1 - if test "$3"; then - as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $1" >&2 + $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error @@ -679,7 +679,7 @@ test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` @@ -698,8 +698,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='nut' PACKAGE_TARNAME='nut' -PACKAGE_VERSION='2.6.0' -PACKAGE_STRING='nut 2.6.0' +PACKAGE_VERSION='2.6.1' +PACKAGE_STRING='nut 2.6.1' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1060,8 +1060,9 @@ do fi case $ac_option in - *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *) ac_optarg=yes ;; + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. @@ -1106,7 +1107,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1132,7 +1133,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1336,7 +1337,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1352,7 +1353,7 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in @@ -1382,8 +1383,8 @@ do | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) as_fn_error "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information." + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" ;; *=*) @@ -1391,7 +1392,7 @@ Try \`$0 --help' for more information." # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error "invalid variable name: \`$ac_envvar'" ;; + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; @@ -1409,13 +1410,13 @@ done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error "missing argument to $ac_option" + as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; - fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1438,7 +1439,7 @@ do [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac - as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' @@ -1452,8 +1453,8 @@ target=$target_alias if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - $as_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 + $as_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 @@ -1468,9 +1469,9 @@ test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error "working directory cannot be determined" + as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error "pwd does not report name of working directory" + as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. @@ -1509,11 +1510,11 @@ else fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then @@ -1539,7 +1540,7 @@ 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 nut 2.6.0 to adapt to many kinds of systems. +\`configure' configures nut 2.6.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1553,7 +1554,7 @@ Configuration: --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 + -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 @@ -1610,7 +1611,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of nut 2.6.0:";; + short | recursive ) echo "Configuration of nut 2.6.1:";; esac cat <<\_ACEOF @@ -1632,8 +1633,7 @@ Optional Features: Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-all enable serial, usb, snmp, hal, cgi, dev, neon, - powerman + --with-all enable serial, usb, snmp, neon, powerman, cgi, dev --with-dev build and install the development files (no) --with-serial build and install serial drivers (yes) --with-usb build and install USB drivers (auto) @@ -1774,10 +1774,10 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -nut configure 2.6.0 -generated by GNU Autoconf 2.65 +nut configure 2.6.1 +generated by GNU Autoconf 2.67 -Copyright (C) 2009 Free Software Foundation, Inc. +Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1847,7 +1847,7 @@ $as_echo "$ac_try_echo"; } >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } >/dev/null && { + test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : @@ -1871,10 +1871,10 @@ fi ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + if eval "test \"\${$3+set}\"" = set; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 @@ -1910,7 +1910,7 @@ if ac_fn_c_try_cpp "$LINENO"; then : else ac_header_preproc=no fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } @@ -1937,7 +1937,7 @@ $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" @@ -2001,7 +2001,7 @@ ac_fn_c_check_header_compile () as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -2077,7 +2077,7 @@ ac_fn_c_check_func () as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -2136,15 +2136,18 @@ $as_echo "$ac_res" >&6; } } # ac_fn_c_check_func -# ac_fn_c_check_decl LINENO SYMBOL VAR -# ------------------------------------ -# Tests whether SYMBOL is declared, setting cache variable VAR accordingly. +# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES +# --------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $2 is declared" >&5 -$as_echo_n "checking whether $2 is declared... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -2153,8 +2156,12 @@ $4 int main () { -#ifndef $2 - (void) $2; +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif #endif ; @@ -2184,7 +2191,7 @@ ac_fn_c_check_type () as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else eval "$3=no" @@ -2228,190 +2235,12 @@ $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_type - -# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES -# -------------------------------------------- -# Tries to find the compile-time value of EXPR in a program that includes -# INCLUDES, setting VAR accordingly. Returns whether the value could be -# computed -ac_fn_c_compute_int () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_lo=0 ac_mid=0 - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=$ac_mid; break -else - as_fn_arith $ac_mid + 1 && ac_lo=$as_val - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=-1 ac_mid=-1 - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_lo=$ac_mid; break -else - as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - ac_lo= ac_hi= -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -int -main () -{ -static int test_array [1 - 2 * !(($2) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_hi=$ac_mid -else - as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in #(( -?*) eval "$3=\$ac_lo"; ac_retval=0 ;; -'') ac_retval=1 ;; -esac - else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -static long int longval () { return $2; } -static unsigned long int ulongval () { return $2; } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (($2) < 0) - { - long int i = longval (); - if (i != ($2)) - return 1; - fprintf (f, "%ld", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ($2)) - return 1; - fprintf (f, "%lu", i); - } - /* Do not output a trailing newline, as this causes \r\n confusion - on some platforms. */ - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - echo >>conftest.val; read $3 config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by nut $as_me 2.6.0, which was -generated by GNU Autoconf 2.65. Invocation command line was +It was created by nut $as_me 2.6.1, which was +generated by GNU Autoconf 2.67. Invocation command line was $ $0 $@ @@ -2521,11 +2350,9 @@ trap 'exit_status=$? { echo - cat <<\_ASBOX -## ---------------- ## + $as_echo "## ---------------- ## ## Cache variables. ## -## ---------------- ## -_ASBOX +## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( @@ -2559,11 +2386,9 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - cat <<\_ASBOX -## ----------------- ## + $as_echo "## ----------------- ## ## Output variables. ## -## ----------------- ## -_ASBOX +## ----------------- ##" echo for ac_var in $ac_subst_vars do @@ -2576,11 +2401,9 @@ _ASBOX echo if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------------- ## + $as_echo "## ------------------- ## ## File substitutions. ## -## ------------------- ## -_ASBOX +## ------------------- ##" echo for ac_var in $ac_subst_files do @@ -2594,11 +2417,9 @@ _ASBOX fi if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## + $as_echo "## ----------- ## ## confdefs.h. ## -## ----------- ## -_ASBOX +## ----------- ##" echo cat confdefs.h echo @@ -2653,7 +2474,12 @@ _ACEOF ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - ac_site_file1=$CONFIG_SITE + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site @@ -2668,7 +2494,11 @@ do { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5 ; } fi done @@ -2744,7 +2574,7 @@ if $ac_cache_corrupted; then $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## @@ -2762,16 +2592,22 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "Network UPS Tools version ${PACKAGE_VERSION}" ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - for ac_t in install-sh install.sh shtool; do - if test -f "$ac_dir/$ac_t"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/$ac_t -c" - break 2 - fi - done + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi done if test -z "$ac_aux_dir"; then - as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, @@ -2785,7 +2621,7 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } @@ -2796,16 +2632,16 @@ else test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && - as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; -*) as_fn_error "invalid value of canonical build" "$LINENO" 5;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' @@ -2830,7 +2666,7 @@ else ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi @@ -2838,7 +2674,7 @@ fi $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; -*) as_fn_error "invalid value of canonical host" "$LINENO" 5;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' @@ -2863,7 +2699,7 @@ else ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || - as_fn_error "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi @@ -2871,7 +2707,7 @@ fi $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; -*) as_fn_error "invalid value of canonical target" "$LINENO" 5;; +*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5 ;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' @@ -3140,11 +2976,11 @@ am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5 ;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5 ;; esac # Do `set' in a subshell so we don't clobber the current shell's @@ -3166,7 +3002,7 @@ if ( # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". - as_fn_error "ls -t appears to fail. Make sure there is not a broken + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi @@ -3176,7 +3012,7 @@ then # Ok. : else - as_fn_error "newly created file is older than distributed files! + as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 @@ -3414,7 +3250,7 @@ done $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF @@ -3422,7 +3258,7 @@ SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; @@ -3456,7 +3292,7 @@ if test "`cd $srcdir && pwd`" != "`pwd`"; then am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then - as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi @@ -3472,7 +3308,7 @@ fi # Define the identity of the package. PACKAGE='nut' - VERSION='2.6.0' + VERSION='2.6.1' cat >>confdefs.h <<_ACEOF @@ -3880,8 +3716,8 @@ fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "no acceptable C compiler found in \$PATH -See \`config.log' for more details." "$LINENO" 5; } +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5 ; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 @@ -3995,9 +3831,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ as_fn_set_status 77 -as_fn_error "C compiler cannot create executables -See \`config.log' for more details." "$LINENO" 5; }; } +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5 ; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } @@ -4039,8 +3874,8 @@ done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." "$LINENO" 5; } +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5 ; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 @@ -4097,9 +3932,9 @@ $as_echo "$ac_try_echo"; } >&5 else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "cannot run C compiled programs. +as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. -See \`config.log' for more details." "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } fi fi fi @@ -4150,8 +3985,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "cannot compute suffix of object files: cannot compile -See \`config.log' for more details." "$LINENO" 5; } +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5 ; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi @@ -4541,7 +4376,7 @@ else # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. @@ -4557,11 +4392,11 @@ else ac_preproc_ok=: break fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext +rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi @@ -4600,7 +4435,7 @@ else # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. @@ -4616,18 +4451,18 @@ else ac_preproc_ok=: break fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext +rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." "$LINENO" 5; } +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5 ; } fi ac_ext=c @@ -4688,7 +4523,7 @@ esac done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then - as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP @@ -4754,7 +4589,7 @@ esac done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then - as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP @@ -4886,8 +4721,7 @@ do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF @@ -5317,8 +5151,8 @@ fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "no acceptable C compiler found in \$PATH -See \`config.log' for more details." "$LINENO" 5; } +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5 ; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 @@ -5693,7 +5527,7 @@ $as_echo_n "checking whether cc understands -c and -o together... " >&6; } fi set dummy $CC; ac_cc=`$as_echo "$2" | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then : +if eval "test \"\${ac_cv_prog_cc_${ac_cc}_c_o+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -5852,7 +5686,7 @@ else # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. @@ -5868,11 +5702,11 @@ else ac_preproc_ok=: break fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext +rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi @@ -5911,7 +5745,7 @@ else # Broken: fails on valid input. continue fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. @@ -5927,18 +5761,18 @@ else ac_preproc_ok=: break fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext +rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." "$LINENO" 5; } +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5 ; } fi ac_ext=c @@ -6002,7 +5836,7 @@ esac done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then - as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP @@ -6367,8 +6201,8 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) - as_fn_error "unknown endianness - presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + as_fn_error $? "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 @@ -6491,8 +6325,7 @@ for ac_func in flock lockf fcvt fcvtl do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -eval as_val=\$$as_ac_var - if test "x$as_val" = x""yes; then : +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF @@ -6504,8 +6337,7 @@ for ac_func in cfsetispeed tcsendbreak do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -eval as_val=\$$as_ac_var - if test "x$as_val" = x""yes; then : +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF @@ -6517,8 +6349,7 @@ for ac_func in seteuid setsid getpassphrase do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -eval as_val=\$$as_ac_var - if test "x$as_val" = x""yes; then : +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF @@ -6530,8 +6361,7 @@ for ac_func in on_exit strptime setlogmask do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -eval as_val=\$$as_ac_var - if test "x$as_val" = x""yes; then : +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF @@ -6556,8 +6386,7 @@ for ac_func in vsnprintf snprintf do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -eval as_val=\$$as_ac_var - if test "x$as_val" = x""yes; then : +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF @@ -6620,22 +6449,19 @@ else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - /* Test preprocessor. */ - #if ! (-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) - error in preprocessor; - #endif - #if ! (18446744073709551615ULL <= -1ull) - error in preprocessor; - #endif + /* For now, do not test the preprocessor; as of 2007 there are too many + implementations with broken preprocessors. Perhaps this can + be revisited in 2012. In the meantime, code should not expect + #if to work with literals wider than 32 bits. */ /* Test literals. */ long long int ll = 9223372036854775807ll; long long int nll = -9223372036854775807LL; unsigned long long int ull = 18446744073709551615ULL; /* Test constant expressions. */ typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll) - ? 1 : -1)]; + ? 1 : -1)]; typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1 - ? 1 : -1)]; + ? 1 : -1)]; int i = 63; int main () @@ -6644,40 +6470,40 @@ main () long long int llmax = 9223372036854775807ll; unsigned long long int ullmax = 18446744073709551615ull; return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) - | (llmax / ll) | (llmax % ll) - | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) - | (ullmax / ull) | (ullmax % ull)); + | (llmax / ll) | (llmax % ll) + | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i) + | (ullmax / ull) | (ullmax % ull)); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes; then : ac_cv_type_long_long_int=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include - #ifndef LLONG_MAX - # define HALF \ - (1LL << (sizeof (long long int) * CHAR_BIT - 2)) - # define LLONG_MAX (HALF - 1 + HALF) - #endif + #ifndef LLONG_MAX + # define HALF \ + (1LL << (sizeof (long long int) * CHAR_BIT - 2)) + # define LLONG_MAX (HALF - 1 + HALF) + #endif int main () { long long int n = 1; - int i; - for (i = 0; ; i++) - { - long long int m = n << i; - if (m >> i != n) - return 1; - if (LLONG_MAX / 2 < m) - break; - } - return 0; + int i; + for (i = 0; ; i++) + { + long long int m = n << i; + if (m >> i != n) + return 1; + if (LLONG_MAX / 2 < m) + break; + } + return 0; ; return 0; } @@ -6710,25 +6536,44 @@ fi done -for ac_func in setenv strerror atexit -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -eval as_val=\$$as_ac_var - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +ac_fn_c_check_func "$LINENO" "setenv" "ac_cv_func_setenv" +if test "x$ac_cv_func_setenv" = x""yes; then : + $as_echo "#define HAVE_SETENV 1" >>confdefs.h else case " $LIBOBJS " in - *" $ac_func.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" + *" setenv.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS setenv.$ac_objext" + ;; +esac + +fi + +ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror" +if test "x$ac_cv_func_strerror" = x""yes; then : + $as_echo "#define HAVE_STRERROR 1" >>confdefs.h + +else + case " $LIBOBJS " in + *" strerror.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strerror.$ac_objext" + ;; +esac + +fi + +ac_fn_c_check_func "$LINENO" "atexit" "ac_cv_func_atexit" +if test "x$ac_cv_func_atexit" = x""yes; then : + $as_echo "#define HAVE_ATEXIT 1" >>confdefs.h + +else + case " $LIBOBJS " in + *" atexit.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS atexit.$ac_objext" ;; esac fi -done @@ -6737,6 +6582,12 @@ then CFLAGS="${CFLAGS} -Wall -Wsign-compare" fi +case ${target_os} in + hpux11* ) + CFLAGS="${CFLAGS} -D_REENTRANT" + ;; +esac + ac_fn_c_check_decl "$LINENO" "optind" "ac_cv_have_decl_optind" "$ac_includes_default " if test "x$ac_cv_have_decl_optind" = x""yes; then : @@ -7005,8 +6856,7 @@ do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF @@ -7016,473 +6866,6 @@ fi done -# ------ AX CREATE STDINT H ------------------------------------- -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint types" >&5 -$as_echo_n "checking for stdint types... " >&6; } -ac_stdint_h=`echo include/nut_stdint.h` -# try to shortcircuit - if the default include path of the compiler -# can find a "stdint.h" header then we assume that all compilers can. -if test "${ac_cv_header_stdint_t+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - -old_CXXFLAGS="$CXXFLAGS" ; CXXFLAGS="" -old_CPPFLAGS="$CPPFLAGS" ; CPPFLAGS="" -old_CFLAGS="$CFLAGS" ; CFLAGS="" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -int_least32_t v = 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_stdint_result="(assuming C99 compatible system)" - ac_cv_header_stdint_t="stdint.h"; -else - ac_cv_header_stdint_t="" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -if test "$GCC" = "yes" && test ".$ac_cv_header_stdint_t" = "."; then -CFLAGS="-std=c99" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -int_least32_t v = 0; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: your GCC compiler has a defunct stdint.h for its default-mode" >&5 -$as_echo "$as_me: WARNING: your GCC compiler has a defunct stdint.h for its default-mode" >&2;} -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -CXXFLAGS="$old_CXXFLAGS" -CPPFLAGS="$old_CPPFLAGS" -CFLAGS="$old_CFLAGS" -fi - - -v="... $ac_cv_header_stdint_h" -if test "$ac_stdint_h" = "stdint.h" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: (are you sure you want them in ./stdint.h?)" >&5 -$as_echo "(are you sure you want them in ./stdint.h?)" >&6; } -elif test "$ac_stdint_h" = "inttypes.h" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: (are you sure you want them in ./inttypes.h?)" >&5 -$as_echo "(are you sure you want them in ./inttypes.h?)" >&6; } -elif test "_$ac_cv_header_stdint_t" = "_" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: (putting them into $ac_stdint_h)$v" >&5 -$as_echo "(putting them into $ac_stdint_h)$v" >&6; } -else - ac_cv_header_stdint="$ac_cv_header_stdint_t" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint (shortcircuit)" >&5 -$as_echo "$ac_cv_header_stdint (shortcircuit)" >&6; } -fi - -if test "_$ac_cv_header_stdint_t" = "_" ; then # can not shortcircuit.. - - -inttype_headers=`echo | sed -e 's/,/ /g'` - -ac_cv_stdint_result="(no helpful system typedefs seen)" - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uintptr_t" >&5 -$as_echo_n "checking for stdint uintptr_t... " >&6; } -if test "${ac_cv_header_stdint_x+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - - ac_cv_header_stdint_x="" # the 1997 typedefs (inttypes.h) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5 -$as_echo "(..)" >&6; } - for i in stdint.h inttypes.h sys/inttypes.h $inttype_headers - do - unset ac_cv_type_uintptr_t - unset ac_cv_type_uint64_t - ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "#include <$i> -" -if test "x$ac_cv_type_uintptr_t" = x""yes; then : - ac_cv_header_stdint_x=$i -else - continue -fi - - ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include<$i> -" -if test "x$ac_cv_type_uint64_t" = x""yes; then : - and64="/uint64_t" -else - and64="" -fi - - ac_cv_stdint_result="(seen uintptr_t$and64 in $i)" - break - done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uintptr_t" >&5 -$as_echo_n "checking for stdint uintptr_t... " >&6; } - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_x" >&5 -$as_echo "$ac_cv_header_stdint_x" >&6; } - - -if test "_$ac_cv_header_stdint_x" = "_" ; then - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uint32_t" >&5 -$as_echo_n "checking for stdint uint32_t... " >&6; } -if test "${ac_cv_header_stdint_o+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - - ac_cv_header_stdint_o="" # the 1995 typedefs (sys/inttypes.h) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5 -$as_echo "(..)" >&6; } - for i in inttypes.h sys/inttypes.h stdint.h $inttype_headers - do - unset ac_cv_type_uint32_t - unset ac_cv_type_uint64_t - ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "#include <$i> -" -if test "x$ac_cv_type_uint32_t" = x""yes; then : - ac_cv_header_stdint_o=$i -else - continue -fi - - ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include<$i> -" -if test "x$ac_cv_type_uint64_t" = x""yes; then : - and64="/uint64_t" -else - and64="" -fi - - ac_cv_stdint_result="(seen uint32_t$and64 in $i)" - break - break; - done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uint32_t" >&5 -$as_echo_n "checking for stdint uint32_t... " >&6; } - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_o" >&5 -$as_echo "$ac_cv_header_stdint_o" >&6; } - -fi - -if test "_$ac_cv_header_stdint_x" = "_" ; then -if test "_$ac_cv_header_stdint_o" = "_" ; then - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint u_int32_t" >&5 -$as_echo_n "checking for stdint u_int32_t... " >&6; } -if test "${ac_cv_header_stdint_u+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - - ac_cv_header_stdint_u="" # the BSD typedefs (sys/types.h) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5 -$as_echo "(..)" >&6; } - for i in sys/types.h inttypes.h sys/inttypes.h $inttype_headers ; do - unset ac_cv_type_u_int32_t - unset ac_cv_type_u_int64_t - ac_fn_c_check_type "$LINENO" "u_int32_t" "ac_cv_type_u_int32_t" "#include <$i> -" -if test "x$ac_cv_type_u_int32_t" = x""yes; then : - ac_cv_header_stdint_u=$i -else - continue -fi - - ac_fn_c_check_type "$LINENO" "u_int64_t" "ac_cv_type_u_int64_t" "#include<$i> -" -if test "x$ac_cv_type_u_int64_t" = x""yes; then : - and64="/u_int64_t" -else - and64="" -fi - - ac_cv_stdint_result="(seen u_int32_t$and64 in $i)" - break - break; - done - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint u_int32_t" >&5 -$as_echo_n "checking for stdint u_int32_t... " >&6; } - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_u" >&5 -$as_echo "$ac_cv_header_stdint_u" >&6; } - -fi fi - -if test "_$ac_cv_header_stdint_x" = "_" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint datatype model" >&5 -$as_echo_n "checking for stdint datatype model... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5 -$as_echo "(..)" >&6; } - - # The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5 -$as_echo_n "checking size of char... " >&6; } -if test "${ac_cv_sizeof_char+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_char" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ as_fn_set_status 77 -as_fn_error "cannot compute sizeof (char) -See \`config.log' for more details." "$LINENO" 5; }; } - else - ac_cv_sizeof_char=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5 -$as_echo "$ac_cv_sizeof_char" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_CHAR $ac_cv_sizeof_char -_ACEOF - - - # The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 -$as_echo_n "checking size of short... " >&6; } -if test "${ac_cv_sizeof_short+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_short" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ as_fn_set_status 77 -as_fn_error "cannot compute sizeof (short) -See \`config.log' for more details." "$LINENO" 5; }; } - else - ac_cv_sizeof_short=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 -$as_echo "$ac_cv_sizeof_short" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_SHORT $ac_cv_sizeof_short -_ACEOF - - - # The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 -$as_echo_n "checking size of int... " >&6; } -if test "${ac_cv_sizeof_int+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_int" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ as_fn_set_status 77 -as_fn_error "cannot compute sizeof (int) -See \`config.log' for more details." "$LINENO" 5; }; } - else - ac_cv_sizeof_int=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 -$as_echo "$ac_cv_sizeof_int" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_INT $ac_cv_sizeof_int -_ACEOF - - - # The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 -$as_echo_n "checking size of long... " >&6; } -if test "${ac_cv_sizeof_long+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_long" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ as_fn_set_status 77 -as_fn_error "cannot compute sizeof (long) -See \`config.log' for more details." "$LINENO" 5; }; } - else - ac_cv_sizeof_long=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 -$as_echo "$ac_cv_sizeof_long" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_LONG $ac_cv_sizeof_long -_ACEOF - - - # The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void*" >&5 -$as_echo_n "checking size of void*... " >&6; } -if test "${ac_cv_sizeof_voidp+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ac_cv_sizeof_voidp" "$ac_includes_default"; then : - -else - if test "$ac_cv_type_voidp" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -{ as_fn_set_status 77 -as_fn_error "cannot compute sizeof (void*) -See \`config.log' for more details." "$LINENO" 5; }; } - else - ac_cv_sizeof_voidp=0 - fi -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_voidp" >&5 -$as_echo "$ac_cv_sizeof_voidp" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_VOIDP $ac_cv_sizeof_voidp -_ACEOF - - - ac_cv_char_data_model="" - ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_char" - ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_short" - ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_int" - ac_cv_long_data_model="" - ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_int" - ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_long" - ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_voidp" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking data model" >&5 -$as_echo_n "checking data model... " >&6; } - case "$ac_cv_char_data_model/$ac_cv_long_data_model" in - 122/242) ac_cv_data_model="IP16" ; n="standard 16bit machine" ;; - 122/244) ac_cv_data_model="LP32" ; n="standard 32bit machine" ;; - 122/*) ac_cv_data_model="i16" ; n="unusual int16 model" ;; - 124/444) ac_cv_data_model="ILP32" ; n="standard 32bit unixish" ;; - 124/488) ac_cv_data_model="LP64" ; n="standard 64bit unixish" ;; - 124/448) ac_cv_data_model="LLP64" ; n="unusual 64bit unixish" ;; - 124/*) ac_cv_data_model="i32" ; n="unusual int32 model" ;; - 128/888) ac_cv_data_model="ILP64" ; n="unusual 64bit numeric" ;; - 128/*) ac_cv_data_model="i64" ; n="unusual int64 model" ;; - 222/*2) ac_cv_data_model="DSP16" ; n="strict 16bit dsptype" ;; - 333/*3) ac_cv_data_model="DSP24" ; n="strict 24bit dsptype" ;; - 444/*4) ac_cv_data_model="DSP32" ; n="strict 32bit dsptype" ;; - 666/*6) ac_cv_data_model="DSP48" ; n="strict 48bit dsptype" ;; - 888/*8) ac_cv_data_model="DSP64" ; n="strict 64bit dsptype" ;; - 222/*|333/*|444/*|666/*|888/*) : - ac_cv_data_model="iDSP" ; n="unusual dsptype" ;; - *) ac_cv_data_model="none" ; n="very unusual model" ;; - esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_data_model ($ac_cv_long_data_model, $n)" >&5 -$as_echo "$ac_cv_data_model ($ac_cv_long_data_model, $n)" >&6; } - -fi - -if test "_$ac_cv_header_stdint_x" != "_" ; then - ac_cv_header_stdint="$ac_cv_header_stdint_x" -elif test "_$ac_cv_header_stdint_o" != "_" ; then - ac_cv_header_stdint="$ac_cv_header_stdint_o" -elif test "_$ac_cv_header_stdint_u" != "_" ; then - ac_cv_header_stdint="$ac_cv_header_stdint_u" -else - ac_cv_header_stdint="stddef.h" -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for extra inttypes in chosen header" >&5 -$as_echo_n "checking for extra inttypes in chosen header... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ($ac_cv_header_stdint)" >&5 -$as_echo "($ac_cv_header_stdint)" >&6; } -unset ac_cv_type_int_least32_t -unset ac_cv_type_int_fast32_t -ac_fn_c_check_type "$LINENO" "int_least32_t" "ac_cv_type_int_least32_t" "#include <$ac_cv_header_stdint> -" -if test "x$ac_cv_type_int_least32_t" = x""yes; then : - -fi - -ac_fn_c_check_type "$LINENO" "int_fast32_t" "ac_cv_type_int_fast32_t" "#include<$ac_cv_header_stdint> -" -if test "x$ac_cv_type_int_fast32_t" = x""yes; then : - -fi - -ac_fn_c_check_type "$LINENO" "intmax_t" "ac_cv_type_intmax_t" "#include <$ac_cv_header_stdint> -" -if test "x$ac_cv_type_intmax_t" = x""yes; then : - -fi - - -fi # shortcircut to system "stdint.h" -# ------------------ PREPARE VARIABLES ------------------------------ -if test "$GCC" = "yes" ; then -ac_cv_stdint_message="using gnu compiler "`$CC --version | head -1` -else -ac_cv_stdint_message="using $CC" -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: make use of $ac_cv_header_stdint in $ac_stdint_h $ac_cv_stdint_result" >&5 -$as_echo "make use of $ac_cv_header_stdint in $ac_stdint_h $ac_cv_stdint_result" >&6; } - -# ----------------- DONE inttypes.h checks START header ------------- -ac_config_commands="$ac_config_commands $ac_stdint_h" - - ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "#include #include @@ -7532,7 +6915,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done if test "x$nut_cv_socklen_t_equiv" = x; then - as_fn_error "Cannot find a type to use in place of socklen_t" "$LINENO" 5 + as_fn_error $? "Cannot find a type to use in place of socklen_t" "$LINENO" 5 fi fi @@ -7559,7 +6942,6 @@ if test "${with_all+set}" = set; then : if test -z "${with_serial}"; then with_serial="${withval}"; fi if test -z "${with_usb}"; then with_usb="${withval}"; fi if test -z "${with_snmp}"; then with_snmp="${withval}"; fi - if test -z "${with_hal}"; then with_hal="${withval}"; fi if test -z "${with_neon}"; then with_neon="${withval}"; fi if test -z "${with_powerman}"; then with_powerman="${withval}"; fi if test -z "${with_cgi}"; then with_cgi="${withval}"; fi @@ -7647,7 +7029,7 @@ if test "${with_snmp_includes+set}" = set; then : withval=$with_snmp_includes; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-snmp-includes - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-snmp-includes - see docs/configure.txt" "$LINENO" 5 ;; *) CFLAGS="${withval}" @@ -7669,7 +7051,7 @@ if test "${with_snmp_libs+set}" = set; then : withval=$with_snmp_libs; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-snmp-libs - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-snmp-libs - see docs/configure.txt" "$LINENO" 5 ;; *) LIBS="${withval}" @@ -7758,7 +7140,7 @@ if test "${with_usb_includes+set}" = set; then : withval=$with_usb_includes; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-usb-includes - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-usb-includes - see docs/configure.txt" "$LINENO" 5 ;; *) CFLAGS="${withval}" @@ -7778,7 +7160,7 @@ if test "${with_usb_libs+set}" = set; then : withval=$with_usb_libs; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-usb-libs - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-usb-libs - see docs/configure.txt" "$LINENO" 5 ;; *) LIBS="${withval}" @@ -7878,7 +7260,7 @@ if test "${with_hal_includes+set}" = set; then : withval=$with_hal_includes; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-hal-includes - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-hal-includes - see docs/configure.txt" "$LINENO" 5 ;; *) CFLAGS="${withval}" @@ -7905,7 +7287,7 @@ if test "${with_hal_libs+set}" = set; then : withval=$with_hal_libs; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-hal-libs - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-hal-libs - see docs/configure.txt" "$LINENO" 5 ;; *) LIBS="${withval}" @@ -7944,8 +7326,7 @@ do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF @@ -8004,7 +7385,7 @@ if test "${with_hal_user+set}" = set; then : withval=$with_hal_user; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-hal-user - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-hal-user - see docs/configure.txt" "$LINENO" 5 ;; *) HAL_USER="${withval}" @@ -8036,7 +7417,7 @@ if test "${with_hal_device_match_key+set}" = set; then : withval=$with_hal_device_match_key; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-hal-device-match-key - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-hal-device-match-key - see docs/configure.txt" "$LINENO" 5 ;; *) HAL_DEVICE_MATCH_KEY="${withval}" @@ -8064,7 +7445,7 @@ if test "${with_hal_callouts_path+set}" = set; then : withval=$with_hal_callouts_path; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-hal-callouts-path - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-hal-callouts-path - see docs/configure.txt" "$LINENO" 5 ;; *) HAL_CALLOUTS_PATH="${withval}" @@ -8091,7 +7472,7 @@ if test "${with_hal_fdi_path+set}" = set; then : withval=$with_hal_fdi_path; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-hal-fdi-path - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-hal-fdi-path - see docs/configure.txt" "$LINENO" 5 ;; *) HAL_FDI_PATH="${withval}" @@ -8145,7 +7526,7 @@ if test "${with_snmp_includes+set}" = set; then : withval=$with_snmp_includes; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-snmp-includes - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-snmp-includes - see docs/configure.txt" "$LINENO" 5 ;; *) CFLAGS="${withval}" @@ -8167,7 +7548,7 @@ if test "${with_snmp_libs+set}" = set; then : withval=$with_snmp_libs; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-snmp-libs - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-snmp-libs - see docs/configure.txt" "$LINENO" 5 ;; *) LIBS="${withval}" @@ -8253,7 +7634,7 @@ if test "${with_neon_includes+set}" = set; then : withval=$with_neon_includes; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-neon-includes - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-neon-includes - see docs/configure.txt" "$LINENO" 5 ;; *) CFLAGS="${withval}" @@ -8275,7 +7656,7 @@ if test "${with_neon_libs+set}" = set; then : withval=$with_neon_libs; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-neon-libs - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-neon-libs - see docs/configure.txt" "$LINENO" 5 ;; *) LIBS="${withval}" @@ -8323,8 +7704,7 @@ done do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -eval as_val=\$$as_ac_var - if test "x$as_val" = x""yes; then : +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF @@ -8365,7 +7745,7 @@ if test "${with_powerman_includes+set}" = set; then : withval=$with_powerman_includes; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-powerman-includes - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-powerman-includes - see docs/configure.txt" "$LINENO" 5 ;; *) CFLAGS="${withval}" @@ -8387,7 +7767,7 @@ if test "${with_powerman_libs+set}" = set; then : withval=$with_powerman_libs; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-powerman-libs - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-powerman-libs - see docs/configure.txt" "$LINENO" 5 ;; *) LIBS="${withval}" @@ -8539,7 +7919,7 @@ $as_echo "${nut_with_serial}" >&6; } if test "${nut_with_usb}" = "yes" -a "${nut_have_libusb}" != "yes"; then - as_fn_error "\"USB drivers requested, but libusb not found.\"" "$LINENO" 5 + as_fn_error $? "\"USB drivers requested, but libusb not found.\"" "$LINENO" 5 fi if test "${nut_with_usb}" != "no"; then @@ -8571,7 +7951,7 @@ $as_echo "${nut_with_usb}" >&6; } if test "${nut_with_snmp}" = "yes" -a "${nut_have_libnetsnmp}" != "yes"; then - as_fn_error "\"Net-SNMP libraries not found, required for SNMP drivers\"" "$LINENO" 5 + as_fn_error $? "\"Net-SNMP libraries not found, required for SNMP drivers\"" "$LINENO" 5 fi if test "${nut_with_snmp}" != "no"; then @@ -8603,7 +7983,7 @@ $as_echo "${nut_with_snmp}" >&6; } if test "${nut_with_neon}" = "yes" -a "${nut_have_neon}" != "yes"; then - as_fn_error "\"neon libraries not found, required for neon based XML/HTTP driver\"" "$LINENO" 5 + as_fn_error $? "\"neon libraries not found, required for neon based XML/HTTP driver\"" "$LINENO" 5 fi if test "${nut_with_neon}" != "no"; then @@ -8636,7 +8016,7 @@ $as_echo "${nut_with_neon}" >&6; } if test "${nut_with_powerman}" = "yes" -a "${nut_have_libpowerman}" != "yes"; then - as_fn_error "\"Powerman client libraries not found, required for Powerman PDU client driver\"" "$LINENO" 5 + as_fn_error $? "\"Powerman client libraries not found, required for Powerman PDU client driver\"" "$LINENO" 5 fi if test "${nut_with_powerman}" != "no"; then @@ -8708,7 +8088,7 @@ if test "${with_ssl_includes+set}" = set; then : withval=$with_ssl_includes; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-ssl-includes - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-ssl-includes - see docs/configure.txt" "$LINENO" 5 ;; *) CFLAGS="${withval}" @@ -8728,7 +8108,7 @@ if test "${with_ssl_libs+set}" = set; then : withval=$with_ssl_libs; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-ssl-libs - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-ssl-libs - see docs/configure.txt" "$LINENO" 5 ;; *) LIBS="${withval}" @@ -8784,7 +8164,7 @@ fi fi if test "${nut_with_ssl}" = "yes" -a "${nut_have_libssl}" != "yes"; then - as_fn_error "\"OpenSSL not found, required for SSL support\"" "$LINENO" 5 + as_fn_error $? "\"OpenSSL not found, required for SSL support\"" "$LINENO" 5 fi if test "${nut_with_ssl}" != "no"; then @@ -8979,7 +8359,7 @@ fi fi if test "${nut_with_wrap}" = "yes" -a "${nut_have_libwrap}" != "yes"; then - as_fn_error "\"libwrap not found\"" "$LINENO" 5 + as_fn_error $? "\"libwrap not found\"" "$LINENO" 5 fi if test "${nut_with_wrap}" != "no"; then @@ -9067,7 +8447,7 @@ if test "${with_gd_includes+set}" = set; then : withval=$with_gd_includes; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-gd-includes - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-gd-includes - see docs/configure.txt" "$LINENO" 5 ;; *) CFLAGS="${withval}" @@ -9087,7 +8467,7 @@ if test "${with_gd_libs+set}" = set; then : withval=$with_gd_libs; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-gd-libs - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-gd-libs - see docs/configure.txt" "$LINENO" 5 ;; *) LDFLAGS="${withval}" @@ -9105,8 +8485,7 @@ do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF @@ -9192,7 +8571,7 @@ fi fi if test "${nut_with_cgi}" = "yes" -a "${nut_have_libgd}" != "yes"; then - as_fn_error "libgd not found, required for CGI build" "$LINENO" 5 + as_fn_error $? "libgd not found, required for CGI build" "$LINENO" 5 fi if test "${nut_with_cgi}" != "no"; then @@ -9224,11 +8603,11 @@ $as_echo "${nut_with_cgi}" >&6; } if test "${nut_with_hal}" = "yes" -a "${nut_have_libhal}" != "yes"; then - as_fn_error "\"libhal not found, required for HAL support\"" "$LINENO" 5 + as_fn_error $? "\"libhal not found, required for HAL support\"" "$LINENO" 5 fi if test "${nut_with_hal}" = "yes" -a "${nut_have_libusb}" != "yes"; then - as_fn_error "\"libusb not found, required for HAL support\"" "$LINENO" 5 + as_fn_error $? "\"libusb not found, required for HAL support\"" "$LINENO" 5 fi if test "${nut_with_hal}" != "no"; then @@ -9610,7 +8989,7 @@ no) if test -z "${DOC_NOBUILD_LIST}"; then nut_with_doc="yes" else - as_fn_error "\"Asciidoc is required for documentation support and missing\"" "$LINENO" 5 + as_fn_error $? "\"Asciidoc is required for documentation support and missing\"" "$LINENO" 5 fi ;; esac @@ -9825,7 +9204,7 @@ esac done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then - as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5 + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED @@ -9904,7 +9283,7 @@ esac done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then - as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP @@ -10020,7 +9399,7 @@ else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then : @@ -10222,13 +9601,13 @@ if test "${lt_cv_nm_interface+set}" = set; then : else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:10225: $ac_compile\"" >&5) + (eval echo "\"\$as_me:9604: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 - (eval echo "\"\$as_me:10228: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval echo "\"\$as_me:9607: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 - (eval echo "\"\$as_me:10231: output\"" >&5) + (eval echo "\"\$as_me:9610: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" @@ -11433,7 +10812,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 11436 "configure"' > conftest.$ac_ext + echo '#line 10815 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -12695,11 +12074,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:12698: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12077: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:12702: \$? = $ac_status" >&5 + echo "$as_me:12081: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -13034,11 +12413,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:13037: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12416: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:13041: \$? = $ac_status" >&5 + echo "$as_me:12420: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -13139,11 +12518,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:13142: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12521: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:13146: \$? = $ac_status" >&5 + echo "$as_me:12525: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -13194,11 +12573,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:13197: $lt_compile\"" >&5) + (eval echo "\"\$as_me:12576: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:13201: \$? = $ac_status" >&5 + echo "$as_me:12580: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -15578,7 +14957,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 15581 "configure" +#line 14960 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -15674,7 +15053,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 15677 "configure" +#line 15056 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -15967,7 +15346,7 @@ if test "${with_statepath+set}" = set; then : withval=$with_statepath; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-statepath - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-statepath - see docs/configure.txt" "$LINENO" 5 ;; *) STATEPATH="${withval}" @@ -15993,7 +15372,7 @@ if test "${with_altpidpath+set}" = set; then : withval=$with_altpidpath; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-altpidpath - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-altpidpath - see docs/configure.txt" "$LINENO" 5 ;; *) ALTPIDPATH="${withval}" @@ -16022,7 +15401,7 @@ if test "${with_drvpath+set}" = set; then : withval=$with_drvpath; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-drvpath - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-drvpath - see docs/configure.txt" "$LINENO" 5 ;; *) driverexecdir="${withval}" @@ -16050,7 +15429,7 @@ if test "${with_cgipath+set}" = set; then : withval=$with_cgipath; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-cgipath - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-cgipath - see docs/configure.txt" "$LINENO" 5 ;; *) cgiexecdir="${withval}" @@ -16078,7 +15457,7 @@ if test "${with_htmlpath+set}" = set; then : withval=$with_htmlpath; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-htmlpath - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-htmlpath - see docs/configure.txt" "$LINENO" 5 ;; *) htmldir="${withval}" @@ -16106,7 +15485,7 @@ if test "${with_pidpath+set}" = set; then : withval=$with_pidpath; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-pidpath - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-pidpath - see docs/configure.txt" "$LINENO" 5 ;; *) PIDPATH="${withval}" @@ -16131,7 +15510,7 @@ if test "${with_port+set}" = set; then : withval=$with_port; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-port - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-port - see docs/configure.txt" "$LINENO" 5 ;; *) PORT="${withval}" @@ -16160,7 +15539,7 @@ if test "${with_user+set}" = set; then : withval=$with_user; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-user - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-user - see docs/configure.txt" "$LINENO" 5 ;; *) RUN_AS_USER="${withval}" @@ -16190,7 +15569,7 @@ if test "${with_group+set}" = set; then : withval=$with_group; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-group - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-group - see docs/configure.txt" "$LINENO" 5 ;; *) RUN_AS_GROUP="${withval}" @@ -16213,9 +15592,9 @@ _ACEOF $as_echo "${RUN_AS_GROUP}" >&6; } if test "${nut_user_given}" = "yes" -a "${nut_group_given}" = "no"; then - as_fn_error "\"If you specify --with-user, you also must specify --with-group\"" "$LINENO" 5 + as_fn_error $? "\"If you specify --with-user, you also must specify --with-group\"" "$LINENO" 5 elif test "${nut_user_given}" = "no" -a "${nut_group_given}" = "yes"; then - as_fn_error "\"If you specify --with-group, you also must specify --with-user\"" "$LINENO" 5 + as_fn_error $? "\"If you specify --with-group, you also must specify --with-user\"" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking facility for syslog" >&5 @@ -16226,7 +15605,7 @@ if test "${with_logfacility+set}" = set; then : withval=$with_logfacility; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-logfacility - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-logfacility - see docs/configure.txt" "$LINENO" 5 ;; *) LOGFACILITY="${withval}" @@ -16255,7 +15634,7 @@ if test "${with_drivers+set}" = set; then : withval=$with_drivers; case "${withval}" in yes|no) - as_fn_error "invalid option --with(out)-drivers - see docs/configure.txt" "$LINENO" 5 + as_fn_error $? "invalid option --with(out)-drivers - see docs/configure.txt" "$LINENO" 5 ;; *) DRIVER_BUILD_LIST=`echo ${withval} | sed "s/,/ /g"` @@ -16380,7 +15759,7 @@ if test "${with_hotplug_dir+set}" = set; then : if test -z "${hotplugdir}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } - as_fn_error "\"hotplug directory requested but not found\"" "$LINENO" 5 + as_fn_error $? "\"hotplug directory requested but not found\"" "$LINENO" 5 fi ;; auto) @@ -16422,7 +15801,7 @@ if test "${with_udev_dir+set}" = set; then : if test -z "${udevdir}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } - as_fn_error "\"udev directory requested but not found\"" "$LINENO" 5 + as_fn_error $? "\"udev directory requested but not found\"" "$LINENO" 5 fi ;; auto) @@ -16567,6 +15946,7 @@ _ACEOF conftemp="${datadir}" eval conftemp=\"${conftemp}\" eval conftemp=\"${conftemp}\" +DATADIR=${conftemp} cat >>confdefs.h <<_ACEOF #define DATADIR "${conftemp}" @@ -16576,6 +15956,7 @@ _ACEOF conftemp="${bindir}" eval conftemp=\"${conftemp}\" eval conftemp=\"${conftemp}\" +BINDIR=${conftemp} cat >>confdefs.h <<_ACEOF #define BINDIR "${conftemp}" @@ -16708,6 +16089,7 @@ DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= +U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' @@ -16731,84 +16113,84 @@ else fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error "conditional \"AMDEP\" was never defined. + as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error "conditional \"am__fastdepCC\" was never defined. + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then - as_fn_error "conditional \"MAINTAINER_MODE\" was never defined. + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error "conditional \"am__fastdepCC\" was never defined. + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_SERIAL_TRUE}" && test -z "${WITH_SERIAL_FALSE}"; then - as_fn_error "conditional \"WITH_SERIAL\" was never defined. + as_fn_error $? "conditional \"WITH_SERIAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_USB_TRUE}" && test -z "${WITH_USB_FALSE}"; then - as_fn_error "conditional \"WITH_USB\" was never defined. + as_fn_error $? "conditional \"WITH_USB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_SNMP_TRUE}" && test -z "${WITH_SNMP_FALSE}"; then - as_fn_error "conditional \"WITH_SNMP\" was never defined. + as_fn_error $? "conditional \"WITH_SNMP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_NEONXML_TRUE}" && test -z "${WITH_NEONXML_FALSE}"; then - as_fn_error "conditional \"WITH_NEONXML\" was never defined. + as_fn_error $? "conditional \"WITH_NEONXML\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_LIBPOWERMAN_TRUE}" && test -z "${WITH_LIBPOWERMAN_FALSE}"; then - as_fn_error "conditional \"WITH_LIBPOWERMAN\" was never defined. + as_fn_error $? "conditional \"WITH_LIBPOWERMAN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_SSL_TRUE}" && test -z "${WITH_SSL_FALSE}"; then - as_fn_error "conditional \"WITH_SSL\" was never defined. + as_fn_error $? "conditional \"WITH_SSL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_WRAP_TRUE}" && test -z "${WITH_WRAP_FALSE}"; then - as_fn_error "conditional \"WITH_WRAP\" was never defined. + as_fn_error $? "conditional \"WITH_WRAP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_CGI_TRUE}" && test -z "${WITH_CGI_FALSE}"; then - as_fn_error "conditional \"WITH_CGI\" was never defined. + as_fn_error $? "conditional \"WITH_CGI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_HAL_TRUE}" && test -z "${WITH_HAL_FALSE}"; then - as_fn_error "conditional \"WITH_HAL\" was never defined. + as_fn_error $? "conditional \"WITH_HAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_ASCIIDOC_TRUE}" && test -z "${HAVE_ASCIIDOC_FALSE}"; then - as_fn_error "conditional \"HAVE_ASCIIDOC\" was never defined. + as_fn_error $? "conditional \"HAVE_ASCIIDOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_DEV_TRUE}" && test -z "${WITH_DEV_FALSE}"; then - as_fn_error "conditional \"WITH_DEV\" was never defined. + as_fn_error $? "conditional \"WITH_DEV\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SOME_DRIVERS_TRUE}" && test -z "${SOME_DRIVERS_FALSE}"; then - as_fn_error "conditional \"SOME_DRIVERS\" was never defined. + as_fn_error $? "conditional \"SOME_DRIVERS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_PKG_CONFIG_TRUE}" && test -z "${WITH_PKG_CONFIG_FALSE}"; then - as_fn_error "conditional \"WITH_PKG_CONFIG\" was never defined. + as_fn_error $? "conditional \"WITH_PKG_CONFIG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_HOTPLUG_TRUE}" && test -z "${WITH_HOTPLUG_FALSE}"; then - as_fn_error "conditional \"WITH_HOTPLUG\" was never defined. + as_fn_error $? "conditional \"WITH_HOTPLUG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_UDEV_TRUE}" && test -z "${WITH_UDEV_FALSE}"; then - as_fn_error "conditional \"WITH_UDEV\" was never defined. + as_fn_error $? "conditional \"WITH_UDEV\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MANUALUPDATE_TRUE}" && test -z "${MANUALUPDATE_FALSE}"; then - as_fn_error "conditional \"MANUALUPDATE\" was never defined. + as_fn_error $? "conditional \"MANUALUPDATE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi @@ -16958,19 +16340,19 @@ export LANGUAGE (unset CDPATH) >/dev/null 2>&1 && unset CDPATH -# as_fn_error ERROR [LINENO LOG_FD] -# --------------------------------- +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with status $?, using 1 if that was 0. +# script with STATUS, using 1 if that was 0. as_fn_error () { - as_status=$?; test $as_status -eq 0 && as_status=1 - if test "$3"; then - as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $1" >&2 + $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error @@ -17166,7 +16548,7 @@ $as_echo X"$as_dir" | test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p @@ -17219,8 +16601,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by nut $as_me 2.6.0, which was -generated by GNU Autoconf 2.65. Invocation command line was +This file was extended by nut $as_me 2.6.1, which was +generated by GNU Autoconf 2.67. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -17285,11 +16667,11 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -nut config.status 2.6.0 -configured by $0, generated by GNU Autoconf 2.65, +nut config.status 2.6.1 +configured by $0, generated by GNU Autoconf 2.67, with options \\"\$ac_cs_config\\" -Copyright (C) 2009 Free Software Foundation, Inc. +Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -17307,11 +16689,16 @@ ac_need_defaults=: while test $# != 0 do case $1 in - --*=*) + --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; *) ac_option=$1 ac_optarg=$2 @@ -17333,6 +16720,7 @@ do $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; @@ -17345,7 +16733,7 @@ do ac_need_defaults=false;; --he | --h) # Conflict between --help and --header - as_fn_error "ambiguous option: \`$1' + as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; @@ -17354,7 +16742,7 @@ Try \`$0 --help' for more information.";; ac_cs_silent=: ;; # This is an error. - -*) as_fn_error "unrecognized option: \`$1' + -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" @@ -17399,24 +16787,6 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" -# variables for create stdint.h replacement -PACKAGE="$PACKAGE" -VERSION="$VERSION" -ac_stdint_h="$ac_stdint_h" -_ac_stdint_h=`$as_echo "_$PACKAGE-$ac_stdint_h" | $as_tr_cpp` -ac_cv_stdint_message="$ac_cv_stdint_message" -ac_cv_header_stdint_t="$ac_cv_header_stdint_t" -ac_cv_header_stdint_x="$ac_cv_header_stdint_x" -ac_cv_header_stdint_o="$ac_cv_header_stdint_o" -ac_cv_header_stdint_u="$ac_cv_header_stdint_u" -ac_cv_type_uint64_t="$ac_cv_type_uint64_t" -ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t" -ac_cv_char_data_model="$ac_cv_char_data_model" -ac_cv_long_data_model="$ac_cv_long_data_model" -ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t" -ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t" -ac_cv_type_intmax_t="$ac_cv_type_intmax_t" - # The HP-UX ksh and POSIX shell print the target directory to stdout @@ -17683,7 +17053,6 @@ do case $ac_config_target in "include/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "$ac_stdint_h") CONFIG_COMMANDS="$CONFIG_COMMANDS $ac_stdint_h" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "clients/Makefile") CONFIG_FILES="$CONFIG_FILES clients/Makefile" ;; "common/Makefile") CONFIG_FILES="$CONFIG_FILES common/Makefile" ;; @@ -17722,7 +17091,7 @@ do "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; esac done @@ -17760,7 +17129,7 @@ $debug || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") -} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. @@ -17777,7 +17146,7 @@ if test "x$ac_cr" = x; then fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\r' + ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi @@ -17791,18 +17160,18 @@ _ACEOF echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -17891,20 +17260,28 @@ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ - || as_fn_error "could not setup config files machinery" "$LINENO" 5 + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/ -s/:*\${srcdir}:*/:/ -s/:*@srcdir@:*/:/ -s/^\([^=]*=[ ]*\):*/\1/ + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// s/^[^=]*=[ ]*$// }' fi @@ -17932,7 +17309,7 @@ for ac_last_try in false false :; do if test -z "$ac_t"; then break elif $ac_last_try; then - as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -18017,7 +17394,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error "could not setup config headers machinery" "$LINENO" 5 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" @@ -18030,7 +17407,7 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -18058,7 +17435,7 @@ do [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" @@ -18085,7 +17462,7 @@ $as_echo "$as_me: creating $ac_file" >&6;} case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac @@ -18222,22 +17599,22 @@ s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&5 +which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&2;} +which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # @@ -18248,19 +17625,19 @@ which seems to be undefined. Please make sure it is defined." >&2;} $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error "could not create -" "$LINENO" 5 + || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" @@ -18399,470 +17776,6 @@ $as_echo X"$file" | done done } - ;; - "$ac_stdint_h":C) -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_stdint_h : $_ac_stdint_h" >&5 -$as_echo "$as_me: creating $ac_stdint_h : $_ac_stdint_h" >&6;} -ac_stdint=$tmp/_stdint.h - -echo "#ifndef" $_ac_stdint_h >$ac_stdint -echo "#define" $_ac_stdint_h "1" >>$ac_stdint -echo "#ifndef" _GENERATED_STDINT_H >>$ac_stdint -echo "#define" _GENERATED_STDINT_H '"'$PACKAGE $VERSION'"' >>$ac_stdint -echo "/* generated $ac_cv_stdint_message */" >>$ac_stdint -if test "_$ac_cv_header_stdint_t" != "_" ; then -echo "#define _STDINT_HAVE_STDINT_H" "1" >>$ac_stdint -echo "#include " >>$ac_stdint -echo "#endif" >>$ac_stdint -echo "#endif" >>$ac_stdint -else - -cat >>$ac_stdint < -#else -#include - -/* .................... configured part ............................ */ - -STDINT_EOF - -echo "/* whether we have a C99 compatible stdint header file */" >>$ac_stdint -if test "_$ac_cv_header_stdint_x" != "_" ; then - ac_header="$ac_cv_header_stdint_x" - echo "#define _STDINT_HEADER_INTPTR" '"'"$ac_header"'"' >>$ac_stdint -else - echo "/* #undef _STDINT_HEADER_INTPTR */" >>$ac_stdint -fi - -echo "/* whether we have a C96 compatible inttypes header file */" >>$ac_stdint -if test "_$ac_cv_header_stdint_o" != "_" ; then - ac_header="$ac_cv_header_stdint_o" - echo "#define _STDINT_HEADER_UINT32" '"'"$ac_header"'"' >>$ac_stdint -else - echo "/* #undef _STDINT_HEADER_UINT32 */" >>$ac_stdint -fi - -echo "/* whether we have a BSD compatible inet types header */" >>$ac_stdint -if test "_$ac_cv_header_stdint_u" != "_" ; then - ac_header="$ac_cv_header_stdint_u" - echo "#define _STDINT_HEADER_U_INT32" '"'"$ac_header"'"' >>$ac_stdint -else - echo "/* #undef _STDINT_HEADER_U_INT32 */" >>$ac_stdint -fi - -echo "" >>$ac_stdint - -if test "_$ac_header" != "_" ; then if test "$ac_header" != "stddef.h" ; then - echo "#include <$ac_header>" >>$ac_stdint - echo "" >>$ac_stdint -fi fi - -echo "/* which 64bit typedef has been found */" >>$ac_stdint -if test "$ac_cv_type_uint64_t" = "yes" ; then -echo "#define _STDINT_HAVE_UINT64_T" "1" >>$ac_stdint -else -echo "/* #undef _STDINT_HAVE_UINT64_T */" >>$ac_stdint -fi -if test "$ac_cv_type_u_int64_t" = "yes" ; then -echo "#define _STDINT_HAVE_U_INT64_T" "1" >>$ac_stdint -else -echo "/* #undef _STDINT_HAVE_U_INT64_T */" >>$ac_stdint -fi -echo "" >>$ac_stdint - -echo "/* which type model has been detected */" >>$ac_stdint -if test "_$ac_cv_char_data_model" != "_" ; then -echo "#define _STDINT_CHAR_MODEL" "$ac_cv_char_data_model" >>$ac_stdint -echo "#define _STDINT_LONG_MODEL" "$ac_cv_long_data_model" >>$ac_stdint -else -echo "/* #undef _STDINT_CHAR_MODEL // skipped */" >>$ac_stdint -echo "/* #undef _STDINT_LONG_MODEL // skipped */" >>$ac_stdint -fi -echo "" >>$ac_stdint - -echo "/* whether int_least types were detected */" >>$ac_stdint -if test "$ac_cv_type_int_least32_t" = "yes"; then -echo "#define _STDINT_HAVE_INT_LEAST32_T" "1" >>$ac_stdint -else -echo "/* #undef _STDINT_HAVE_INT_LEAST32_T */" >>$ac_stdint -fi -echo "/* whether int_fast types were detected */" >>$ac_stdint -if test "$ac_cv_type_int_fast32_t" = "yes"; then -echo "#define _STDINT_HAVE_INT_FAST32_T" "1" >>$ac_stdint -else -echo "/* #undef _STDINT_HAVE_INT_FAST32_T */" >>$ac_stdint -fi -echo "/* whether intmax_t type was detected */" >>$ac_stdint -if test "$ac_cv_type_intmax_t" = "yes"; then -echo "#define _STDINT_HAVE_INTMAX_T" "1" >>$ac_stdint -else -echo "/* #undef _STDINT_HAVE_INTMAX_T */" >>$ac_stdint -fi -echo "" >>$ac_stdint - - cat >>$ac_stdint <= 199901L -#define _HAVE_UINT64_T -#define _HAVE_LONGLONG_UINT64_T -typedef long long int64_t; -typedef unsigned long long uint64_t; - -#elif !defined __STRICT_ANSI__ -#if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__ -#define _HAVE_UINT64_T -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; - -#elif defined __GNUC__ || defined __MWERKS__ || defined __ELF__ -/* note: all ELF-systems seem to have loff-support which needs 64-bit */ -#if !defined _NO_LONGLONG -#define _HAVE_UINT64_T -#define _HAVE_LONGLONG_UINT64_T -typedef long long int64_t; -typedef unsigned long long uint64_t; -#endif - -#elif defined __alpha || (defined __mips && defined _ABIN32) -#if !defined _NO_LONGLONG -typedef long int64_t; -typedef unsigned long uint64_t; -#endif - /* compiler/cpu type to define int64_t */ -#endif -#endif -#endif - -#if defined _STDINT_HAVE_U_INT_TYPES -/* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */ -typedef u_int8_t uint8_t; -typedef u_int16_t uint16_t; -typedef u_int32_t uint32_t; - -/* glibc compatibility */ -#ifndef __int8_t_defined -#define __int8_t_defined -#endif -#endif - -#ifdef _STDINT_NEED_INT_MODEL_T -/* we must guess all the basic types. Apart from byte-adressable system, */ -/* there a few 32-bit-only dsp-systems that we guard with BYTE_MODEL 8-} */ -/* (btw, those nibble-addressable systems are way off, or so we assume) */ - - -#if defined _STDINT_BYTE_MODEL -#if _STDINT_LONG_MODEL+0 == 242 -/* 2:4:2 = IP16 = a normal 16-bit system */ -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned long uint32_t; -#ifndef __int8_t_defined -#define __int8_t_defined -typedef char int8_t; -typedef short int16_t; -typedef long int32_t; -#endif -#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL == 444 -/* 2:4:4 = LP32 = a 32-bit system derived from a 16-bit */ -/* 4:4:4 = ILP32 = a normal 32-bit system */ -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -#ifndef __int8_t_defined -#define __int8_t_defined -typedef char int8_t; -typedef short int16_t; -typedef int int32_t; -#endif -#elif _STDINT_LONG_MODEL+0 == 484 || _STDINT_LONG_MODEL+0 == 488 -/* 4:8:4 = IP32 = a 32-bit system prepared for 64-bit */ -/* 4:8:8 = LP64 = a normal 64-bit system */ -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -#ifndef __int8_t_defined -#define __int8_t_defined -typedef char int8_t; -typedef short int16_t; -typedef int int32_t; -#endif -/* this system has a "long" of 64bit */ -#ifndef _HAVE_UINT64_T -#define _HAVE_UINT64_T -typedef unsigned long uint64_t; -typedef long int64_t; -#endif -#elif _STDINT_LONG_MODEL+0 == 448 -/* LLP64 a 64-bit system derived from a 32-bit system */ -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -#ifndef __int8_t_defined -#define __int8_t_defined -typedef char int8_t; -typedef short int16_t; -typedef int int32_t; -#endif -/* assuming the system has a "long long" */ -#ifndef _HAVE_UINT64_T -#define _HAVE_UINT64_T -#define _HAVE_LONGLONG_UINT64_T -typedef unsigned long long uint64_t; -typedef long long int64_t; -#endif -#else -#define _STDINT_NO_INT32_T -#endif -#else -#define _STDINT_NO_INT8_T -#define _STDINT_NO_INT32_T -#endif -#endif - -/* - * quote from SunOS-5.8 sys/inttypes.h: - * Use at your own risk. As of February 1996, the committee is squarely - * behind the fixed sized types; the "least" and "fast" types are still being - * discussed. The probability that the "fast" types may be removed before - * the standard is finalized is high enough that they are not currently - * implemented. - */ - -#if defined _STDINT_NEED_INT_LEAST_T -typedef int8_t int_least8_t; -typedef int16_t int_least16_t; -typedef int32_t int_least32_t; -#ifdef _HAVE_UINT64_T -typedef int64_t int_least64_t; -#endif - -typedef uint8_t uint_least8_t; -typedef uint16_t uint_least16_t; -typedef uint32_t uint_least32_t; -#ifdef _HAVE_UINT64_T -typedef uint64_t uint_least64_t; -#endif - /* least types */ -#endif - -#if defined _STDINT_NEED_INT_FAST_T -typedef int8_t int_fast8_t; -typedef int int_fast16_t; -typedef int32_t int_fast32_t; -#ifdef _HAVE_UINT64_T -typedef int64_t int_fast64_t; -#endif - -typedef uint8_t uint_fast8_t; -typedef unsigned uint_fast16_t; -typedef uint32_t uint_fast32_t; -#ifdef _HAVE_UINT64_T -typedef uint64_t uint_fast64_t; -#endif - /* fast types */ -#endif - -#ifdef _STDINT_NEED_INTMAX_T -#ifdef _HAVE_UINT64_T -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; -#else -typedef long intmax_t; -typedef unsigned long uintmax_t; -#endif -#endif - -#ifdef _STDINT_NEED_INTPTR_T -#ifndef __intptr_t_defined -#define __intptr_t_defined -/* we encourage using "long" to store pointer values, never use "int" ! */ -#if _STDINT_LONG_MODEL+0 == 242 || _STDINT_LONG_MODEL+0 == 484 -typedef unsigned int uintptr_t; -typedef int intptr_t; -#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL+0 == 444 -typedef unsigned long uintptr_t; -typedef long intptr_t; -#elif _STDINT_LONG_MODEL+0 == 448 && defined _HAVE_UINT64_T -typedef uint64_t uintptr_t; -typedef int64_t intptr_t; -#else /* matches typical system types ILP32 and LP64 - but not IP16 or LLP64 */ -typedef unsigned long uintptr_t; -typedef long intptr_t; -#endif -#endif -#endif - -/* The ISO C99 standard specifies that in C++ implementations these - should only be defined if explicitly requested. */ -#if !defined __cplusplus || defined __STDC_CONSTANT_MACROS -#ifndef UINT32_C - -/* Signed. */ -# define INT8_C(c) c -# define INT16_C(c) c -# define INT32_C(c) c -# ifdef _HAVE_LONGLONG_UINT64_T -# define INT64_C(c) c ## L -# else -# define INT64_C(c) c ## LL -# endif - -/* Unsigned. */ -# define UINT8_C(c) c ## U -# define UINT16_C(c) c ## U -# define UINT32_C(c) c ## U -# ifdef _HAVE_LONGLONG_UINT64_T -# define UINT64_C(c) c ## UL -# else -# define UINT64_C(c) c ## ULL -# endif - -/* Maximal type. */ -# ifdef _HAVE_LONGLONG_UINT64_T -# define INTMAX_C(c) c ## L -# define UINTMAX_C(c) c ## UL -# else -# define INTMAX_C(c) c ## LL -# define UINTMAX_C(c) c ## ULL -# endif - - /* literalnumbers */ -#endif -#endif - -/* These limits are merily those of a two complement byte-oriented system */ - -/* Minimum of signed integral types. */ -# define INT8_MIN (-128) -# define INT16_MIN (-32767-1) -# define INT32_MIN (-2147483647-1) -# define INT64_MIN (-__INT64_C(9223372036854775807)-1) -/* Maximum of signed integral types. */ -# define INT8_MAX (127) -# define INT16_MAX (32767) -# define INT32_MAX (2147483647) -# define INT64_MAX (__INT64_C(9223372036854775807)) - -/* Maximum of unsigned integral types. */ -# define UINT8_MAX (255) -# define UINT16_MAX (65535) -# define UINT32_MAX (4294967295U) -# define UINT64_MAX (__UINT64_C(18446744073709551615)) - -/* Minimum of signed integral types having a minimum size. */ -# define INT_LEAST8_MIN INT8_MIN -# define INT_LEAST16_MIN INT16_MIN -# define INT_LEAST32_MIN INT32_MIN -# define INT_LEAST64_MIN INT64_MIN -/* Maximum of signed integral types having a minimum size. */ -# define INT_LEAST8_MAX INT8_MAX -# define INT_LEAST16_MAX INT16_MAX -# define INT_LEAST32_MAX INT32_MAX -# define INT_LEAST64_MAX INT64_MAX - -/* Maximum of unsigned integral types having a minimum size. */ -# define UINT_LEAST8_MAX UINT8_MAX -# define UINT_LEAST16_MAX UINT16_MAX -# define UINT_LEAST32_MAX UINT32_MAX -# define UINT_LEAST64_MAX UINT64_MAX - - /* shortcircuit*/ -#endif - /* once */ -#endif -#endif -STDINT_EOF -fi - if cmp -s $ac_stdint_h $ac_stdint 2>/dev/null; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_stdint_h is unchanged" >&5 -$as_echo "$as_me: $ac_stdint_h is unchanged" >&6;} - else - ac_dir=`$as_dirname -- "$ac_stdint_h" || -$as_expr X"$ac_stdint_h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_stdint_h" : 'X\(//\)[^/]' \| \ - X"$ac_stdint_h" : 'X\(//\)$' \| \ - X"$ac_stdint_h" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_stdint_h" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - rm -f $ac_stdint_h - mv $ac_stdint $ac_stdint_h - fi ;; "libtool":C) @@ -19509,7 +18422,7 @@ _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || - as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. @@ -19530,7 +18443,7 @@ if test "$no_create" != yes; then exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit $? + $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 diff --git a/configure.in b/configure.in index 7af73e4..bdbb136 100644 --- a/configure.in +++ b/configure.in @@ -3,7 +3,7 @@ dnl | Network UPS Tools: configure.in | dnl +------------------------------------------------------------------+ dnl NUT version number is defined here and *only* here (no more include/version) -AC_INIT(nut, 2.6.0) +AC_INIT(nut, 2.6.1) AC_CONFIG_SRCDIR(server/upsd.c) AC_CONFIG_MACRO_DIR([m4]) echo "Network UPS Tools version ${PACKAGE_VERSION}" @@ -108,6 +108,14 @@ then CFLAGS="${CFLAGS} -Wall -Wsign-compare" fi +case ${target_os} in + hpux11* ) + dnl It seems like the thread safe string functions won't be included + dnl on 64 bit HP-UX unless we define _REENTRANT + CFLAGS="${CFLAGS} -D_REENTRANT" + ;; +esac + dnl optind handling: dnl need to check if unistd.h is enough, else try getopt.h, else need decls AC_CHECK_DECLS(optind, [], [ @@ -148,7 +156,6 @@ AC_CHECK_HEADERS(sys/modem.h stdarg.h varargs.h sys/termios.h sys/time.h, [], [] dnl ---------------------------------------------------------------------- dnl Check for types and define possible replacements -AX_CREATE_STDINT_H(include/nut_stdint.h) NUT_TYPE_SOCKLEN_T dnl ---------------------------------------------------------------------- @@ -156,7 +163,7 @@ dnl check for --with-all (or --without-all, or --with-all=auto) flag AC_MSG_CHECKING(for --with-all) AC_ARG_WITH(all, - AS_HELP_STRING([--with-all], [enable serial, usb, snmp, hal, cgi, dev, neon, powerman]), + AS_HELP_STRING([--with-all], [enable serial, usb, snmp, neon, powerman, cgi, dev]), [ if test -n "${withval}"; then dnl Note: we allow "no" as a positive value, because @@ -164,7 +171,6 @@ AC_ARG_WITH(all, if test -z "${with_serial}"; then with_serial="${withval}"; fi if test -z "${with_usb}"; then with_usb="${withval}"; fi if test -z "${with_snmp}"; then with_snmp="${withval}"; fi - if test -z "${with_hal}"; then with_hal="${withval}"; fi if test -z "${with_neon}"; then with_neon="${withval}"; fi if test -z "${with_powerman}"; then with_powerman="${withval}"; fi if test -z "${with_cgi}"; then with_cgi="${withval}"; fi @@ -848,12 +854,14 @@ dnl same for datadir conftemp="${datadir}" eval conftemp=\"${conftemp}\" eval conftemp=\"${conftemp}\" +DATADIR=${conftemp} AC_DEFINE_UNQUOTED(DATADIR, "${conftemp}", [Default path for data files]) dnl same for bindir conftemp="${bindir}" eval conftemp=\"${conftemp}\" eval conftemp=\"${conftemp}\" +BINDIR=${conftemp} AC_DEFINE_UNQUOTED(BINDIR, "${conftemp}", [Default path for user executables]) AC_SUBST(OS_NAME) diff --git a/data/Makefile.in b/data/Makefile.in index fb8e69a..b70eda8 100644 --- a/data/Makefile.in +++ b/data/Makefile.in @@ -42,7 +42,6 @@ DIST_COMMON = $(dist_data_DATA) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/driver.list.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ diff --git a/data/cmdvartab b/data/cmdvartab index f594412..1765213 100644 --- a/data/cmdvartab +++ b/data/cmdvartab @@ -3,12 +3,13 @@ # This file is optional. You may delete it to save resources, but # clients will receive "Unavailable" for any description requests. # -# *** NOTE *** : When updating this file, also update docs/new-names.txt +# *** NOTE *** : When updating this file, also update docs/nut-names.txt VARDESC ups.alarm "UPS alarms" VARDESC ups.status "UPS status" VARDESC ups.time "Internal UPS clock time" VARDESC ups.date "Internal UPS clock date" +VARDESC ups.efficiency "Efficiency of the UPS" VARDESC ups.model "UPS model" VARDESC ups.mfr "UPS manufacturer" VARDESC ups.mfr.date "UPS manufacturing date" diff --git a/data/driver.list.in b/data/driver.list.in index f5501c7..d1b2d5e 100644 --- a/data/driver.list.in +++ b/data/driver.list.in @@ -184,6 +184,7 @@ "Delta" "ups" "1" "GES602N" "" "belkin" "Deltec" "ups" "1" "PowerRite Pro II" "" "genericups upstype=15" +"Deltec" "ups" "4" "PRM 450/700/1000/1500" "" "upscode2" "Digital Loggers" "pdu" "1" "LPC, EPCR2, DIN" "8 outlets" "powerman-pdu (experimental)" @@ -196,6 +197,7 @@ "Dynex" "ups" "2" "DX-800U" "USB" "usbhid-ups" "Eaton" "ups" "5" "Protection Station 500/650/800 VA" "USB" "usbhid-ups" +"Eaton" "ups" "5" "Ellipse ECO 650/800/1200/1600 VA" "USB" "usbhid-ups" "Eaton" "ups" "5" "Ellipse ASR USBS 600/750/1000/1500 VA" "USB cable" "usbhid-ups" "Eaton" "ups" "5" "Ellipse MAX USBS 600/850/1100/1500 VA" "USB cable" "usbhid-ups" "Eaton" "ups" "5" "Evolution 650/850/1150/1550/2000 VA" "USB port" "usbhid-ups" @@ -204,6 +206,7 @@ "Eaton" "ups" "5" "EX 2200/3000/3000 XL VA" "USB port" "usbhid-ups" "Eaton" "ups" "5" "EX 1000 RT2U / 1500 RT2U" "USB port" "usbhid-ups" "Eaton" "ups" "5" "MX 5/8/10/15/20 kVA" "USB port" "usbhid-ups" +"Eaton" "ups" "5" "5 PX" "USB port" "usbhid-ups" "Eaton" "ups" "5" "Nova AVR 625/1250" "USB" "usbhid-ups" "Eaton" "ups" "5" "Ellipse ASR USBS 600/750/1000/1500 VA" "Serial cable" "mge-shut or newmge-shut" "Eaton" "ups" "5" "Ellipse MAX USBS 600/850/1100/1500 VA" "Serial cable" "mge-shut or newmge-shut" @@ -213,12 +216,14 @@ "Eaton" "ups" "5" "EX 2200/3000/3000 XL VA" "Serial port" "mge-shut or newmge-shut" "Eaton" "ups" "5" "EX 1000 RT2U / 1500 RT2U" "Serial port" "mge-shut or newmge-shut" "Eaton" "ups" "5" "MX 5/8/10/15/20 kVA" "Serial port" "mge-shut or newmge-shut" +"Eaton" "ups" "5" "5 PX" "Serial port" "mge-shut or newmge-shut" "Eaton" "ups" "5" "EX RT 1:1 7/11 kVA" "" "mge-shut or newmge-shut" "Eaton" "ups" "5" "EX RT 3:1 5/7/11 kVA" "" "mge-shut or newmge-shut" "Eaton" "ups" "5" "EX RT (XML/HTTP)" "NMC Transverse card (ref 66074)" "netxml-ups (experimental)" "Eaton" "ups" "5" "EX RT (SNMP)" "NMC Transverse card (ref 66074)" "snmp-ups (experimental)" "Eaton" "ups" "5" "E Series NV UPS 400-2000 VA" "" "blazer_usb" "Eaton" "ups" "5" "E Series DX UPS 1-20 kVA" "" "mge-utalk" +"Eaton" "ups" "4" "NetUPS SE 450/700/1000/1500" "" "upscode2" "Eaton" "ups" "5" "BladeUPS (SNMP)" "ConnectUPS Web/SNMP Card" "snmp-ups (experimental)" "Eaton" "ups" "5" "various models (XML/HTTP mode)" "NMC Minislot (Ref 66102)" "netxml-ups (experimental)" "Eaton" "ups" "5" "various models (SNMP mode)" "NMC Minislot (Ref 66102)" "snmp-ups (experimental)" @@ -227,6 +232,7 @@ "Eaton" "pdu" "5" "ePDU Managed" "" "snmp-ups (experimental)" "Eaton" "pdu" "5" "ePDU Monitored" "" "snmp-ups or netxml-ups" "Eaton" "ups" "5" "Powerware 9130" "" "bcmxcp or usbhid-ups" +"Eaton" "ups" "5" "Powerware 9140" "" "bcmxcp or usbhid-ups" "Eaton" "ups" "5" "Powerware 5130" "" "usbhid-ups" "Eaton" "ups" "5" "9395" "Serial port" "bcmxcp" "Eaton" "ups" "5" "Best Ferrups" "older ConnectUPS" "snmp-ups" @@ -247,6 +253,7 @@ "Ever-Power" "ups" "1" "625/1000" "" "safenet" "Exide" "ups" "1" "NetUPS SE" "" "genericups upstype=15" +"Exide" "ups" "4" "NetUPS SE 450/700/1000/1500" "" "upscode2" "Fenton Technologies" "ups" "1" "PowerPal" "P-series" "safenet" "Fenton Technologies" "ups" "5" "PowerPal" "L-series" "blazer_ser" @@ -274,6 +281,8 @@ "Gamatronic" "ups" "5" "MS" "" "gamatronic" "Gamatronic" "ups" "5" "µPS3/1" "" "gamatronic" +"GE" "ups" "2" "EP series" "" "blazer_usb" + "Geek Squad" "ups" "2" "GS1285U" "USB" "usbhid-ups" "Gemini" "ups" "1" "UPS625/UPS1000" "" "safenet" @@ -303,7 +312,8 @@ "Inform" "ups" "1" "GUARD" "Line Interactive AP model" "powercom" "Inform" "ups" "2" "Guard S 1500AP" "" "blazer_ser" -"Inform" "ups" "2" "Informer Compact 1000VA" "" "blazer_ser" +"Inform" "ups" "2" "Informer Compact 1000-2000-3000 VA" "" "blazer_ser" +"Inform" "ups" "2" "Sinus SS 210" "" "blazer_ser" "Infosec" "ups" "2" "iPEL 350" "" "blazer_ser" "Infosec" "ups" "2" "iPEL 500" "" "blazer_ser" @@ -313,6 +323,8 @@ "Infosec" "ups" "2" "XP 500" "USB" "blazer_usb" "Infosec" "ups" "2" "XP 1000" "" "blazer_ser" +"IPAR" "ups" "2" "Mini Energy ME 800" "" "blazer_usb" + "IPMI" "pdu" "1" "" "" "powerman-pdu (experimental)" "Ippon" "ups" "2" "Back Power Pro 400/500/600/700/800" "" "blazer_ser" @@ -554,6 +566,7 @@ "Mustek" "ups" "2" "Powermust" "2000VA USB" "blazer_ser" "Mustek" "ups" "2" "Powermust Office 650" "USB" "blazer_usb" "Mustek" "ups" "2" "PowerMust 424 / 636 / 848" "USB" "blazer_usb" +"Mustek" "ups" "2" "Yukai PowerMust" "1000 USB (PID: 5161)" "blazer_usb" "Mustek" "ups" "2" "Various" "" "blazer_ser" "Neus" "ups" "2" "400va / 600va" "" "blazer_ser" @@ -562,6 +575,8 @@ "Nitram" "ups" "1" "Elite 2002" "" "genericups upstype=16" "Nitram" "ups" "1" "Elite 2005" "" "powerpanel" +"NUMERIC" "ups" "2" "3000 SW" "" "blazer_ser" + "Oneac" "ups" "1" "ON400" "advanced interface" "oneac" "Oneac" "ups" "1" "ON600" "advanced interface" "oneac" "Oneac" "ups" "1" "ON900" "advanced interface" "oneac" @@ -662,7 +677,7 @@ "Repotec" "ups" "1" "RPT-800A" "" "genericups upstype=13" "Repotec" "ups" "1" "RPT-162A" "" "genericups upstype=13" -"Rocketfish" "ups" "2" "RF-1000VA / RF-1025VA" "" "usbhid-ups" +"Rocketfish" "ups" "2" "RF-1000VA / RF-1025VA" "" "usbhid-ups" "SmartLabs" "pdu" "1" "2412S Power Line Modem" "for X10/Insteon" "powerman-pdu (experimental)" @@ -692,8 +707,9 @@ "SuperPower" "ups" "2" "HP360, Hope-550" "" "blazer_ser" -"SVEN" "ups" "2" "Power Pro+ series" "USB" "blazer_usb" -"SVEN" "ups" "2" "Power Smart RM 2000" "USB" "blazer_usb" +"SVEN" "ups" "2" "Power Pro+ series" "USB" "blazer_usb (USB ID 05b8:0000)" +"SVEN" "ups" "1" "Power Pro+ series" "USB" "richcomm_usb (USB ID 0925:1234)" +"SVEN" "ups" "2" "Power Smart RM 2000" "USB" "blazer_usb (USB ID 05b8:0000)" "Sweex" "ups" "1" "500/1000" "smart - shipped with SafeNet" "safenet" "Sweex" "ups" "1" "500/1000" "" "genericups upstype=7" @@ -722,6 +738,8 @@ "Tripp-Lite" "ups" "2" "AVR750U" "USB" "usbhid-ups" "Tripp-Lite" "ups" "2" "ECO550UPS" "USB" "usbhid-ups" "Tripp-Lite" "ups" "2" "SmartOnline SU1500RTXL2ua" "USB" "usbhid-ups" +"Tripp-Lite" "ups" "2" "Smart1000LCD" "USB" "usbhid-ups" +"Tripp-Lite" "ups" "2" "Smart1500LCD" "USB" "usbhid-ups" "Tripp-Lite" "ups" "2" "smart2200RMXL2U" "USB, newer models" "usbhid-ups" "Trust" "ups" "2" "UPS 1000 Management PW-4105" "" "blazer_ser" @@ -755,6 +773,8 @@ "Viewsonic" "ups" "1" "PowerES" "420E" "optiups" +"Vivaldi" "ups" "1" "EA200 LED" "USB" "richcomm_usb" + "WinPower" "ups" "2" "CPM-800" "" "blazer_ser" "WTI" "pdu" "1" "RPS-10" "10 outlets" "powerman-pdu (experimental)" diff --git a/data/html/Makefile.in b/data/html/Makefile.in index 7685a37..3e63f89 100644 --- a/data/html/Makefile.in +++ b/data/html/Makefile.in @@ -40,7 +40,6 @@ DIST_COMMON = README $(am__dist_html_DATA_DIST) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/header.html.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ diff --git a/docs/FAQ.txt b/docs/FAQ.txt index fb913e4..2e6126a 100644 --- a/docs/FAQ.txt +++ b/docs/FAQ.txt @@ -299,15 +299,12 @@ things depending on what's supported: it into powering up whenever line power is present - Teach a monkey to watch the machine and press the power button when the outage is over. - This might work, but it creates high produce bills. If you can't use one of the first two options, give the board to an enemy. Let them worry about it. -== My PowerMac G4 won't power back up by itself (into Linux) after the UPS shuts down. What can I do about this? - -*Answer 1* +== My Mac won't power back up by itself into Linux after the UPS shuts down. What can I do about this? This is about the same situation as the ATX question above, only worse. Earlier Macs apparently supported a hack where you could @@ -324,15 +321,20 @@ From Usenet post <6boftzxz51.fsf@ecc-office.sp.cs.cmu.edu>: autoboot.adb contains these three bytes (in hex): 01 13 01 -Unfortunately, the hardware has evolved and there is no good -equivalent for this hack on today's systems. +Later PowerPC Macs with a PMU and the appropriate kernel driver can achieve the +same effect with the following command: -If you find out how to do this, please send me some mail, since -this affects one of my systems and my stop-gap solution is getting -cranky. + echo server_mode=1 > /proc/pmu/options -Note: this question has been in the FAQ for over a year and -there's still no answer. Let me guess: everyone who runs a server +The following pages have some slightly more kludgy answers which involve the +use of `setpci`, and are highly model-specific: + + - http://mythic-beasts.com/support/macminicolo_howto.html + - http://superuser.com/questions/212434/reboot-after-power-failure-for-mac-running-ubuntu + - http://ubuntuforums.org/showthread.php?t=1209576 + +Note: this question has been in the FAQ for several years now, and +there's still no clean answer. Let me guess: everyone who runs a server on Mac hardware has a team of trained monkeys, and feeds them by growing bananas in the tropical environment formed by waste heat from the equipment. @@ -341,14 +343,14 @@ The rest of us are still waiting for the answer. Booting into the Mac OS to frob the "file server" panel is not an acceptable solution. -*Answer 2* +== My Mac won't power back up by itself into Mac OS X after the UPS shuts down. What can I do about this? -If you're on OS X, this is relatively simple to fix. Go to system -preferences, click on energy saver, click on the options tab, check -"Restart automatically after a power failure". +This is relatively simple to fix. If you have console or VNC access, log in as +an administrator, go to System Preferences, click on energy saver, click on the +options tab, check "Restart automatically after a power failure". -If you're on some other OS, hope they've figured out how to duplicate -the above in a non-simian manner. +Alternatively, you can connect via SSH and run "sudo pmset autorestart 1" to +achieve the same effect. == I want to keep the drivers and upsd in their own security domains. How can this be accomplished? diff --git a/docs/Makefile.in b/docs/Makefile.in index d39db23..1030704 100644 --- a/docs/Makefile.in +++ b/docs/Makefile.in @@ -38,7 +38,6 @@ subdir = docs DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ diff --git a/docs/configure.txt b/docs/configure.txt index 31ffed3..180ad7d 100644 --- a/docs/configure.txt +++ b/docs/configure.txt @@ -75,8 +75,8 @@ Build and install the upsclient library and header files. --with-all (no default) -Build and install all of the above (the serial, USB, and SNMP -drivers, the CGI programs and HTML files, and the upsclient +Build and install all of the above (the serial, USB, SNMP, XML/HTTP and +PowerMan drivers, the CGI programs and HTML files, and the upsclient library). --with-ssl (default: auto-detect) diff --git a/docs/documentation.txt b/docs/documentation.txt index 2d21868..8e84b4d 100644 --- a/docs/documentation.txt +++ b/docs/documentation.txt @@ -53,7 +53,7 @@ These are writeups by users of the software. - link:http://www.dimat.unina2.it/LCS/MonitoraggioUpsNutUbuntu10-eng.htm[Deploying NUT on an Ubuntu 10.04 cluster] '(Stefano Angelone)' - link:http://blog.shadypixel.com/monitoring-a-ups-with-nut-on-debian-or-ubuntu-linux[Monitoring a UPS with nut on Debian or Ubuntu Linux] '(Avery Fay)' - link:http://linux.developpez.com/cours/upsusb/[Installation et gestion d'un UPS USB en réseau sous linux] '(Olivier Van Hoof, french)' -- link:http://boxster.ghz.cc/projects/nut/wiki/NutOnMacOSX[Network UPS Tools (NUT) on Mac OS X (10.4.10)] '(Andy Poush)' +- link:http://trac.networkupstools.org/projects/nut/wiki/NutOnMacOSX[Network UPS Tools (NUT) on Mac OS X (10.4.10)] '(Andy Poush)' - link:http://www.llondel.org/ups.shtml[Interfacing a Contact-Closure UPS to Mac OS X and Linux] '(David Hough)' - link:http://fedoranews.org/contributors/kazutoshi_morioka/nut/[How to use UPS with nut on RedHat / Fedora Core] '(Kazutoshi Morioka)' - link:http://people.freebsd.org/~thierry/nut_FreeBSD_HowTo.txt[FreeBSD installation procedure] '(Thierry Thomas, from FreeBSD)' diff --git a/docs/download.txt b/docs/download.txt index c551902..d4a25c2 100644 --- a/docs/download.txt +++ b/docs/download.txt @@ -23,10 +23,11 @@ to do so. Stable tree: 2.6 ~~~~~~~~~~~~~~~~ -link:http://www.networkupstools.org/source/2.6/nut-2.6.0.tar.gz[nut-2.6.0.tar.gz] -link:http://www.networkupstools.org/source/2.6/nut-2.6.0.tar.gz.sig[signature] -link:http://www.networkupstools.org/source/2.6/new-2.6.0.txt[release notes] -link:http://www.networkupstools.org/source/2.6/ChangeLog[ChangeLog] +- link:http://www.networkupstools.org/source/2.6/nut-2.6.1.tar.gz[nut-2.6.1.tar.gz] +- link:http://www.networkupstools.org/source/2.6/nut-2.6.1.tar.gz.sig[PGP/GPG signature] +- SHA-256 sum: 4ba1d297a98190db0ae86eb31136c780f35e6d3f47ae845316b44eaa9245a86e +- link:http://www.networkupstools.org/source/2.6/new-2.6.1.txt[Release notes] +- link:http://www.networkupstools.org/source/2.6/ChangeLog[ChangeLog] You can also browse the link:http://www.networkupstools.org/source/2.6/[stable source directory]. @@ -48,7 +49,7 @@ link:http://alioth.debian.org/[Debian Alioth server]. To retrieve the current development tree, use the following command: - $ svn co svn://svn.debian.org/nut/trunk + $ svn co svn://anonscm.debian.org/nut/trunk To generate the build scripts, you must call, from the 'trunk' directory: @@ -69,9 +70,8 @@ use <>. Browse code ^^^^^^^^^^^ -You can also browse the code with link:http://svn.debian.org/wsvn/nut/trunk/?rev=0&sc=0[WebSvn]. - -Or through the link:http://boxster.ghz.cc/projects/nut[Trac mirror], +You can also browse the code with link:http://alioth.debian.org/scm/?group_id=30602[WebSvn], +or through the link:http://trac.networkupstools.org/projects/nut[Trac mirror], kindly hosted and maintained by Charles Lepple. [[Snapshots]] @@ -113,5 +113,6 @@ link:http://www.openbsd.org/cgi-bin/cvsweb/ports/sysutils/nut/[OpenBSD]. link:http://pdb.finkproject.org/pdb/package.php/nut[Fink], link:http://trac.macports.org/browser/trunk/dports/sysutils/nut/Portfile[MacPorts] -- Windows (client side only): -link:http://csociety.ecn.purdue.edu/~delpha/winnut/[WinNUT] +- Windows (complete port, Beta): +link:http://www.networkupstools.org/source/2.6/NUT-Installer-2.6.0-1.msi[Windows MSI installer 2.6.0-1] + diff --git a/docs/features.txt b/docs/features.txt index 5e49483..d114ea1 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -235,5 +235,4 @@ The other systems are Slaves of UPS 2. Image credits ------------- -Thanks to Luc Descotils and Arnaud Quette at Eaton for providing shiny -cleaned-up graphics. +Thanks to Eaton for providing shiny modern graphics. diff --git a/docs/images/advanced.png b/docs/images/advanced.png index 1aaf75d41e3d4c8e46f1c94251162259f940eacb..8f1df804eaabab8db0b23ffde371a40b66673fcc 100644 GIT binary patch literal 45511 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%0D=kmvB)blU` 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 literal 32046 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 z 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 diff --git a/docs/images/bigbox.png b/docs/images/bigbox.png index e552b4a947149070c2e7a29f1549f4805eac51a3..37c792a04ac4c52e461bb033c77cc2096f423166 100644 GIT binary patch literal 25121 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 bC=&iZP#=hlkEL&300000NkvXXu0mjf4*OjU diff --git a/docs/images/bizarre.png b/docs/images/bizarre.png index 4e97eaafe31dc64b436d43befee5bff8060d0603..0c56884a3db07712ac4dab21a134663b5eb44342 100644 GIT binary patch literal 48365 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 literal 34200 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 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "APCSMART" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "APCSMART" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/bcmxcp.8 b/docs/man/bcmxcp.8 index 2a7af9d..503db8a 100644 --- a/docs/man/bcmxcp.8 +++ b/docs/man/bcmxcp.8 @@ -2,12 +2,12 @@ .\" Title: bcmxcp .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BCMXCP" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "BCMXCP" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/bcmxcp_usb.8 b/docs/man/bcmxcp_usb.8 index 591c43e..628435f 100644 --- a/docs/man/bcmxcp_usb.8 +++ b/docs/man/bcmxcp_usb.8 @@ -2,12 +2,12 @@ .\" Title: bcmxcp_usb .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BCMXCP_USB" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "BCMXCP_USB" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/belkin.8 b/docs/man/belkin.8 index 4aa1378..07b0e2c 100644 --- a/docs/man/belkin.8 +++ b/docs/man/belkin.8 @@ -2,12 +2,12 @@ .\" Title: belkin .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BELKIN" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "BELKIN" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/belkinunv.8 b/docs/man/belkinunv.8 index eca4c8c..2e1ed16 100644 --- a/docs/man/belkinunv.8 +++ b/docs/man/belkinunv.8 @@ -2,12 +2,12 @@ .\" Title: belkinunv .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BELKINUNV" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "BELKINUNV" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/bestfcom.8 b/docs/man/bestfcom.8 index dfeafd1..e57a232 100644 --- a/docs/man/bestfcom.8 +++ b/docs/man/bestfcom.8 @@ -2,12 +2,12 @@ .\" Title: bestfcom .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BESTFCOM" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "BESTFCOM" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/bestfortress.8 b/docs/man/bestfortress.8 index 031c8fe..d169d47 100644 --- a/docs/man/bestfortress.8 +++ b/docs/man/bestfortress.8 @@ -2,12 +2,12 @@ .\" Title: bestfortress .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BESTFORTRESS" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "BESTFORTRESS" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/bestuferrups.8 b/docs/man/bestuferrups.8 index e45ab0a..59f7bee 100644 --- a/docs/man/bestuferrups.8 +++ b/docs/man/bestuferrups.8 @@ -2,12 +2,12 @@ .\" Title: bestuferrups .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BESTUFERRUPS" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "BESTUFERRUPS" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/bestups.8 b/docs/man/bestups.8 index aed0cee..4849183 100644 --- a/docs/man/bestups.8 +++ b/docs/man/bestups.8 @@ -2,12 +2,12 @@ .\" Title: bestups .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BESTUPS" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "BESTUPS" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/blazer.8 b/docs/man/blazer.8 index 781eea8..daa7244 100644 --- a/docs/man/blazer.8 +++ b/docs/man/blazer.8 @@ -2,12 +2,12 @@ .\" Title: blazer .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "BLAZER" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "BLAZER" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/clone.8 b/docs/man/clone.8 index 94b04be..75ebf97 100644 --- a/docs/man/clone.8 +++ b/docs/man/clone.8 @@ -2,12 +2,12 @@ .\" Title: clone .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "CLONE" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "CLONE" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/dummy-ups.8 b/docs/man/dummy-ups.8 index f50bf03..ba9b312 100644 --- a/docs/man/dummy-ups.8 +++ b/docs/man/dummy-ups.8 @@ -2,12 +2,12 @@ .\" Title: dummy-ups .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "DUMMY\-UPS" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "DUMMY\-UPS" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -63,7 +63,7 @@ For instance: .RE .\} .sp -This file is generally named "something\&.dev"\&. It contains a list of all valid data and associated values, and has the same format as an \fBupsc\fR(8) dump (: )\&. So you can easilly create definition files from an existing UPS using "upsc > file\&.dev"\&. It can also be empty, in which case only a basic set of data is available: device\&.\fB, driver\&.\fR, ups\&.mfr, ups\&.model, ups\&.status +This file is generally named "something\&.dev"\&. It contains a list of all valid data and associated values, and has the same format as an \fBupsc\fR(8) dump (: )\&. So you can easily create definition files from an existing UPS using "upsc > file\&.dev"\&. It can also be empty, in which case only a basic set of data is available: device\&.\fB, driver\&.\fR, ups\&.mfr, ups\&.model, ups\&.status .sp Samples definition files are available in the "data" directory of the nut source tree, and generally in the sysconfig directory of your system distribution\&. .sp diff --git a/docs/man/dummy-ups.txt b/docs/man/dummy-ups.txt index ef55db5..496e8db 100644 --- a/docs/man/dummy-ups.txt +++ b/docs/man/dummy-ups.txt @@ -55,7 +55,7 @@ For instance: This file is generally named "something.dev". It contains a list of all valid data and associated values, and has the same format as an linkman:upsc[8] -dump (: ). So you can easilly create definition +dump (: ). So you can easily create definition files from an existing UPS using "upsc > file.dev". It can also be empty, in which case only a basic set of data is available: device.*, driver.*, ups.mfr, ups.model, ups.status diff --git a/docs/man/etapro.8 b/docs/man/etapro.8 index 236dd99..7f91bbc 100644 --- a/docs/man/etapro.8 +++ b/docs/man/etapro.8 @@ -2,12 +2,12 @@ .\" Title: etapro .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "ETAPRO" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "ETAPRO" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/everups.8 b/docs/man/everups.8 index 94ce786..9d7538b 100644 --- a/docs/man/everups.8 +++ b/docs/man/everups.8 @@ -2,12 +2,12 @@ .\" Title: everups .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "EVERUPS" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "EVERUPS" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/gamatronic.8 b/docs/man/gamatronic.8 index 2c64b44..9503f1e 100644 --- a/docs/man/gamatronic.8 +++ b/docs/man/gamatronic.8 @@ -2,12 +2,12 @@ .\" Title: gamatronic .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "GAMATRONIC" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "GAMATRONIC" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/genericups.8 b/docs/man/genericups.8 index 64a8b74..a0403e5 100644 --- a/docs/man/genericups.8 +++ b/docs/man/genericups.8 @@ -2,12 +2,12 @@ .\" Title: genericups .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "GENERICUPS" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "GENERICUPS" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/hosts.conf.5 b/docs/man/hosts.conf.5 index caf89a3..4b7245d 100644 --- a/docs/man/hosts.conf.5 +++ b/docs/man/hosts.conf.5 @@ -2,12 +2,12 @@ .\" Title: hosts.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "HOSTS\&.CONF" "5" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "HOSTS\&.CONF" "5" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/isbmex.8 b/docs/man/isbmex.8 index f649265..b74b2de 100644 --- a/docs/man/isbmex.8 +++ b/docs/man/isbmex.8 @@ -2,12 +2,12 @@ .\" Title: isbmex .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "ISBMEX" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "ISBMEX" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/ivtscd.8 b/docs/man/ivtscd.8 index f1365f2..9d25e5a 100644 --- a/docs/man/ivtscd.8 +++ b/docs/man/ivtscd.8 @@ -2,12 +2,12 @@ .\" Title: ivtscd .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "IVTSCD" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "IVTSCD" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/libupsclient-config.1 b/docs/man/libupsclient-config.1 index 99d9dcd..74f1382 100644 --- a/docs/man/libupsclient-config.1 +++ b/docs/man/libupsclient-config.1 @@ -2,12 +2,12 @@ .\" Title: libupsclient-config .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "LIBUPSCLIENT\-CONFIG" "1" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "LIBUPSCLIENT\-CONFIG" "1" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/liebert-esp2.8 b/docs/man/liebert-esp2.8 index d574af1..779ee90 100644 --- a/docs/man/liebert-esp2.8 +++ b/docs/man/liebert-esp2.8 @@ -2,12 +2,12 @@ .\" Title: liebert-esp2 .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "LIEBERT\-ESP2" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "LIEBERT\-ESP2" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/liebert.8 b/docs/man/liebert.8 index b1524fa..ab2530a 100644 --- a/docs/man/liebert.8 +++ b/docs/man/liebert.8 @@ -2,12 +2,12 @@ .\" Title: liebert .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "LIEBERT" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "LIEBERT" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/masterguard.8 b/docs/man/masterguard.8 index 11dc582..7ea77e7 100644 --- a/docs/man/masterguard.8 +++ b/docs/man/masterguard.8 @@ -2,12 +2,12 @@ .\" Title: masterguard .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "MASTERGUARD" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "MASTERGUARD" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/metasys.8 b/docs/man/metasys.8 index 7d0f54c..6edef80 100644 --- a/docs/man/metasys.8 +++ b/docs/man/metasys.8 @@ -2,12 +2,12 @@ .\" Title: metasys .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "METASYS" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "METASYS" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -124,7 +124,7 @@ This driver supports no extra arguments from \fBups.conf\fR(5)\&. .sp This driver has been tested on Meta System HF Millennium 820 and ally HF 1000 only\&. .sp -Any informations about the use of the driver with the other listed UPS are really welcome\&. +Any information about the use of the driver with the other listed UPS are really welcome\&. .SH "AUTHOR" .sp Fabio Di Niro diff --git a/docs/man/metasys.txt b/docs/man/metasys.txt index 2e29557..4a6fc2e 100644 --- a/docs/man/metasys.txt +++ b/docs/man/metasys.txt @@ -44,7 +44,7 @@ BUGS This driver has been tested on Meta System HF Millennium 820 and ally HF 1000 only. -Any informations about the use of the driver with the other listed +Any information about the use of the driver with the other listed UPS are really welcome. AUTHOR diff --git a/docs/man/mge-shut.8 b/docs/man/mge-shut.8 index d174e06..bd602a1 100644 --- a/docs/man/mge-shut.8 +++ b/docs/man/mge-shut.8 @@ -2,12 +2,12 @@ .\" Title: mge-shut .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "MGE\-SHUT" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "MGE\-SHUT" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/mge-utalk.8 b/docs/man/mge-utalk.8 index 82d1812..32462ef 100644 --- a/docs/man/mge-utalk.8 +++ b/docs/man/mge-utalk.8 @@ -2,12 +2,12 @@ .\" Title: mge-utalk .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "MGE\-UTALK" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "MGE\-UTALK" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/microdowell.8 b/docs/man/microdowell.8 index a166d56..8a97ec4 100644 --- a/docs/man/microdowell.8 +++ b/docs/man/microdowell.8 @@ -2,12 +2,12 @@ .\" Title: microdowell .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "MICRODOWELL" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "MICRODOWELL" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/netxml-ups.8 b/docs/man/netxml-ups.8 index 2ecc4e0..49eec6a 100644 --- a/docs/man/netxml-ups.8 +++ b/docs/man/netxml-ups.8 @@ -2,12 +2,12 @@ .\" Title: netxml-ups .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NETXML\-UPS" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "NETXML\-UPS" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nut.conf.5 b/docs/man/nut.conf.5 index 9665388..f48a192 100644 --- a/docs/man/nut.conf.5 +++ b/docs/man/nut.conf.5 @@ -2,12 +2,12 @@ .\" Title: nut.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUT\&.CONF" "5" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "NUT\&.CONF" "5" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/nutupsdrv.8 b/docs/man/nutupsdrv.8 index 043fed2..1ddc49e 100644 --- a/docs/man/nutupsdrv.8 +++ b/docs/man/nutupsdrv.8 @@ -2,12 +2,12 @@ .\" Title: nutupsdrv .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "NUTUPSDRV" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "NUTUPSDRV" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/oneac.8 b/docs/man/oneac.8 index 507e23c..1ff049f 100644 --- a/docs/man/oneac.8 +++ b/docs/man/oneac.8 @@ -2,12 +2,12 @@ .\" Title: oneac .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "ONEAC" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "ONEAC" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/optiups.8 b/docs/man/optiups.8 index ec18abc..eda8030 100644 --- a/docs/man/optiups.8 +++ b/docs/man/optiups.8 @@ -2,12 +2,12 @@ .\" Title: optiups .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "OPTIUPS" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "OPTIUPS" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/powercom.8 b/docs/man/powercom.8 index d3a4560..7f48c2f 100644 --- a/docs/man/powercom.8 +++ b/docs/man/powercom.8 @@ -2,12 +2,12 @@ .\" Title: powercom .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "POWERCOM" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "POWERCOM" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -41,7 +41,7 @@ This driver supports the following optional settings in the \fBups.conf\fR(5) fi .PP \fBlinevoltage\fR=\fIvalue\fR .RS 4 -An integer specifying the mains voltage\&. It can\(cqt be auto detected\&. Acceptable values are in the range of 110\(em120 or 220\(em240\&. The default is +An integer specifying the line voltage\&. It can\(cqt be auto detected\&. Acceptable values are in the range of 110\-120 or 220\-240\&. The default is \fI230\fR\&. .RE .PP @@ -66,23 +66,30 @@ Like modelname above, but for the serial number\&. The default is \fBtype\fR=\fIname\fR .RS 4 The exact type of the communication protocol within the powercom family, that will be used to communicate with the UPS\&. The type is named after the first modelname that was coded with that protocol\&. The acceptable names are -\fIKP625AP\fR, \fITrust\fR, \fIEgys\fR, +\fIKP625AP\fR, +\fIIMP\fR, \fIKIN\fR, -\fIBNT\fR, -\fIIMP\fR -and +\fIBNT\fR, and \fIBNT\-other\fR\&. The default is \fITrust\fR\&. .sp \fIBNT\-other\fR -is a special type for BNT 100\-120V models\&. For this type you can (I think must!) specify voltage, batteryPercentage, loadPercentage and validationSequence\&. +is a special type for other BNT models (such as the 1500A at 120V and can be used to override ALL models using ALL of the following values\&. +.RE +.PP +\fBshutdownArguments\fR={{\fIminutes\fR,\fIseconds\fR},\fIwhether_minutes_should_be_used\fR} +.RS 4 +The minutes and seconds that the UPS should wait between receiving the shutdown command and actually shutting off\&. The other argument should be set to the character +\fIn\fR +only when the minutes value should be skipped and not sent to the UPS\&. The default is type\-dependent and is given below\&. The braces and commas are mandatory\&. Note that there should be no whitespace characters\&. .RE .PP \fBnumOfBytesFromUPS\fR=\fIvalue\fR .RS 4 -The number of bytes in a UPS frame\&. The default is type\-dependent and is given below\&. +The number of bytes in a UPS frame: 16 is common, 11 for +\fITrust\fR\&. The default is type\-dependent and is given below\&. .RE .PP \fBmethodOfFlowControl\fR=\fIname\fR @@ -94,36 +101,29 @@ or \fIno_flow_control\fR\&. .RE .PP -\fBshutdownArguments\fR={{\fIminutes\fR,\fIseconds\fR},\fIwhether_minutes_should_be_used\fR} -.RS 4 -The minutes and seconds that the UPS should wait between receiving the shutdown command and actually shutting off\&. The other argument should be set to the character -\fIn\fR -only when the minutes value should be skipped and not sent to the UPS\&. The default is type\-dependent and is given below\&. The braces and commas are mandatory\&. Note that there should be no whitespace characters\&. -.RE -.PP -\fBvoltage\fR={\fIcoefficient1\fR,\fIcoefficient2\fR,\fIcoefficient3\fR,\fIcoefficient4\fR} -.RS 4 -(Only for types KP625AP, Trust, Egys, BNT\-other\&.) A quad that is used convert the raw data to a human\-readable voltage reading\&. The default is type\-dependent and is given below\&. Do note that the braces and commas are mandatory, as well as the lack of whitespace characters\&. -.RE -.PP -\fBfrequency\fR={\fIcoefficient1\fR,\fIcoefficient2\fR} -.RS 4 -(Only for types KP625AP, Trust, Egys\&.) A pair to convert the raw data to a human\-readable frequency reading\&. The default is type\-dependent and is given below\&. Do note that the braces and commas are mandatory as well, as the lack of whitespace characters\&. -.RE -.PP -\fBbatteryPercentage\fR={\fIcoefficient1\fR,\fIcoefficient2\fR,\fIcoefficient3\fR,\fIcoefficient4\fR,\fIcoefficient5\fR} -.RS 4 -(Only for KP625AP, Trust, Egys, BNT\-other\&.) A 5 tuple to convert the raw data to a human\-readable battery percentage reading\&. The default is type\-dependent and is given below\&. Do note that the braces and commas are mandatory, as the lack of white space characters\&. -.RE -.PP -\fBloadPercentage\fR={\fIcoefficient1\fR,\fIcoefficient2\fR,\fIcoefficient3\fR,\fIcoefficient4\fR} -.RS 4 -(Only for types KP625AP, Trust, Egys, BNT\-other\&.) A quad to convert the raw data to human readable load percentage reading\&. The default is type\-dependent and is given below\&. Do note that the braces and commas are mandatory, as the lack of white space characters\&. -.RE -.PP \fBvalidationSequence\fR={{\fIindex1\fR,\fIvalue1\fR},{\fIindex2\fR,\fIvalue2\fR},{\fIindex3\fR,\fIvalue3\fR}} .RS 4 -(Only for types KP625AP, Trust, Egys, BNT\-other\&.) 3 pairs to be used for validating the UPS by comparing bytes of the raw data with constant values\&. The default is type\-dependent and is given below\&. The braces and commas are mandatory, as the lack of white space characters\&. +(Only for types KP625AP, Trust, Egys\&.) 3 pairs to be used for validating the UPS by comparing bytes of the raw data with constant values\&. The index selects the byte from the UPS (see numOfBytesFromUPS) and the value is for matching to the byte\&. The default is type\-dependent and is given below\&. The braces and commas are mandatory, as the lack of white space characters\&. +.RE +.PP +\fBfrequency\fR={\fIA\fR,\fIB\fR} +.RS 4 +(Only for types KP625AP, Trust, Egys\&.) A pair to convert the raw frequency data to a human\-readable frequency reading using the function 1/(A*x+B)\&. If the raw value x IS the frequency, then set A=1/(x^2) and B=0\&. The default is type\-dependent and is given below\&. Do note that the braces and commas are mandatory as well, as the lack of whitespace characters\&. +.RE +.PP +\fBloadPercentage\fR={\fIBatteryA\fR,\fIBatteryB\fR,\fILineA\fR,\fILineB\fR} +.RS 4 +(Only for types KP625AP, Trust, Egys\&.) A quad to convert the raw load data to human readable load percentage reading using the function A*x+B\&. If the raw value x IS the Load Percent, then set A=1 and B=0\&. The default is type\-dependent and is given below\&. Do note that the braces and commas are mandatory, as the lack of white space characters\&. +.RE +.PP +\fBbatteryPercentage\fR={\fIBattery1\fR,\fIBattery2\fR,\fIBattery3\fR,\fILine4\fR,\fILine5\fR} +.RS 4 +(Only for KP625AP, Trust, Egys\&.) A 5 tuple to convert the raw battery and line data to a human\-readable battery and line percentage reading using the functions (Battery) A*x+B*y+C and (Line) D*x+E\&. If the raw value x IS the Battery Percent, then set A=1, B=0, C=0, D=1, E=0\&. The default is type\-dependent and is given below\&. Do note that the braces and commas are mandatory, as the lack of white space characters\&. +.RE +.PP +\fBvoltage\fR={\fI240A\fR,\fI240B\fR,\fI120A\fR,\fI120B\fR} +.RS 4 +(Only for types KP625AP, Trust, Egys\&.) A quad that is used convert the raw voltage data to a human\-readable voltage reading using the function A*x+B\&. If the raw value x IS HALF the Voltage, then set A=2, B=0\&. The default is type\-dependent and is given below\&. Do note that the braces and commas are mandatory, as well as the lack of whitespace characters\&. .RE .SH "DEFAULT VALUES FOR THE EXTRA ARGUMENTS" .sp @@ -141,7 +141,7 @@ type = Trust .RE .\} .sp -The rest of the default values for the extra arguments are type\-dependent: +The rest of the default values for the extra arguments are type\-dependent\&. However, \fIBNT\-other\fR is a special type that can be used to override ALL values for ALL models\&. .SS "Trust" .sp .if n \{\ @@ -248,16 +248,17 @@ numOfBytesFromUPS = 16 methodOfFlowControl = no_flow_control validationSequence = {{8,0},{8,0},{8,0}} shutdownArguments = {{1,30},y} -loadPercentage = {1\&.4474,0\&.0,0\&.8594,0\&.0} -batteryPercentage = {5\&.0000,0\&.3268,\-825\&.00,0\&.46511,0} -voltage = {1\&.9216,\-0\&.0977,0\&.82857,0\&.0000} +frequency = {0\&.00027778,0\&.0000} +loadPercentage = {1\&.0000,0\&.0,1\&.0000,0\&.0} +batteryPercentage = {1\&.0000,0\&.0000,0\&.0000,1\&.0000,0\&.0000} +voltage = {2\&.0000,0\&.0000,2\&.0000,0\&.0000} .fi .if n \{\ .RE .\} .SH "AUTHOR" .sp -Peter Bieringer , Alexey Sidorov +Peter Bieringer , Alexey Sidorov , Keven L\&. Ates .SH "SEE ALSO" .SS "The core driver:" .sp diff --git a/docs/man/powercom.txt b/docs/man/powercom.txt index 020599d..f01bd9a 100644 --- a/docs/man/powercom.txt +++ b/docs/man/powercom.txt @@ -24,84 +24,85 @@ This driver supports the following optional settings in the linkman:ups.conf[5] file: *linevoltage*='value':: -An integer specifying the mains voltage. It can't be auto detected. -Acceptable values are in the range of 110--120 or 220--240. The default -is '230'. +An integer specifying the line voltage. It can't be auto detected. Acceptable +values are in the range of 110-120 or 220-240. The default is '230'. *manufacturer*='name':: -Specify the manufacturer name, which also can't be auto detected. This is -a user defined string, so any name is acceptable. The default is -'PowerCom'. +Specify the manufacturer name, which also can't be auto detected. This is a +user defined string, so any name is acceptable. The default is 'PowerCom'. *modelname*='name':: -Specify the model name, which also can't be auto detected. This is a -user defined string, so any name is acceptable. The default is -'Unknown'. +Specify the model name, which also can't be auto detected. This is a user +defined string, so any name is acceptable. The default is 'Unknown'. *serialnumber*='value':: -Like modelname above, but for the serial number. The default is -'Unknown'. +Like modelname above, but for the serial number. The default is 'Unknown'. *type*='name':: -The exact type of the communication protocol within the powercom family, -that will be used to communicate with the UPS. The type is named after -the first modelname that was coded with that protocol. The acceptable -names are 'KP625AP', 'Trust', 'Egys', 'KIN', 'BNT', 'IMP' and 'BNT-other'. The -default is 'Trust'. +The exact type of the communication protocol within the powercom family, that +will be used to communicate with the UPS. The type is named after the first +modelname that was coded with that protocol. The acceptable names are +'Trust', 'Egys', 'KP625AP', 'IMP', 'KIN', 'BNT', and 'BNT-other'. +The default is 'Trust'. + -'BNT-other' is a special type for BNT 100-120V models. -For this type you can (I think must!) specify voltage, batteryPercentage, -loadPercentage and validationSequence. - -*numOfBytesFromUPS*='value':: -The number of bytes in a UPS frame. The default is type-dependent and -is given below. - -*methodOfFlowControl*='name':: -The method of serial communication flow control that is engaged by the -UPS. The default is type-dependent and is given below. Acceptable names -are 'dtr0rts1', 'dtr1' or 'no_flow_control'. +'BNT-other' is a special type for other BNT models (such as the 1500A at 120V +and can be used to override ALL models using ALL of the following values. *shutdownArguments*={{'minutes','seconds'},'whether_minutes_should_be_used'}:: The minutes and seconds that the UPS should wait between receiving the -shutdown command and actually shutting off. The other argument should -be set to the character 'n' only when the minutes value should be -skipped and not sent to the UPS. The default is type-dependent and is -given below. The braces and commas are mandatory. Note that there should -be no whitespace characters. +shutdown command and actually shutting off. The other argument should be set +to the character 'n' only when the minutes value should be skipped and not +sent to the UPS. The default is type-dependent and is given below. The braces +and commas are mandatory. Note that there should be no whitespace characters. -*voltage*={'coefficient1','coefficient2','coefficient3','coefficient4'}:: -(Only for types KP625AP, Trust, Egys, BNT-other.) -A quad that is used convert the raw data to a human-readable voltage -reading. The default is type-dependent and is given below. Do note that -the braces and commas are mandatory, as well as the lack of whitespace -characters. +*numOfBytesFromUPS*='value':: +The number of bytes in a UPS frame: 16 is common, 11 for 'Trust'. The default +is type-dependent and is given below. -*frequency*={'coefficient1','coefficient2'}:: -(Only for types KP625AP, Trust, Egys.) -A pair to convert the raw data to a human-readable frequency reading. The -default is type-dependent and is given below. Do note that the braces -and commas are mandatory as well, as the lack of whitespace characters. - -*batteryPercentage*={'coefficient1','coefficient2','coefficient3','coefficient4','coefficient5'}:: -(Only for KP625AP, Trust, Egys, BNT-other.) -A 5 tuple to convert the raw data to a human-readable battery percentage -reading. The default is type-dependent and is given below. Do note that -the braces and commas are mandatory, as the lack of white space -characters. - -*loadPercentage*={'coefficient1','coefficient2','coefficient3','coefficient4'}:: -(Only for types KP625AP, Trust, Egys, BNT-other.) -A quad to convert the raw data to human readable load percentage -reading. The default is type-dependent and is given below. Do note that -the braces and commas are mandatory, as the lack of white space -characters. +*methodOfFlowControl*='name':: +The method of serial communication flow control that is engaged by the UPS. +The default is type-dependent and is given below. Acceptable names are +'dtr0rts1', 'dtr1' or 'no_flow_control'. *validationSequence*={{'index1','value1'},{'index2','value2'},{'index3','value3'}}:: -(Only for types KP625AP, Trust, Egys, BNT-other.) -3 pairs to be used for validating the UPS by comparing bytes of the raw -data with constant values. The default is type-dependent and is given -below. The braces and commas are mandatory, as the lack of white space +(Only for types KP625AP, Trust, Egys.) +3 pairs to be used for validating the UPS by comparing bytes of the raw data +with constant values. The index selects the byte from the UPS (see +numOfBytesFromUPS) and the value is for matching to the byte. The default is +type-dependent and is given below. The braces and commas are mandatory, as +the lack of white space characters. + +*frequency*={'A','B'}:: +(Only for types KP625AP, Trust, Egys.) +A pair to convert the raw frequency data to a human-readable frequency +reading using the function 1/(A*x+B). If the raw value x IS the frequency, +then set A=1/(x^2) and B=0. The default is type-dependent and is given below. +Do note that the braces and commas are mandatory as well, as the lack of +whitespace characters. + +*loadPercentage*={'BatteryA','BatteryB','LineA','LineB'}:: +(Only for types KP625AP, Trust, Egys.) +A quad to convert the raw load data to human readable load percentage reading +using the function A*x+B. If the raw value x IS the Load Percent, then set +A=1 and B=0. The default is type-dependent and is given below. Do note that +the braces and commas are mandatory, as the lack of white space +characters. + +*batteryPercentage*={'Battery1','Battery2','Battery3','Line4','Line5'}:: +(Only for KP625AP, Trust, Egys.) +A 5 tuple to convert the raw battery and line data to a human-readable +battery and line percentage reading using the functions (Battery) +A*x+B*y+C and (Line) D*x+E. If the raw value x IS the Battery Percent, then +set A=1, B=0, C=0, D=1, E=0. The default is type-dependent and is given below. +Do note that the braces and commas are mandatory, as the lack of white space +characters. + +*voltage*={'240A','240B','120A','120B'}:: +(Only for types KP625AP, Trust, Egys.) +A quad that is used convert the raw voltage data to a human-readable voltage +reading using the function A*x+B. If the raw value x IS HALF the Voltage, +then set A=2, B=0. The default is type-dependent and is given below. Do note +that the braces and commas are mandatory, as well as the lack of whitespace characters. DEFAULT VALUES FOR THE EXTRA ARGUMENTS @@ -112,7 +113,9 @@ DEFAULT VALUES FOR THE EXTRA ARGUMENTS serialnumber = Unknown type = Trust -The rest of the default values for the extra arguments are type-dependent: +The rest of the default values for the extra arguments are type-dependent. +However, 'BNT-other' is a special type that can be used to override ALL +values for ALL models. Trust ~~~~~ @@ -136,10 +139,8 @@ KP625AP batteryPercentage = {5.0000,0.3268,-825.00,4.5639,-835.82} voltage = {1.9216,-0.0977,0.9545,0.0000} - Egys ~~~~ - numOfBytesFromUPS = 16 methodOfFlowControl = no_flow_control validationSequence = {{5,0x80},{7,0},{8,0}} @@ -149,49 +150,43 @@ Egys batteryPercentage = {5.0000,0.3268,-825.00,2.2105,-355.37} voltage = {1.9216,-0.0977,0.9545,0.0000} - IMP ~~~ - numOfBytesFromUPS = 16 methodOfFlowControl = no_flow_control validationSequence = {{5,0xFF},{7,0},{8,0}} shutdownArguments = {{1,30},y} - KIN ~~~ - numOfBytesFromUPS = 16 methodOfFlowControl = no_flow_control validationSequence = {{11,0x4b},{8,0},{8,0}} shutdownArguments = {{1,30},y} - BNT ~~~ - numOfBytesFromUPS = 16 methodOfFlowControl = no_flow_control validationSequence = {{11,0x42},{8,0},{8,0}} shutdownArguments = {{1,30},y} - BNT-other ~~~~~~~~~ - numOfBytesFromUPS = 16 methodOfFlowControl = no_flow_control validationSequence = {{8,0},{8,0},{8,0}} shutdownArguments = {{1,30},y} - loadPercentage = {1.4474,0.0,0.8594,0.0} - batteryPercentage = {5.0000,0.3268,-825.00,0.46511,0} - voltage = {1.9216,-0.0977,0.82857,0.0000} + frequency = {0.00027778,0.0000} + loadPercentage = {1.0000,0.0,1.0000,0.0} + batteryPercentage = {1.0000,0.0000,0.0000,1.0000,0.0000} + voltage = {2.0000,0.0000,2.0000,0.0000} AUTHOR ------ Peter Bieringer , -Alexey Sidorov +Alexey Sidorov , +Keven L. Ates SEE ALSO -------- diff --git a/docs/man/powerman-pdu.8 b/docs/man/powerman-pdu.8 index f8afcdd..06cb22b 100644 --- a/docs/man/powerman-pdu.8 +++ b/docs/man/powerman-pdu.8 @@ -2,12 +2,12 @@ .\" Title: powerman-pdu .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "POWERMAN\-PDU" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "POWERMAN\-PDU" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/powerpanel.8 b/docs/man/powerpanel.8 index ddfe8b3..0352956 100644 --- a/docs/man/powerpanel.8 +++ b/docs/man/powerpanel.8 @@ -2,12 +2,12 @@ .\" Title: powerpanel .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "POWERPANEL" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "POWERPANEL" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/rhino.8 b/docs/man/rhino.8 index 3030456..f14f3d4 100644 --- a/docs/man/rhino.8 +++ b/docs/man/rhino.8 @@ -2,12 +2,12 @@ .\" Title: rhino .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "RHINO" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "RHINO" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/richcomm_usb.8 b/docs/man/richcomm_usb.8 index 22c29a3..084731c 100644 --- a/docs/man/richcomm_usb.8 +++ b/docs/man/richcomm_usb.8 @@ -2,12 +2,12 @@ .\" Title: richcomm_usb .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "RICHCOMM_USB" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "RICHCOMM_USB" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/safenet.8 b/docs/man/safenet.8 index a3ca1c8..8568660 100644 --- a/docs/man/safenet.8 +++ b/docs/man/safenet.8 @@ -2,12 +2,12 @@ .\" Title: safenet .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "SAFENET" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "SAFENET" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/snmp-ups.8 b/docs/man/snmp-ups.8 index 5345521..440087d 100644 --- a/docs/man/snmp-ups.8 +++ b/docs/man/snmp-ups.8 @@ -2,12 +2,12 @@ .\" Title: snmp-ups .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "SNMP\-UPS" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "SNMP\-UPS" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/solis.8 b/docs/man/solis.8 index 6478e12..93c54b9 100644 --- a/docs/man/solis.8 +++ b/docs/man/solis.8 @@ -2,12 +2,12 @@ .\" Title: solis .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "SOLIS" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "SOLIS" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/tripplite.8 b/docs/man/tripplite.8 index 2904180..a0c59d9 100644 --- a/docs/man/tripplite.8 +++ b/docs/man/tripplite.8 @@ -2,12 +2,12 @@ .\" Title: tripplite .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "TRIPPLITE" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "TRIPPLITE" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/tripplite_usb.8 b/docs/man/tripplite_usb.8 index df2c950..783b67c 100644 --- a/docs/man/tripplite_usb.8 +++ b/docs/man/tripplite_usb.8 @@ -2,12 +2,12 @@ .\" Title: tripplite_usb .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "TRIPPLITE_USB" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "TRIPPLITE_USB" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/tripplitesu.8 b/docs/man/tripplitesu.8 index 9857093..bf65a94 100644 --- a/docs/man/tripplitesu.8 +++ b/docs/man/tripplitesu.8 @@ -2,12 +2,12 @@ .\" Title: tripplitesu .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "TRIPPLITESU" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "TRIPPLITESU" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/ups.conf.5 b/docs/man/ups.conf.5 index e120145..0a35a09 100644 --- a/docs/man/ups.conf.5 +++ b/docs/man/ups.conf.5 @@ -2,12 +2,12 @@ .\" Title: ups.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPS\&.CONF" "5" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPS\&.CONF" "5" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -132,12 +132,79 @@ You should only use this if your system won\(cqt work without it\&. This may be needed on Mac OS X systems\&. .RE .PP +\fBignorelb\fR +.RS 4 +Optional\&. When you specify this, the driver ignores a low battery condition flag that is reported by the UPS (some devices will switch off almost immediately after setting this flag, or will report this as soons as the mains fails)\&. Instead it will use either of the following conditions to determine when the battery is low: +.sp +.if n \{\ +.RS 4 +.\} +.nf +battery\&.charge < battery\&.charge\&.low +battery\&.runtime < battery\&.runtime\&.low +.fi +.if n \{\ +.RE +.\} +.sp +The idea is to set the battery\&.charge\&.low and/or battery\&.runtime\&.low levels in +\fBups\&.conf\fR +to a value that gives enough time to cleanly shutdown your system: +.sp +.if n \{\ +.RS 4 +.\} +.nf +override\&.battery\&.charge\&.low = 30 +override\&.battery\&.runtime\&.low = 180 +.fi +.if n \{\ +.RE +.\} +.sp +In order for this to work, your UPS should be able to (reliably) report charge and/or runtime remaining on battery\&. Use with caution! +.RE +.PP \fBmaxstartdelay\fR .RS 4 Optional\&. This can be set as a global variable above your first UPS definition and it can also be set in a UPS section\&. This value controls how long upsdrvctl will wait for the driver to finish starting\&. This keeps your system from getting stuck due to a broken driver or UPS\&. .sp The default is 45 seconds\&. .RE +.PP +\fBdefault\&.\fR +.RS 4 +Optional\&. Set a default value for which is used in case the UPS doesn\(cqt provide a value, but will be overwritten if a value is available from the UPS: +.sp +.if n \{\ +.RS 4 +.\} +.nf +default\&.input\&.voltage\&.nominal = 230 +.fi +.if n \{\ +.RE +.\} +.sp +The above will report the nominal input voltage to be 230, unless the UPS tells us differently\&. +.RE +.PP +\fBoverride\&.\fR +.RS 4 +Optional\&. Set a value for that overrides any value that may be read from the UPS\&. Used for overriding values from the UPS that are clearly wrong (some devices report wrong values for battery voltage for instance): +.sp +.if n \{\ +.RS 4 +.\} +.nf +override\&.battery\&.voltage\&.nominal = 12 +.fi +.if n \{\ +.RE +.\} +.sp +Use with caution! This will only change the appearance of the variable to the outside world, internally in the UPS the original value is used\&. +.RE .sp All other fields are passed through to the hardware\-specific part of the driver\&. See those manuals for the list of what is allowed\&. .SH "INTEGRATION" diff --git a/docs/man/ups.conf.txt b/docs/man/ups.conf.txt index 432b1f4..8a72a83 100644 --- a/docs/man/ups.conf.txt +++ b/docs/man/ups.conf.txt @@ -109,6 +109,27 @@ You should only use this if your system won't work without it. + This may be needed on Mac OS X systems. +*ignorelb*:: + +Optional. When you specify this, the driver ignores a low battery condition +flag that is reported by the UPS (some devices will switch off almost +immediately after setting this flag, or will report this as soons as the +mains fails). Instead it will use either of the following conditions to +determine when the battery is low: + + battery.charge < battery.charge.low + battery.runtime < battery.runtime.low ++ +The idea is to set the battery.charge.low and/or battery.runtime.low levels +in *ups.conf* to a value that gives enough time to cleanly shutdown your +system: + + override.battery.charge.low = 30 + override.battery.runtime.low = 180 ++ +In order for this to work, your UPS should be able to (reliably) report +charge and/or runtime remaining on battery. Use with caution! + *maxstartdelay*:: Optional. This can be set as a global variable above your first UPS @@ -118,6 +139,28 @@ system from getting stuck due to a broken driver or UPS. + The default is 45 seconds. +*default.*:: + +Optional. Set a default value for which is used in case the UPS +doesn't provide a value, but will be overwritten if a value is available +from the UPS: + + default.input.voltage.nominal = 230 ++ +The above will report the nominal input voltage to be 230, unless the UPS +tells us differently. + +*override.*:: + +Optional. Set a value for that overrides any value that may be read +from the UPS. Used for overriding values from the UPS that are clearly wrong +(some devices report wrong values for battery voltage for instance): + + override.battery.voltage.nominal = 12 ++ +Use with caution! This will only change the appearance of the variable to +the outside world, internally in the UPS the original value is used. + All other fields are passed through to the hardware-specific part of the driver. See those manuals for the list of what is allowed. diff --git a/docs/man/upsc.8 b/docs/man/upsc.8 index 59828f0..e6dc870 100644 --- a/docs/man/upsc.8 +++ b/docs/man/upsc.8 @@ -2,12 +2,12 @@ .\" Title: upsc .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSC" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSC" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_connect.3 b/docs/man/upscli_connect.3 index 7ad7b85..0ab6637 100644 --- a/docs/man/upscli_connect.3 +++ b/docs/man/upscli_connect.3 @@ -2,12 +2,12 @@ .\" Title: upscli_connect .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_CONNECT" "3" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_CONNECT" "3" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_disconnect.3 b/docs/man/upscli_disconnect.3 index e745421..f8a5a4a 100644 --- a/docs/man/upscli_disconnect.3 +++ b/docs/man/upscli_disconnect.3 @@ -2,12 +2,12 @@ .\" Title: upscli_disconnect .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_DISCONNECT" "3" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_DISCONNECT" "3" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_fd.3 b/docs/man/upscli_fd.3 index c243aa1..96d807b 100644 --- a/docs/man/upscli_fd.3 +++ b/docs/man/upscli_fd.3 @@ -2,12 +2,12 @@ .\" Title: upscli_fd .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_FD" "3" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_FD" "3" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_get.3 b/docs/man/upscli_get.3 index ec72a15..3f6a545 100644 --- a/docs/man/upscli_get.3 +++ b/docs/man/upscli_get.3 @@ -2,12 +2,12 @@ .\" Title: upscli_get .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_GET" "3" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_GET" "3" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_list_next.3 b/docs/man/upscli_list_next.3 index acbb024..783d393 100644 --- a/docs/man/upscli_list_next.3 +++ b/docs/man/upscli_list_next.3 @@ -2,12 +2,12 @@ .\" Title: upscli_list_next .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_LIST_NEXT" "3" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_LIST_NEXT" "3" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_list_start.3 b/docs/man/upscli_list_start.3 index aec5052..941e868 100644 --- a/docs/man/upscli_list_start.3 +++ b/docs/man/upscli_list_start.3 @@ -2,12 +2,12 @@ .\" Title: upscli_list_start .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_LIST_START" "3" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_LIST_START" "3" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_readline.3 b/docs/man/upscli_readline.3 index 226cd90..8f2a741 100644 --- a/docs/man/upscli_readline.3 +++ b/docs/man/upscli_readline.3 @@ -2,12 +2,12 @@ .\" Title: upscli_readline .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_READLINE" "3" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_READLINE" "3" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_sendline.3 b/docs/man/upscli_sendline.3 index 5f3004f..13efe30 100644 --- a/docs/man/upscli_sendline.3 +++ b/docs/man/upscli_sendline.3 @@ -2,12 +2,12 @@ .\" Title: upscli_sendline .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_SENDLINE" "3" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_SENDLINE" "3" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_splitaddr.3 b/docs/man/upscli_splitaddr.3 index 79145c6..cd38178 100644 --- a/docs/man/upscli_splitaddr.3 +++ b/docs/man/upscli_splitaddr.3 @@ -2,12 +2,12 @@ .\" Title: upscli_splitaddr .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_SPLITADDR" "3" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_SPLITADDR" "3" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_splitname.3 b/docs/man/upscli_splitname.3 index ca0c3d0..5180536 100644 --- a/docs/man/upscli_splitname.3 +++ b/docs/man/upscli_splitname.3 @@ -2,12 +2,12 @@ .\" Title: upscli_splitname .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_SPLITNAME" "3" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_SPLITNAME" "3" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_ssl.3 b/docs/man/upscli_ssl.3 index 70bdd99..2256b60 100644 --- a/docs/man/upscli_ssl.3 +++ b/docs/man/upscli_ssl.3 @@ -2,12 +2,12 @@ .\" Title: upscli_ssl .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_SSL" "3" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_SSL" "3" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_strerror.3 b/docs/man/upscli_strerror.3 index 64ff539..ffc4d1f 100644 --- a/docs/man/upscli_strerror.3 +++ b/docs/man/upscli_strerror.3 @@ -2,12 +2,12 @@ .\" Title: upscli_strerror .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_STRERROR" "3" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_STRERROR" "3" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscli_upserror.3 b/docs/man/upscli_upserror.3 index 36711c0..cd96ba4 100644 --- a/docs/man/upscli_upserror.3 +++ b/docs/man/upscli_upserror.3 @@ -2,12 +2,12 @@ .\" Title: upscli_upserror .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLI_UPSERROR" "3" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSCLI_UPSERROR" "3" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsclient.3 b/docs/man/upsclient.3 index 1496883..ece6715 100644 --- a/docs/man/upsclient.3 +++ b/docs/man/upsclient.3 @@ -2,12 +2,12 @@ .\" Title: upsclient .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCLIENT" "3" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSCLIENT" "3" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscmd.8 b/docs/man/upscmd.8 index 944264a..b26db9f 100644 --- a/docs/man/upscmd.8 +++ b/docs/man/upscmd.8 @@ -2,12 +2,12 @@ .\" Title: upscmd .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCMD" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSCMD" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upscode2.8 b/docs/man/upscode2.8 index 194362b..b2edf82 100644 --- a/docs/man/upscode2.8 +++ b/docs/man/upscode2.8 @@ -2,12 +2,12 @@ .\" Title: upscode2 .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSCODE2" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSCODE2" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsd.8 b/docs/man/upsd.8 index 1d29102..6be6ba0 100644 --- a/docs/man/upsd.8 +++ b/docs/man/upsd.8 @@ -2,12 +2,12 @@ .\" Title: upsd .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSD" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSD" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsd.conf.5 b/docs/man/upsd.conf.5 index 2f9b2a8..9bd303f 100644 --- a/docs/man/upsd.conf.5 +++ b/docs/man/upsd.conf.5 @@ -2,12 +2,12 @@ .\" Title: upsd.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSD\&.CONF" "5" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSD\&.CONF" "5" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsd.users.5 b/docs/man/upsd.users.5 index f6246ab..11e41ee 100644 --- a/docs/man/upsd.users.5 +++ b/docs/man/upsd.users.5 @@ -2,12 +2,12 @@ .\" Title: upsd.users .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSD\&.USERS" "5" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSD\&.USERS" "5" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsdrvctl.8 b/docs/man/upsdrvctl.8 index 2b9b068..8223a68 100644 --- a/docs/man/upsdrvctl.8 +++ b/docs/man/upsdrvctl.8 @@ -2,12 +2,12 @@ .\" Title: upsdrvctl .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSDRVCTL" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSDRVCTL" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsimage.cgi.8 b/docs/man/upsimage.cgi.8 index d1f5eba..1b42870 100644 --- a/docs/man/upsimage.cgi.8 +++ b/docs/man/upsimage.cgi.8 @@ -2,12 +2,12 @@ .\" Title: upsimage.cgi .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSIMAGE\&.CGI" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSIMAGE\&.CGI" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upslog.8 b/docs/man/upslog.8 index e3ff7f3..869f16a 100644 --- a/docs/man/upslog.8 +++ b/docs/man/upslog.8 @@ -2,12 +2,12 @@ .\" Title: upslog .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSLOG" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSLOG" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsmon.8 b/docs/man/upsmon.8 index 6f9c028..d508ccb 100644 --- a/docs/man/upsmon.8 +++ b/docs/man/upsmon.8 @@ -2,12 +2,12 @@ .\" Title: upsmon .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSMON" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSMON" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsmon.conf.5 b/docs/man/upsmon.conf.5 index b00226c..3f70b14 100644 --- a/docs/man/upsmon.conf.5 +++ b/docs/man/upsmon.conf.5 @@ -2,12 +2,12 @@ .\" Title: upsmon.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSMON\&.CONF" "5" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSMON\&.CONF" "5" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsrw.8 b/docs/man/upsrw.8 index f052567..85a37bb 100644 --- a/docs/man/upsrw.8 +++ b/docs/man/upsrw.8 @@ -2,12 +2,12 @@ .\" Title: upsrw .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSRW" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSRW" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upssched.8 b/docs/man/upssched.8 index 2704421..069855c 100644 --- a/docs/man/upssched.8 +++ b/docs/man/upssched.8 @@ -2,12 +2,12 @@ .\" Title: upssched .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSSCHED" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSSCHED" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upssched.conf.5 b/docs/man/upssched.conf.5 index 2bace08..7953be4 100644 --- a/docs/man/upssched.conf.5 +++ b/docs/man/upssched.conf.5 @@ -2,12 +2,12 @@ .\" Title: upssched.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSSCHED\&.CONF" "5" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSSCHED\&.CONF" "5" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsset.cgi.8 b/docs/man/upsset.cgi.8 index 7c09012..f2f7230 100644 --- a/docs/man/upsset.cgi.8 +++ b/docs/man/upsset.cgi.8 @@ -2,12 +2,12 @@ .\" Title: upsset.cgi .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSSET\&.CGI" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSSET\&.CGI" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsset.conf.5 b/docs/man/upsset.conf.5 index 5e89519..385f0e8 100644 --- a/docs/man/upsset.conf.5 +++ b/docs/man/upsset.conf.5 @@ -2,12 +2,12 @@ .\" Title: upsset.conf .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSSET\&.CONF" "5" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSSET\&.CONF" "5" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsstats.cgi.8 b/docs/man/upsstats.cgi.8 index 2aa8c97..e51e116 100644 --- a/docs/man/upsstats.cgi.8 +++ b/docs/man/upsstats.cgi.8 @@ -2,12 +2,12 @@ .\" Title: upsstats.cgi .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSSTATS\&.CGI" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSSTATS\&.CGI" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/upsstats.html.5 b/docs/man/upsstats.html.5 index b20ae24..6159d5b 100644 --- a/docs/man/upsstats.html.5 +++ b/docs/man/upsstats.html.5 @@ -2,12 +2,12 @@ .\" Title: upsstats.html .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "UPSSTATS\&.HTML" "5" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "UPSSTATS\&.HTML" "5" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/usbhid-ups.8 b/docs/man/usbhid-ups.8 index 37c149d..551ba96 100644 --- a/docs/man/usbhid-ups.8 +++ b/docs/man/usbhid-ups.8 @@ -2,12 +2,12 @@ .\" Title: usbhid-ups .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "USBHID\-UPS" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "USBHID\-UPS" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/man/victronups.8 b/docs/man/victronups.8 index ae9fdae..d635204 100644 --- a/docs/man/victronups.8 +++ b/docs/man/victronups.8 @@ -2,12 +2,12 @@ .\" Title: victronups .\" Author: [see the "AUTHOR" section] .\" Generator: DocBook XSL Stylesheets v1.75.2 -.\" Date: 12/24/2010 +.\" Date: 05/31/2011 .\" Manual: NUT Manual .\" Source: Network UPS Tools .\" Language: English .\" -.TH "VICTRONUPS" "8" "12/24/2010" "Network UPS Tools" "NUT Manual" +.TH "VICTRONUPS" "8" "05/31/2011" "Network UPS Tools" "NUT Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/docs/nut-names.txt b/docs/nut-names.txt index 80d173e..f99c13d 100644 --- a/docs/nut-names.txt +++ b/docs/nut-names.txt @@ -86,6 +86,9 @@ ups: General unit information panel (*** opaque) | E | ups.contacts | UPS external contact sensors (*** opaque) | F0 +| ups.efficiency | Efficiency of the UPS (ratio + of the output current on the + input current) (percent) | 95 | ups.power | Current value of apparent power (Volt-Amps) | 500 | ups.power.nominal | Nominal value of apparent @@ -363,6 +366,8 @@ outlet: Smart outlet management NOTE: *n* stands for the outlet index. For more information, refer to the NUT outlets management and PDU notes chapter of the user manual. +A special case is "outlet.0" which is equivalent to "outlet", and +represent the whole set of outlets of the device. [options="header"] |=============================================================================== diff --git a/docs/stable-hcl.txt b/docs/stable-hcl.txt index 49c799a..b522d89 100644 --- a/docs/stable-hcl.txt +++ b/docs/stable-hcl.txt @@ -3,8 +3,15 @@ Hardware compatibility list =========================== endif::website[] -NOTE: Before you buy, take a look at the link:acknowledgements.html[Acknowledgements] -for information about which drivers are developed with the support of the manufacturer. +[NOTE] +================================================================================ + +Before you buy, take a look at the link:acknowledgements.html[Acknowledgements] +for information about which drivers are developed with the support of the manufacturer. + +Be sure to also read the <>. + +================================================================================ ifdef::website[] ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -85,6 +92,7 @@ include::ups-html.txt[] endif::website[] +[[footnotes]] [NOTE] ================================================================================ @@ -111,12 +119,23 @@ between the set of developers and the set of owners of that hardware. The way to fix it is to turn a developer into an owner or an owner into a developer. -*Omissions or errors* +*Report new devices, omissions or errors* -There is a lot of UPS hardware for sale, and it's possible that we have missed -listing some that are supported. +There is a lot of power devices hardware for sale, and it's possible +that we have missed listing some that are supported, or made an error. + +So that this list can be as accurate as possible, please report any +omissions to the +link:http://lists.alioth.debian.org/mailman/listinfo/nut-upsuser[NUT Users] +mailing list, with *[HCL]* in the subject and including the following +information: + +- Device manufacturer and name, +- upsc output (upsrw and upscmd outputs are also welcome), +- link:docs/user-manual.chunked/ar01s06.html#Shutdown_design[shutdown sequence] +testing results, +- a link to an online description is also appreciated. -Please report any omissions so that this list can be as accurate as possible. *Pointing the present HCL* diff --git a/docs/website/Makefile.am b/docs/website/Makefile.am index 5be8085..75a59d6 100644 --- a/docs/website/Makefile.am +++ b/docs/website/Makefile.am @@ -50,6 +50,7 @@ ASCIIDOC_PARAMS = --unsafe --backend=xhtml11 \ --attribute scriptsdir=$(srcdir)/scripts \ --attribute=badges \ --attribute=website \ + --attribute=quirks \ --attribute=revision=$(PACKAGE_VERSION) \ --attribute localdate=`TZ=UTC date +%Y-%m-%d` \ --attribute localtime=`TZ=UTC date +%H:%M:%S` \ diff --git a/docs/website/Makefile.in b/docs/website/Makefile.in index ad40ad9..d6ed1f3 100644 --- a/docs/website/Makefile.in +++ b/docs/website/Makefile.in @@ -38,7 +38,6 @@ subdir = docs/website DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ @@ -277,6 +276,7 @@ ASCIIDOC_PARAMS = --unsafe --backend=xhtml11 \ --attribute scriptsdir=$(srcdir)/scripts \ --attribute=badges \ --attribute=website \ + --attribute=quirks \ --attribute=revision=$(PACKAGE_VERSION) \ --attribute localdate=`TZ=UTC date +%Y-%m-%d` \ --attribute localtime=`TZ=UTC date +%H:%M:%S` \ diff --git a/docs/website/news.txt b/docs/website/news.txt index 95da757..46cbc6a 100644 --- a/docs/website/news.txt +++ b/docs/website/news.txt @@ -1,3 +1,5 @@ +- June 1, 2011: 2.6.1 released +- May 19, 2011: link:download.html#_binary_packages[Beta NUT 2.6.0-1 package for Windows released] - January 14, 2011: 2.6.0 released - December 24, 2010: 2.6.0-pre1 released - December 16, 2010: link:http://www.lestat.st/en/informatique/projets/nut-monitor[NUT-Monitor] 1.3 released diff --git a/docs/website/web-layout.conf b/docs/website/web-layout.conf index 0e4c16f..29a4406 100644 --- a/docs/website/web-layout.conf +++ b/docs/website/web-layout.conf @@ -35,10 +35,8 @@ Network UPS Tools - {doctitle} -ifdef::index-only[] - -endif::index-only[] + {doctype-manpage} ifdef::quirks[] @@ -166,20 +164,20 @@ endif::badges[] + + + var _gaq = _gaq || []; + _gaq.push(['_setAccount', 'UA-9664272-1']); + _gaq.push(['_trackPageview']); - - + (function() { + var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); + })(); + + endif::analytics[] diff --git a/drivers/Makefile.in b/drivers/Makefile.in index 841c3e6..80e5e13 100644 --- a/drivers/Makefile.in +++ b/drivers/Makefile.in @@ -68,7 +68,6 @@ DIST_COMMON = $(dist_noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ diff --git a/drivers/apc-hid.c b/drivers/apc-hid.c index c902462..f76621f 100644 --- a/drivers/apc-hid.c +++ b/drivers/apc-hid.c @@ -146,16 +146,38 @@ static usage_lkp_t apc_usage_lkp[] = { { "APCProbe1", 0xff860007 }, { "APCProbe2", 0xff860008 }, { "APCBattReplaceDate", 0xff860016 }, + /* usage seen in dumps but unknown: + * - ff860018 + * Path: UPS.Battery.ff860018, Type: Feature, ReportID: 0x48, Offset: 0, Size: 32, Value: 0 + */ { "APCBattCapBeforeStartup", 0xff860019 }, /* FIXME: exploit */ + /* usage seen in dumps but unknown: + * - ff86001a + * Path: UPS.Battery.ff86001a, Type: Input, ReportID: 0x1b, Offset: 0, Size: 8, Value: 3 + * Path: UPS.Battery.ff86001a, Type: Feature, ReportID: 0x1b, Offset: 0, Size: 8, Value: 3 + * - ff86001b + * Path: UPS.Battery.ff86001b, Type: Input, ReportID: 0x1c, Offset: 0, Size: 8, Value: 0 + * Path: UPS.Battery.ff86001b, Type: Feature, ReportID: 0x1c, Offset: 0, Size: 8, Value: 0 + * - ff860023 + * Path: UPS.ff860001.ff860023, Type: Feature, ReportID: 0x60, Offset: 0, Size: 16, Value: 0 + * - ff860024 + * Path: UPS.Battery.ff860024, Type: Feature, ReportID: 0x47, Offset: 0, Size: 8, Value: 245 + * Path: UPS.PowerConverter.ff860024, Type: Feature, ReportID: 0x51, Offset: 0, Size: 8, Value: 145 + * - ff860025 + * Path: UPS.ff860001.ff860025, Type: Feature, ReportID: 0x62, Offset: 0, Size: 32, Value: 0 + * - ff860026 + * Path: UPS.ff860001.ff860026, Type: Feature, ReportID: 0x61, Offset: 0, Size: 8, Value: 10 + * - ff860027 + * Path: UPS.ff860027, Type: Feature, ReportID: 0x3e, Offset: 0, Size: 32, Value: 0 + * - ff860028 + * Path: UPS.ff860028, Type: Feature, ReportID: 0x3f, Offset: 0, Size: 32, Value: 0 + * - ff860030 + * Path: UPS.Output.ff860030, Type: Feature, ReportID: 0x42, Offset: 0, Size: 16, Value: 5.8 + */ { "APC_UPS_FirmwareRevision", 0xff860042 }, { "APCLineFailCause", 0xff860052 }, { "APCStatusFlag", 0xff860060 }, { "APCSensitivity", 0xff860061 }, - /* usage seen in dumps but unknown: - * - ff860027, ff860028 - * Path: UPS.ff860027, Type: Feature, ReportID: 0x3e, Offset: 0, - * Size: 32, Value:0.000000 - */ { "APCPanelTest", 0xff860072 }, /* FIXME: exploit */ { "APCShutdownAfterDelay", 0xff860076 }, /* FIXME: exploit */ { "APC_USB_FirmwareRevision", 0xff860079 }, /* FIXME: exploit */ @@ -164,14 +186,24 @@ static usage_lkp_t apc_usage_lkp[] = { { "APCDelayBeforeStartup", 0xff86007e }, /* FIXME: exploit */ /* usage seen in dumps but unknown: * - ff860080 - * Path: UPS.PresentStatus.ff860080, Type: Input, ReportID: 0x33, - * Offset: 12, Size: 1, Value: 0.000000 - * - ff86001a - * Path: UPS.Battery.ff86001a, Type: Input, ReportID: 0x1b, - * Offset: 0, Size: 8, Value: 3.000000 - * - ff86001b - * Path: UPS.Battery.ff86001b, Type: Input, ReportID: 0x1c, - * Offset: 0, Size: 8, Value: 0.000000 + * Path: UPS.PresentStatus.ff860080, Type: Input, ReportID: 0x33, Offset: 12, Size: 1, Value: 0 + * Path: UPS.PresentStatus.ff860080, Type: Feature, ReportID: 0x33, Offset: 12, Size: 1, Value: 0 + * Path: UPS.PowerSummary.PresentStatus.ff860080, Type: Input, ReportID: 0x07, Offset: 12, Size: 1, Value: 0 + * Path: UPS.PowerSummary.PresentStatus.ff860080, Type: Feature, ReportID: 0x07, Offset: 12, Size: 1, Value: 0 + * - ff860090, ff860091 + * Path: UPS.ff860090.ff860091, Type: Feature, ReportID: 0x8c, Offset: 0, Size: 8, Value: 1.000000 + * - ff860092 + * Path: UPS.ff860090.ff860092, Type: Feature, ReportID: 0x8d, Offset: 0, Size: 8, Value: 25.000000 + * - ff860093 + * Path: UPS.ff860090.ff860093, Type: Feature, ReportID: 0x8e, Offset: 0, Size: 8, Value: 83.000000 + * - ff860094 + * Path: UPS.ff860090.ff860094, Type: Feature, ReportID: 0x8f, Offset: 0, Size: 8, Value: 0.000000 + * - ff860095 + * Path: UPS.ff860090.ff860095, Type: Feature, ReportID: 0x90, Offset: 0, Size: 8, Value: 1.000000 + * - ff860096 + * Path: UPS.ff860090.ff860096, Type: Feature, ReportID: 0x91, Offset: 0, Size: 16, Value: 4.000000 + * - ff860097 + * Path: UPS.ff860090.ff860097, Type: Feature, ReportID: 0x92, Offset: 0, Size: 16, Value: 4.000000 */ /* Note (Arnaud): BUP stands for BackUPS Pro @@ -269,12 +301,12 @@ static hid_info_t apc_hid2nut[] = { { "ups.timer.start", 0, 0, "UPS.APCGeneralCollection.APCDelayBeforeStartup", NULL, "%.0f", HU_FLAG_QUICK_POLL, NULL}, { "ups.timer.shutdown", 0, 0, "UPS.APCGeneralCollection.APCDelayBeforeShutdown", NULL, "%.0f", HU_FLAG_QUICK_POLL, NULL}, { "ups.timer.reboot", 0, 0, "UPS.APCGeneralCollection.APCDelayBeforeReboot", NULL, "%.0f", HU_FLAG_QUICK_POLL, NULL}, - { "ups.test.result", 0, 0, "UPS.Battery.Test", NULL, "%s", 0, test_read_info }, { "ups.beeper.status", 0, 0, "UPS.PowerSummary.AudibleAlarmControl", NULL, "%s", 0, beeper_info }, { "ups.mfr.date", 0, 0, "UPS.ManufacturerDate", NULL, "%s", 0, date_conversion }, { "ups.mfr.date", 0, 0, "UPS.PowerSummary.ManufacturerDate", NULL, "%s", 0, date_conversion }, /* Back-UPS 500 */ - { "ups.realpower.nominal", 0, 0, "UPS.PowerConverter.ConfigActivePower", NULL, "%.0f", 0, NULL }, + { "ups.realpower.nominal", 0, 0, "UPS.PowerConverter.ConfigActivePower", NULL, "%.0f", 0, NULL }, + { "ups.realpower.nominal", 0, 0, "UPS.Output.ConfigActivePower", NULL, "%.0f", 0, NULL }, /* the below one need to be discussed as we might need to complete * the ups.test sub collection @@ -306,13 +338,18 @@ static hid_info_t apc_hid2nut[] = { /* Input page */ { "input.voltage", 0, 0, "UPS.Input.Voltage", NULL, "%.1f", 0, NULL }, { "input.voltage.nominal", 0, 0, "UPS.Input.ConfigVoltage", NULL, "%.0f", 0, NULL }, + { "input.transfer.low", ST_FLAG_RW | ST_FLAG_STRING, 10, "UPS.Output.LowVoltageTransfer", NULL, "%.0f", HU_FLAG_SEMI_STATIC, NULL }, + { "input.transfer.high", ST_FLAG_RW | ST_FLAG_STRING, 10, "UPS.Output.HighVoltageTransfer", NULL, "%.0f", HU_FLAG_SEMI_STATIC, NULL }, + /* used by APC BackUPS RS */ { "input.transfer.low", ST_FLAG_RW | ST_FLAG_STRING, 10, "UPS.Input.LowVoltageTransfer", NULL, "%.0f", HU_FLAG_SEMI_STATIC, NULL }, { "input.transfer.high", ST_FLAG_RW | ST_FLAG_STRING, 10, "UPS.Input.HighVoltageTransfer", NULL, "%.0f", HU_FLAG_SEMI_STATIC, NULL }, { "input.sensitivity", ST_FLAG_RW | ST_FLAG_STRING, 10, "UPS.Input.APCSensitivity", NULL, "%s", HU_FLAG_SEMI_STATIC, apc_sensitivity_info }, - + /* Output page */ { "output.voltage", 0, 0, "UPS.Output.Voltage", NULL, "%.1f", 0, NULL }, { "output.voltage.nominal", 0, 0, "UPS.Output.ConfigVoltage", NULL, "%.1f", 0, NULL }, + { "output.current", 0, 0, "UPS.Output.Current", NULL, "%.2f", 0, NULL }, + { "output.frequency", 0, 0, "UPS.Output.Frequency", NULL, "%.1f", 0, NULL }, /* Environmental page */ { "ambient.temperature", 0, 0, "UPS.APCEnvironment.APCProbe1.Temperature", NULL, "%s", 0, kelvin_celsius_conversion }, @@ -352,7 +389,9 @@ static hid_info_t apc_hid2nut[] = { { "load.on.delay", 0, 0, "UPS.APCGeneralCollection.APCDelayBeforeStartup", NULL, DEFAULT_ONDELAY, HU_TYPE_CMD, NULL }, { "shutdown.stop", 0, 0, "UPS.APCGeneralCollection.APCDelayBeforeShutdown", NULL, "-1", HU_TYPE_CMD, NULL }, { "shutdown.reboot", 0, 0, "UPS.APCGeneralCollection.APCDelayBeforeReboot", NULL, "10", HU_TYPE_CMD, NULL }, - + /* used by APC BackUPS CS */ + { "shutdown.return", 0, 0, "UPS.Output.APCDelayBeforeReboot", NULL, "1", HU_TYPE_CMD, NULL }, + { "beeper.on", 0, 0, "UPS.PowerSummary.AudibleAlarmControl", NULL, "2", HU_TYPE_CMD, NULL }, { "beeper.off", 0, 0, "UPS.PowerSummary.AudibleAlarmControl", NULL, "3", HU_TYPE_CMD, NULL }, { "beeper.enable", 0, 0, "UPS.PowerSummary.AudibleAlarmControl", NULL, "2", HU_TYPE_CMD, NULL }, diff --git a/drivers/apcsmart.c b/drivers/apcsmart.c index aad21f8..f30f625 100644 --- a/drivers/apcsmart.c +++ b/drivers/apcsmart.c @@ -24,7 +24,7 @@ #include "apcsmart.h" #define DRIVER_NAME "APC Smart protocol driver" -#define DRIVER_VERSION "2.03" +#define DRIVER_VERSION "2.1" static upsdrv_info_t table_info = { "APC command table", @@ -38,8 +38,9 @@ static upsdrv_info_t table_info = { upsdrv_info_t upsdrv_info = { DRIVER_NAME, DRIVER_VERSION, - "Russell Kroll \n" \ - "Nigel Metheringham ", + "Russell Kroll \n" + "Nigel Metheringham \n" + "Michal Soltys ", DRV_STABLE, { &table_info, NULL } }; @@ -73,7 +74,7 @@ static apc_vartab_t *vartab_lookup_name(const char *var) /* FUTURE: change to use function pointers */ /* convert APC formatting to NUT formatting */ -static const char *convert_data(apc_vartab_t *cmd_entry, char *upsval) +static const char *convert_data(apc_vartab_t *cmd_entry, const char *upsval) { static char tmp[128]; int tval; @@ -178,6 +179,16 @@ static void alert_handler(char ch) ups_status |= APC_STAT_RB; break; + case '?': /* set OVER */ + upsdebugx(4, "alert_handler: OVER"); + ups_status |= APC_STAT_OVER; + break; + + case '=': /* clear OVER */ + upsdebugx(4, "alert_handler: not OVER"); + ups_status &= ~APC_STAT_OVER; + break; + default: upsdebugx(4, "alert_handler got 0x%02x (unhandled)", ch); break; @@ -252,8 +263,10 @@ static int query_ups(const char *var, int first) return 0; } - /* already known to not be supported? */ - if (vt->flags & APC_IGNORE) + /* + * not first run and already known to not be supported ? + */ + if (!first && !(vt->flags & APC_PRESENT)) return 0; /* empty the input buffer (while allowing the alert handler to run) */ @@ -278,11 +291,10 @@ static int query_ups(const char *var, int first) ser_comm_good(); - if ((ret < 1) || (!strcmp(temp, "NA"))) { /* not supported */ - vt->flags |= APC_IGNORE; + if ((ret < 1) || (!strcmp(temp, "NA"))) /* not supported */ return 0; - } + vt->flags |= APC_PRESENT; ptr = convert_data(vt, temp); dstate_setinfo(vt->name, "%s", ptr); @@ -293,7 +305,7 @@ static void do_capabilities(void) { const char *ptr, *entptr; char upsloc, temp[512], cmd, loc, etmp[16], *endtemp; - int nument, entlen, i, matrix, ret; + int nument, entlen, i, matrix, ret, valid; apc_vartab_t *vt; upsdebugx(1, "APC - About to get capabilities string"); @@ -324,7 +336,7 @@ static void do_capabilities(void) /* This should never happen since we only call this if the REQ_CAPABILITIES command is supported */ - upslogx(LOG_ERR, "ERROR: APC cannot do capabilites but said it could!"); + upslogx(LOG_ERR, "ERROR: APC cannot do capabilities but said it could!"); return; } @@ -333,8 +345,8 @@ static void do_capabilities(void) endtemp = &temp[0] + strlen(temp); if (temp[0] != '#') { - printf("Unrecognized capability start char %c\n", temp[0]); - printf("Please report this error [%s]\n", temp); + upsdebugx(1, "Unrecognized capability start char %c", temp[0]); + upsdebugx(1, "Please report this error [%s]", temp); upslogx(LOG_ERR, "ERROR: unknown capability start char %c!", temp[0]); @@ -377,9 +389,10 @@ static void do_capabilities(void) entptr = &ptr[4]; vt = vartab_lookup_char(cmd); + valid = vt && ((loc == upsloc) || (loc == '4')); /* mark this as writable */ - if (vt && ((loc == upsloc) || (loc == '4'))) { + if (valid) { upsdebugx(1, "Supported capability: %02x (%c) - %s", cmd, loc, vt->name); @@ -390,11 +403,10 @@ static void do_capabilities(void) } for (i = 0; i < nument; i++) { - snprintf(etmp, entlen + 1, "%s", entptr); - - if (vt && ((loc == upsloc) || (loc == '4'))) - dstate_addenum(vt->name, "%s", - convert_data(vt, etmp)); + if (valid) { + snprintf(etmp, entlen + 1, "%s", entptr); + dstate_addenum(vt->name, "%s", convert_data(vt, etmp)); + } entptr += entlen; } @@ -430,7 +442,6 @@ static int update_status(void) ups_status = strtol(buf, 0, 16) & 0xff; ups_status_set(); - status_commit(); dstate_dataok(); return 1; @@ -466,10 +477,6 @@ static void protocol_verify(unsigned char cmd) { int i, found; - /* we might not care about this one */ - if (strchr(CMD_IGN_CHARS, cmd)) - return; - /* see if it's a variable */ for (i = 0; apc_vartab[i].name != NULL; i++) { @@ -531,27 +538,28 @@ static int firmware_table_lookup(void) unsigned int i, j; char buf[SMALLBUF]; - upsdebugx(1, "Attempting firmware lookup"); + upsdebugx(1, "Attempting firmware lookup using command 'V'"); - ret = ser_send_char(upsfd, 'b'); + ret = ser_send_char(upsfd, 'V'); if (ret != 1) { - upslog_with_errno(LOG_ERR, "getbaseinfo: ser_send_char failed"); + upslog_with_errno(LOG_ERR, "firmware_table_lookup: ser_send_char failed"); return 0; } ret = ser_get_line(upsfd, buf, sizeof(buf), ENDCHAR, IGNCHARS, SER_WAIT_SEC, SER_WAIT_USEC); - /* see if this is an older version like an APC600 which doesn't - * response to 'a' or 'b' queries + /* + * Some UPSes support both 'V' and 'b'. As 'b' doesn't always return + * firmware version, we attempt that only if 'V' doesn't work. */ if ((ret < 1) || (!strcmp(buf, "NA"))) { - upsdebugx(1, "Attempting to contact older Smart-UPS version"); - ret = ser_send_char(upsfd, 'V'); + upsdebugx(1, "Attempting firmware lookup using command 'b'"); + ret = ser_send_char(upsfd, 'b'); if (ret != 1) { - upslog_with_errno(LOG_ERR, "getbaseinfo: ser_send_char failed"); + upslog_with_errno(LOG_ERR, "firmware_table_lookup: ser_send_char failed"); return 0; } @@ -562,10 +570,10 @@ static int firmware_table_lookup(void) upslog_with_errno(LOG_ERR, "firmware_table_lookup: ser_get_line failed"); return 0; } - - upsdebugx(2, "Firmware: [%s]", buf); } + upsdebugx(2, "Firmware: [%s]", buf); + /* this will be reworked if we get a lot of these things */ if (!strcmp(buf, "451.2.I")) { quirk_capability_overflow = 1; @@ -602,6 +610,10 @@ static void getbaseinfo(void) int ret = 0; char *alrts, *cmds, temp[512]; + /* + * try firmware lookup first; we could start with 'a', but older models + * sometimes return other things than a command set + */ if (firmware_table_lookup() == 1) return; @@ -622,7 +634,6 @@ static void getbaseinfo(void) SER_WAIT_SEC, SER_WAIT_USEC); if ((ret < 1) || (!strcmp(temp, "NA"))) { - /* We have an old dumb UPS - go to specific code for old stuff */ oldapcsetup(); return; @@ -774,101 +785,276 @@ static int smartmode(void) return 0; /* failure */ } +/* + * all shutdown commands should respond with 'OK' or '*' + */ +static int sdok(void) +{ + char temp[16]; + + ser_get_line(upsfd, temp, sizeof(temp), ENDCHAR, IGNCHARS, SER_WAIT_SEC, SER_WAIT_USEC); + upsdebugx(4, "sdok: got \"%s\"", temp); + + if (!strcmp(temp, "*") || !strcmp(temp, "OK")) { + upsdebugx(4, "Last issued shutdown command succeeded"); + return 1; + } + + upsdebugx(1, "Last issued shutdown command failed"); + return 0; +} + +/* soft hibernate: S - working only when OB, otherwise ignored */ +static int sdcmd_S(int dummy) +{ + ser_flush_in(upsfd, IGNCHARS, nut_debug_level); + + upsdebugx(1, "Issuing soft hibernate"); + ser_send_char(upsfd, APC_CMD_SOFTDOWN); + + return sdok(); +} + +/* soft hibernate, hack version for CS 350 */ +static int sdcmd_CS(int tval) +{ + upsdebugx(1, "Using CS 350 'force OB' shutdown method"); + if (tval & APC_STAT_OL) { + upsdebugx(1, "On-line - forcing OB temporarily"); + ser_send_char(upsfd, 'U'); + usleep(UPSDELAY); + } + return sdcmd_S(tval); +} + +/* + * hard hibernate: @nnn / @nn + * note: works differently for older and new models, see help function for + * detailed info + */ +static int sdcmd_ATn(int cnt) +{ + int n = 0, mmax, ret; + const char *strval; + char timer[4]; + + mmax = cnt == 2 ? 99 : 999; + + if ((strval = getval("wugrace"))) { + errno = 0; + n = strtol(strval, NULL, 10); + if (errno || n < 0 || n > mmax) + n = 0; + } + + snprintf(timer, sizeof(timer), "%.*d", cnt, n); + + ser_flush_in(upsfd, IGNCHARS, nut_debug_level); + upsdebugx(1, "Issuing hard hibernate with %d minutes additional wakeup delay", n*6); + + ser_send_char(upsfd, APC_CMD_GRACEDOWN); + usleep(CMDLONGDELAY); + ser_send_pace(upsfd, UPSDELAY, "%s", timer); + + ret = sdok(); + if (ret || cnt == 3) + return ret; + + /* + * "tricky" part - we tried @nn variation and it (unsurprisingly) + * failed; we have to abort the sequence with something bogus to have + * the clean state; newer upses will respond with 'NO', older will be + * silent (YMMV); + */ + ser_send_char(upsfd, APC_CMD_GRACEDOWN); + usleep(UPSDELAY); + ser_flush_in(upsfd, IGNCHARS, nut_debug_level); + + return 0; +} + +/* shutdown: K - delayed poweroff */ +static int sdcmd_K(int dummy) +{ + ser_flush_in(upsfd, IGNCHARS, nut_debug_level); + upsdebugx(1, "Issuing delayed poweroff"); + + ser_send_char(upsfd, APC_CMD_SHUTDOWN); + usleep(CMDLONGDELAY); + ser_send_char(upsfd, APC_CMD_SHUTDOWN); + + return sdok(); +} + +/* shutdown: Z - immediate poweroff */ +static int sdcmd_Z(int dummy) +{ + ser_flush_in(upsfd, IGNCHARS, nut_debug_level); + upsdebugx(1, "Issuing immediate poweroff"); + + ser_send_char(upsfd, APC_CMD_OFF); + usleep(CMDLONGDELAY); + ser_send_char(upsfd, APC_CMD_OFF); + + return sdok(); +} + +static int (*sdlist[])(int) = { + sdcmd_S, + sdcmd_ATn, /* for @nnn version */ + sdcmd_K, + sdcmd_Z, + sdcmd_CS, + sdcmd_ATn, /* for @nn version */ +}; + +#define SDIDX_S 0 +#define SDIDX_AT3N 1 +#define SDIDX_K 2 +#define SDIDX_Z 3 +#define SDIDX_CS 4 +#define SDIDX_AT2N 5 + +#define SDCNT 6 + +static void upsdrv_shutdown_simple(int status) +{ + unsigned int sdtype = 0; + char *strval; + + if ((strval = getval("sdtype"))) { + errno = 0; + sdtype = strtol(strval, NULL, 10); + if (errno || sdtype < 0 || sdtype > 6) + sdtype = 0; + } + + switch (sdtype) { + + case 6: /* hard hibernate */ + sdcmd_ATn(3); + break; + case 5: /* "hack nn" hard hibernate */ + sdcmd_ATn(2); + break; + case 4: /* special hack for CS 350 and similar models */ + sdcmd_CS(status); + break; + + case 3: /* delayed poweroff */ + sdcmd_K(0); + break; + + case 2: /* instant poweroff */ + sdcmd_Z(0); + break; + case 1: + /* + * Send a combined set of shutdown commands which can work + * better if the UPS gets power during shutdown process + * Specifically it sends both the soft shutdown 'S' and the + * hard hibernate '@nnn' commands + */ + upsdebugx(1, "UPS - currently %s - sending soft/hard hibernate commands", + (status & APC_STAT_OL) ? "on-line" : "on battery"); + + /* S works only when OB */ + if ((status & APC_STAT_OB) && sdcmd_S(0)) + break; + sdcmd_ATn(3); + break; + + default: + /* + * Send @nnn or S, depending on OB / OL status + */ + if (status & APC_STAT_OL) /* on line */ + sdcmd_ATn(3); + else + sdcmd_S(0); + } +} + +static void upsdrv_shutdown_advanced(int status) +{ + const char *strval; + const char deforder[] = {48 + SDIDX_S, + 48 + SDIDX_AT3N, + 48 + SDIDX_K, + 48 + SDIDX_Z, + 0}; + size_t i; + int n; + + strval = getval("advorder"); + + /* sanitize advorder */ + + if (!strval || !strlen(strval) || strlen(strval) > SDCNT) + strval = deforder; + for (i = 0; i < strlen(strval); i++) { + if (strval[i] - 48 < 0 || strval[i] - 48 >= SDCNT) { + strval = deforder; + break; + } + } + + /* + * try each method in the list with a little bit of handling in certain + * cases + */ + + for (i = 0; i < strlen(strval); i++) { + switch (strval[i] - 48) { + case SDIDX_CS: + n = status; + break; + case SDIDX_AT3N: + n = 3; + break; + case SDIDX_AT2N: + default: + n = 2; + } + + if (sdlist[strval[i] - 48](n)) + break; /* finish if command succeeded */ + } +} + /* power down the attached load immediately */ void upsdrv_shutdown(void) { char temp[32]; - int ret, tval, sdtype = 0; + int ret, status; if (!smartmode()) - printf("Detection failed. Trying a shutdown command anyway.\n"); + upsdebugx(1, "SM detection failed. Trying a shutdown command anyway"); /* check the line status */ ret = ser_send_char(upsfd, APC_STATUS); if (ret == 1) { - ret = ser_get_line(upsfd, temp, sizeof(temp), ENDCHAR, + ret = ser_get_line(upsfd, temp, sizeof(temp), ENDCHAR, IGNCHARS, SER_WAIT_SEC, SER_WAIT_USEC); if (ret < 1) { - printf("Status read failed! Assuming on battery state\n"); - tval = APC_STAT_LB | APC_STAT_OB; + upsdebugx(1, "Status read failed ! Assuming on battery state"); + status = APC_STAT_LB | APC_STAT_OB; } else { - tval = strtol(temp, 0, 16); + status = strtol(temp, 0, 16); } } else { - printf("Status request failed; assuming on battery state\n"); - tval = APC_STAT_LB | APC_STAT_OB; + upsdebugx(1, "Status request failed; assuming on battery state"); + status = APC_STAT_LB | APC_STAT_OB; } - if (testvar("sdtype")) - sdtype = atoi(getval("sdtype")); - - switch (sdtype) { - - case 4: /* special hack for CS 350 and similar models */ - printf("Using CS 350 'force OB' shutdown method\n"); - - if (tval & APC_STAT_OL) { - printf("On line - forcing OB temporarily\n"); - ser_send_char(upsfd, 'U'); - } - - ser_send_char(upsfd, 'S'); - break; - - case 3: /* shutdown with grace period */ - printf("Sending delayed power off command to UPS\n"); - - ser_send_char(upsfd, APC_CMD_SHUTDOWN); - usleep(CMDLONGDELAY); - ser_send_char(upsfd, APC_CMD_SHUTDOWN); - - break; - - case 2: /* instant shutdown */ - printf("Sending power off command to UPS\n"); - - ser_send_char(upsfd, APC_CMD_OFF); - usleep(CMDLONGDELAY); - ser_send_char(upsfd, APC_CMD_OFF); - - break; - - case 1: - - /* Send a combined set of shutdown commands which can work better */ - /* if the UPS gets power during shutdown process */ - /* Specifically it sends both the soft shutdown 'S' */ - /* and the powerdown after grace period - '@000' commands */ - printf("UPS - currently %s - sending shutdown/powerdown\n", - (tval & APC_STAT_OL) ? "on-line" : "on battery"); - - ser_flush_in(upsfd, IGNCHARS, nut_debug_level); - ser_send_pace(upsfd, UPSDELAY, "S@000"); - break; - - default: - - /* @000 - shutdown after 'p' grace period */ - /* - returns after 000 minutes (i.e. right away) */ - - /* S - shutdown after 'p' grace period, only on battery */ - /* returns after 'e' charge % plus 'r' seconds */ - - ser_flush_in(upsfd, IGNCHARS, nut_debug_level); - - if (tval & APC_STAT_OL) { /* on line */ - printf("On line, sending shutdown+return command...\n"); - ser_send_pace(upsfd, UPSDELAY, "@000"); - } - else { - printf("On battery, sending normal shutdown command...\n"); - ser_send_char(upsfd, APC_CMD_SOFTDOWN); - } - } + if (testvar("advorder") && strcasecmp(getval("advorder"), "no")) + upsdrv_shutdown_advanced(status); + else + upsdrv_shutdown_simple(status); } /* 940-0095B support: set DTR, lower RTS */ @@ -921,6 +1107,7 @@ static int setvar_enum(apc_vartab_t *vt, const char *val) char orig[256], temp[256]; const char *ptr; + ser_flush_in(upsfd, IGNCHARS, nut_debug_level); ret = ser_send_char(upsfd, vt->cmd); if (ret != 1) { @@ -1015,7 +1202,6 @@ static int setvar_string(apc_vartab_t *vt, const char *val) char temp[256]; ser_flush_in(upsfd, IGNCHARS, nut_debug_level); - ret = ser_send_char(upsfd, vt->cmd); if (ret != 1) { @@ -1118,6 +1304,7 @@ static int do_cmd(apc_cmdtab_t *ct) int ret; char buf[SMALLBUF]; + ser_flush_in(upsfd, IGNCHARS, nut_debug_level); ret = ser_send_char(upsfd, ct->cmd); if (ret != 1) { @@ -1222,7 +1409,9 @@ static void setuphandlers(void) void upsdrv_makevartable(void) { addvar(VAR_VALUE, "cable", "Specify alternate cable (940-0095B)"); - addvar(VAR_VALUE, "sdtype", "Specify shutdown type (1-3)"); + addvar(VAR_VALUE, "wugrace", "Hard hibernate's wakeup grace"); + addvar(VAR_VALUE, "sdtype", "Specify simple shutdown method (0-6)"); + addvar(VAR_VALUE, "advorder", "Enable advanced shutdown control"); } void upsdrv_initups(void) @@ -1234,9 +1423,8 @@ void upsdrv_initups(void) cable = getval("cable"); - if (cable) - if (!strcasecmp(cable, ALT_CABLE_1)) - init_serial_0095B(); + if (cable && !strcasecmp(cable, ALT_CABLE_1)) + init_serial_0095B(); /* make sure we wake up if the UPS sends alert chars to us */ extrafd = upsfd; @@ -1244,18 +1432,12 @@ void upsdrv_initups(void) void upsdrv_help(void) { - printf("\nShutdown types:\n"); - printf(" 0: soft shutdown or powerdown, depending on battery status\n"); - printf(" 1: soft shutdown followed by powerdown\n"); - printf(" 2: instant power off\n"); - printf(" 3: power off with grace period\n"); - printf(" 4: 'force OB' hack method for CS 350\n"); - printf("Modes 0-1 will make the UPS come back when power returns\n"); - printf("Modes 2-3 will make the UPS stay turned off when power returns\n"); } void upsdrv_initinfo(void) { + const char *pmod, *pser; + if (!smartmode()) { fatalx(EXIT_FAILURE, "Unable to detect an APC Smart protocol UPS on port %s\n" @@ -1268,8 +1450,12 @@ void upsdrv_initinfo(void) getbaseinfo(); - printf("Detected %s [%s] on %s\n", dstate_getinfo("ups.model"), - dstate_getinfo("ups.serial"), device_path); + if (!(pmod = dstate_getinfo("ups.model"))) + pmod = "\"unknown model\""; + if (!(pser = dstate_getinfo("ups.serial"))) + pser = "unknown serial"; + + upsdebugx(1, "Detected %s [%s] on %s", pmod, pser, device_path); setuphandlers(); } diff --git a/drivers/apcsmart.h b/drivers/apcsmart.h index 41ebbe1..f143cfa 100644 --- a/drivers/apcsmart.h +++ b/drivers/apcsmart.h @@ -23,20 +23,22 @@ #include "serial.h" #include "timehead.h" -#define APC_TABLE_VERSION "version 2.1" +#define APC_TABLE_VERSION "version 2.2" /* Basic UPS reply line structure */ #define ENDCHAR 10 /* APC ends responses with LF */ -/* these two are only used during startup */ -#define IGNCHARS "\015+$|!~%?=*#&" /* special characters to ignore */ +/* characters ignored by default */ +#define IGNCHARS "\015+$|!~%?=#&" /* special characters to ignore */ + +/* these one is used only during startup, due to ^Z sending certain characters such as # */ #define MINIGNCHARS "\015+$|!" /* minimum set of special characters to ignore */ /* normal polls: characters we don't want to parse (including a few alerts) */ -#define POLL_IGNORE "\015?=*&|" +#define POLL_IGNORE "\015&|" -/* alert characters we care about - OL, OB, LB, not LB, RB */ -#define POLL_ALERT "$!%+#" +/* alert characters we care about - OL, OB, LB, not LB, RB, OVER, not OVER */ +#define POLL_ALERT "$!%+#?=" #define UPSDELAY 50000 /* slow down multicharacter commands */ #define CMDLONGDELAY 1500000 /* some commands need a 1.5s gap for safety */ @@ -77,7 +79,6 @@ /* Driver command table flag values */ #define APC_POLL 0x0001 /* Poll this variable regularly */ -#define APC_IGNORE 0x0002 /* Never poll this */ #define APC_PRESENT 0x0004 /* Capability seen on this UPS */ #define APC_RW 0x0010 /* read-write variable */ @@ -109,15 +110,11 @@ typedef struct { apc_vartab_t apc_vartab[] = { + { "ups.firmware.old", 0, 'V' }, { "ups.firmware", 0, 'b' }, { "ups.firmware.aux", 0, 'v' }, { "ups.model", 0, 0x01 }, -/* FUTURE: depends on variable naming scheme */ -#if 0 - { "ups.model.code", 0, 'V' }, -#endif - { "ups.serial", 0, 'n' }, { "ups.mfr.date", 0, 'm' }, @@ -207,6 +204,7 @@ apc_vartab_t apc_vartab[] = { #define APC_CMD_CALTOGGLE 'D' #define APC_CMD_SHUTDOWN 'K' #define APC_CMD_SOFTDOWN 'S' +#define APC_CMD_GRACEDOWN '@' #define APC_CMD_SIMPWF 'U' #define APC_CMD_BTESTTOGGLE 'W' #define APC_CMD_OFF 'Z' @@ -232,6 +230,8 @@ apc_cmdtab_t apc_cmdtab[] = { "test.battery.start", 0, APC_CMD_BTESTTOGGLE }, { "test.battery.stop", 0, APC_CMD_BTESTTOGGLE }, + { "shutdown.return.grace", + APC_NASTY, APC_CMD_GRACEDOWN }, { "shutdown.return", APC_NASTY, APC_CMD_SOFTDOWN }, { "shutdown.stayoff", APC_NASTY|APC_REPEAT, APC_CMD_SHUTDOWN }, @@ -244,9 +244,6 @@ apc_cmdtab_t apc_cmdtab[] = { NULL, 0, 0 } }; -/* things to ignore in protocol_verify - useless variables, etc. */ -#define CMD_IGN_CHARS "\032-78@.,~\047\177QHRTYayz)1IJ" - /* compatibility with hardware that doesn't do APC_CMDSET ('a') */ struct { @@ -255,33 +252,40 @@ struct { int flags; } compat_tab[] = { /* APC Matrix */ + { "0XI", "789ABCDEFGKLMNOPQRSTUVWXYZcefgjklmnopqrsuwxz/<>\\^\014\026", 0 }, + { "0XM", "789ABCDEFGKLMNOPQRSTUVWXYZcefgjklmnopqrsuwxz/<>\\^\014\026", 0 }, { "0ZI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz/<>", 0 }, { "5UI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz/<>", 0 }, { "5ZM", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz/<>", 0 }, /* APC600 */ { "6QD", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, - { "6QI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, + { "6QI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, { "6TD", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, { "6TI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, /* SmartUPS 900 */ - { "7QD", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, - { "7QI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, - { "7TD", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, - { "7TI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, - /* SmartUPS 1250. */ + { "7QD", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, + { "7QI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, + { "7TD", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, + { "7TI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, + /* SmartUPS 900I */ + { "7II", "79ABCEFGKLMNOPQSUVWXYZcfg", 0 }, + /* SmartUPS 2000I */ + { "9II", "79ABCEFGKLMNOPQSUVWXYZcfg", 0 }, + { "9GI", "79ABCEFGKLMNOPQSUVWXYZcfg", 0 }, + /* SmartUPS 1250 */ { "8QD", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, { "8QI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, - { "8TD", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, - { "8TI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, + { "8TD", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, + { "8TI", "79ABCDEFGKLMNOPQRSUVWXYZcefgjklmnopqrsuxz", 0 }, /* CS 350 */ { "5.4.D", "\1ABPQRSUYbdfgjmnx9", 0 }, /* Smart-UPS 600 */ - { "D9", "789ABCEFGKLMNOPQRSUVWXYZ", 0 }, - { "D8", "789ABCEFGKLMNOPQRSUVWXYZ", 0 }, - { "D7", "789ABCEFGKLMNOPQRSUVWXYZ", 0 }, - { "D6", "789ABCEFGKLMNOPQRSUVWXYZ", 0 }, - { "D5", "789ABCEFGKLMNOPQRSUVWXYZ", 0 }, - { "D4", "789ABCEFGKLMNOPQRSUVWXYZ", 0 }, + { "D9", "789ABCEFGKLMNOPQRSUVWXYZ", 0 }, + { "D8", "789ABCEFGKLMNOPQRSUVWXYZ", 0 }, + { "D7", "789ABCEFGKLMNOPQRSUVWXYZ", 0 }, + { "D6", "789ABCEFGKLMNOPQRSUVWXYZ", 0 }, + { "D5", "789ABCEFGKLMNOPQRSUVWXYZ", 0 }, + { "D4", "789ABCEFGKLMNOPQRSUVWXYZ", 0 }, { NULL, NULL, 0 }, }; diff --git a/drivers/bcmxcp.c b/drivers/bcmxcp.c index 13b43bd..d2e0f5c 100644 --- a/drivers/bcmxcp.c +++ b/drivers/bcmxcp.c @@ -120,7 +120,7 @@ TODO List: #include "bcmxcp.h" #define DRIVER_NAME "BCMXCP UPS driver" -#define DRIVER_VERSION "0.23" +#define DRIVER_VERSION "0.24" /* driver description structure */ upsdrv_info_t upsdrv_info = { @@ -1176,17 +1176,20 @@ void upsdrv_initinfo(void) iIndex += 1; /* Size of command list block */ - cmd_list_len = get_word(answer+iIndex); + if (iIndex < res) + cmd_list_len = get_word(answer+iIndex); upsdebugx(2, "Length of command list: %d\n", cmd_list_len); iIndex += 2; /* Size of outlet monitoring block */ - outlet_block_len = get_word(answer+iIndex); + if (iIndex < res) + outlet_block_len = get_word(answer+iIndex); upsdebugx(2, "Length of outlet_block: %d\n", outlet_block_len); iIndex += 2; /* Size of the alarm block */ - alarm_block_len = get_word(answer+iIndex); + if (iIndex < res) + alarm_block_len = get_word(answer+iIndex); upsdebugx(2, "Length of alarm_block: %d\n", alarm_block_len); /* End of UPS ID block request */ @@ -1209,7 +1212,8 @@ void upsdrv_initinfo(void) init_limit(); /* Get information on UPS commands */ - init_command_map(); + if (cmd_list_len) + init_command_map(); /* FIXME: leave up to init_command_map() to add instant commands? */ dstate_addcmd("shutdown.return"); diff --git a/drivers/bcmxcp_ser.c b/drivers/bcmxcp_ser.c index b6f98f0..b03e0c1 100644 --- a/drivers/bcmxcp_ser.c +++ b/drivers/bcmxcp_ser.c @@ -6,7 +6,7 @@ #define PW_MAX_BAUD 5 #define SUBDRIVER_NAME "RS-232 communication subdriver" -#define SUBDRIVER_VERSION "0.17" +#define SUBDRIVER_VERSION "0.18" /* communication driver description structure */ upsdrv_info_t comm_upsdrv_info = { @@ -47,8 +47,10 @@ static void send_command(unsigned char *command, int command_length) while (retry++ < PW_MAX_TRY) { - if (retry == PW_MAX_TRY) + if (retry == PW_MAX_TRY) { ser_send_char(upsfd, 0x1d); /* last retry is preceded by a ESC.*/ + usleep(250000); + } sent = ser_send_buf(upsfd, sbuf, command_length); @@ -82,7 +84,7 @@ int get_answer(unsigned char *data, unsigned char command) res = ser_get_char(upsfd, my_buf, 1, 0); if (res != 1) { - upsdebugx(1,"Receive error (PW_COMMAND_START_BYTE): %d!!!\n", res); + upsdebugx(1,"Receive error (PW_COMMAND_START_BYTE): %d, cmd=%x!!!\n", res, command); return -1; } @@ -250,6 +252,7 @@ void upsdrv_comm_good() void pw_comm_setup(const char *port) { unsigned char command = PW_SET_REQ_ONLY_MODE; + unsigned char id_command = PW_ID_BLOCK_REQ; unsigned char answer[256]; int i = 0, baud, mybaud = 0, ret = -1; @@ -274,6 +277,10 @@ void pw_comm_setup(const char *port) send_write_command(AUT, 4); usleep(500000); ret = command_sequence(&command, 1, answer); + if (ret <= 0) { + usleep(500000); + ret = command_sequence(&id_command, 1, answer); + } if (ret > 0) { upslogx(LOG_INFO, "Connected to UPS on %s with baudrate %d", port, baud); @@ -293,6 +300,10 @@ void pw_comm_setup(const char *port) send_write_command(AUT, 4); usleep(500000); ret = command_sequence(&command, 1, answer); + if (ret <= 0) { + usleep(500000); + ret = command_sequence(&id_command, 1, answer); + } if (ret > 0) { upslogx(LOG_INFO, "Connected to UPS on %s with baudrate %d", port, pw_baud_rates[i].name); diff --git a/drivers/bcmxcp_usb.c b/drivers/bcmxcp_usb.c index ce44abb..95feea7 100644 --- a/drivers/bcmxcp_usb.c +++ b/drivers/bcmxcp_usb.c @@ -160,7 +160,7 @@ int get_answer(unsigned char *data, unsigned char command) { /* Clear any possible endpoint stalls */ usb_clear_halt(upsdev, 0x81); - //continue; // FIXME: seems a break would be better! + /* continue; */ /* FIXME: seems a break would be better! */ break; } diff --git a/drivers/blazer.c b/drivers/blazer.c index 4dbbcbd..5179be5 100644 --- a/drivers/blazer.c +++ b/drivers/blazer.c @@ -186,7 +186,7 @@ static int blazer_status(const char *cmd) * 01234567890123456789012345678901234567890123456 * 0 1 2 3 4 */ - if (blazer_command(cmd, buf, sizeof(buf)) < 47) { + if (blazer_command(cmd, buf, sizeof(buf)) < 46) { upsdebugx(2, "%s: short reply", __func__); return -1; } @@ -691,6 +691,9 @@ void upsdrv_updateinfo(void) if (blazer_status(command[proto].status)) { if (retry < MAXTRIES) { + upsdebugx(1, "Communications with UPS lost: status read failed!"); + retry++; + } else if (retry == MAXTRIES) { upslogx(LOG_WARNING, "Communications with UPS lost: status read failed!"); retry++; } else { @@ -723,7 +726,7 @@ void upsdrv_updateinfo(void) lastpoll = now; } - if (retry) { + if (retry > MAXTRIES) { upslogx(LOG_NOTICE, "Communications with UPS re-established"); } diff --git a/drivers/blazer_usb.c b/drivers/blazer_usb.c index 7a07107..317093e 100644 --- a/drivers/blazer_usb.c +++ b/drivers/blazer_usb.c @@ -255,16 +255,17 @@ static int krauler_command(const char *cmd, char *buf, size_t buflen) /* "UPS No Ack" has a special meaning */ if (!strcasecmp(buf, "UPS No Ack")) { + upsdebugx(3, "read: %.*s", (int)strcspn(buf, "\r"), buf); continue; } /* Replace the first byte of what we received with the correct one */ buf[0] = command[i].prefix; + upsdebugx(3, "read: %.*s", (int)strcspn(buf, "\r"), buf); return ret; } - upsdebugx(3, "read: %.*s", (int)strcspn(buf, "\r"), buf); return 0; } @@ -295,13 +296,21 @@ static void *krauler_subdriver(void) } +static void *phoenix_subdriver(void) +{ + subdriver_command = &phoenix_command; + return NULL; +} + + static usb_device_id_t blazer_usb_id[] = { { USB_DEVICE(0x05b8, 0x0000), &cypress_subdriver }, /* Agiler UPS */ - { USB_DEVICE(0x0001, 0x0000), &krauler_subdriver }, /* Krauler UP-M500VA */ - { USB_DEVICE(0xffff, 0x0000), &krauler_subdriver }, /* Ablerex 625L USB */ + { 0x0001, 0x0000, &krauler_subdriver }, /* Krauler UP-M500VA */ + { 0xffff, 0x0000, &krauler_subdriver }, /* Ablerex 625L USB */ { USB_DEVICE(0x0665, 0x5161), &cypress_subdriver }, /* Belkin F6C1200-UNV */ { USB_DEVICE(0x06da, 0x0003), &ippon_subdriver }, /* Mustek Powermust */ { USB_DEVICE(0x0f03, 0x0001), &cypress_subdriver }, /* Unitek Alpha 1200Sx */ + { USB_DEVICE(0x14f0, 0x00c9), &phoenix_subdriver }, /* GE EP series */ /* end of list */ {-1, -1, NULL} }; diff --git a/drivers/cps-hid.c b/drivers/cps-hid.c index e594a59..b098df3 100644 --- a/drivers/cps-hid.c +++ b/drivers/cps-hid.c @@ -74,6 +74,22 @@ static info_lkp_t cps_battvolt[] = { { 0, NULL, &cps_battvolt_fun } }; +/* returns statically allocated string - must not use it again before + done with result! */ +static const char *cps_battcharge_fun(double value) +{ + static char buf[8]; + + /* clamp battery charge to 100% */ + snprintf(buf, sizeof(buf), "%.0f", value < 100.0 ? value : 100.0); + + return buf; +} + +static info_lkp_t cps_battcharge[] = { + { 0, NULL, &cps_battcharge_fun } +}; + /* --------------------------------------------------------------- */ /* Vendor-specific usage table */ /* --------------------------------------------------------------- */ @@ -106,7 +122,7 @@ static hid_info_t cps_hid2nut[] = { { "battery.mfr.date", 0, 0, "UPS.PowerSummary.iOEMInformation", NULL, "%s", 0, stringid_conversion }, { "battery.charge.warning", 0, 0, "UPS.PowerSummary.WarningCapacityLimit", NULL, "%.0f", 0, NULL }, { "battery.charge.low", ST_FLAG_RW | ST_FLAG_STRING, 10, "UPS.PowerSummary.RemainingCapacityLimit", NULL, "%.0f", HU_FLAG_SEMI_STATIC, NULL }, - { "battery.charge", 0, 0, "UPS.PowerSummary.RemainingCapacity", NULL, "%.0f", 0, NULL }, + { "battery.charge", 0, 0, "UPS.PowerSummary.RemainingCapacity", NULL, "%s", 0, cps_battcharge }, { "battery.runtime", 0, 0, "UPS.PowerSummary.RunTimeToEmpty", NULL, "%.0f", 0, NULL }, { "battery.runtime.low", ST_FLAG_RW | ST_FLAG_STRING, 10, "UPS.PowerSummary.RemainingTimeLimit", NULL, "%.0f", HU_FLAG_SEMI_STATIC, NULL }, { "battery.voltage.nominal", 0, 0, "UPS.PowerSummary.ConfigVoltage", NULL, "%.0f", 0, NULL }, diff --git a/drivers/dstate.c b/drivers/dstate.c index b95cec9..316c54f 100644 --- a/drivers/dstate.c +++ b/drivers/dstate.c @@ -32,7 +32,7 @@ #include "state.h" #include "parseconf.h" - static int sockfd = -1, stale = 1, alarm_active = 0; + static int sockfd = -1, stale = 1, alarm_active = 0, ignorelb = 0; static char *sockfn = NULL; static char status_buf[ST_MAX_VALUE_LEN], alarm_buf[ST_MAX_VALUE_LEN]; static st_tree_t *dtree_root = NULL; @@ -223,8 +223,11 @@ static void sock_connect(int sock) int fd, ret; conn_t *conn; struct sockaddr_un sa; +#if defined(__hpux) && !defined(_XOPEN_SOURCE_EXTENDED) + int salen; +#else socklen_t salen; - +#endif salen = sizeof(sa); fd = accept(sock, (struct sockaddr *) &sa, &salen); @@ -639,7 +642,12 @@ void dstate_setflags(const char *var, int flags) sttmp = state_tree_find(dtree_root, var); if (!sttmp) { - upslogx(LOG_ERR, "dstate_setflags: base variable (%s) does not exist", var); + upslogx(LOG_ERR, "%s: base variable (%s) does not exist", __func__, var); + return; + } + + if (sttmp->flags & ST_FLAG_IMMUTABLE) { + upslogx(LOG_WARNING, "%s: base variable (%s) is immutable", __func__, var); return; } @@ -792,12 +800,21 @@ int dstate_is_stale(void) /* clean out the temp space for a new pass */ void status_init(void) { + if (dstate_getinfo("driver.flag.ignorelb")) { + ignorelb = 1; + } + memset(status_buf, 0, sizeof(status_buf)); } /* add a status element */ void status_set(const char *buf) { + if (ignorelb && !strcasecmp(buf, "LB")) { + upsdebugx(2, "%s: ignoring LB flag from device", __func__); + return; + } + /* separate with a space if multiple elements are present */ if (strlen(status_buf) > 0) { snprintfcat(status_buf, sizeof(status_buf), " %s", buf); @@ -809,6 +826,31 @@ void status_set(const char *buf) /* write the status_buf into the externally visible dstate storage */ void status_commit(void) { + while (ignorelb) { + const char *val, *low; + + val = dstate_getinfo("battery.charge"); + low = dstate_getinfo("battery.charge.low"); + + if (val && low && (strtol(val, NULL, 10) < strtol(low, NULL, 10))) { + snprintfcat(status_buf, sizeof(status_buf), " LB"); + upsdebugx(2, "%s: appending LB flag [charge '%s' below '%s']", __func__, val, low); + break; + } + + val = dstate_getinfo("battery.runtime"); + low = dstate_getinfo("battery.runtime.low"); + + if (val && low && (strtol(val, NULL, 10) < strtol(low, NULL, 10))) { + snprintfcat(status_buf, sizeof(status_buf), " LB"); + upsdebugx(2, "%s: appending LB flag [runtime '%s' below '%s']", __func__, val, low); + break; + } + + /* LB condition not detected */ + break; + } + if (alarm_active) { dstate_setinfo("ups.status", "ALARM %s", status_buf); } else { diff --git a/drivers/dummy-ups.c b/drivers/dummy-ups.c index 468e660..72bef62 100644 --- a/drivers/dummy-ups.c +++ b/drivers/dummy-ups.c @@ -375,7 +375,7 @@ static int is_valid_data(const char* varname) * enforcing controls! We also need a way to automate * the update / sync process (with cmdvartab?!) */ - upsdebugx(1, "Unknown data. Commiting anyway..."); + upsdebugx(1, "Unknown data. Committing anyway..."); return 1; /* return 0;*/ } @@ -395,7 +395,7 @@ static int is_valid_value(const char* varname, const char *value) * enforcing controls! We also need a way to automate * the update / sync process (with cmdvartab?) */ - upsdebugx(1, "Unknown data. Commiting value anyway..."); + upsdebugx(1, "Unknown data. Committing value anyway..."); return 1; /* return 0;*/ } @@ -412,7 +412,7 @@ static void upsconf_err(const char *errmsg) static int parse_data_file(int upsfd) { char fn[SMALLBUF]; - char *ptr, *var_value = (char*) xmalloc(MAX_STRING_SIZE); + char *ptr, var_value[MAX_STRING_SIZE]; int value_args = 0, counter; time_t now; @@ -501,13 +501,13 @@ static int parse_data_file(int upsfd) } else { - memset(var_value, 0, MAX_STRING_SIZE); for (counter = 1, value_args = ctx->numargs ; counter < value_args ; counter++) { - if (counter != 1) /* don't append the first space separator */ - strncat(var_value, " ", 1); - strncat(var_value, ctx->arglist[counter], MAX_STRING_SIZE); + if (counter == 1) /* don't append the first space separator */ + snprintf(var_value, sizeof(var_value), "%s", ctx->arglist[counter]); + else + snprintfcat(var_value, sizeof(var_value), " %s", ctx->arglist[counter]); } if (setvar(ctx->arglist[0], var_value) == STAT_SET_UNKNOWN) @@ -529,7 +529,6 @@ static int parse_data_file(int upsfd) pconf_finish(ctx); free(ctx); ctx=NULL; - free(var_value); } return 1; } diff --git a/drivers/eaton-mib.c b/drivers/eaton-mib.c index 1bd2dd2..18fcf55 100644 --- a/drivers/eaton-mib.c +++ b/drivers/eaton-mib.c @@ -1,6 +1,6 @@ /* eaton-mib.c - data to monitor Eaton Aphel PDUs (Basic and Complex) * - * Copyright (C) 2008 + * Copyright (C) 2008 - 2010 * Arnaud Quette * * Sponsored by Eaton @@ -25,7 +25,7 @@ #include "eaton-mib.h" -#define EATON_APHEL_MIB_VERSION "0.4" +#define EATON_APHEL_MIB_VERSION "0.45" /* APHEL-GENESIS-II-MIB (monitored ePDU) * ************************************* @@ -87,8 +87,6 @@ static snmp_info_t eaton_aphel_genesisII_mib[] = { #define APHEL2_OID_MODEL_NAME AR_OID_MODEL_NAME -/* Common Aphel / Raritan declaration */ - #define AR_OID_MODEL_NAME AR_BASE_OID ".1.1.12.0" #define AR_OID_DEVICE_NAME AR_BASE_OID ".1.1.13.0" #define AR_OID_FIRMREV AR_BASE_OID ".1.1.1.0" @@ -180,12 +178,21 @@ static snmp_info_t eaton_aphel_revelation_mib[] = { /* FIXME: * - delay for startup/shutdown sequence - * - support for Ambient page - temperatureSensorCount" src="snmp:$sysoid.2.1.0 - ambient.temperature src="snmp:$sysoid.2.2.1.3.$indiceSensor => seems dumb! - ambient.humidity src="snmp:$sysoid.2.4.1.3.$indiceSensor + * - support for multiple Ambient sensors ( max. 8), starting at index '0' + * ambient.%i.temperature => .1.3.6.1.4.1.534.6.6.6.2.2.1.3.%i + * ambient.%i.humidity => .1.3.6.1.4.1.534.6.6.6.2.4.1.3.%i */ + /* Ambient page */ + /* We use critical levels, for both temperature and humidity, + * since warning levels are also available! */ + { "ambient.temperature", 0, 1.0, ".1.3.6.1.4.1.534.6.6.6.2.2.1.3.0", NULL, SU_FLAG_OK, NULL, NULL }, + { "ambient.temperature.low", 0, 1.0, "1.3.6.1.4.1.534.6.6.6.2.2.1.6.0", NULL, SU_FLAG_OK, NULL, NULL }, + { "ambient.temperature.high", 0, 1.0, "1.3.6.1.4.1.534.6.6.6.2.2.1.7.0", NULL, SU_FLAG_OK, NULL, NULL }, + { "ambient.humidity", 0, 1.0, ".1.3.6.1.4.1.534.6.6.6.2.4.1.3.0", NULL, SU_FLAG_OK, NULL, NULL }, + { "ambient.humidity.low", 0, 1.0, ".1.3.6.1.4.1.534.6.6.6.2.4.1.6.0", NULL, SU_FLAG_OK, NULL, NULL }, + { "ambient.humidity.high", 0, 1.0, ".1.3.6.1.4.1.534.6.6.6.2.4.1.7.0", NULL, SU_FLAG_OK, NULL, NULL }, + /* instant commands. */ /* Note that load.cycle might be replaced by / mapped on shutdown.reboot */ /* no counterpart found! diff --git a/drivers/genericups.c b/drivers/genericups.c index 868f792..bc8ddc4 100644 --- a/drivers/genericups.c +++ b/drivers/genericups.c @@ -142,12 +142,12 @@ void upsdrv_initinfo(void) */ if ((v = getval("OL")) != NULL) { parse_input_signals(v, &upstab[upstype].line_ol, &upstab[upstype].val_ol); - upsdebugx(2, "parse_input_signals: OL overriden with %s\n", v); + upsdebugx(2, "parse_input_signals: OL overridden with %s\n", v); } if ((v = getval("LB")) != NULL) { parse_input_signals(v, &upstab[upstype].line_bl, &upstab[upstype].val_bl); - upsdebugx(2, "parse_input_signals: LB overriden with %s\n", v); + upsdebugx(2, "parse_input_signals: LB overridden with %s\n", v); } } @@ -318,12 +318,12 @@ void upsdrv_initups(void) */ if ((v = getval("CP")) != NULL) { parse_output_signals(v, &upstab[upstype].line_norm); - upsdebugx(2, "parse_output_signals: CP overriden with %s\n", v); + upsdebugx(2, "parse_output_signals: CP overridden with %s\n", v); } if ((v = getval("SD")) != NULL) { parse_output_signals(v, &upstab[upstype].line_sd); - upsdebugx(2, "parse_output_signals: SD overriden with %s\n", v); + upsdebugx(2, "parse_output_signals: SD overridden with %s\n", v); } if (ioctl(upsfd, TIOCMSET, &upstab[upstype].line_norm)) { diff --git a/drivers/libhid.c b/drivers/libhid.c index 78b1236..6fce6a9 100644 --- a/drivers/libhid.c +++ b/drivers/libhid.c @@ -141,7 +141,6 @@ static int refresh_report_buffer(reportbuf_t *rbuf, hid_dev_handle_t udev, HIDDa { int id = pData->ReportID; int r; - unsigned char buf[SMALLBUF]; if (rbuf->ts[id] + age > time(NULL)) { /* buffered report is still good; nothing to do */ @@ -149,17 +148,14 @@ static int refresh_report_buffer(reportbuf_t *rbuf, hid_dev_handle_t udev, HIDDa return 0; } - r = comm_driver->get_report(udev, id, buf, sizeof(buf)); + r = comm_driver->get_report(udev, id, rbuf->data[id], rbuf->len[id]); if (r <= 0) { return -1; } - /* broken report descriptors are common, so store whatever we can */ - memcpy(rbuf->data[id], buf, (r < rbuf->len[id]) ? r : rbuf->len[id]); - if (rbuf->len[id] != r) { upsdebugx(2, "%s: expected %d bytes, but got %d instead", __func__, rbuf->len[id], r); - upsdebug_hex(3, "Report[err]", buf, r); + upsdebug_hex(3, "Report[err]", rbuf->data[id], r); } else { upsdebug_hex(3, "Report[get]", rbuf->data[id], rbuf->len[id]); } @@ -399,7 +395,7 @@ char *HIDGetIndexString(hid_dev_handle_t udev, const int Index, char *buf, size_ if (comm_driver->get_string(udev, Index, buf, buflen) < 1) buf[0] = '\0'; - return buf; + return rtrim(buf, '\n'); } /* Return pointer to indexed string from HID path (empty if not found) diff --git a/drivers/liebert-esp2.c b/drivers/liebert-esp2.c index 06d486a..fca7c5e 100644 --- a/drivers/liebert-esp2.c +++ b/drivers/liebert-esp2.c @@ -23,8 +23,58 @@ #include "timehead.h" #include "nut_stdint.h" +#define sivann +#define IsBitSet(val, bit) ((val) & (1 << (bit))) + #define DRIVER_NAME "Liebert ESP-II serial UPS driver" -#define DRIVER_VERSION "0.02" +#define DRIVER_VERSION "0.03" +#define UPS_SHUTDOWN_DELAY 12 /* it means UPS will be shutdown 120 sec */ +#define SHUTDOWN_CMD_LEN 8 + +/* values for sending to UPS */ +enum mult_enum { + M_10, + M_0_1, + M_VOLTAGE_I, + M_VOLTAGE_O, + M_VOLTAGE_B, + M_CURRENT_I, + M_CURRENT_O, + M_CURRENT_B, + M_LOAD_VA, + M_LOAD_WATT, + M_FREQUENCY, + M_VOLT_DC, + M_TEMPERATURE, + M_CURRENT_DC , + M_BAT_RUNTIME, + M_NOMPOWER, + M_POWER, + M_REALPOWER, + M_LOADPERC +}; + +static float multi[19]={ + 10.0, + 0.1, + 0.1, /* volt */ + 0.1, + 0.1, + 0.1, /* curr */ + 0.1, + 0.1, + 100.0, /* va */ + 100.0, /* W */ + 0.01, /* FREQ */ + 0.1, /* V DC*/ + 0.1, /* TEMP*/ + 0.01, /* CUR DC*/ + 60.0, /* BAT RUNTIME*/ + 100.0, /* NOMPOWER*/ + 100.0, /* POWER*/ + 100.0, /* REAL POWER*/ + 1.0 /* LOADPERC*/ +}; static int instcmd(const char *cmdname, const char *extra); static int setvar(const char *varname, const char *val); @@ -33,7 +83,8 @@ static int setvar(const char *varname, const char *val); upsdrv_info_t upsdrv_info = { DRIVER_NAME, DRIVER_VERSION, - "Richard Gregory ", + "Richard Gregory \n" \ + "Robert Jobbagy 1){ + cmdin_p=vartab3i; + } + else { + cmdin_p=vartab1i; + } + + if (num_outphases>1){ + cmdout_p=vartab3o; + } + else { + cmdout_p=vartab1o; + } + + for (i = 0; cmdin_p[i].var; i++) { + int16_t val; + ret = do_command(cmdin_p[i].cmd, reply, 6); + if (ret < 8) { + continue; + } + val = (unsigned char)reply[5]; + val <<= 8; + val += (unsigned char)reply[6]; + dstate_setinfo(cmdin_p[i].var, cmdin_p[i].fmt, val * multi[cmdin_p[i].multindex]); + } + + for (i = 0; cmdout_p[i].var; i++) { + int16_t val; + ret = do_command(cmdout_p[i].cmd, reply, 6); + if (ret < 8) { + continue; + } + val = (unsigned char)reply[5]; + val <<= 8; + val += (unsigned char)reply[6]; + dstate_setinfo(cmdout_p[i].var, cmdout_p[i].fmt, val * multi[cmdout_p[i].multindex]); } status_init(); - ret = do_command(cmd_bitfield1, reply); + ret = do_command(cmd_bitfield1, reply, 6); if (ret < 8) { upslogx(LOG_ERR, "Failed reading bitfield #1"); dstate_datastale(); @@ -217,7 +430,7 @@ void upsdrv_updateinfo(void) } } - ret = do_command(cmd_bitfield2, reply); + ret = do_command(cmd_bitfield2, reply, 6); if (ret < 8) { upslogx(LOG_ERR, "Failed reading bitfield #2"); dstate_datastale(); @@ -240,7 +453,7 @@ void upsdrv_updateinfo(void) status_set("TRIM"); } - ret = do_command(cmd_bitfield3, reply); + ret = do_command(cmd_bitfield3, reply, 6); if (ret < 8) { upslogx(LOG_ERR, "Failed reading bitfield #3"); dstate_datastale(); @@ -262,8 +475,13 @@ void upsdrv_updateinfo(void) void upsdrv_shutdown(void) { - /* replace with a proper shutdown function */ - fatalx(EXIT_FAILURE, "shutdown not supported"); + char reply[8]; + + if(!(do_command(cmd_setOutOffMode, reply, 8) != -1) && + (do_command(cmd_setOutOffDelay, reply, 8) != -1) && + (do_command(cmd_sysLoadKey, reply, 6) != -1) && + (do_command(cmd_shutdown, reply, 8) != -1)) + upslogx(LOG_ERR, "Failed to shutdown UPS"); } static int instcmd(const char *cmdname, const char *extra) diff --git a/drivers/liebert-hid.c b/drivers/liebert-hid.c index 89ab03a..2cce0ee 100644 --- a/drivers/liebert-hid.c +++ b/drivers/liebert-hid.c @@ -29,8 +29,8 @@ #define LIEBERT_HID_VERSION "Liebert HID 0.3" /* FIXME: experimental flag to be put in upsdrv_info */ -/* Liebert */ -#define LIEBERT_VENDORID 0x06da +/* Phoenixtec */ +#define LIEBERT_VENDORID 0x06da /* USB IDs device table */ static usb_device_id_t liebert_usb_device_table[] = { diff --git a/drivers/main.c b/drivers/main.c index d14f990..aafee68 100644 --- a/drivers/main.c +++ b/drivers/main.c @@ -258,6 +258,11 @@ static int main_arg(char *var, char *val) return 1; /* handled */ } + if (!strcmp(var, "ignorelb")) { + dstate_setinfo("driver.flag.ignorelb", "enabled"); + return 1; /* handled */ + } + /* any other flags are for the driver code */ if (!val) return 0; @@ -600,6 +605,28 @@ int main(int argc, char **argv) upsdrv_initinfo(); upsdrv_updateinfo(); + if (dstate_getinfo("driver.flag.ignorelb")) { + int have_lb_method = 0; + + if (dstate_getinfo("battery.charge") && dstate_getinfo("battery.charge.low")) { + upslogx(LOG_INFO, "using 'battery.charge' to set battery low state"); + have_lb_method++; + } + + if (dstate_getinfo("battery.runtime") && dstate_getinfo("battery.runtime.low")) { + upslogx(LOG_INFO, "using 'battery.runtime' to set battery low state"); + have_lb_method++; + } + + if (!have_lb_method) { + fatalx(EXIT_FAILURE, + "The 'ignorelb' flag is set, but there is no way to determine the\n" + "battery state of charge.\n\n" + "Only set this flag if both 'battery.charge' and 'battery.charge.low'\n" + "and/or 'battery.runtime' and 'battery.runtime.low' are available.\n"); + } + } + /* now we can start servicing requests */ dstate_init(progname, upsname); diff --git a/drivers/metasys.c b/drivers/metasys.c index 6a0b2d2..aa3a677 100644 --- a/drivers/metasys.c +++ b/drivers/metasys.c @@ -62,12 +62,12 @@ static int instcmd(const char *cmdname, const char *extra); /* Metasystem UPS data transfer are made with packet of the format: - STX DATA_LENGHT DATA CHECKSUM + STX DATA_LENGTH DATA CHECKSUM where: STX is 0x02 and is the start of transmission byte - DATA_LENGHT is number of data bytes + the checksum byte + DATA_LENGTH is number of data bytes + the checksum byte DATA ...... - CHECKSUM is the sum modulus 256 of all DATA bytes + DATA_LENGHT + CHECKSUM is the sum modulus 256 of all DATA bytes + DATA_LENGTH The answer from the UPS have the same packet format and the first data byte is equal to the command that the ups is answering to @@ -114,7 +114,7 @@ void dump_buffer(unsigned char *buffer, int buf_len) { } /* send a read command to the UPS, it retries 5 times before give up - it's a 4 byte request (STX, LENGHT, COMMAND and CHECKSUM) */ + it's a 4 byte request (STX, LENGTH, COMMAND and CHECKSUM) */ void send_read_command(char command) { int retry, sent; unsigned char buf[4]; @@ -122,9 +122,9 @@ void send_read_command(char command) { sent = 0; while ((sent != 4) && (retry < 5)) { buf[0]=0x02; /* STX Start of Transmission */ - buf[1]=0x02; /* data lenght(data + checksum byte) */ + buf[1]=0x02; /* data length(data + checksum byte) */ buf[2]=command; /* command to send */ - buf[3]=buf[1] + buf[2]; /* checksum (sum modulus 256 of data bytes + lenght) */ + buf[3]=buf[1] + buf[2]; /* checksum (sum modulus 256 of data bytes + length) */ if (retry == 4) send_zeros(); /* last retry is preceded by a serial reset...*/ sent = ser_send_buf(upsfd, buf, 4); retry += 1; @@ -134,29 +134,29 @@ void send_read_command(char command) { /* send a write command to the UPS, the write command and the value to be written are passed with a char* buffer it retries 5 times before give up */ -void send_write_command(unsigned char *command, int command_lenght) { +void send_write_command(unsigned char *command, int command_length) { int i, retry, sent, checksum; unsigned char raw_buf[255]; /* prepares the raw data */ raw_buf[0] = 0x02; /* STX byte */ - raw_buf[1] = (unsigned char)(command_lenght + 1); /* data lenght + checksum */ - memcpy(raw_buf+2, command, command_lenght); - command_lenght += 2; + raw_buf[1] = (unsigned char)(command_length + 1); /* data length + checksum */ + memcpy(raw_buf+2, command, command_length); + command_length += 2; /* calculate checksum */ checksum = 0; - for (i = 1; i < command_lenght; i++) checksum += raw_buf[i]; + for (i = 1; i < command_length; i++) checksum += raw_buf[i]; checksum = checksum % 256; - raw_buf[command_lenght] = (unsigned char)checksum; - command_lenght +=1; + raw_buf[command_length] = (unsigned char)checksum; + command_length +=1; retry = 0; sent = 0; - while ((sent != (command_lenght)) && (retry < 5)) { + while ((sent != (command_length)) && (retry < 5)) { if (retry == 4) send_zeros(); /* last retry is preceded by a serial reset... */ - sent = ser_send_buf(upsfd, raw_buf, (command_lenght)); - if (sent != (command_lenght)) printf("Error sending command %d\n", raw_buf[2]); + sent = ser_send_buf(upsfd, raw_buf, (command_length)); + if (sent != (command_length)) printf("Error sending command %d\n", raw_buf[2]); retry += 1; } } @@ -164,8 +164,8 @@ void send_write_command(unsigned char *command, int command_lenght) { /* get the answer of a command from the ups */ int get_answer(unsigned char *data) { - unsigned char my_buf[255]; /* packet has a maximum lenght of 256 bytes */ - int packet_lenght, checksum, i, res; + unsigned char my_buf[255]; /* packet has a maximum length of 256 bytes */ + int packet_length, checksum, i, res; /* Read STX byte */ res = ser_get_char(upsfd, my_buf, 1, 0); if (res < 1) { @@ -176,43 +176,43 @@ int get_answer(unsigned char *data) { ser_comm_fail("Receive error (STX): packet not on start!!\n"); return -1; } - /* Read data lenght byte */ + /* Read data length byte */ res = ser_get_char(upsfd, my_buf, 1, 0); if (res < 1) { - ser_comm_fail("Receive error (lenght): %d!!!\n", res); + ser_comm_fail("Receive error (length): %d!!!\n", res); return -1; } - packet_lenght = my_buf[0]; - if (packet_lenght < 2) { - ser_comm_fail("Receive error (lenght): packet lenght %d!!!\n", packet_lenght); + packet_length = my_buf[0]; + if (packet_length < 2) { + ser_comm_fail("Receive error (length): packet length %d!!!\n", packet_length); return -1; } - /* Try to read all the remainig bytes (packet_lenght) */ - res = ser_get_buf_len(upsfd, my_buf, packet_lenght, 1, 0); - if (res != packet_lenght) { - ser_comm_fail("Receive error (data): got %d bytes instead of %d!!!\n", res, packet_lenght); + /* Try to read all the remainig bytes (packet_length) */ + res = ser_get_buf_len(upsfd, my_buf, packet_length, 1, 0); + if (res != packet_length) { + ser_comm_fail("Receive error (data): got %d bytes instead of %d!!!\n", res, packet_length); return -1; } /* now we have the whole answer from the ups, we can checksum it - checksum byte is equal to the sum modulus 256 of all the data bytes + packet_lenght + checksum byte is equal to the sum modulus 256 of all the data bytes + packet_length (no STX no checksum byte itself) */ - checksum = packet_lenght; - for (i = 0; i < (packet_lenght - 1); i++) checksum += my_buf[i]; + checksum = packet_length; + for (i = 0; i < (packet_length - 1); i++) checksum += my_buf[i]; checksum = checksum % 256; - if (my_buf[packet_lenght-1] != checksum) { - ser_comm_fail("checksum error! got %x instad of %x, received %d bytes \n", my_buf[packet_lenght - 1], checksum, packet_lenght); - dump_buffer(my_buf, packet_lenght); + if (my_buf[packet_length-1] != checksum) { + ser_comm_fail("checksum error! got %x instad of %x, received %d bytes \n", my_buf[packet_length - 1], checksum, packet_length); + dump_buffer(my_buf, packet_length); return -1; } - packet_lenght-=1; /* get rid of the checksum byte */ - memcpy(data, my_buf, packet_lenght); - return packet_lenght; + packet_length-=1; /* get rid of the checksum byte */ + memcpy(data, my_buf, packet_length); + return packet_length; } /* send a read command and try get the answer, if something fails, it retries (5 times max) if it is on the 4th or 5th retry, it will flush the serial before sending commands - it returns the lenght of the received answer or -1 in case of failure */ + it returns the length of the received answer or -1 in case of failure */ int command_read_sequence(unsigned char command, unsigned char *data) { int bytes_read = 0; int retry = 0; @@ -234,13 +234,13 @@ int command_read_sequence(unsigned char command, unsigned char *data) { /* send a write command and try get the answer, if something fails, it retries (5 times max) if it is on the 4th or 5th retry, it will flush the serial before sending commands - it returns the lenght of the received answer or -1 in case of failure */ -int command_write_sequence(unsigned char *command, int command_lenght, unsigned char *answer) { + it returns the length of the received answer or -1 in case of failure */ +int command_write_sequence(unsigned char *command, int command_length, unsigned char *answer) { int bytes_read = 0; int retry = 0; while ((bytes_read < 1) && (retry < 5)) { - send_write_command(command, command_lenght); + send_write_command(command, command_length); bytes_read = get_answer(answer); if (retry > 2) ser_flush_in(upsfd, "", 0); retry += 1; diff --git a/drivers/mge-hid.c b/drivers/mge-hid.c index 7b3d59e..ccf1c9a 100644 --- a/drivers/mge-hid.c +++ b/drivers/mge-hid.c @@ -26,7 +26,7 @@ #include "usbhid-ups.h" #include "mge-hid.h" -#define MGE_HID_VERSION "MGE HID 1.19" +#define MGE_HID_VERSION "MGE HID 1.21" /* (prev. MGE Office Protection Systems, prev. MGE UPS SYSTEMS) */ /* Eaton */ @@ -35,6 +35,9 @@ /* Dell */ #define DELL_VENDORID 0x047c +/* Powerware */ +#define POWERWARE_VENDORID 0x0592 + #ifndef SHUT_MODE #include "usb-common.h" @@ -47,6 +50,9 @@ static usb_device_id_t mge_usb_device_table[] = { /* various models */ { USB_DEVICE(DELL_VENDORID, 0xffff), NULL }, + /* PW 9140 */ + { USB_DEVICE(POWERWARE_VENDORID, 0x0004), NULL }, + /* Terminating entry */ { -1, -1, NULL } }; @@ -492,7 +498,8 @@ static usage_lkp_t mge_usage_lkp[] = { { "HighHumidity", 0xffff0082 }, { "LowTemperature", 0xffff0083 }, { "HighTemperature", 0xffff0084 }, - /* 0xffff0085-0xffff008f => Reserved */ + /* 0xffff0085-0xffff008f (minus 0xffff0086) => Reserved */ + { "Efficiency", 0xffff0086 }, { "Count", 0xffff0090 }, { "Timer", 0xffff0091 }, { "Interval", 0xffff0092 }, @@ -582,11 +589,17 @@ static models_name_t mge_model_names [] = { "PROTECTIONCENTER", "500", MGE_DEFAULT, "Protection Center 500" }, { "PROTECTIONCENTER", "675", MGE_DEFAULT, "Protection Center 675" }, - /* Protection Station */ + /* Protection Station, supports Eco control */ { "Protection Station", "500", MGE_PEGASUS, NULL }, { "Protection Station", "650", MGE_PEGASUS, NULL }, { "Protection Station", "800", MGE_PEGASUS, NULL }, + /* Ellipse ECO, also supports Eco control */ + { "Ellipse ECO", "650", MGE_PEGASUS, NULL }, + { "Ellipse ECO", "800", MGE_PEGASUS, NULL }, + { "Ellipse ECO", "1200", MGE_PEGASUS, NULL }, + { "Ellipse ECO", "1600", MGE_PEGASUS, NULL }, + /* Evolution models */ { "Evolution", "500", MGE_DEFAULT, "Pulsar Evolution 500" }, { "Evolution", "800", MGE_DEFAULT, "Pulsar Evolution 800" }, @@ -689,6 +702,7 @@ static hid_info_t mge_hid2nut[] = { "battery.charge.restart", ST_FLAG_RW | ST_FLAG_STRING, 3, "UPS.PowerSummary.RestartLevel", NULL, "%.0f", HU_FLAG_SEMI_STATIC, NULL }, { "battery.capacity", 0, 0, "UPS.BatterySystem.Battery.DesignCapacity", NULL, "%s", HU_FLAG_STATIC, mge_battery_capacity }, /* conversion needed from As to Ah */ { "battery.runtime", 0, 0, "UPS.PowerSummary.RunTimeToEmpty", NULL, "%.0f", 0, NULL }, + { "battery.runtime.low", ST_FLAG_RW | ST_FLAG_STRING, 10, "UPS.PowerSummary.RemainingTimeLimit", NULL, "%.0f", 0, NULL }, { "battery.runtime.elapsed", 0, 0, "UPS.StatisticSystem.Input.[1].Statistic.[1].Time", NULL, "%.0f", HU_FLAG_QUICK_POLL, NULL }, { "battery.temperature", 0, 0, "UPS.BatterySystem.Battery.Temperature", NULL, "%s", 0, kelvin_celsius_conversion }, { "battery.type", 0, 0, "UPS.PowerSummary.iDeviceChemistry", NULL, "%s", HU_FLAG_STATIC, stringid_conversion }, @@ -700,6 +714,7 @@ static hid_info_t mge_hid2nut[] = { "battery.energysave", ST_FLAG_RW | ST_FLAG_STRING, 5, "UPS.PowerConverter.Input.[3].EnergySaving", NULL, "%s", HU_FLAG_SEMI_STATIC, yes_no_info }, /* UPS page */ + { "ups.efficiency", 0, 0, "UPS.PowerConverter.Output.Efficiency", NULL, "%.0f", 0, NULL }, { "ups.firmware", 0, 0, "UPS.PowerSummary.iVersion", NULL, "%s", HU_FLAG_STATIC, stringid_conversion }, { "ups.load", 0, 0, "UPS.PowerSummary.PercentLoad", NULL, "%.0f", 0, NULL }, { "ups.load.high", ST_FLAG_RW | ST_FLAG_STRING, 5, "UPS.Flow.[4].ConfigPercentLoad", NULL, "%.0f", HU_FLAG_SEMI_STATIC, NULL }, @@ -767,7 +782,7 @@ static hid_info_t mge_hid2nut[] = /* Battery DC voltage too high! */ { "BOOL", 0, 0, "UPS.BatterySystem.Battery.PresentStatus.VoltageTooHigh", NULL, NULL, 0, battvolthi_info }, { "BOOL", 0, 0, "UPS.BatterySystem.Charger.PresentStatus.VoltageTooLow", NULL, NULL, 0, battvoltlo_info }, - { "BOOL", 0, 0, "UPS.PowerConverter.Input.[1].PresentStatus.VoltageTooLow", NULL, NULL, 0, battvoltlo_info }, + { "BOOL", 0, 0, "UPS.PowerConverter.Input.[1].PresentStatus.VoltageTooLow", NULL, NULL, 0, mge_onbatt_info }, { "BOOL", 0, 0, "UPS.PowerSummary.PresentStatus.InternalFailure", NULL, NULL, 0, commfault_info }, { "BOOL", 0, 0, "UPS.PowerSummary.PresentStatus.OverTemperature", NULL, NULL, 0, overheat_info }, { "BOOL", 0, 0, "UPS.PowerSummary.PresentStatus.ShutdownImminent", NULL, NULL, 0, shutdownimm_info }, diff --git a/drivers/microdowell.c b/drivers/microdowell.c index 319edf1..33acc8e 100644 --- a/drivers/microdowell.c +++ b/drivers/microdowell.c @@ -221,13 +221,13 @@ unsigned char * CmdSerial(unsigned char *OutBuffer, int Len, unsigned char *RetB unsigned char *p ; int BuffLen ; - // The default error code (no received character) + /* The default error code (no received character) */ ErrCode = ERR_COM_NO_CHARS ; SendCmdToSerial(OutBuffer, Len) ; - usleep(10000) ; // small delay (1/100 s)) + usleep(10000) ; /* small delay (1/100 s) */ - // get chars until timeout + /* get chars until timeout */ BuffLen = 0 ; while (ser_get_char(upsfd, TmpBuff, 0, 10000) == 1) { diff --git a/drivers/powercom.c b/drivers/powercom.c index 9c75680..28ce962 100644 --- a/drivers/powercom.c +++ b/drivers/powercom.c @@ -7,7 +7,7 @@ * This model is based on PowerCom (www.powercom.com) models. * -Socomec Sicon Egys 420 * - * $Id: powercom.c 2336 2010-02-11 20:16:43Z adkorte-guest $ + * $Id: powercom.c 2990 2011-05-19 18:34:09Z aquette $ * * Copyrights: * (C) 2002 Simon Rozman @@ -51,6 +51,15 @@ * - strange battery level on BNT1200AP in online mode( & may be on other models) * - i don't know how connect to IMP|IMD USB * - i havn't specs for BNT 100-120V models. Add BNT-other type for it + * + * rev 0.13: Keven Ates + * - Modified functions to work for BNT-other 100-120V models. + * - Modified BNT-other type defaults to work for the BNT 1500A 120VA model. + * - Documented the type[] values purpose in a condensed format. + * - BNT-other can be used to perform a complete user override of values for all PowerCom models, detected or not. + * + * Tested on: BNT-1500A + * */ #include "main.h" @@ -59,7 +68,7 @@ #include "math.h" #define DRIVER_NAME "PowerCom protocol UPS driver" -#define DRIVER_VERSION "0.12" +#define DRIVER_VERSION "0.13" /* driver description structure */ upsdrv_info_t upsdrv_info = { @@ -92,7 +101,28 @@ static unsigned int type = 0; static void dtr0rts1 (void); static void no_flow_control (void); -/* struct defining types */ +/* struct defining types + * --------------------- + * See powercom.h for detailed information and functions. + * + * The following type defaults use this definition: + * + * "TypeID", + * ByteCount, + * { "FlowControlString", FlowControlFuncPtr }, + * { { ValidationIndex, ValidationValue }, + * { ValidationIndex, ValidationValue }, + * { ValidationIndex, ValidationValue } }, + * { { DelayShutdownMinutes, DelayShutdownSeconds }, + * UseMinutesChar'y''n' }, + * { FrequencyFactor, FrequencyConstant }, + * { OfflineLoadFactor, OfflineLoadConstant, + * OnlineLoadFactor, OnlineLoadConstant }, + * { OfflineBatteryFactor, OfflineLoad%Factor, OfflineBatteryConstant, + * OnlineBatteryFactor, OnlineBatteryConstant }, + * { 240VoltageFactor, 240VoltageConstant, + * 120VoltageFactor, 120VoltageConstant }, + */ static struct type types[] = { { "Trust", @@ -166,10 +196,10 @@ static struct type types[] = { { "no_flow_control", no_flow_control }, { { 8U, 0U }, { 8U, 0U }, { 8U, 0U } }, { { 1U, 30U }, 'y' }, - { 0.00020803, 0.0 }, - { 1.4474, 0.0, 0.8594, 0.0 }, - { 5.0000, 0.3268, -825.00, 0.46511, 0 }, - { 1.9216, -0.0977, 0.82857, 0.0000 }, + { 0.00027778, 0.0000 }, + { 1.0000, 0.0000, 1.0000, 0.0000 }, + { 1.0000, 0.0000, 0.0000, 1.0000, 0.0000 }, + { 2.0000, 0.0000, 2.0000, 0.0000 }, }, }; @@ -217,10 +247,10 @@ enum status { OFF = 128U }; -unsigned int voltages[]={100,110,115,120,0,0,0,200,220,230,240}; -unsigned int BNTmodels[]={0,400,500,600,800,801,1000,1200,1500,2000}; -unsigned int KINmodels[]={0,425,500,525,625,800,1000,1200,1500,1600,2200,2200,2500,3000,5000}; -unsigned int IMPmodels[]={0,425,525,625,825,1025,1200,1500,2000}; +unsigned int voltages[]={100,110,115,120,0,0,0,200,220,230,240,0,0,0,0,0}; +unsigned int BNTmodels[]={0,400,500,600,800,801,1000,1200,1500,2000,0,0,0,0,0,0}; +unsigned int KINmodels[]={0,425,500,525,625,800,1000,1200,1500,1600,2200,2200,2500,3000,5000,0}; +unsigned int IMPmodels[]={0,425,525,625,825,1025,1200,1500,2000,0,0,0,0,0,0,0}; /* * local used functions @@ -338,6 +368,7 @@ static int ups_getinfo(void) /* optional dump of raw data */ if (nut_debug_level > 4) { + /* FIXME: use upsdebug_hex() ? */ printf("Raw data from UPS:\n"); for (i = 0; i < types[type].num_of_bytes_from_ups; i++) { printf("%2d 0x%02x (%c)\n", i, raw_data[i], raw_data[i]>=0x20 ? raw_data[i] : ' '); @@ -475,7 +506,7 @@ static float output_voltage(void) static float input_freq(void) { - if ( !strncmp(types[type].name, "BNT",3) || !strcmp(types[type].name, "KIN")) + if ( !strcmp(types[type].name, "BNT") || !strcmp(types[type].name, "KIN")) return 4807.0/raw_data[INPUT_FREQUENCY]; else if ( !strcmp(types[type].name, "IMP")) return raw_data[INPUT_FREQUENCY]; @@ -487,7 +518,7 @@ static float input_freq(void) static float output_freq(void) { - if ( !strncmp(types[type].name, "BNT",3) || !strcmp(types[type].name, "KIN")) + if ( !strcmp(types[type].name, "BNT") || !strcmp(types[type].name, "KIN")) return 4807.0/raw_data[OUTPUT_FREQUENCY]; else if ( !strcmp(types[type].name, "IMP")) return raw_data[OUTPUT_FREQUENCY]; @@ -574,7 +605,7 @@ static float batt_level(void) int bat0,bat29,bat100,model; float battval; - if ( !strncmp(types[type].name, "BNT",3) ) { + if ( !strcmp(types[type].name, "BNT") ) { bat0=157; bat29=165; bat100=193; @@ -617,11 +648,13 @@ static float batt_level(void) } if ( !strcmp(types[type].name, "IMP")) return raw_data[BATTERY_CHARGE]; - return raw_data[STATUS_A] & ONLINE ? + return raw_data[STATUS_A] & ONLINE ? /* Are we on battery power? */ + /* Yes */ types[type].battpct[0] * raw_data[BATTERY_CHARGE] + types[type].battpct[1] * load_level() + types[type].battpct[2] : + /* No */ types[type].battpct[3] * raw_data[BATTERY_CHARGE] + - types[type].battpct[4]; + types[type].battpct[4]; } /* @@ -852,27 +885,31 @@ void upsdrv_initups(void) /* setup flow control */ types[type].flowControl.setup_flow_control(); + + /* Setup Model and LineVoltage */ if (!strncmp(types[type].name, "BNT",3) || !strcmp(types[type].name, "KIN") || !strcmp(types[type].name, "IMP")){ if (!ups_getinfo()) return; - if (raw_data[UPSVERSION]==0xFF){ + /* Give "BNT-other" a chance! */ + if (raw_data[MODELNAME]==0x42 || raw_data[MODELNAME]==0x4B){ + model=BNTmodels[raw_data[MODELNUMBER]/16]; + if (!strcmp(types[type].name, "BNT-other")) + types[type].name="BNT-other"; + else if (raw_data[MODELNAME]==0x42) + types[type].name="BNT"; + else if (raw_data[MODELNAME]==0x4B){ + types[type].name="KIN"; + model=KINmodels[raw_data[MODELNUMBER]/16]; + } + } + else if (raw_data[UPSVERSION]==0xFF){ types[type].name="IMP"; model=IMPmodels[raw_data[MODELNUMBER]/16]; } - if (raw_data[MODELNAME]==0x42){ - if (!strcmp(types[type].name, "BNT-other")) - types[type].name="BNT-other"; - else - types[type].name="BNT"; - model=BNTmodels[raw_data[MODELNUMBER]/16]; - } - if (raw_data[MODELNAME]==0x4B){ - types[type].name="KIN"; - model=KINmodels[raw_data[MODELNUMBER]/16]; - } linevoltage=voltages[raw_data[MODELNUMBER]%16]; snprintf(buf,sizeof(buf),"%s-%dAP",types[type].name,model); - modelname=buf; - upsdebugx(1,"Detected: %s , %dV",modelname,linevoltage); + if (!strcmp(modelname, "Unknown")) + modelname=buf; + upsdebugx(1,"Detected: %s , %dV",buf,linevoltage); if (ser_send_char (upsfd, BATTERY_TEST) != 1) { upslogx(LOG_NOTICE, "writing error"); dstate_datastale(); @@ -922,23 +959,65 @@ void upsdrv_initups(void) /* display help */ void upsdrv_help(void) { - printf("You must specify type in ups.conf\n"); - printf("Type of UPS like 'Trust', 'Egys', 'KP625AP', 'IMP', 'KIN' or 'BNT' or 'BNT-other' (default: 'Trust')\n"); - printf("BNT-other - it's a special type for BNT 100-120V models \n"); - printf("You can additional cpecify next variables:\n"); - printf(" shutdownArguments: The number of delay arguments and their values for the shutdown operation\n"); - printf("Also, you can specify next variables (not work for 'IMP', 'KIN' or 'BNT', because detected automatically or known\n"); - printf(" manufacturer: Specify manufacturer name (default: 'PowerCom')\n"); - printf(" modelname: Specify model name, because it cannot detect automagically (default: Unknown)\n"); - printf(" serialnumber: Specify serial number, because it cannot detect automatically (default: Unknown)\n"); - printf(" linevoltage: Specify line voltage (110-120 or 220-240 V), if it cannot detect automatically (default: 230 V)\n"); - printf(" numOfBytesFromUPS: The number of bytes in a UPS frame\n"); - printf(" methodOfFlowControl: The flow control method engaged by the UPS\n"); - printf(" validationSequence: 3 pairs to be used for validating the UPS\n"); - printf(" voltage: A quad to convert the raw data to human readable voltage\n"); - printf(" frequency: A pair to convert the raw data to human readable freqency\n"); - printf(" batteryPercentage: A 5 tuple to convert the raw data to human readable battery percentage\n"); - printf(" loadPercentage: A quad to convert the raw data to human readable load percentage\n"); + // 1 2 3 4 5 6 7 8 + // 12345678901234567890123456789012345678901234567890123456789012345678901234567890 MAX + printf("\n"); + printf("Specify UPS information in the ups.conf file.\n"); + printf(" type: Type of UPS: 'Trust','Egys','KP625AP','IMP','KIN','BNT',\n"); + printf(" 'BNT-other' (default: 'Trust')\n"); + printf(" 'BNT-other' is a special type intended for BNT 100-120V models,\n"); + printf(" but can be used to override ALL models.\n"); + printf("You can additional specify these variables:\n"); + printf(" manufacturer: Manufacturer name (default: 'PowerCom')\n"); + printf(" modelname: Model name (default: 'Unknown' or autodetected)\n"); + printf(" serialnumber: Serial number (default: Unknown)\n"); + printf(" shutdownArguments: 3 delay arguments for the shutdown operation:\n"); + printf(" {{Minutes,Seconds},UseMinutes?}\n"); + printf(" where Minutes and Seconds are integer, UseMinutes? is either\n"); + printf(" 'y' or 'n'.\n"); + printf("You can specify these variables if not automagically detected for types\n"); + printf(" 'IMP','KIN','BNT'\n"); + printf(" linevoltage: Line voltage: 110-120 or 220-240 (default: 230)\n"); + printf(" numOfBytesFromUPS: Number of bytes in a UPS frame: 16 is common, 11 for 'Trust'\n"); + printf(" methodOfFlowControl: Flow control method for UPS:\n"); + printf(" 'dtr0rts1', 'dtr1' or 'no_flow_control'\n"); + printf(" validationSequence: 3 pairs of validation values: {{I,V},{I,V},{I,V}}\n"); + printf(" where I is the index into BytesFromUPS (see numOfBytesFromUPS)\n"); + printf(" and V is the value for the ByteIndex to match.\n"); + printf(" frequency: Input & Output Frequency conversion values: {A, B}\n"); + printf(" used in function: 1/(A*x+B)\n"); + printf(" If the raw value x IS the frequency, then A=1/(x^2), B=0\n"); + printf(" loadPercentage: Load conversion values for Battery and Line load: {BA,BB,LA,LB}\n"); + printf(" used in function: A*x+B\n"); + printf(" If the raw value x IS the Load Percent, then A=1, B=0\n"); + printf(" batteryPercentage: Battery conversion values for Battery and Line power:\n"); + printf(" {A,B,C,D,E}\n"); + printf(" used in functions: (Battery) A*x+B*y+C, (Line) D*x+E\n"); + printf(" If the raw value x IS the Battery Percent, then\n"); + printf(" A=1, B=0, C=0, D=1, E=0\n"); + printf(" voltage: Voltage conversion values for 240 and 120 voltage:\n"); + printf(" {240A,240B,120A,120B}\n"); + printf(" used in function: A*x+B\n"); + printf(" If the raw value x IS HALF the Voltage, then A=2, B=0\n\n"); + + printf("Example for BNT1500AP in ups.conf:\n"); + printf("[BNT1500AP]\n"); + printf(" driver = powercom\n"); + printf(" port = /dev/ttyS0\n"); + printf(" desc = \"PowerCom BNT 1500 AP\"\n"); + printf(" manufacturer = PowerCom\n"); + printf(" modelname = BNT1500AP\n"); + printf(" serialnumber = 13245678900\n"); + printf(" type = BNT-other\n"); + printf("# linevoltage = 120\n"); + printf("# numOfBytesFromUPS = 16\n"); + printf("# methodOfFlowControl = no_flow_control\n"); + printf("# validationSequence = {{8,0},{8,0},{8,0}}\n"); + printf("# shutdownArguments = {{1,30},y}\n"); + printf("# frequency = {0.00027778,0.0000}\n"); + printf("# loadPercentage = {1.0000,0.0,1.0000,0.0}\n"); + printf("# batteryPercentage = {1.0000,0.0000,0.0000,1.0000,0.0000}\n"); + printf("# voltage = {2.0000,0.0000,2.0000,0.0000}\n"); return; } @@ -962,20 +1041,36 @@ void upsdrv_initinfo(void) /* define possible arguments */ void upsdrv_makevartable(void) { - addvar(VAR_VALUE, "manufacturer", "Specify manufacturer name (default: 'PowerCom')"); - addvar(VAR_VALUE, "linevoltage", "Specify line voltage (110-120 or 220-240 V), if it cannot detect automatically (default: 230 V)"); - addvar(VAR_VALUE, "modelname", "Specify model name, because it cannot detect automagically (default: Unknown)"); - addvar(VAR_VALUE, "serialnumber", "Specify serial number, because it cannot detect automatically (default: Unknown)"); - addvar(VAR_VALUE, "type", "Type of UPS like 'Trust', 'Egys', 'KP625AP', 'IMP', 'KIN' or 'BNT' or 'BNT-other' (default: 'Trust')"); - addvar(VAR_VALUE, "numOfBytesFromUPS", "The number of bytes in a UPS frame"); - addvar(VAR_VALUE, "methodOfFlowControl", "The flow control method engaged by the UPS"); - addvar(VAR_VALUE, "shutdownArguments", "The number of delay arguments and their values for the shutdown operation"); - addvar(VAR_VALUE, "validationSequence", "3 pairs to be used for validating the UPS"); + // 1 2 3 4 5 6 7 8 + //2345678901234567890123456789012345678901234567890123456789012345678901234567890 MAX + addvar(VAR_VALUE, "type", + "Type of UPS: 'Trust','Egys','KP625AP','IMP','KIN','BNT','BNT-other'\n" + " (default: 'Trust')"); + addvar(VAR_VALUE, "manufacturer", + "Manufacturer name (default: 'PowerCom')"); + addvar(VAR_VALUE, "modelname", + "Model name [cannot be detected] (default: Unknown)"); + addvar(VAR_VALUE, "serialnumber", + "Serial number [cannot be detected] (default: Unknown)"); + addvar(VAR_VALUE, "shutdownArguments", + "Delay values for shutdown: Minutes, Seconds, UseMinutes?'y'or'n'"); + addvar(VAR_VALUE, "linevoltage", + "Line voltage 110-120 or 220-240 V (default: 230)"); + addvar(VAR_VALUE, "numOfBytesFromUPS", + "The number of bytes in a UPS frame"); + addvar(VAR_VALUE, "methodOfFlowControl", + "Flow control method for UPS: 'dtr0rts1' or 'no_flow_control'"); + addvar(VAR_VALUE, "validationSequence", + "Validation values: ByteIndex, ByteValue x 3"); if ( strcmp(types[type].name, "KIN") && strcmp(types[type].name, "BNT") && strcmp(types[type].name, "IMP")) { - addvar(VAR_VALUE, "voltage", "A quad to convert the raw data to human readable voltage"); - addvar(VAR_VALUE, "frequency", "A pair to convert the raw data to human readable freqency"); - addvar(VAR_VALUE, "batteryPercentage", "A 5 tuple to convert the raw data to human readable battery percentage"); - addvar(VAR_VALUE, "loadPercentage", "A quad to convert the raw data to human readable load percentage"); + addvar(VAR_VALUE, "frequency", + "Frequency conversion values: FreqFactor, FreqConst"); + addvar(VAR_VALUE, "loadPercentage", + "Load conversion values: OffFactor, OffConst, OnFactor, OnConst"); + addvar(VAR_VALUE, "batteryPercentage", + "Battery conversion values: OffFactor, LoadFactor, OffConst, OnFactor, OnConst"); + addvar(VAR_VALUE, "voltage", + "Voltage conversion values: 240VFactor, 240VConst, 120VFactor, 120VConst"); } } diff --git a/drivers/powercom.h b/drivers/powercom.h index 8209099..3286860 100644 --- a/drivers/powercom.h +++ b/drivers/powercom.h @@ -1,7 +1,7 @@ /* * powercom.h - defines for the newpowercom.c driver * - * $Id: powercom.h 2627 2010-10-26 21:09:34Z adkorte-guest $ + * $Id: powercom.h 2984 2011-05-13 13:18:34Z aquette $ * * Copyrights: * (C) 2002 Simon Rozman @@ -62,39 +62,39 @@ struct type { * the COUNTER commands while others are known to work with the * seconds argument alone. */ - struct deley_for_power_kill { + struct delay_for_power_kill { unsigned int delay[2]; /* { minutes, seconds } */ unsigned char minutesShouldBeUsed; - /* 'n' in case the minutes value, which is deley[0], should + /* 'n' in case the minutes value, which is delay[0], should * be skipped and not sent to the UPS. */ } shutdown_arguments; - /* parameters to calculate input and output freq., one pair for - * each type: - * Each pair defines parameters for 1/(A*x+B) to calculate freq. - * from raw data + /* parameters to calculate input and output freq., one pair used for + * both input and output functions: + * The pair [0],[1] defines parameters for 1/(A*x+B) to calculate freq. + * from raw data 'x'. */ float freq[2]; /* parameters to calculate load %, two pairs for each type: - * First pair defines the parameters for A*x+B to calculate load - * from raw data when offline and the second pair is used when + * First pair [0],[1] defines the parameters for A*x+B to calculate load + * from raw data when offline and the second pair [2],[3] is used when * online */ float loadpct[4]; /* parameters to calculate battery %, five parameters for each type: - * First three params defines the parameters for A*x+B*y+C to calculate + * First three params [0],[1],[2] defines the parameters for A*x+B*y+C to calculate * battery % (x is raw data, y is load %) when offline. - * Fourth and fifth parameters are used to calculate D*y+E when online. + * Fourth and fifth parameters [3],[4] are used to calculate D*x+E when online. */ float battpct[5]; /* parameters to calculate utility and output voltage, two pairs for * each type: - * First pair defines the parameters for A*x+B to calculate utility - * from raw data when line voltage is >=220 and the second pair + * First pair [0],[1] defines the parameters for A*x+B to calculate utility + * from raw data when line voltage is >=220 and the second pair [2],[3] * is used otherwise. */ float voltage[4]; diff --git a/drivers/rhino.c b/drivers/rhino.c index 6839fde..ca66169 100644 --- a/drivers/rhino.c +++ b/drivers/rhino.c @@ -22,7 +22,7 @@ 2005/10/26 - Version 0.40 - Operational-2 release 2005/11/29 - Version 0.50 - rhino commands release - + http://www.microsol.com.br */ @@ -63,28 +63,27 @@ typedef int bool_t; #define CMD_PASSOFF 0x0006 #define CMD_UPSCONT 0x0053 -/* xoff - xon protocol -#define _SOH = 0x01; // start of header -#define _EOT = 0x04; // end of transmission -#define _ACK = 0x06; // acknoledge (positive) -#define _DLE = 0x10; // data link escape -#define _XOn = 0x11; // transmit on -#define _XOff = 0x13; // transmit off -#define _NAK = 0x15; // negative acknoledge -#define _SYN = 0x16; // synchronous idle -#define _CAN = 0x18; // cancel -*/ +/* xoff - xon protocol */ +#define _SOH = 0x01; /* start of header */ +#define _EOT = 0x04; /* end of transmission */ +#define _ACK = 0x06; /* acknoledge (positive) */ +#define _DLE = 0x10; /* data link escape */ +#define _XOn = 0x11; /* transmit on */ +#define _XOff = 0x13; /* transmit off */ +#define _NAK = 0x15; /* negative acknoledge */ +#define _SYN = 0x16; /* synchronous idle */ +#define _CAN = 0x18; /* cancel */ static int const pacsize = 37; /* size of receive data package */ /* autonomy calcule */ -static double const AmpH = 40; // Amperes-hora da bateria -static double const VbatMin = 126; // Tensão mínina das baterias -static double const VbatNom = 144; // Tensão nominal das baterias -static double const FM = 0.32; // Fator multiplicativo de correção da autonomia -static double const FA = -2; // Fator aditivo de correção da autonomia -static double const ConstInt = 250; // Consumo interno sem o carregador -static double const Vin = 220; // Tensão de entrada +static double const AmpH = 40; /* Amperes-hora da bateria */ +static double const VbatMin = 126; /* Tensão mínina das baterias */ +static double const VbatNom = 144; /* Tensão nominal das baterias */ +static double const FM = 0.32; /* Fator multiplicativo de correção da autonomia */ +static double const FA = -2; /* Fator aditivo de correção da autonomia */ +static double const ConstInt = 250; /* Consumo interno sem o carregador */ +static double const Vin = 220; /* Tensão de entrada */ static int Day, Month, Year; static int dian=0, mesn=0, anon=0, weekn=0; @@ -93,8 +92,8 @@ static int ihour,imin, isec; /* char seman[4]; */ /* int FExpansaoBateria; */ -// internal variables -// package handshake ariables +/* internal variables */ +/* package handshake variables */ /* int ContadorEstouro; */ static bool_t detected; static bool_t SourceFail, Out110, RedeAnterior, OcorrenciaDeFalha; @@ -125,7 +124,7 @@ static int BoostVolt, Rendimento; static unsigned char StatusEntrada, StatusSaida, StatusBateria; /* events group */ static unsigned char EventosRede, EventosSaida, EventosBateria; -// Grupo de Programação +/* Grupo de Programação */ /* Methods */ static void ScanReceivePack(void); @@ -261,16 +260,16 @@ ScanReceivePack( void ) if( RecPack[0] ==0xC2 ) { LimInfBattSrc = 174; - LimSupBattSrc = 192;//180????? carregador eh 180 (SCOPOS) + LimSupBattSrc = 192;/* 180????? carregador eh 180 (SCOPOS) */ LimInfBattInv = 174; - LimSupBattInv = 192;//170????? (SCOPOS) + LimSupBattInv = 192;/* 170????? (SCOPOS) */ } else { LimInfBattSrc = 138; - LimSupBattSrc = 162;//180????? carregador eh 180 (SCOPOS) + LimSupBattSrc = 162;/* 180????? carregador eh 180 (SCOPOS) */ LimInfBattInv = 126; - LimSupBattInv = 156;//170????? (SCOPOS) + LimSupBattInv = 156;/* 170????? (SCOPOS) */ } BattNonValue = 144; @@ -300,10 +299,10 @@ ScanReceivePack( void ) if( BypassOn ) OutVoltage = ( InVoltage * 1.0 / 2 ) + 5; - if( SourceFail && RedeAnterior ) // falha pela primeira vez + if( SourceFail && RedeAnterior ) /* falha pela primeira vez */ OcorrenciaDeFalha = true; - if( !( SourceFail ) && !( RedeAnterior ) ) // retorno da rede + if( !( SourceFail ) && !( RedeAnterior ) ) /* retorno da rede */ RetornoDaRede = true; if( !( SourceFail ) == RedeAnterior ) @@ -333,7 +332,7 @@ ScanReceivePack( void ) RecPack[8] = 99; /* ??????????????????????????????????? */ } - if( OutputOn ) // Output Status + if( OutputOn ) /* Output Status */ StatusSaida = 2; else StatusSaida = 1; @@ -341,7 +340,7 @@ ScanReceivePack( void ) if( OverCharge ) StatusSaida = 3; - if( CriticBatt ) // Battery Status + if( CriticBatt ) /* Battery Status */ StatusBateria = 4; else StatusBateria = 1; @@ -494,7 +493,7 @@ send_command( int cmd ) if( i == 1) chk = cmd; else - chk = 0x00; // 0x20; + chk = 0x00; /* 0x20; */ } ch = chk; @@ -511,7 +510,7 @@ send_command( int cmd ) kount = 0; while ( kount < 5 ) { - /* ret = ser_send_buf_pace(upsfd, UPSDELAY, psend, sizes );// optional delay */ + /* ret = ser_send_buf_pace(upsfd, UPSDELAY, psend, sizes ); */ /* optional delay */ for(i=0; i < 19; i++) { @@ -564,7 +563,7 @@ static void getbaseinfo(void) while ( ( !detected ) && ( j < 10 ) ) { - temp[0] = 0; // flush temp buffer + temp[0] = 0; /* flush temp buffer */ tam = ser_get_buf_len(upsfd, temp, pacsize, 3, 0); if( tam == 37 ) { @@ -628,10 +627,10 @@ static void getbaseinfo(void) dstate_setinfo("input.transfer.high", "%03.1f", InUpLim); LimSupBattInv ? */ - dstate_addcmd("shutdown.stayoff"); // CMD_SHUT + dstate_addcmd("shutdown.stayoff"); /* CMD_SHUT */ /* there is no reserved words for CMD_INON and CMD_INOFF yet */ - /* dstate_addcmd("input.on"); // CMD_INON = 1 */ - /* dstate_addcmd("input.off"); // CMD_INOFF = 2 */ + /* dstate_addcmd("input.on"); */ /* CMD_INON = 1 */ + /* dstate_addcmd("input.off"); */ /* CMD_INOFF = 2 */ dstate_addcmd("load.on"); /* CMD_OUTON = 3 */ dstate_addcmd("load.off"); /* CMD_OUTOFF = 4 */ dstate_addcmd("bypass.start"); /* CMD_PASSON = 5 */ @@ -671,7 +670,7 @@ static int instcmd(const char *cmdname, const char *extra) if (!strcasecmp(cmdname, "shutdown.stayoff")) { - // shutdown now (one way) + /* shutdown now (one way) */ /* send_command( CMD_SHUT ); */ sendshut(); return STAT_INSTCMD_HANDLED; @@ -679,7 +678,7 @@ static int instcmd(const char *cmdname, const char *extra) if (!strcasecmp(cmdname, "load.on")) { - // liga Saida + /* liga Saida */ ret = send_command( 3 ); if ( ret < 1 ) upslogx(LOG_ERR, "send_command 3 failed"); @@ -688,7 +687,7 @@ static int instcmd(const char *cmdname, const char *extra) if (!strcasecmp(cmdname, "load.off")) { - // desliga Saida + /* desliga Saida */ ret = send_command( 4 ); if ( ret < 1 ) upslogx(LOG_ERR, "send_command 4 failed"); @@ -697,7 +696,7 @@ static int instcmd(const char *cmdname, const char *extra) if (!strcasecmp(cmdname, "bypass.start")) { - // liga Bypass + /* liga Bypass */ ret = send_command( 5 ); if ( ret < 1 ) upslogx(LOG_ERR, "send_command 5 failed"); @@ -706,7 +705,7 @@ static int instcmd(const char *cmdname, const char *extra) if (!strcasecmp(cmdname, "bypass.stop")) { - // desliga Bypass + /* desliga Bypass */ ret = send_command( 6 ); if ( ret < 1 ) upslogx(LOG_ERR, "send_command 6 failed"); @@ -771,7 +770,7 @@ void upsdrv_shutdown(void) /* on line: send normal shutdown, ups will return by itself on utility */ /* on battery: send shutdown+return, ups will cycle and return soon */ - if (!SourceFail) // on line + if (!SourceFail) /* on line */ { printf("On line, forcing shutdown command...\n"); send_command( CMD_SHUT ); diff --git a/drivers/snmp-ups.c b/drivers/snmp-ups.c index d852dc5..344f514 100644 --- a/drivers/snmp-ups.c +++ b/drivers/snmp-ups.c @@ -484,7 +484,7 @@ bool_t nut_snmp_get_str(const char *OID, char *buf, size_t buf_len, info_lkp_t * len = snprintf(buf, buf_len, "%ld", *pdu->variables->val.integer / 100); break; default: - upslogx(LOG_ERR, "[%s] unhandled ASN 0x%x recieved from %s", + upslogx(LOG_ERR, "[%s] unhandled ASN 0x%x received from %s", upsname?upsname:device_name, pdu->variables->type, OID); return FALSE; break; @@ -524,7 +524,7 @@ bool_t nut_snmp_get_int(const char *OID, long *pval) value = *pdu->variables->val.integer / 100; break; default: - upslogx(LOG_ERR, "[%s] unhandled ASN 0x%x recieved from %s", + upslogx(LOG_ERR, "[%s] unhandled ASN 0x%x received from %s", upsname?upsname:device_name, pdu->variables->type, OID); return FALSE; break; @@ -1459,7 +1459,7 @@ static int parse_mibconf_args(int numargs, char **arg) if (ret == FALSE) upslogx(LOG_ERR, "su_setvar: cannot set value %s for %s", arg[4], arg[3]); else - upsdebugx(1, "su_setvar: sucessfully set %s to \"%s\"", arg[0], arg[4]); + upsdebugx(1, "su_setvar: successfully set %s to \"%s\"", arg[0], arg[4]); return 1; } diff --git a/drivers/solis.c b/drivers/solis.c index 0ff49a7..f2e47f7 100644 --- a/drivers/solis.c +++ b/drivers/solis.c @@ -282,23 +282,12 @@ static unsigned char revertdays( unsigned char dweek ) static int IsHour( char *strx, int qual ) { - char shora[3], smin[3], sep[2]; - int hora=0, min = 0, len = 0; + int hora=0, min = 0; - len = strlen( strx ); - if ( len != 5 ) - return -1; - sscanf( strx, "%2s%1s%2s", shora, sep, smin); - if( sep[0] != ':' ) - return -1; - if( (!isdigit( shora[0] )) || (!isdigit( shora[1] )) ) - return -1; - if( (!isdigit( smin[0] )) || (!isdigit( smin[1] )) ) + if ((strlen(strx) != 5) || (sscanf(strx, "%d:%d", &hora, &min) != 2)) { return -1; + } - hora = atoi( shora ); - min = atoi( smin ); - if( qual ) { dhour = hora; dmin = min; @@ -408,7 +397,7 @@ static int IsToday( unsigned char dweek, int nweek) switch ( nweek ) { - case 0: // sunday + case 0: /* sunday */ return ( ( ( dweek & 0x40 ) == 0x40 ) ); case 1: return ( ( ( dweek & 0x20 ) == 0x20 ) ); @@ -420,7 +409,7 @@ static int IsToday( unsigned char dweek, int nweek) return ( ( ( dweek & 0x04 ) == 0x04 ) ); case 5: return ( ( ( dweek & 0x02 ) == 0x02 ) ); - case 6: // saturday + case 6: /* saturday */ return ( ( ( dweek & 0x01 ) == 0x01 ) ); } @@ -802,7 +791,7 @@ static void getbaseinfo(void) #else char DaysOfWeek[7][4]={"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; #endif - char mycmd[8]; // , ch; + char mycmd[8]; char *str1, *str2, *str3, *str4, *strx; unsigned char Pacote[25]; int i, i1=0, i2=0, j=0, tam, tpac=25; @@ -871,7 +860,7 @@ static void getbaseinfo(void) } } - } // end prgups 1 - 2 + } /* end prgups 1 - 2 */ /* dummy read attempt to sync - throw it out */ snprintf(mycmd, sizeof(mycmd), "%c%c",CMD_UPSCONT, ENDCHAR); @@ -879,7 +868,7 @@ static void getbaseinfo(void) /* trying detect solis model */ while ( ( !detected ) && ( j < 20 ) ) { - temp[0] = 0; // flush temp buffer + temp[0] = 0; /* flush temp buffer */ tam = ser_get_buf_len(upsfd, temp, tpac, 3, 0); if( tam == 25 ) { for( i = 0 ; i < tam ; i++ ) { @@ -1011,17 +1000,17 @@ static int instcmd(const char *cmdname, const char *extra) { if (!strcasecmp(cmdname, "shutdown.return")) { - // shutdown and restart - ser_send_char(upsfd, CMD_SHUTRET); // 0xDE - // ser_send_char(upsfd, ENDCHAR); + /* shutdown and restart */ + ser_send_char(upsfd, CMD_SHUTRET); /* 0xDE */ + /* ser_send_char(upsfd, ENDCHAR); */ return STAT_INSTCMD_HANDLED; } if (!strcasecmp(cmdname, "shutdown.stayoff")) { - // shutdown now (one way) - ser_send_char(upsfd, CMD_SHUT); // 0xDD - // ser_send_char(upsfd, ENDCHAR); + /* shutdown now (one way) */ + ser_send_char(upsfd, CMD_SHUT); /* 0xDD */ + /* ser_send_char(upsfd, ENDCHAR); */ return STAT_INSTCMD_HANDLED; } @@ -1082,7 +1071,7 @@ void upsdrv_shutdown(void) /* on battery: send normal shutdown, ups will return by itself on utility */ /* on line: send shutdown+return, ups will cycle and return soon */ - if (!SourceFail) { // on line + if (!SourceFail) { /* on line */ printf("On line, sending shutdown+return command...\n"); ser_send_char(upsfd, CMD_SHUTRET ); diff --git a/drivers/usb-common.h b/drivers/usb-common.h index 8df0b5a..9ab1fce 100644 --- a/drivers/usb-common.h +++ b/drivers/usb-common.h @@ -71,7 +71,10 @@ void USBFreeExactMatcher(USBDeviceMatcher_t *matcher); void USBFreeRegexMatcher(USBDeviceMatcher_t *matcher); /* dummy USB function and macro, inspired from the Linux kernel - * this allows USB information extraction */ + * this allows USB information extraction + * CAUTION: only use with *valid* device identifiers, Ie the following is not + * valid (from blazer_usb, krauler subdriver): 0x0001:0x0000 + */ #define USB_DEVICE(vendorID, productID) vendorID, productID typedef struct { diff --git a/include/Makefile.am b/include/Makefile.am index bd2ee4b..51894b6 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -1,9 +1,8 @@ EXTRA_DIST = attribute.h common.h extstate.h parseconf.h proto.h \ - state.h timehead.h upsconf.h + state.h timehead.h upsconf.h nut_stdint.h # http://www.gnu.org/software/automake/manual/automake.html#Clean -BUILT_SOURCES = nut_version.h nut_stdint.h -DISTCLEANFILES = nut_stdint.h +BUILT_SOURCES = nut_version.h CLEANFILES = nut_version.h # magic to include SVN revision number in NUT version string diff --git a/include/Makefile.in b/include/Makefile.in index 81a05c6..6767600 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -39,7 +39,6 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/config.h.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ @@ -226,12 +225,11 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ udevdir = @udevdir@ EXTRA_DIST = attribute.h common.h extstate.h parseconf.h proto.h \ - state.h timehead.h upsconf.h + state.h timehead.h upsconf.h nut_stdint.h # http://www.gnu.org/software/automake/manual/automake.html#Clean -BUILT_SOURCES = nut_version.h nut_stdint.h -DISTCLEANFILES = nut_stdint.h +BUILT_SOURCES = nut_version.h CLEANFILES = nut_version.h all: $(BUILT_SOURCES) config.h $(MAKE) $(AM_MAKEFLAGS) all-am @@ -355,7 +353,6 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" diff --git a/include/config.h.in b/include/config.h.in index e2df661..ae5bb0a 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -288,21 +288,6 @@ /* User to switch to if started as root */ #undef RUN_AS_USER -/* The size of `char', as computed by sizeof. */ -#undef SIZEOF_CHAR - -/* The size of `int', as computed by sizeof. */ -#undef SIZEOF_INT - -/* The size of `long', as computed by sizeof. */ -#undef SIZEOF_LONG - -/* The size of `short', as computed by sizeof. */ -#undef SIZEOF_SHORT - -/* The size of `void*', as computed by sizeof. */ -#undef SIZEOF_VOIDP - /* Path for UPS driver state files */ #undef STATEPATH diff --git a/include/nut_stdint.h b/include/nut_stdint.h new file mode 100644 index 0000000..35292ee --- /dev/null +++ b/include/nut_stdint.h @@ -0,0 +1,34 @@ +/* + * nut_stdint.h - Network UPS Tools sets of integer types having specified widths + * + * Copyright (C) 2011 Arjen de Korte + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef NUT_STDINT_H_SEEN +#define NUT_STDINT_H_SEEN + +#include "config.h" + +#if defined HAVE_INTTYPES_H +# include +#endif + +#if defined HAVE_STDINT_H +# include +#endif + +#endif /* NUT_STDINT_H_SEEN */ diff --git a/include/nut_version.h b/include/nut_version.h index b830a50..42cfb0c 100644 --- a/include/nut_version.h +++ b/include/nut_version.h @@ -1,3 +1,3 @@ /* Autogenerated file. Do not change. */ /* This file was generated by "make". */ -#define NUT_VERSION_MACRO "2.6.0-2831:2832" +#define NUT_VERSION_MACRO "2.6.1-3015:3023" diff --git a/lib/Makefile.in b/lib/Makefile.in index e3e5b8a..73e3a58 100644 --- a/lib/Makefile.in +++ b/lib/Makefile.in @@ -43,7 +43,6 @@ DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/libupsclient-config.in $(srcdir)/libupsclient.pc.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ diff --git a/lib/libupsclient-config.in b/lib/libupsclient-config.in index a7de7d5..2a59f70 100644 --- a/lib/libupsclient-config.in +++ b/lib/libupsclient-config.in @@ -10,7 +10,7 @@ Version="@PACKAGE_VERSION@" prefix=@prefix@ exec_prefix=@exec_prefix@ -Libs="-L@libdir@ -lupsclient @LIBSSL_LDFLAGS@" +Libs="-L@libdir@ -lupsclient @LIBSSL_LIBS@" Cflags="-I@includedir@ @LIBSSL_CFLAGS@" case "$1" in diff --git a/lib/libupsclient.pc.in b/lib/libupsclient.pc.in index eb6826c..4ad31fb 100644 --- a/lib/libupsclient.pc.in +++ b/lib/libupsclient.pc.in @@ -9,5 +9,5 @@ nutuser=@RUN_AS_USER@ Name: libupsclient Description: UPS monitoring with Network UPS Tools Version: @PACKAGE_VERSION@ -Libs: -L${libdir} -lupsclient @LIBSSL_LDFLAGS@ +Libs: -L${libdir} -lupsclient @LIBSSL_LIBS@ Cflags: -I${includedir} @LIBSSL_CFLAGS@ diff --git a/ltmain.sh b/ltmain.sh index 7ed280b..fa4b1e1 100755 --- a/ltmain.sh +++ b/ltmain.sh @@ -65,7 +65,7 @@ # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1 +# $progname: (GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu3 # automake: $automake_version # autoconf: $autoconf_version # @@ -73,7 +73,7 @@ PROGRAM=ltmain.sh PACKAGE=libtool -VERSION="2.2.6b Debian-2.2.6b-2ubuntu1" +VERSION="2.2.6b Debian-2.2.6b-2ubuntu3" TIMESTAMP="" package_revision=1.3017 diff --git a/m4/ax_create_stdint_h.m4 b/m4/ax_create_stdint_h.m4 deleted file mode 100644 index f2a94e1..0000000 --- a/m4/ax_create_stdint_h.m4 +++ /dev/null @@ -1,725 +0,0 @@ -# =========================================================================== -# http://www.nongnu.org/autoconf-archive/ax_create_stdint_h.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CREATE_STDINT_H [( HEADER-TO-GENERATE [, HEDERS-TO-CHECK])] -# -# DESCRIPTION -# -# the "ISO C9X: 7.18 Integer types " section requires the -# existence of an include file that defines a set of typedefs, -# especially uint8_t,int32_t,uintptr_t. Many older installations will not -# provide this file, but some will have the very same definitions in -# . In other enviroments we can use the inet-types in -# which would define the typedefs int8_t and u_int8_t -# respectivly. -# -# This macros will create a local "_stdint.h" or the headerfile given as -# an argument. In many cases that file will just "#include " or -# "#include ", while in other environments it will provide the -# set of basic 'stdint's definitions/typedefs: -# -# int8_t,uint8_t,int16_t,uint16_t,int32_t,uint32_t,intptr_t,uintptr_t -# int_least32_t.. int_fast32_t.. intmax_t -# -# which may or may not rely on the definitions of other files, or using -# the AC_CHECK_SIZEOF macro to determine the actual sizeof each type. -# -# if your header files require the stdint-types you will want to create an -# installable file mylib-int.h that all your other installable header may -# include. So if you have a library package named "mylib", just use -# -# AX_CREATE_STDINT_H(mylib-int.h) -# -# in configure.ac and go to install that very header file in Makefile.am -# along with the other headers (mylib.h) - and the mylib-specific headers -# can simply use "#include " to obtain the stdint-types. -# -# Remember, if the system already had a valid , the generated -# file will include it directly. No need for fuzzy HAVE_STDINT_H things... -# (oops, GCC 4.2.x has deliberatly disabled its stdint.h for non-c99 -# compilation and the c99-mode is not the default. Therefore this macro -# will not use the compiler's stdint.h - please complain to the GCC -# developers). -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# -# 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, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -AC_DEFUN([AX_CHECK_DATA_MODEL],[ - AC_CHECK_SIZEOF(char) - AC_CHECK_SIZEOF(short) - AC_CHECK_SIZEOF(int) - AC_CHECK_SIZEOF(long) - AC_CHECK_SIZEOF(void*) - ac_cv_char_data_model="" - ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_char" - ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_short" - ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_int" - ac_cv_long_data_model="" - ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_int" - ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_long" - ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_voidp" - AC_MSG_CHECKING([data model]) - case "$ac_cv_char_data_model/$ac_cv_long_data_model" in - 122/242) ac_cv_data_model="IP16" ; n="standard 16bit machine" ;; - 122/244) ac_cv_data_model="LP32" ; n="standard 32bit machine" ;; - 122/*) ac_cv_data_model="i16" ; n="unusual int16 model" ;; - 124/444) ac_cv_data_model="ILP32" ; n="standard 32bit unixish" ;; - 124/488) ac_cv_data_model="LP64" ; n="standard 64bit unixish" ;; - 124/448) ac_cv_data_model="LLP64" ; n="unusual 64bit unixish" ;; - 124/*) ac_cv_data_model="i32" ; n="unusual int32 model" ;; - 128/888) ac_cv_data_model="ILP64" ; n="unusual 64bit numeric" ;; - 128/*) ac_cv_data_model="i64" ; n="unusual int64 model" ;; - 222/*2) ac_cv_data_model="DSP16" ; n="strict 16bit dsptype" ;; - 333/*3) ac_cv_data_model="DSP24" ; n="strict 24bit dsptype" ;; - 444/*4) ac_cv_data_model="DSP32" ; n="strict 32bit dsptype" ;; - 666/*6) ac_cv_data_model="DSP48" ; n="strict 48bit dsptype" ;; - 888/*8) ac_cv_data_model="DSP64" ; n="strict 64bit dsptype" ;; - 222/*|333/*|444/*|666/*|888/*) : - ac_cv_data_model="iDSP" ; n="unusual dsptype" ;; - *) ac_cv_data_model="none" ; n="very unusual model" ;; - esac - AC_MSG_RESULT([$ac_cv_data_model ($ac_cv_long_data_model, $n)]) -]) - -dnl AX_CHECK_HEADER_STDINT_X([HEADERLIST][,ACTION-IF]) -AC_DEFUN([AX_CHECK_HEADER_STDINT_X],[ -AC_CACHE_CHECK([for stdint uintptr_t], [ac_cv_header_stdint_x],[ - ac_cv_header_stdint_x="" # the 1997 typedefs (inttypes.h) - AC_MSG_RESULT([(..)]) - for i in m4_ifval([$1],[$1],[stdint.h inttypes.h sys/inttypes.h sys/types.h]) - do - unset ac_cv_type_uintptr_t - unset ac_cv_type_uint64_t - AC_CHECK_TYPE(uintptr_t,[ac_cv_header_stdint_x=$i],continue,[#include <$i>]) - AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include<$i>]) - m4_ifvaln([$2],[$2]) break - done - AC_MSG_CHECKING([for stdint uintptr_t]) - ]) -]) - -AC_DEFUN([AX_CHECK_HEADER_STDINT_O],[ -AC_CACHE_CHECK([for stdint uint32_t], [ac_cv_header_stdint_o],[ - ac_cv_header_stdint_o="" # the 1995 typedefs (sys/inttypes.h) - AC_MSG_RESULT([(..)]) - for i in m4_ifval([$1],[$1],[inttypes.h sys/inttypes.h sys/types.h stdint.h]) - do - unset ac_cv_type_uint32_t - unset ac_cv_type_uint64_t - AC_CHECK_TYPE(uint32_t,[ac_cv_header_stdint_o=$i],continue,[#include <$i>]) - AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include<$i>]) - m4_ifvaln([$2],[$2]) break - break; - done - AC_MSG_CHECKING([for stdint uint32_t]) - ]) -]) - -AC_DEFUN([AX_CHECK_HEADER_STDINT_U],[ -AC_CACHE_CHECK([for stdint u_int32_t], [ac_cv_header_stdint_u],[ - ac_cv_header_stdint_u="" # the BSD typedefs (sys/types.h) - AC_MSG_RESULT([(..)]) - for i in m4_ifval([$1],[$1],[sys/types.h inttypes.h sys/inttypes.h]) ; do - unset ac_cv_type_u_int32_t - unset ac_cv_type_u_int64_t - AC_CHECK_TYPE(u_int32_t,[ac_cv_header_stdint_u=$i],continue,[#include <$i>]) - AC_CHECK_TYPE(u_int64_t,[and64="/u_int64_t"],[and64=""],[#include<$i>]) - m4_ifvaln([$2],[$2]) break - break; - done - AC_MSG_CHECKING([for stdint u_int32_t]) - ]) -]) - -AC_DEFUN([AX_CREATE_STDINT_H], -[# ------ AX CREATE STDINT H ------------------------------------- -AC_MSG_CHECKING([for stdint types]) -ac_stdint_h=`echo ifelse($1, , _stdint.h, $1)` -# try to shortcircuit - if the default include path of the compiler -# can find a "stdint.h" header then we assume that all compilers can. -AC_CACHE_VAL([ac_cv_header_stdint_t],[ -old_CXXFLAGS="$CXXFLAGS" ; CXXFLAGS="" -old_CPPFLAGS="$CPPFLAGS" ; CPPFLAGS="" -old_CFLAGS="$CFLAGS" ; CFLAGS="" -AC_TRY_COMPILE([#include ],[int_least32_t v = 0;], -[ac_cv_stdint_result="(assuming C99 compatible system)" - ac_cv_header_stdint_t="stdint.h"; ], -[ac_cv_header_stdint_t=""]) -if test "$GCC" = "yes" && test ".$ac_cv_header_stdint_t" = "."; then -CFLAGS="-std=c99" -AC_TRY_COMPILE([#include ],[int_least32_t v = 0;], -[AC_MSG_WARN(your GCC compiler has a defunct stdint.h for its default-mode)]) -fi -CXXFLAGS="$old_CXXFLAGS" -CPPFLAGS="$old_CPPFLAGS" -CFLAGS="$old_CFLAGS" ]) - -v="... $ac_cv_header_stdint_h" -if test "$ac_stdint_h" = "stdint.h" ; then - AC_MSG_RESULT([(are you sure you want them in ./stdint.h?)]) -elif test "$ac_stdint_h" = "inttypes.h" ; then - AC_MSG_RESULT([(are you sure you want them in ./inttypes.h?)]) -elif test "_$ac_cv_header_stdint_t" = "_" ; then - AC_MSG_RESULT([(putting them into $ac_stdint_h)$v]) -else - ac_cv_header_stdint="$ac_cv_header_stdint_t" - AC_MSG_RESULT([$ac_cv_header_stdint (shortcircuit)]) -fi - -if test "_$ac_cv_header_stdint_t" = "_" ; then # can not shortcircuit.. - -dnl .....intro message done, now do a few system checks..... -dnl btw, all old CHECK_TYPE macros do automatically "DEFINE" a type, -dnl therefore we use the autoconf implementation detail CHECK_TYPE_NEW -dnl instead that is triggered with 3 or more arguments (see types.m4) - -inttype_headers=`echo $2 | sed -e 's/,/ /g'` - -ac_cv_stdint_result="(no helpful system typedefs seen)" -AX_CHECK_HEADER_STDINT_X(dnl - stdint.h inttypes.h sys/inttypes.h $inttype_headers, - ac_cv_stdint_result="(seen uintptr_t$and64 in $i)") - -if test "_$ac_cv_header_stdint_x" = "_" ; then -AX_CHECK_HEADER_STDINT_O(dnl, - inttypes.h sys/inttypes.h stdint.h $inttype_headers, - ac_cv_stdint_result="(seen uint32_t$and64 in $i)") -fi - -if test "_$ac_cv_header_stdint_x" = "_" ; then -if test "_$ac_cv_header_stdint_o" = "_" ; then -AX_CHECK_HEADER_STDINT_U(dnl, - sys/types.h inttypes.h sys/inttypes.h $inttype_headers, - ac_cv_stdint_result="(seen u_int32_t$and64 in $i)") -fi fi - -dnl if there was no good C99 header file, do some typedef checks... -if test "_$ac_cv_header_stdint_x" = "_" ; then - AC_MSG_CHECKING([for stdint datatype model]) - AC_MSG_RESULT([(..)]) - AX_CHECK_DATA_MODEL -fi - -if test "_$ac_cv_header_stdint_x" != "_" ; then - ac_cv_header_stdint="$ac_cv_header_stdint_x" -elif test "_$ac_cv_header_stdint_o" != "_" ; then - ac_cv_header_stdint="$ac_cv_header_stdint_o" -elif test "_$ac_cv_header_stdint_u" != "_" ; then - ac_cv_header_stdint="$ac_cv_header_stdint_u" -else - ac_cv_header_stdint="stddef.h" -fi - -AC_MSG_CHECKING([for extra inttypes in chosen header]) -AC_MSG_RESULT([($ac_cv_header_stdint)]) -dnl see if int_least and int_fast types are present in _this_ header. -unset ac_cv_type_int_least32_t -unset ac_cv_type_int_fast32_t -AC_CHECK_TYPE(int_least32_t,,,[#include <$ac_cv_header_stdint>]) -AC_CHECK_TYPE(int_fast32_t,,,[#include<$ac_cv_header_stdint>]) -AC_CHECK_TYPE(intmax_t,,,[#include <$ac_cv_header_stdint>]) - -fi # shortcircut to system "stdint.h" -# ------------------ PREPARE VARIABLES ------------------------------ -if test "$GCC" = "yes" ; then -ac_cv_stdint_message="using gnu compiler "`$CC --version | head -1` -else -ac_cv_stdint_message="using $CC" -fi - -AC_MSG_RESULT([make use of $ac_cv_header_stdint in $ac_stdint_h dnl -$ac_cv_stdint_result]) - -dnl ----------------------------------------------------------------- -# ----------------- DONE inttypes.h checks START header ------------- -AC_CONFIG_COMMANDS([$ac_stdint_h],[ -AC_MSG_NOTICE(creating $ac_stdint_h : $_ac_stdint_h) -ac_stdint=$tmp/_stdint.h - -echo "#ifndef" $_ac_stdint_h >$ac_stdint -echo "#define" $_ac_stdint_h "1" >>$ac_stdint -echo "#ifndef" _GENERATED_STDINT_H >>$ac_stdint -echo "#define" _GENERATED_STDINT_H '"'$PACKAGE $VERSION'"' >>$ac_stdint -echo "/* generated $ac_cv_stdint_message */" >>$ac_stdint -if test "_$ac_cv_header_stdint_t" != "_" ; then -echo "#define _STDINT_HAVE_STDINT_H" "1" >>$ac_stdint -echo "#include " >>$ac_stdint -echo "#endif" >>$ac_stdint -echo "#endif" >>$ac_stdint -else - -cat >>$ac_stdint < -#else -#include - -/* .................... configured part ............................ */ - -STDINT_EOF - -echo "/* whether we have a C99 compatible stdint header file */" >>$ac_stdint -if test "_$ac_cv_header_stdint_x" != "_" ; then - ac_header="$ac_cv_header_stdint_x" - echo "#define _STDINT_HEADER_INTPTR" '"'"$ac_header"'"' >>$ac_stdint -else - echo "/* #undef _STDINT_HEADER_INTPTR */" >>$ac_stdint -fi - -echo "/* whether we have a C96 compatible inttypes header file */" >>$ac_stdint -if test "_$ac_cv_header_stdint_o" != "_" ; then - ac_header="$ac_cv_header_stdint_o" - echo "#define _STDINT_HEADER_UINT32" '"'"$ac_header"'"' >>$ac_stdint -else - echo "/* #undef _STDINT_HEADER_UINT32 */" >>$ac_stdint -fi - -echo "/* whether we have a BSD compatible inet types header */" >>$ac_stdint -if test "_$ac_cv_header_stdint_u" != "_" ; then - ac_header="$ac_cv_header_stdint_u" - echo "#define _STDINT_HEADER_U_INT32" '"'"$ac_header"'"' >>$ac_stdint -else - echo "/* #undef _STDINT_HEADER_U_INT32 */" >>$ac_stdint -fi - -echo "" >>$ac_stdint - -if test "_$ac_header" != "_" ; then if test "$ac_header" != "stddef.h" ; then - echo "#include <$ac_header>" >>$ac_stdint - echo "" >>$ac_stdint -fi fi - -echo "/* which 64bit typedef has been found */" >>$ac_stdint -if test "$ac_cv_type_uint64_t" = "yes" ; then -echo "#define _STDINT_HAVE_UINT64_T" "1" >>$ac_stdint -else -echo "/* #undef _STDINT_HAVE_UINT64_T */" >>$ac_stdint -fi -if test "$ac_cv_type_u_int64_t" = "yes" ; then -echo "#define _STDINT_HAVE_U_INT64_T" "1" >>$ac_stdint -else -echo "/* #undef _STDINT_HAVE_U_INT64_T */" >>$ac_stdint -fi -echo "" >>$ac_stdint - -echo "/* which type model has been detected */" >>$ac_stdint -if test "_$ac_cv_char_data_model" != "_" ; then -echo "#define _STDINT_CHAR_MODEL" "$ac_cv_char_data_model" >>$ac_stdint -echo "#define _STDINT_LONG_MODEL" "$ac_cv_long_data_model" >>$ac_stdint -else -echo "/* #undef _STDINT_CHAR_MODEL // skipped */" >>$ac_stdint -echo "/* #undef _STDINT_LONG_MODEL // skipped */" >>$ac_stdint -fi -echo "" >>$ac_stdint - -echo "/* whether int_least types were detected */" >>$ac_stdint -if test "$ac_cv_type_int_least32_t" = "yes"; then -echo "#define _STDINT_HAVE_INT_LEAST32_T" "1" >>$ac_stdint -else -echo "/* #undef _STDINT_HAVE_INT_LEAST32_T */" >>$ac_stdint -fi -echo "/* whether int_fast types were detected */" >>$ac_stdint -if test "$ac_cv_type_int_fast32_t" = "yes"; then -echo "#define _STDINT_HAVE_INT_FAST32_T" "1" >>$ac_stdint -else -echo "/* #undef _STDINT_HAVE_INT_FAST32_T */" >>$ac_stdint -fi -echo "/* whether intmax_t type was detected */" >>$ac_stdint -if test "$ac_cv_type_intmax_t" = "yes"; then -echo "#define _STDINT_HAVE_INTMAX_T" "1" >>$ac_stdint -else -echo "/* #undef _STDINT_HAVE_INTMAX_T */" >>$ac_stdint -fi -echo "" >>$ac_stdint - - cat >>$ac_stdint <= 199901L -#define _HAVE_UINT64_T -#define _HAVE_LONGLONG_UINT64_T -typedef long long int64_t; -typedef unsigned long long uint64_t; - -#elif !defined __STRICT_ANSI__ -#if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__ -#define _HAVE_UINT64_T -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; - -#elif defined __GNUC__ || defined __MWERKS__ || defined __ELF__ -/* note: all ELF-systems seem to have loff-support which needs 64-bit */ -#if !defined _NO_LONGLONG -#define _HAVE_UINT64_T -#define _HAVE_LONGLONG_UINT64_T -typedef long long int64_t; -typedef unsigned long long uint64_t; -#endif - -#elif defined __alpha || (defined __mips && defined _ABIN32) -#if !defined _NO_LONGLONG -typedef long int64_t; -typedef unsigned long uint64_t; -#endif - /* compiler/cpu type to define int64_t */ -#endif -#endif -#endif - -#if defined _STDINT_HAVE_U_INT_TYPES -/* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */ -typedef u_int8_t uint8_t; -typedef u_int16_t uint16_t; -typedef u_int32_t uint32_t; - -/* glibc compatibility */ -#ifndef __int8_t_defined -#define __int8_t_defined -#endif -#endif - -#ifdef _STDINT_NEED_INT_MODEL_T -/* we must guess all the basic types. Apart from byte-adressable system, */ -/* there a few 32-bit-only dsp-systems that we guard with BYTE_MODEL 8-} */ -/* (btw, those nibble-addressable systems are way off, or so we assume) */ - -dnl /* have a look at "64bit and data size neutrality" at */ -dnl /* http://unix.org/version2/whatsnew/login_64bit.html */ -dnl /* (the shorthand "ILP" types always have a "P" part) */ - -#if defined _STDINT_BYTE_MODEL -#if _STDINT_LONG_MODEL+0 == 242 -/* 2:4:2 = IP16 = a normal 16-bit system */ -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned long uint32_t; -#ifndef __int8_t_defined -#define __int8_t_defined -typedef char int8_t; -typedef short int16_t; -typedef long int32_t; -#endif -#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL == 444 -/* 2:4:4 = LP32 = a 32-bit system derived from a 16-bit */ -/* 4:4:4 = ILP32 = a normal 32-bit system */ -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -#ifndef __int8_t_defined -#define __int8_t_defined -typedef char int8_t; -typedef short int16_t; -typedef int int32_t; -#endif -#elif _STDINT_LONG_MODEL+0 == 484 || _STDINT_LONG_MODEL+0 == 488 -/* 4:8:4 = IP32 = a 32-bit system prepared for 64-bit */ -/* 4:8:8 = LP64 = a normal 64-bit system */ -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -#ifndef __int8_t_defined -#define __int8_t_defined -typedef char int8_t; -typedef short int16_t; -typedef int int32_t; -#endif -/* this system has a "long" of 64bit */ -#ifndef _HAVE_UINT64_T -#define _HAVE_UINT64_T -typedef unsigned long uint64_t; -typedef long int64_t; -#endif -#elif _STDINT_LONG_MODEL+0 == 448 -/* LLP64 a 64-bit system derived from a 32-bit system */ -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -#ifndef __int8_t_defined -#define __int8_t_defined -typedef char int8_t; -typedef short int16_t; -typedef int int32_t; -#endif -/* assuming the system has a "long long" */ -#ifndef _HAVE_UINT64_T -#define _HAVE_UINT64_T -#define _HAVE_LONGLONG_UINT64_T -typedef unsigned long long uint64_t; -typedef long long int64_t; -#endif -#else -#define _STDINT_NO_INT32_T -#endif -#else -#define _STDINT_NO_INT8_T -#define _STDINT_NO_INT32_T -#endif -#endif - -/* - * quote from SunOS-5.8 sys/inttypes.h: - * Use at your own risk. As of February 1996, the committee is squarely - * behind the fixed sized types; the "least" and "fast" types are still being - * discussed. The probability that the "fast" types may be removed before - * the standard is finalized is high enough that they are not currently - * implemented. - */ - -#if defined _STDINT_NEED_INT_LEAST_T -typedef int8_t int_least8_t; -typedef int16_t int_least16_t; -typedef int32_t int_least32_t; -#ifdef _HAVE_UINT64_T -typedef int64_t int_least64_t; -#endif - -typedef uint8_t uint_least8_t; -typedef uint16_t uint_least16_t; -typedef uint32_t uint_least32_t; -#ifdef _HAVE_UINT64_T -typedef uint64_t uint_least64_t; -#endif - /* least types */ -#endif - -#if defined _STDINT_NEED_INT_FAST_T -typedef int8_t int_fast8_t; -typedef int int_fast16_t; -typedef int32_t int_fast32_t; -#ifdef _HAVE_UINT64_T -typedef int64_t int_fast64_t; -#endif - -typedef uint8_t uint_fast8_t; -typedef unsigned uint_fast16_t; -typedef uint32_t uint_fast32_t; -#ifdef _HAVE_UINT64_T -typedef uint64_t uint_fast64_t; -#endif - /* fast types */ -#endif - -#ifdef _STDINT_NEED_INTMAX_T -#ifdef _HAVE_UINT64_T -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; -#else -typedef long intmax_t; -typedef unsigned long uintmax_t; -#endif -#endif - -#ifdef _STDINT_NEED_INTPTR_T -#ifndef __intptr_t_defined -#define __intptr_t_defined -/* we encourage using "long" to store pointer values, never use "int" ! */ -#if _STDINT_LONG_MODEL+0 == 242 || _STDINT_LONG_MODEL+0 == 484 -typedef unsigned int uintptr_t; -typedef int intptr_t; -#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL+0 == 444 -typedef unsigned long uintptr_t; -typedef long intptr_t; -#elif _STDINT_LONG_MODEL+0 == 448 && defined _HAVE_UINT64_T -typedef uint64_t uintptr_t; -typedef int64_t intptr_t; -#else /* matches typical system types ILP32 and LP64 - but not IP16 or LLP64 */ -typedef unsigned long uintptr_t; -typedef long intptr_t; -#endif -#endif -#endif - -/* The ISO C99 standard specifies that in C++ implementations these - should only be defined if explicitly requested. */ -#if !defined __cplusplus || defined __STDC_CONSTANT_MACROS -#ifndef UINT32_C - -/* Signed. */ -# define INT8_C(c) c -# define INT16_C(c) c -# define INT32_C(c) c -# ifdef _HAVE_LONGLONG_UINT64_T -# define INT64_C(c) c ## L -# else -# define INT64_C(c) c ## LL -# endif - -/* Unsigned. */ -# define UINT8_C(c) c ## U -# define UINT16_C(c) c ## U -# define UINT32_C(c) c ## U -# ifdef _HAVE_LONGLONG_UINT64_T -# define UINT64_C(c) c ## UL -# else -# define UINT64_C(c) c ## ULL -# endif - -/* Maximal type. */ -# ifdef _HAVE_LONGLONG_UINT64_T -# define INTMAX_C(c) c ## L -# define UINTMAX_C(c) c ## UL -# else -# define INTMAX_C(c) c ## LL -# define UINTMAX_C(c) c ## ULL -# endif - - /* literalnumbers */ -#endif -#endif - -/* These limits are merily those of a two complement byte-oriented system */ - -/* Minimum of signed integral types. */ -# define INT8_MIN (-128) -# define INT16_MIN (-32767-1) -# define INT32_MIN (-2147483647-1) -# define INT64_MIN (-__INT64_C(9223372036854775807)-1) -/* Maximum of signed integral types. */ -# define INT8_MAX (127) -# define INT16_MAX (32767) -# define INT32_MAX (2147483647) -# define INT64_MAX (__INT64_C(9223372036854775807)) - -/* Maximum of unsigned integral types. */ -# define UINT8_MAX (255) -# define UINT16_MAX (65535) -# define UINT32_MAX (4294967295U) -# define UINT64_MAX (__UINT64_C(18446744073709551615)) - -/* Minimum of signed integral types having a minimum size. */ -# define INT_LEAST8_MIN INT8_MIN -# define INT_LEAST16_MIN INT16_MIN -# define INT_LEAST32_MIN INT32_MIN -# define INT_LEAST64_MIN INT64_MIN -/* Maximum of signed integral types having a minimum size. */ -# define INT_LEAST8_MAX INT8_MAX -# define INT_LEAST16_MAX INT16_MAX -# define INT_LEAST32_MAX INT32_MAX -# define INT_LEAST64_MAX INT64_MAX - -/* Maximum of unsigned integral types having a minimum size. */ -# define UINT_LEAST8_MAX UINT8_MAX -# define UINT_LEAST16_MAX UINT16_MAX -# define UINT_LEAST32_MAX UINT32_MAX -# define UINT_LEAST64_MAX UINT64_MAX - - /* shortcircuit*/ -#endif - /* once */ -#endif -#endif -STDINT_EOF -fi - if cmp -s $ac_stdint_h $ac_stdint 2>/dev/null; then - AC_MSG_NOTICE([$ac_stdint_h is unchanged]) - else - ac_dir=`AS_DIRNAME(["$ac_stdint_h"])` - AS_MKDIR_P(["$ac_dir"]) - rm -f $ac_stdint_h - mv $ac_stdint $ac_stdint_h - fi -],[# variables for create stdint.h replacement -PACKAGE="$PACKAGE" -VERSION="$VERSION" -ac_stdint_h="$ac_stdint_h" -_ac_stdint_h=AS_TR_CPP(_$PACKAGE-$ac_stdint_h) -ac_cv_stdint_message="$ac_cv_stdint_message" -ac_cv_header_stdint_t="$ac_cv_header_stdint_t" -ac_cv_header_stdint_x="$ac_cv_header_stdint_x" -ac_cv_header_stdint_o="$ac_cv_header_stdint_o" -ac_cv_header_stdint_u="$ac_cv_header_stdint_u" -ac_cv_type_uint64_t="$ac_cv_type_uint64_t" -ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t" -ac_cv_char_data_model="$ac_cv_char_data_model" -ac_cv_long_data_model="$ac_cv_long_data_model" -ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t" -ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t" -ac_cv_type_intmax_t="$ac_cv_type_intmax_t" -]) -]) diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 6c318fb..4a3f064 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -8,6 +8,7 @@ HP-UX/nut-upsmon \ HP-UX/nut-upsmon.sh \ misc/nut.bash_completion \ misc/osd-notify \ +perl/Nut.pm \ RedHat/halt.patch \ RedHat/README \ RedHat/ups \ diff --git a/scripts/Makefile.in b/scripts/Makefile.in index ce6a171..895ca91 100644 --- a/scripts/Makefile.in +++ b/scripts/Makefile.in @@ -38,7 +38,6 @@ subdir = scripts DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ @@ -274,6 +273,7 @@ HP-UX/nut-upsmon \ HP-UX/nut-upsmon.sh \ misc/nut.bash_completion \ misc/osd-notify \ +perl/Nut.pm \ RedHat/halt.patch \ RedHat/README \ RedHat/ups \ diff --git a/scripts/augeas/Makefile.in b/scripts/augeas/Makefile.in index d1724f9..f35554d 100644 --- a/scripts/augeas/Makefile.in +++ b/scripts/augeas/Makefile.in @@ -43,7 +43,6 @@ DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/nutupssetconf.aug.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ diff --git a/scripts/augeas/nutupsconf.aug.in b/scripts/augeas/nutupsconf.aug.in index 86afa99..1c5918e 100644 --- a/scripts/augeas/nutupsconf.aug.in +++ b/scripts/augeas/nutupsconf.aug.in @@ -51,6 +51,7 @@ let ups_fields = "driver" | "OffDelay" | "OnDelay" | "SD" + | "advorder" | "authPassword" | "authProtocol" | "batteryPercentage" @@ -143,6 +144,7 @@ let ups_fields = "driver" | "vendorid" | "voltage" | "wait" + | "wugrace" let ups_entry = IniFile.indented_entry (ups_global|ups_fields) ups_sep ups_comment diff --git a/scripts/hal/Makefile.in b/scripts/hal/Makefile.in index f362c11..ed3dc02 100644 --- a/scripts/hal/Makefile.in +++ b/scripts/hal/Makefile.in @@ -40,7 +40,6 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/ups-nut-device.fdi.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ diff --git a/scripts/hal/ups-nut-device.fdi.in b/scripts/hal/ups-nut-device.fdi.in index 147edf1..609c17d 100644 --- a/scripts/hal/ups-nut-device.fdi.in +++ b/scripts/hal/ups-nut-device.fdi.in @@ -2,15 +2,6 @@ - - - - battery - battery - hald-addon-blazer_usb - ups - - @@ -195,27 +186,16 @@ hald-addon-bcmxcp_usb ups - - - - + + battery battery - hald-addon-blazer_usb - ups - - - - - - battery - battery - hald-addon-blazer_usb + hald-addon-usbhid-ups ups - + @@ -275,15 +255,6 @@ ups - - - - battery - battery - hald-addon-richcomm_usb - ups - - @@ -544,15 +515,6 @@ ups - - - - battery - battery - hald-addon-blazer_usb - ups - - @@ -564,15 +526,6 @@ ups - - - - battery - battery - hald-addon-blazer_usb - ups - - diff --git a/scripts/hotplug/Makefile.in b/scripts/hotplug/Makefile.in index 0630762..ae6a80f 100644 --- a/scripts/hotplug/Makefile.in +++ b/scripts/hotplug/Makefile.in @@ -42,7 +42,6 @@ DIST_COMMON = README $(am__dist_hotplugusb_DATA_DIST) \ $(srcdir)/libhidups.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ diff --git a/scripts/hotplug/libhid.usermap b/scripts/hotplug/libhid.usermap index facf548..9b301a6 100644 --- a/scripts/hotplug/libhid.usermap +++ b/scripts/hotplug/libhid.usermap @@ -4,8 +4,6 @@ # libhidups 0x0003 0xVVVV 0xPPPP 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # # usb module match_flags idVendor idProduct bcdDevice_lo bcdDevice_hi bDeviceClass bDeviceSubClass bDeviceProtocol bInterfaceClass bInterfaceSubClass bInterfaceProtocol driver_info -# Krauler UP-M500VA -libhidups 0x0003 0x0001 0x0000 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # Hewlett Packard # T500 @@ -64,12 +62,10 @@ libhidups 0x0003 0x051d 0x0003 0x0000 0x0000 0x00 # Powerware # various models libhidups 0x0003 0x0592 0x0002 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 -# Agiler UPS -libhidups 0x0003 0x05b8 0x0000 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 -# Belkin F6C1200-UNV -libhidups 0x0003 0x0665 0x5161 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 +# PW 9140 +libhidups 0x0003 0x0592 0x0004 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 -# Liebert +# Phoenixtec # various models libhidups 0x0003 0x06da 0x0002 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # Mustek Powermust @@ -88,8 +84,6 @@ libhidups 0x0003 0x0764 0x0005 0x0000 0x0000 0x00 libhidups 0x0003 0x0764 0x0501 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # OR2200LCDRM2U libhidups 0x0003 0x0764 0x0601 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 -# Sweex 1000VA -libhidups 0x0003 0x0925 0x1234 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # TrippLite # e.g. OMNIVS1000, SMART550USB, ... @@ -166,11 +160,7 @@ libhidups 0x0003 0x0d9f 0x00a4 0x0000 0x0000 0x00 libhidups 0x0003 0x0d9f 0x00a5 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # PowerCOM BNT - Black Knight Pro libhidups 0x0003 0x0d9f 0x00a6 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 -# Unitek Alpha 1200Sx -libhidups 0x0003 0x0f03 0x0001 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 # Liebert # Liebert PowerSure PSA UPS libhidups 0x0003 0x10af 0x0001 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 -# Ablerex 625L USB -libhidups 0x0003 0xffff 0x0000 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000 diff --git a/scripts/perl/Nut.pm b/scripts/perl/Nut.pm new file mode 100644 index 0000000..8263c0d --- /dev/null +++ b/scripts/perl/Nut.pm @@ -0,0 +1,959 @@ +# UPS::Nut - a class to talk to a UPS via the Network Utility Tools upsd. +# Original author Kit Peters +# Rewritten by Gabor Kiss +# Idea to implement TLS:http://www.logix.cz/michal/devel/smtp-cli/smtp-client.pl + +# ### changelog: made debug messages slightly more descriptive, improved +# ### changelog: comments in code +# ### changelog: Removed timeleft() function. + +package UPS::Nut; +use strict; +use Carp; +use FileHandle; +use IO::Socket; +use IO::Select; +use Dumpvalue; my $dumper = Dumpvalue->new; + +# The following globals dictate whether the accessors and instant-command +# functions are created. +# ### changelog: tie hash interface and AUTOLOAD contributed by +# ### changelog: Wayne Wylupski + +my $_eol = "\n"; + +BEGIN { + use Exporter (); + use vars qw ($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); + $VERSION = 1.51; + @ISA = qw(Exporter IO::Socket::INET); + @EXPORT = qw(); + @EXPORT_OK = qw(); + %EXPORT_TAGS = (); +} + +sub new { +# Author: Kit Peters + my $proto = shift; + my $class = ref($proto) || $proto; + my %arg = @_; # hash of arguments + my $self = {}; # _initialize will fill it later + bless $self, $class; + unless ($self->_initialize(%arg)) { # can't initialize + carp "Can't initialize: $self->{err}"; + return undef; + } + return $self; +} + +# accessor functions. Return a value if successful, return undef +# otherwise. + +sub BattPercent { # get battery percentage + return shift->GetVar('battery.charge'); +} + +sub LoadPercent { # get load percentage + my $self = shift; + my $context = shift; + $context = "L$context" if $context =~ /^[123]$/; + $context = ".$context" if $context; + return $self->GetVar("output$context.power.percent"); +} + +sub LineVoltage { # get line voltage + my $self = shift; + my $context = shift; + $context = "L$context-N" if $context =~ /^[123]$/; + $context = ".$context" if $context; + return $self->GetVar("input$context.voltage"); +} + +sub Status { # get status of UPS + return shift->GetVar('ups.status'); +} + +sub Temperature { # get the internal temperature of UPS + return shift->GetVar('battery.temperature'); +} + +# control functions: they control our relationship to upsd, and send +# commands to upsd. + +sub Login { # login to upsd, so that it won't shutdown unless we say we're + # ok. This should only be used if you're actually connected + # to the ups that upsd is monitoring. + +# Author: Kit Peters +# ### changelog: modified login logic a bit. Now it doesn't check to see +# ### changelog: if we got OK, ERR, or something else from upsd. It +# ### changelog: simply checks for a response beginning with OK from upsd. +# ### changelog: Anything else is an error. +# +# ### changelog: uses the new _send command +# + my $self = shift; # myself + my $user = shift; # username + my $pass = shift; # password + my $errmsg; # error message, sent to _debug and $self->{err} + my $ans; # scalar to hold responses from upsd + + $self->Authenticate($user, $pass) or return; + $ans = $self->_send( "LOGIN $self->{name}" ); + if (defined $ans && $ans =~ /^OK/) { # Login successful. + $self->_debug("LOGIN successful."); + return 1; + } + if (defined $ans) { + $errmsg = "LOGIN failed. Last message from upsd: $ans"; + } + else { + $errmsg = "Network error: $!"; + } + $self->_debug($self->{err} = $errmsg); + return undef; +} + +sub Authenticate { # Announce to the UPS who we are to set up the proper + # management level. See upsd.conf man page for details. + +# Contributor: Wayne Wylupski + my $self = shift; # myself + my $user = shift; # username + my $pass = shift; # password + + my $errmsg; # error message, sent to _debug and $self->{err} + my $ans; # scalar to hold responses from upsd + + # only attempt authentication if username and password given + if (defined $user and defined $pass) { + $ans = $self->_send("USERNAME $user"); + if (defined $ans && $ans =~ /^OK/) { # username OK, send password + + $ans = $self->_send("PASSWORD $pass"); + return 1 if (defined $ans && $ans =~ /^OK/); + } + } + if (defined $ans) { + $errmsg = "Authentication failed. Last message from upsd: $ans"; + } + else { + $errmsg = "Network error: $!"; + } + $self->_debug($self->{err} = $errmsg); + return undef; +} + +sub Logout { # logout of upsd +# Author: Kit Peters +# ### changelog: uses the new _send command +# + my $self = shift; + if ($self->{srvsock}) { # are we still connected to upsd? + my $ans = $self->_send( "LOGOUT" ); + close ($self->{srvsock}); + delete ($self->{srvsock}); + } +} + +# internal functions. These are only used by UPS::Nut internally, so +# please don't use them otherwise. If you really think an internal +# function should be externalized, let me know. + +sub _initialize { +# Author: Kit Peters + my $self = shift; + my %arg = @_; + my $host = $arg{HOST} || 'localhost'; # Host running master upsd + my $port = $arg{PORT} || '3493'; # 3493 is IANA assigned port for NUT + my $proto = $arg{PROTO} || 'tcp'; # use tcp unless user tells us to + my $user = $arg{USERNAME} || undef; # username passed to upsd + my $pass = $arg{PASSWORD} || undef; # password passed to upsd + my $login = $arg{LOGIN} || 0; # login to upsd on init? + + + $self->{name} = $arg{NAME} || 'default'; # UPS name in etc/ups.conf on $host + $self->{timeout} = $arg{TIMEOUT} || 30; # timeout + $self->{debug} = $arg{DEBUG} || 0; # debugging? + $self->{debugout} = $arg{DEBUGOUT} || undef; # where to send debug messages + + my $srvsock = $self->{srvsock} = # establish connection to upsd + IO::Socket::INET->new( + PeerAddr => $host, + PeerPort => $port, + Proto => $proto + ); + + unless ( defined $srvsock) { # can't connect + $self->{err} = "Unable to connect via $proto to $host:$port: $!"; + return undef; + } + + $self->{select} = IO::Select->new( $srvsock ); + + if ($user and $pass) { # attempt login to upsd if that option is specified + if ($login) { # attempt login to upsd if that option is specified + $self->Login($user, $pass) or carp $self->{err}; + } + else { + $self->Authenticate($user, $pass) or carp $self->{err}; + } + } + + # get a hash of vars for both the TIE functions as well as for + # expanding vars. + $self->{vars} = $self->ListVar; + + unless ( defined $self->{vars} ) { + $self->{err} = "Network error: $!"; + return undef; + } + + return $self; +} + +# +# _send +# +# Sends a command to the server and retrieves the results. +# If there was a network error, return undef; $! will contain the +# error. +sub _send +{ +# Contributor: Wayne Wylupski + my $self = shift; + my $cmd = shift; + my @handles; + my $result; # undef by default + + my $socket = $self->{srvsock}; + my $select = $self->{select}; + + @handles = IO::Select->select( undef, $select, $select, $self->{timeout} ); + return undef if ( !scalar $handles[1] ); + + $socket->print( $cmd . $_eol ); + + @handles = IO::Select->select( $select, undef, $select, $self->{timeout} ); + return undef if ( !scalar $handles[0]); + + $result = $socket->getline; + return undef if ( !defined ( $result ) ); + chomp $result; + + return $result; +} + +sub _getline +{ +# Contributor: Wayne Wylupski + my $self = shift; + my $result; # undef by default + + my $socket = $self->{srvsock}; + my $select = $self->{select}; + + # Different versions of IO::Socket has different error detection routines. + return undef if ( $IO::Socket::{has_error} && $select->has_error(0) ); + return undef if ( $IO::Socket::{has_exception} && $select->has_exception(0) ); + + chomp ( $result = $socket->getline ); + return $result; +} + +# Compatibility layer +sub Request { goto &GetVar; } + +sub GetVar { # request a variable from the UPS +# Author: Kit Peters + my $self = shift; +# ### changelog: 8/3/2002 - KP - Request() now returns undef if not +# ### changelog: connected to upsd via $srvsock +# ### changelog: uses the new _send command +# +# Modified by Gabor Kiss according to protocol version 1.5+ + my $var = shift; + my $req = "GET VAR $self->{name} $var"; # build request + my $ans = $self->_send( $req ); + + unless (defined $ans) { + $self->{err} = "Network error: $!"; + return undef; + }; + + if ($ans =~ /^ERR/) { + $self->{err} = "Error: $ans. Requested $var."; + return undef; + } + elsif ($ans =~ /^VAR/) { + my $checkvar; # to make sure the var we asked for is the var we got. + my $retval; # returned value for requested VAR + (undef, undef, $checkvar, $retval) = split(' ', $ans, 4); + # get checkvar and retval from the answer + if ($checkvar ne $var) { # did not get expected var + $self->{err} = "requested $var, received $checkvar"; + return undef; + } + $retval =~ s/^"(.*)"$/$1/; + return $retval; # return the requested value + } + else { # unrecognized response + $self->{err} = "Unrecognized response from upsd: $ans"; + return undef; + } +} + +sub Set { +# Contributor: Wayne Wylupski +# ### changelog: uses the new _send command +# + my $self = shift; + my $var = shift; + (my $value = shift) =~ s/^"?(.*)"?$/"$1"/; # add quotes if missing + + my $req = "SET VAR $self->{name} $var $value"; # build request + my $ans = $self->_send( $req ); + + unless (defined $ans) { + $self->{err} = "Network error: $!"; + return undef; + }; + + if ($ans =~ /^ERR/) { + $self->{err} = "Error: $ans"; + return undef; + } + elsif ($ans =~ /^OK/) { + return $value; + } + else { # unrecognized response + $self->{err} = "Unrecognized response from upsd: $ans"; + return undef; + } +} + +sub FSD { # set forced shutdown flag +# Author: Kit Peters +# ### changelog: uses the new _send command +# + my $self = shift; + + my $req = "FSD $self->{name}"; # build request + my $ans = $self->_send( $req ); + + unless (defined $ans) { + $self->{err} = "Network error: $!"; + return undef; + }; + + if ($ans =~ /^ERR/) { # can't set forced shutdown flag + $self->{err} = "Can't set FSD flag. Upsd reports: $ans"; + return undef; + } + elsif ($ans =~ /^OK FSD-SET/) { # forced shutdown flag set + $self->_debug("FSD flag set successfully."); + return 1; + } + else { + $self->{err} = "Unrecognized response from upsd: $ans"; + return undef; + } +} + +sub InstCmd { # send instant command to ups +# Contributor: Wayne Wylupski + my $self = shift; + + chomp (my $cmd = shift); + + my $req = "INSTCMD $self->{name} $cmd"; + my $ans = $self->_send( $req ); + + unless (defined $ans) { + $self->{err} = "Network error: $!"; + return undef; + }; + + if ($ans =~ /^ERR/) { # error reported from upsd + $self->{err} = "Can't send instant command $cmd. Reason: $ans"; + return undef; + } + elsif ($ans =~ /^OK/) { # command successful + $self->_debug("Instant command $cmd sent successfully."); + return 1; + } + else { # unrecognized response + $self->{err} = "Can't send instant command $cmd. Unrecognized response from upsd: $ans"; + return undef; + } +} + +sub ListUPS { + my $self = shift; + return $self->_get_list("LIST UPS", 2, 1); +} + +sub ListVar { + my $self = shift; + my $vars = $self->_get_list("LIST VAR $self->{name}", 3, 2); + return $vars unless @_; # return all variables + return {map { $_ => $vars->{$_} } @_}; # return selected ones +} + +sub ListRW { + my $self = shift; + return $self->_get_list("LIST RW $self->{name}", 3, 2); +} + +sub ListCmd { + my $self = shift; + return $self->_get_list("LIST CMD $self->{name}", 2); +} + +sub ListEnum { + my $self = shift; + my $var = shift; + return $self->_get_list("LIST ENUM $self->{name} $var", 3); +} + +sub _get_list { + my $self = shift; + my ($req, $valueidx, $keyidx) = @_; + my $ans = $self->_send($req); + + unless (defined $ans) { + $self->{err} = "Network error: $!"; + return undef; + }; + + if ($ans =~ /^ERR/) { + $self->{err} = "Error: $ans"; + return undef; + } + elsif ($ans =~ /^BEGIN LIST/) { # command successful + my $retval = $keyidx ? {} : []; + my $line; + while ($line = $self->_getline) { + last if $line =~ /^END LIST/; + my @fields = split(' ', $line, $valueidx+1); + (my $value = $fields[$valueidx]) =~ s/^"(.*)"$/$1/; + if ($keyidx) { + $retval->{$fields[$keyidx]} = $value; + } + else { + push(@$retval, $value); + } + } + unless ($line) { + $self->{err} = "Network error: $!"; + return undef; + }; + $self->_debug("$req command sent successfully."); + return $retval; + } + else { # unrecognized response + $self->{err} = "Can't send $req. Unrecognized response from upsd: $ans"; + return undef; + } +} + +# Compatibility layer +sub VarDesc { goto &GetDesc; } + +sub GetDesc { +# Contributor: Wayne Wylupski +# Modified by Gabor Kiss according to protocol version 1.5+ + my $self = shift; + my $var = shift; + + my $req = "GET DESC $self->{name} $var"; + my $ans = $self->_send( $req ); + unless (defined $ans) { + $self->{err} = "Network error: $!"; + return undef; + }; + + if ($ans =~ /^ERR/) { + $self->{err} = "Error: $ans"; + return undef; + } + elsif ($ans =~ /^DESC/) { # command successful + $self->_debug("$req command sent successfully."); + (undef, undef, undef, $ans) = split(' ', $ans, 4); + $ans =~ s/^"(.*)"$/$1/; + return $ans; + } + else { # unrecognized response + $self->{err} = "Can't send $req. Unrecognized response from upsd: $ans"; + return undef; + } +} + +# Compatibility layer +sub VarType { goto &GetType; } + +sub GetType { +# Contributor: Wayne Wylupski +# Modified by Gabor Kiss according to protocol version 1.5+ + my $self = shift; + my $var = shift; + + my $req = "GET TYPE $self->{name} $var"; + my $ans = $self->_send( $req ); + unless (defined $ans) { + $self->{err} = "Network error: $!"; + return undef; + }; + + if ($ans =~ /^ERR/) { + $self->{err} = "Error: $ans"; + return undef; + } + elsif ($ans =~ /^TYPE/) { # command successful + $self->_debug("$req command sent successfully."); + (undef, undef, undef, $ans) = split(' ', $ans, 4); + return $ans; + } + else { # unrecognized response + $self->{err} = "Can't send $req. Unrecognized response from upsd: $ans"; + return undef; + } +} + +# Compatibility layer +sub InstCmdDesc { goto &GetCmdDesc; } + +sub GetCmdDesc { +# Contributor: Wayne Wylupski +# Modified by Gabor Kiss according to protocol version 1.5+ + my $self = shift; + my $cmd = shift; + + my $req = "GET CMDDESC $self->{name} $cmd"; + my $ans = $self->_send( $req ); + unless (defined $ans) { + $self->{err} = "Network error: $!"; + return undef; + }; + + if ($ans =~ /^ERR/) { + $self->{err} = "Error: $ans"; + return undef; + } + elsif ($ans =~ /^DESC/) { # command successful + $self->_debug("$req command sent successfully."); + (undef, undef, undef, $ans) = split(' ', $ans, 4); + $ans =~ s/^"(.*)"$/$1/; + return $ans; + } + else { # unrecognized response + $self->{err} = "Can't send $req. Unrecognized response from upsd: $ans"; + return undef; + } +} + +sub DESTROY { # destructor, all it does is call Logout +# Author: Kit Peters + my $self = shift; + $self->_debug("Object destroyed."); + $self->Logout(); +} + +sub _debug { # print debug messages to stdout or file +# Author: Kit Peters + my $self = shift; + if ($self->{debug}) { + chomp (my $msg = shift); + my $out; # filehandle for output + if ($self->{debugout}) { # if filename is given, use that + $out = new FileHandle ($self->{debugout}, ">>") or warn "Error: $!"; + } + if ($out) { # if out was set to a filehandle, create nifty timestamp + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); + $year = sprintf("%02d", $year % 100); # Y2.1K compliant, even! + my $timestamp = join '/', ($mon + 1), $mday, $year; # today + $timestamp .= " "; + $timestamp .= join ':', $hour, $min, $sec; + print $out "$timestamp $msg\n"; + } + else { print "DEBUG: $msg\n"; } # otherwise, print to stdout + } +} + +sub Error { # what was the last thing that went bang? +# Author: Kit Peters + my $self = shift; + if ($self->{err}) { return $self->{err}; } + else { return "No error explanation available."; } +} + +sub Master { # check for MASTER level access +# Author: Kit Peters +# ### changelog: uses the new _send command +# + my $self = shift; + + my $req = "MASTER $self->{name}"; # build request + my $ans = $self->_send( $req ); + + unless (defined $ans) { + $self->{err} = "Network error: $!"; + return undef; + }; + + if ($ans =~ /^OK/) { # access granted + $self->_debug("MASTER level access granted. Upsd reports: $ans"); + return 1; + } + else { # access denied, or unrecognized reponse + $self->{err} = "MASTER level access denied. Upsd responded: $ans"; +# ### changelog: 8/3/2002 - KP - Master() returns undef rather than 0 on +# ### failure. this makes it consistent with other methods + return undef; + } +} + +sub AUTOLOAD { +# Contributor: Wayne Wylupski + my $self = shift; + my $name = $UPS::Nut::AUTOLOAD; + $name =~ s/^.*:://; + + # for a change we will only load cmds if needed. + if (!defined $self->{cmds} ) { + %{$self->{cmds}} = map{ $_ =>1 } @{$self->ListCmd}; + } + + croak "No such InstCmd: $name" if (! $self->{cmds}{$name} ); + + return $self->InstCmd( $name ); +} + +#------------------------------------------------------------------------- +# tie hash interface +# +# The variables of the array, including the hidden 'numlogins' can +# be accessed as a hash array through this method. +# +# Example: +# tie %ups, 'UPS::Nut', +# NAME => "myups", +# HOST => "somemachine.somewhere.com", +# ... # same options as new(); +# ; +# +# $ups{UPSIDENT} = "MyUPS"; +# print $ups{MFR}, " " $ups{MODEL}, "\n"; +# +#------------------------------------------------------------------------- +sub TIEHASH { + my $class = shift || 'UPS::Nut'; + return $class->new( @_ ); +} + +sub FETCH { + my $self = shift; + my $key = shift; + + return $self->Request( $key ); +} + +sub STORE { + my $self = shift; + my $key = shift; + my $value = shift; + + return $self->Set( $key, $value ); +} + +sub DELETE { + croak "DELETE operation not supported"; +} + +sub CLEAR { + croak "CLEAR operation not supported"; +} + +sub EXISTS { + exists shift->{vars}{shift}; +} + +sub FIRSTKEY { + my $self = shift; + my $a = keys %{$self->{vars}}; + return scalar each %{$self->{vars}}; +} + +sub NEXTKEY { + my $self = shift; + return scalar each %{$self->{vars}}; +} + +sub UNTIE { + $_[0]->Logout; +} + +=head1 NAME + +Nut - a module to talk to a UPS via NUT (Network UPS Tools) upsd + +=head1 SYNOPSIS + + use UPS::Nut; + + $ups = new UPS::Nut( NAME => "myups", + HOST => "somemachine.somewhere.com", + PORT => "3493", + USERNAME => "upsuser", + PASSWORD => "upspasswd", + TIMEOUT => 30, + DEBUG => 1, + DEBUGOUT => "/some/file/somewhere", + ); + if ($ups->Status() =~ /OB/) { + print "Oh, no! Power failure!\n"; + } + + tie %other_ups, 'UPS::Nut', + NAME => "myups", + HOST => "somemachine.somewhere.com", + ... # same options as new(); + ; + + print $other_ups{MFR}, " ", $other_ups{MODEL}, "\n"; + +=head1 DESCRIPTION + +This is an object-oriented (whoo!) interface between Perl and upsd from +the Network UPS Tools package version 1.5 and above +(http://www.networkupstools.org/). +Note that it only talks to upsd for you in a Perl-ish way. +It doesn't monitor the UPS continously. + +=head1 CONSTRUCTOR + +Shown with defaults: new UPS::Nut( NAME => "default", + HOST => "localhost", + PORT => "3493", + USERNAME => "", + PASSWORD => "", + DEBUG => 0, + DEBUGOUT => "", + ); +* NAME is the name of the UPS to monitor, as specified in ups.conf +* HOST is the host running upsd +* PORT is the port that upsd is running on +* USERNAME and PASSWORD are those that you use to login to upsd. This + gives you the right to do certain things, as specified in upsd.conf. +* DEBUG turns on debugging output, set to 1 or 0 +* DEBUGOUT is de thing you do when de s*** hits the fan. Actually, it's + the filename where you want debugging output to go. If it's not + specified, debugging output comes to standard output. + +=head1 Important notice + +This version of UPS::Nut is not compatible with version 0.04. It is totally +rewritten in order to talk the new protocol of NUT 1.5+. You should not use +this module as a drop-in replacement of previous version from 2002. +Allmost all method has changed slightly. + +=head1 Methods + +Unlike in version 0.04 no methods return list values but a +single reference or undef. + +=head2 Methods for querying UPS status + +=over 4 + +=item Getvar($varname) + +returns value of the specified variable. Returns undef if variable +unsupported. +Old method named Request() is also supported for compatibility. + +=item Set($varname, $value) + +sets the value of the specified variable. Returns undef if variable +unsupported, or if variable cannot be set for some other reason. See +Authenticate() if you wish to use this function. + +=item BattPercent() + +returns percentage of battery left. Returns undef if we can't get +battery percentage for some reason. Same as GetVar('battery.charge'). + +=item LoadPercent($context) + +returns percentage of the load on the UPS. Returns undef if load +percentage is unavailable. $context is a selector of 3 phase systems. +Possibled values are 1, 2, 3, 'L1', 'L2', 'L3'. It should be omitted +in case of single phase UPS. + +=item LineVoltage($context) + +returns input line (e.g. the outlet) voltage. Returns undef if line +voltage is unavailable. $context is a selector of 3 phase systems. +Possibled values are 1, 2, 3, 'L1', 'L2', 'L3'. It should be omitted +in case of single phase UPS. + +=item Status() + +returns UPS status, one of OL or OB. OL or OB may be followed by LB, +which signifies low battery state. OL or OB may also be followed by +FSD, which denotes that the forced shutdown state +( see UPS::Nut->FSD() ) has been set on upsd. Returns undef if status +unavailable. Same as GetVar('ups.status'). + +=item Temperature() + +returns UPS internal temperature. Returns undef if internal +temperature unavailable. Same as GetVar('battery.temperature'). + +=back + +=head2 Other methods + +These all operate on the UPS specified in the NAME argument to the +constructor. + +=over 4 + +=item Authenticate($username, $password) + +With NUT certain operations are only available if the user has the +privilege. The program has to authenticate with one of the accounts +defined in upsd.conf. + +=item Login($username, $password) + +Notify upsd that client is drawing power from the given UPS. +It is automatically done if new() is called with USERNAME, PASSWORD +and LOGIN parameters. + +=item Logout() + +Notify upsd that client is released UPS. (E.g. it is shutting down.) +It is automatically done if connection closed. + +=item Master() + +Use this to find out whether or not we have MASTER privileges for +this UPS. Returns 1 if we have MASTER privileges, returns 0 otherwise. + +=item ListVar($variable, ...) + +This is an implementation of "LIST VAR" command. +Returns a hash reference to selected variable names and values supported +by the UPS. If no variables given it returns all. +Returns undef if "LIST VAR" failed. +(Note: This method significally differs from the old ListVars() +and ListRequest().) + +=item ListRW() + +Similar to ListVar() but cares only with read/writeable variables. + +=item ListEnum($variable) + +Returns a reference to the list of all possible values of $variable. +List is empty if $variable is not an ENUM type. (See GetType().) +Returns undef if error occurred. + +=item ListCmd() + +Returns a reference to the list of all instant commands supported +by the UPS. Returns undef if these are unavailable. +This method replaces the old ListInstCmds(). + +=item InstCmd($command) + +Send an instant command to the UPS. Returns 1 on success. Returns +undef if the command can't be completed. + +=item FSD() + +Set the FSD (forced shutdown) flag for the UPS. This means that we're +planning on shutting down the UPS very soon, so the attached load should +be shut down as well. Returns 1 on success, returns undef on failure. +This cannot be unset, so don't set it unless you mean it. + +=item Error() + +why did the previous operation fail? The answer is here. It will +return a concise, well-written, and brilliantly insightful few words as +to why whatever you just did went bang. + +=item GetDesc($variable) + +Returns textual description of $variable or undef in case of error. +Old method named VarDesc() is also supported for compatibility. + +=item GetCmdDesc($command) + +This is like GetDesc() above but applies to the instant commands. +Old method named InstCmdDesc() is also supported for compatibility. + +=item GetType($variable) + +Returns a string UNKNOWN or constructed one or more words of RW, +ENUM and STRING:n (where n is a number). (Seems to be not working +perfectly at upsd 2.2.) +Old method named VarType() is also supported for compatibility. + +=item ListUPS() + +Returns a reference to hash of all available UPS names and descriptions. + +=back + +=head1 AUTOLOAD + +The "instant commands" are available as methods of the UPS object. They +are AUTOLOADed when called. For example, if the instant command is FPTEST, +then it can be called by $ups->FPTEST. + +=head1 TIE Interface + +If you wish to simply query or set values, you can tie a hash value to +UPS::Nut and pass as extra options what you need to connect to the host. +If you need to exercise an occasional command, you may find the return +value of 'tie' useful, as in: + + my %ups; + my $ups_obj = tie %ups, 'UPS::Nut', HOSTNAME=>"firewall"; + + print $ups{UPSIDENT}, "\n"; + + $ups_obj->Authenticate( "user", "pass" ); + + $ups{UPSIDENT} = "MyUPS"; + +=head1 AUTHOR + + Original version made by Kit Peters + perl@clownswilleatyou.com + http://www.awod.com/staff/kpeters/perl/ + + Rewritten by Gabor Kiss . + +=head1 CREDITS + +Developed with the kind support of A World Of Difference, Inc. + + +Many thanks to Ryan Jessen at CyberPower +Systems for much-needed assistance. + +Thanks to Wayne Wylupski for the code to make +accessor methods for all supported vars. + +=head1 LICENSE + +This module is distributed under the same license as Perl itself. + +=cut + +1; +__END__ + diff --git a/scripts/python/Makefile.in b/scripts/python/Makefile.in index d3b1f4e..dc8d7ba 100644 --- a/scripts/python/Makefile.in +++ b/scripts/python/Makefile.in @@ -40,7 +40,6 @@ subdir = scripts/python DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ diff --git a/scripts/udev/Makefile.in b/scripts/udev/Makefile.in index 9594e8d..678ff5c 100644 --- a/scripts/udev/Makefile.in +++ b/scripts/udev/Makefile.in @@ -40,7 +40,6 @@ DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/nut-usbups.rules.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ diff --git a/scripts/udev/nut-usbups.rules.in b/scripts/udev/nut-usbups.rules.in index 2be5a41..9331e60 100644 --- a/scripts/udev/nut-usbups.rules.in +++ b/scripts/udev/nut-usbups.rules.in @@ -6,8 +6,6 @@ SUBSYSTEM=="usb", GOTO="nut-usbups_rules_real" SUBSYSTEM!="usb", GOTO="nut-usbups_rules_end" LABEL="nut-usbups_rules_real" -# Krauler UP-M500VA - blazer_usb -ATTR{idVendor}=="0001", ATTR{idProduct}=="0000", MODE="664", GROUP="@RUN_AS_GROUP@" # Hewlett Packard # T500 - bcmxcp_usb @@ -66,12 +64,10 @@ ATTR{idVendor}=="051d", ATTR{idProduct}=="0003", MODE="664", GROUP="@RUN_AS_GROU # Powerware # various models - bcmxcp_usb ATTR{idVendor}=="0592", ATTR{idProduct}=="0002", MODE="664", GROUP="@RUN_AS_GROUP@" -# Agiler UPS - blazer_usb -ATTR{idVendor}=="05b8", ATTR{idProduct}=="0000", MODE="664", GROUP="@RUN_AS_GROUP@" -# Belkin F6C1200-UNV - blazer_usb -ATTR{idVendor}=="0665", ATTR{idProduct}=="5161", MODE="664", GROUP="@RUN_AS_GROUP@" +# PW 9140 - usbhid-ups +ATTR{idVendor}=="0592", ATTR{idProduct}=="0004", MODE="664", GROUP="@RUN_AS_GROUP@" -# Liebert +# Phoenixtec # various models - bcmxcp_usb ATTR{idVendor}=="06da", ATTR{idProduct}=="0002", MODE="664", GROUP="@RUN_AS_GROUP@" # Mustek Powermust - blazer_usb @@ -90,8 +86,6 @@ ATTR{idVendor}=="0764", ATTR{idProduct}=="0005", MODE="664", GROUP="@RUN_AS_GROU ATTR{idVendor}=="0764", ATTR{idProduct}=="0501", MODE="664", GROUP="@RUN_AS_GROUP@" # OR2200LCDRM2U - usbhid-ups ATTR{idVendor}=="0764", ATTR{idProduct}=="0601", MODE="664", GROUP="@RUN_AS_GROUP@" -# Sweex 1000VA - richcomm_usb -ATTR{idVendor}=="0925", ATTR{idProduct}=="1234", MODE="664", GROUP="@RUN_AS_GROUP@" # TrippLite # e.g. OMNIVS1000, SMART550USB, ... - tripplite_usb @@ -168,13 +162,9 @@ ATTR{idVendor}=="0d9f", ATTR{idProduct}=="00a4", MODE="664", GROUP="@RUN_AS_GROU ATTR{idVendor}=="0d9f", ATTR{idProduct}=="00a5", MODE="664", GROUP="@RUN_AS_GROUP@" # PowerCOM BNT - Black Knight Pro - usbhid-ups ATTR{idVendor}=="0d9f", ATTR{idProduct}=="00a6", MODE="664", GROUP="@RUN_AS_GROUP@" -# Unitek Alpha 1200Sx - blazer_usb -ATTR{idVendor}=="0f03", ATTR{idProduct}=="0001", MODE="664", GROUP="@RUN_AS_GROUP@" # Liebert # Liebert PowerSure PSA UPS - usbhid-ups ATTR{idVendor}=="10af", ATTR{idProduct}=="0001", MODE="664", GROUP="@RUN_AS_GROUP@" -# Ablerex 625L USB - blazer_usb -ATTR{idVendor}=="ffff", ATTR{idProduct}=="0000", MODE="664", GROUP="@RUN_AS_GROUP@" LABEL="nut-usbups_rules_end" diff --git a/scripts/upower/95-upower-hid.rules b/scripts/upower/95-upower-hid.rules index ac1138c..25c267d 100644 --- a/scripts/upower/95-upower-hid.rules +++ b/scripts/upower/95-upower-hid.rules @@ -17,7 +17,8 @@ ATTRS{idVendor}=="0463", ENV{UPOWER_VENDOR}="Eaton" ATTRS{idVendor}=="047c", ENV{UPOWER_VENDOR}="Dell" ATTRS{idVendor}=="050d", ENV{UPOWER_VENDOR}="Belkin" ATTRS{idVendor}=="051d", ENV{UPOWER_VENDOR}="APC" -ATTRS{idVendor}=="06da", ENV{UPOWER_VENDOR}="Liebert" +ATTRS{idVendor}=="0592", ENV{UPOWER_VENDOR}="Powerware" +ATTRS{idVendor}=="06da", ENV{UPOWER_VENDOR}="Phoenixtec" ATTRS{idVendor}=="075d", ENV{UPOWER_VENDOR}="iDowell" ATTRS{idVendor}=="0764", ENV{UPOWER_VENDOR}="Cyber Power Systems" ATTRS{idVendor}=="09ae", ENV{UPOWER_VENDOR}="TrippLite" @@ -54,7 +55,10 @@ ATTRS{idVendor}=="050d", ATTRS{idProduct}=="1100", ENV{UPOWER_BATTERY_TYPE}="ups ATTRS{idVendor}=="051d", ATTRS{idProduct}=="0002", ENV{UPOWER_BATTERY_TYPE}="ups" ATTRS{idVendor}=="051d", ATTRS{idProduct}=="0003", ENV{UPOWER_BATTERY_TYPE}="ups" -# Liebert +# Powerware +ATTRS{idVendor}=="0592", ATTRS{idProduct}=="0004", ENV{UPOWER_BATTERY_TYPE}="ups" + +# Phoenixtec ATTRS{idVendor}=="06da", ATTRS{idProduct}=="ffff", ENV{UPOWER_BATTERY_TYPE}="ups" # iDowell diff --git a/server/Makefile.in b/server/Makefile.in index ed50361..6decd15 100644 --- a/server/Makefile.in +++ b/server/Makefile.in @@ -47,7 +47,6 @@ subdir = server DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ diff --git a/server/netinstcmd.c b/server/netinstcmd.c index 90275ca..7411e2b 100644 --- a/server/netinstcmd.c +++ b/server/netinstcmd.c @@ -29,12 +29,12 @@ #include "netinstcmd.h" static void send_instcmd(ctype_t *client, const char *upsname, - const char *cmdname) + const char *cmdname, const char *value) { int found; upstype_t *ups; const cmdlist_t *ctmp; - char sockcmd[SMALLBUF]; + char sockcmd[SMALLBUF], esc[SMALLBUF]; ups = get_ups_ptr(upsname); @@ -70,11 +70,20 @@ static void send_instcmd(ctype_t *client, const char *upsname, return; } - upslogx(LOG_INFO, "Instant command: %s@%s did %s on %s", - client->username, client->addr, cmdname, - ups->name); + /* see if the user has also passed a value for this command */ + if (value != NULL) { + upslogx(LOG_INFO, "Instant command: %s@%s did %s with value \"%s\" on %s", + client->username, client->addr, cmdname, value, ups->name); - snprintf(sockcmd, sizeof(sockcmd), "INSTCMD %s\n", cmdname); + snprintf(sockcmd, sizeof(sockcmd), "INSTCMD %s %s\n", + cmdname, pconf_encode(value, esc, sizeof(esc))); + } + else { + upslogx(LOG_INFO, "Instant command: %s@%s did %s on %s", + client->username, client->addr, cmdname, ups->name); + + snprintf(sockcmd, sizeof(sockcmd), "INSTCMD %s\n", cmdname); + } if (!sstate_sendline(ups, sockcmd)) { upslogx(LOG_INFO, "Set command send failed"); @@ -82,6 +91,7 @@ static void send_instcmd(ctype_t *client, const char *upsname, return; } + /* FIXME: need to retrieve the cookie number */ sendback(client, "OK\n"); } @@ -92,7 +102,7 @@ void net_instcmd(ctype_t *client, int numarg, const char **arg) return; } - /* INSTCMD */ - send_instcmd(client, arg[0], arg[1]); + /* INSTCMD []*/ + send_instcmd(client, arg[0], arg[1], (numarg == 3)?arg[2]:NULL); return; } diff --git a/server/netlist.c b/server/netlist.c index 39ff826..104026c 100644 --- a/server/netlist.c +++ b/server/netlist.c @@ -204,7 +204,7 @@ static void list_ups(ctype_t *client) utmp->name, esc); } else { - ret = sendback(client, "UPS %s \"Unavailable\"\n", + ret = sendback(client, "UPS %s \"Description unavailable\"\n", utmp->name); } diff --git a/server/upsd.c b/server/upsd.c index a5a0c42..662284e 100644 --- a/server/upsd.c +++ b/server/upsd.c @@ -452,7 +452,11 @@ static void parse_net(ctype_t *client) static void client_connect(stype_t *server) { struct sockaddr_storage csock; +#if defined(__hpux) && !defined(_XOPEN_SOURCE_EXTENDED) + int clen; +#else socklen_t clen; +#endif int fd; ctype_t *client; diff --git a/tools/Makefile.in b/tools/Makefile.in index 9eba5b4..103b72d 100644 --- a/tools/Makefile.in +++ b/tools/Makefile.in @@ -38,7 +38,6 @@ subdir = tools DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ - $(top_srcdir)/m4/ax_create_stdint_h.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 \ diff --git a/tools/nut-usbinfo.pl b/tools/nut-usbinfo.pl index 1bbf3aa..606d89d 100755 --- a/tools/nut-usbinfo.pl +++ b/tools/nut-usbinfo.pl @@ -196,7 +196,9 @@ sub find_usbdevs my $VendorName=""; # special thing for backward declaration using #DEFINE - # Format: #define VENDORID 0x???? /* vendor name */ + # Format: + # /* vendor name */ + # #define VENDORID 0x???? if(!($VendorID=~/\dx(\d|\w)+/)) { open my $fh,$nameFile or die "error open file $nameFile"; @@ -228,9 +230,12 @@ sub find_usbdevs die "In file $nameFile, for product $ProductID, can't find the declaration of the constant"; } } - - # store date (to be optimized) - $vendorName{$VendorID}=trim($VendorName); + + # store data (to be optimized) + if (($vendorName{$VendorID} eq "") && ($VendorName)) + { + $vendorName{$VendorID}=trim($VendorName); + } $vendor{$VendorID}{$ProductID}{"comment"}=$lastComment; # process the driver name my $driver=$nameFile;